From 282c18099c97786ce16bb3b7d4cc43216be8eee8 Mon Sep 17 00:00:00 2001 From: Jack Pope Date: Fri, 22 Nov 2019 16:24:28 -0500 Subject: [PATCH 1/3] Revert "chore(release): 1.1.5 [skip ci]" This reverts commit ee905aa65a30d56f62edf2f5857f366c2bdaada9. --- CHANGELOG.md | 7 ------- package.json | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 03efda2..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -## [1.1.5](https://github.com/contently/videojs-annotation-comments/compare/v1.1.4...v1.1.5) (2019-11-22) - - -### Bug Fixes - -* **api:** BREAKING CHANGE add registerListener func on plugin instance ([bdefb94](https://github.com/contently/videojs-annotation-comments/commit/bdefb94)) -* **build:** Fixed gulp build and added eventEmitter for videojs v7 compat ([a954a7a](https://github.com/contently/videojs-annotation-comments/commit/a954a7a)) diff --git a/package.json b/package.json index 6aa07db..a256f98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contently/videojs-annotation-comments", - "version": "1.1.5", + "version": "2.0.0-pre.2", "description": "A plugin for video.js to add support for timeline moment/range comments and annotations", "repository": "git@github.com:contently/videojs-annotation-comments.git", "main": "build/videojs-annotation-comments.cjs.js", From b7fb33dbd41c025bee9ac772ee6d3984ba2b4146 Mon Sep 17 00:00:00 2001 From: Jack Pope Date: Fri, 22 Nov 2019 16:26:32 -0500 Subject: [PATCH 2/3] REVERT botched v2 release --- .circleci/config.yml | 23 +- .gitignore | 1 - .tool-versions | 1 - LICENSE.md | 18 +- README.md | 149 +- build/css/annotations.css | 474 + build/videojs-annotation-comments.cjs.js | 8476 ++++++++ build/videojs-annotation-comments.cjs.js.map | 1 + build/videojs-annotation-comments.cjs.min.js | 5 + build/videojs-annotation-comments.js | 8482 ++++++++ build/videojs-annotation-comments.js.map | 1 + build/videojs-annotation-comments.min.js | 5 + .../videojs-annotation-comments.cjs.min.js | 5 + gulpfile.js | 326 +- license.md | 13 + package-lock.json | 16798 ++++++++++++++++ package.json | 49 +- src/js/annotation_comments.js | 7 +- src/js/lib/event_dispatcher.js | 24 +- .../mocha/components/event_dispatcher_test.js | 10 +- test/test_api.html | 8 +- yarn.lock | 10388 ---------- 22 files changed, 34529 insertions(+), 10735 deletions(-) delete mode 100644 .tool-versions create mode 100644 build/css/annotations.css create mode 100644 build/videojs-annotation-comments.cjs.js create mode 100644 build/videojs-annotation-comments.cjs.js.map create mode 100644 build/videojs-annotation-comments.cjs.min.js create mode 100644 build/videojs-annotation-comments.js create mode 100644 build/videojs-annotation-comments.js.map create mode 100644 build/videojs-annotation-comments.min.js create mode 100644 docs/build/videojs-annotation-comments.cjs.min.js create mode 100644 license.md create mode 100644 package-lock.json delete mode 100644 yarn.lock diff --git a/.circleci/config.yml b/.circleci/config.yml index 7bcb1bf..392d353 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ jobs: build_and_test: docker: # specify the version you desire here - - image: circleci/node:10.15.2 + - image: circleci/node:9.11.1 working_directory: ~/repo @@ -16,11 +16,11 @@ jobs: # Download and cache dependencies - restore_cache: keys: - - v1-dependencies-{{ checksum "package.json" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- - - run: yarn + - run: npm install - save_cache: paths: @@ -28,12 +28,12 @@ jobs: key: v1-dependencies-{{ checksum "package.json" }} # run tests! - - run: yarn test + - run: npm run test semantic_release: docker: # specify the version you desire here - - image: circleci/node:10.15.2 + - image: circleci/node:9.11.1 working_directory: ~/repo steps: - checkout @@ -41,17 +41,16 @@ jobs: # Download and cache dependencies - restore_cache: keys: - - v1-dependencies-{{ checksum "package.json" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- - - run: yarn + - run: npm install - save_cache: paths: - node_modules key: v1-dependencies-{{ checksum "package.json" }} - - run: yarn build - run: npx semantic-release workflows: diff --git a/.gitignore b/.gitignore index fb40e3f..3c5f369 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ node_modules docs/.sass-cache -build diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index ec73d05..0000000 --- a/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -nodejs 10.15.2 diff --git a/LICENSE.md b/LICENSE.md index e5a55dc..4249b7d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,13 +1,13 @@ Copyright Contently, Inc. 2017 -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index b4fc5f7..865cf64 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,50 @@ [![CircleCI](https://circleci.com/gh/contently/videojs-annotation-comments/tree/master.svg?style=svg)](https://circleci.com/gh/contently/videojs-annotation-comments/tree/master) -# AnnotationComments : Collaborate in your VideoJS player + # AnnotationComments : Collaborate in your VideoJS player -![AnnotationComments Screenshot1](test/screenshot.png) + ![AnnotationComments Screenshot1](test/screenshot.png) ->## Upgrading v1 -> v2 ->Please note that the event based API has changed. In version 1, you can subscribe to plugin events with `pluginInstance.on()`. In version 2, the same functionality is available with `pluginInstance.registerListener()`. The following docs are for the latest version. + ### Background -## About + Collaboration between videographers and clients can be tedious, with emails and phone calls that waste time trying to reference specific frames and areas of the screen. This plugin enables more efficient collaboration from the browser. -### Background - -Collaboration between videographers and clients can be tedious, with emails and phone calls that waste time trying to reference specific frames and areas of the screen. This plugin enables more efficient collaboration from the browser. - -This plugin was conceived and developed as a Hack Week project at [Contently](http://www.contently.com) by [Evan Carothers](http://www.github.com/ecaroth) and [Jack Pope](http://www.github.com/jackpope). Continuing our focus and commitment to multimedia support at Contently, the entire team productized and bulletproofed the plugin as a flexible solution to be used in our product and other open-source use cases. + This plugin was conceived and developed as a Hack Week project at [Contently](http://www.contently.com) by [Evan Carothers](http://www.github.com/ecaroth) and [Jack Pope](http://www.github.com/jackpope). Continuing our focus and commitment to multimedia support at Contently, the entire team productized and bulletproofed the plugin as a flexible solution to be used in our product and other open-source use cases. ### Goals -- **Efficient for videographers and clients alike** - Provides useful collaboration features including annotations, comments/replies, ranged time markers, and more, with intuitive controls. + - **Efficient for videographers and clients alike** - Provides useful collaboration features including annotations, comments/replies, ranged time markers, and more, with intuitive controls. - **SIMPLE & LIGHTWEIGHT** - Everything is contained within the plugin and player element. There is no need to build additional UI components. Just install VideoJS, register the plugin, setup whatever backend storage you wish, and start collaborating. - **EXTENSIBLE** - The plugin can be integrated with existing commenting systems (as we did within Contently), and makes very few assumptions about how to store annotations. Custom events are available for communicating with external APIs, providing support for on-page interactions and data persistence. Simple CSS overrides can also allow for branding customizations with minimal effort, or completely custom UI/UX. -### VideoJS Plugins - -[VideoJS](http://videojs.com/) is a popular open-source HTML5 video player library used by 400k+ sites. As of v6, there is an extendable plugin architecture which was used to create this plugin. This plugin is built and tested against [VideoJS v7](https://www.npmjs.com/package/video.js/) - -## Use it! - -### Install + ### VideoJS Plugins -``` -yarn add @contently/videojs-annotation-comments -``` - -OR + [VideoJS](http://videojs.com/) is a popular open-source HTML5 video player library used by 400k+ sites. As of v6, there is an extendable plugin architecture which was used to create this plugin. This plugin is built and tested against [VideoJS v 6.2.0](https://www.npmjs.com/package/video.js/) -``` -npm install @contently/videojs-annotation-comments -``` -### Add it to your VideoJS player + ### Add it to your VideoJS player -#### As a script from build + #### As a script from build -```javascript + ```javascript // ...videojs & videojs-annotation-comments have been loaded in script tags... -var player = videojs('video-id'); + var player = videojs('video-id'); var plugin = player.annotationComments(pluginOptions) ``` -#### As a module + #### As a module -```javascript + ```javascript import videojs from 'video.js' -import AnnotationComments from '@contently/videojs-annotation-comments' +import AnnotationComments from 'videojs-annotation-comments' videojs.registerPlugin('annotationComments', AnnotationComments(videojs)) var player = videojs('video-id') var plugin = player.annotationComments(pluginOptions) ``` -### Plugin options / configuration + ### Plugin options / configuration -When initializing the plugin, you can pass in an options array to override default options. Any excluded options are set to their default values, listed below: + When initializing the plugin, you can pass in an options array to override default options. Any excluded options are set to their default values, listed below: -```javascript + ```javascript const pluginOptions = { // Collection of annotation data to initialize annotationsObjects: [], @@ -85,9 +67,9 @@ const pluginOptions = { }; ``` -### Annotation Data Structure + ### Annotation Data Structure -To initialize the plugin with the `annotationsObjects` collection, use the following structure: + To initialize the plugin with the `annotationsObjects` collection, use the following structure: ```javascript const annotationsObjects = [{ id: 1, @@ -113,25 +95,25 @@ const annotationsObjects = [{ }]; ``` -### Programmatic Control + ### Programmatic Control -If you'd like to drive the plugin or render plugin data through external UI elements, you can configure the plugin to hide the internal components and pass data through custom events. There are two kinds of AnnotationComments API events, _externally fired_ and _internally fired_. + If you'd like to drive the plugin or render plugin data through external UI elements, you can configure the plugin to hide the internal components and pass data through custom events. There are two kinds of AnnotationComments API events, _externally fired_ and _internally fired_. -#### Waiting for Plugin Ready + ##### Waiting for Plugin Ready -Before triggering any events on the plugin, you must wait for it to be ready. You can use the `onReady` function on the plugin: + Before triggering any events on the plugin, you must wait for it to be ready. You can use the `onReady` function on the plugin: -```javascript -plugin.registerListenerReady(() => { + ```javascript +plugin.onReady(() => { // do stuff with the plugin, such as fire events or setup listeners }); ``` -#### Supported Externally Fired Events: + ##### Supported Externally Fired Events: These events are external actions that can be called from your scripts to trigger events within the plugin: -```javascript + ```javascript // openAnnotation : Opens an annotation within the player given an ID plugin.fire('openAnnotation', { id: myAnnotationId }); // closeActiveAnnotation : Closes any active annotation @@ -162,12 +144,12 @@ plugin.fire('cancelAddingAnnotation'); plugin.fire('toggleAnnotations'); ``` -#### Supported Internally Fired Events: -These are events that are triggered from within the running plugin and can be listened for by binding to `plugin.registerListener` within your scripts: + ##### Supported Internally Fired Events: +These are events that are triggered from within the running plugin and can be listened for by binding to `plugin.on` within your scripts: ```javascript // annotationOpened : Fired whenever an annotation is opened -plugin.registerListener('annotationOpened', (event) => { +plugin.on('annotationOpened', (event) => { // event.detail = // { // annotation: (object) annotation data in format {id:.., comments:..., range:..., shape:...}, @@ -175,98 +157,99 @@ plugin.registerListener('annotationOpened', (event) => { // } }); // annotationClosed : Fired whenever an annotation is closed -plugin.registerListener('annotationClosed', (event) => { +plugin.on('annotationClosed', (event) => { // event.detail = annotation (object) in format {id:.., comments:..., range:..., shape:...} }); // addingAnnotationDataChanged : Fired from adding annotation state if: // 1. the marker is dragged // 2. the start of the marker is moved via control buttons // 3. the shape is dragged -plugin.registerListener('addingAnnotationDataChanged', (event) => { +plugin.on('addingAnnotationDataChanged', (event) => { var newRange = event.detail.range; // returns range data if range was changed var newShape = event.detail.shape; // returns shape data if shape was changed // do something with the data }); // annotationDeleted : Fired when an annotation has been deleted via the UI -plugin.registerListener('annotationDeleted', (event) => { +plugin.on('annotationDeleted', (event) => { // annotationId = event.detail }); // enteredAnnotationMode : Fired when the plugin enters adding annotation mode // includes initial range data -plugin.registerListener('enteredAddingAnnotation', (event) => { +plugin.on('enteredAddingAnnotation', (event) => { var startTime = event.detail.range.start; // do something when adding annotation state begins }); // onStateChanged: Fired when plugin state has changed (annotation added, removed, etc) // This is a way to watch global plugin state, as an alternative to watching various annotation events -plugin.registerListener('onStateChanged', (event) => { +plugin.on('onStateChanged', (event) => { // event.detail = annotation state data }); // playerBoundsChanged : Fired when the player boundaries change due to window resize or fullscreen mode -plugin.registerListener('playerBoundsChanged', (event) => { +plugin.on('playerBoundsChanged', (event) => { var bounds = event.detail; // do something with the new boundaries }); // Entering annotation mode (annotation icon was clicked when previously 'off') -plugin.registerListener('annotationModeEnabled', (event) => { +plugin.on('annotationModeEnabled', (event) => { // do something }); // Exiting annotation mode (annotation icon was clicked when previously 'on') -plugin.registerListener('annotationModeDisabled', (event) => { +plugin.on('annotationModeDisabled', (event) => { // do something }); ``` -## Develop and Build + ### Develop and Build -We're using [yarn](https://yarnpkg.com/en/) for package management and [gulp](https://github.com/gulpjs/gulp) as our build system. + We're using [npm](https://www.npmjs.com/) for package management and [gulp](https://github.com/gulpjs/gulp) as our build system. -The fastest way to get started: + The fastest way to get started: - Clone the repo -- Run `yarn install` -- Run `yarn build` -- Run `yarn watch` +- Run `npm install` +- Run `npm install -g gulp` +- Run `gulp build` +- Run `gulp watch` - Visit `http://localhost:3004/test.html` to see the magic happen. -### Templates + #### Templates We're using the [Handlebars](http://handlebarsjs.com/) templating library to render various components within the plugin. For performance, the templates are pre-compiled into a JS file within the development environment. That way we only need to require the Handlebars runtime, saving nearly 100kb from the minified build! ⚡️ -The `gulp templates` task is used to precompile every template to `/src/js/compiled/templates.js`. This file should _not_ be modified directly, but rather the templates themselves in `/src/templates` should be modified if changes are needed. The templates task will run automatically within `gulp watch`. + The `gulp templates` task is used to precompile every template to `/src/js/compiled/templates.js`. This file should _not_ be modified directly, but rather the templates themselves in `/src/templates` should be modified if changes are needed. The templates task will run automatically within `gulp watch`. -### UI / CSS Customization + #### UI / CSS Customization -The plugin uses SASS and all styles are defined in [annotaitons.scss](src/css/annotations.scss). There is extenssive commenting on classes and styles in the file. The plugin uses a deep level of specificity to prevent styles from polluting elements on the page, and all classes are prefixed with `vac-` to prevent classname collisions in the global namespace. + The plugin uses SASS and all styles are defined in [annotaitons.scss](src/css/annotations.scss). There is extenssive commenting on classes and styles in the file. The plugin uses a deep level of specificity to prevent styles from polluting elements on the page, and all classes are prefixed with `vac-` to prevent classname collisions in the global namespace. -You can extend/modify colors and elements quite easily by writing an overrides stylesheet to address the specific elements that you wish to modify. You can also change the variable colors in the stylesheet and compile yourself for more customization. + You can extend/modify colors and elements quite easily by writing an overrides stylesheet to address the specific elements that you wish to modify. You can also change the variable colors in the stylesheet and compile yourself for more customization. -_NOTE_ - our gulp build tasks use an auto-prefixer to make the styles work cross-browser, so be sure to run that yourself if you compile the SASS files with changes. + _NOTE_ - our gulp build tasks use an auto-prefixer to make the styles work cross-browser, so be sure to run that yourself if you compile the SASS files with changes. -### Testing + #### Testing -#### Feature tests + ##### Feature tests -Feature tests are currently browser-based and run by visiting `http://localhost:3004/mocha/features/index.html`. Feature tests can be added as files in the `/test/mocha/features/` directory and then included within the `index.html` file as a external scripts. + Feature tests are currently browser-based and run by visiting `http://localhost:3004/mocha/features/index.html`. Feature tests can be added as files in the `/test/mocha/features/` directory and then included within the `index.html` file as a external scripts. -#### Unit tests + ##### Unit tests -Unit tests are run through the `gulp test` task. If the `tdd` task is included in `gulp watch`, the tests will run with every change to the test files. Each module should have a corresponding unit test file within the `/test/mocha/modules` directory. + Unit tests are run through the `gulp test` task. If the `tdd` task is included in `gulp watch`, the tests will run with every change to the test files. Each module should have a corresponding unit test file within the `/test/mocha/modules` directory. -### Gulp commands + #### Gulp commands -`gulp watch`: Fires up webserver @ `http://localhost:3004/test.html`, watches for any file changes in `/src`, including js, css (scss), and templates (.hbs), repackages, and transpiles to an unminified file in `/build` on change. + `gulp watch`: Fires up webserver @ `http://localhost:3004/test.html`, watches for any file changes in `/src`, including js, css (scss), and templates (.hbs), repackages, and transpiles to an unminified file in `/build` on change. -`gulp transpile`: Transpiles modules/files to build file in `/build` with JS maps + `gulp transpile`: Transpiles modules/files to build file in `/build` with JS maps -`gulp build`: Runs transpilation, browserify, sass, then minifies to distribution filename in `/build` with attribution + `gulp build`: Runs transpilation, browserify, sass, then minifies to distribution filename in `/build` with attribution -`gulp templates`: Uses Handlebars to pre-compile templates into a javascript file. See Templates section above. + `gulp templates`: Uses Handlebars to pre-compile templates into a javascript file. See Templates section above. -`gulp test`: Runs the mocha unit tests within the `/test/mocha/modules/` directory. + `gulp test`: Runs the mocha unit tests within the `/test/mocha/modules/` directory. -`gulp lint`: Runs jshint linter on javascript files in `/src` + `gulp lint`: Runs jshint linter on javascript files in `/src` -### License + #### License -This plugin is [licensed](license.md) under the Apache License, Version 2.0, which is the same license used by Video.js + This plugin is [licensed](license.md) under the Apache License, Version 2.0, which is the same license used by Video.js diff --git a/build/css/annotations.css b/build/css/annotations.css new file mode 100644 index 0000000..a68585d --- /dev/null +++ b/build/css/annotations.css @@ -0,0 +1,474 @@ +.video-js.vac-active .vjs-mouse-display, .video-js.vac-active .vjs-big-play-button { + display: none !important; } + +.video-js.vac-active .vac-marker-owrap, .video-js.vac-active .vac-control { + display: block; } + +.video-js.vac-active .vjs-control-bar { + z-index: 2; } + +.video-js.vac-active .vac-player-btn i.vac-player-icon svg { + fill: #00A6C2 !important; } + +.video-js.vac-active.vjs-has-started .vac-shape { + display: block; } + +.video-js.vac-disable-play .vjs-control { + cursor: default; } + +.video-js .vac-hidden { + display: none !important; } + +.video-js.vac-disable-fullscreen .vac-player-btn { + display: none; } + +.video-js.vac-disable-play .vac-marker { + display: none !important; } + +.video-js.vac-disable-play .vjs-play-control, .video-js.vac-disable-play .vjs-play-progress { + visibility: hidden !important; } + +.video-js .vac-button { + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + margin: 10px; + line-height: 27px; + font-size: 13px; + padding: 0; + width: calc(100% - 20px); + text-align: center; + border-radius: 2px; + background: #00A6C2; + color: white; + display: block; + cursor: pointer; } + .video-js .vac-button:hover { + background-color: #10dcff; } + +.video-js .vac-video-cover { + z-index: 1; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(255, 0, 0, 0.15); + cursor: crosshair; } + .video-js .vac-video-cover .vac-video-cover-canvas { + width: 100%; + height: 100%; + position: relative; } + +.video-js .vac-video-write-new-wrap { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 11; + background-color: rgba(0, 0, 0, 0.7); } + .video-js .vac-video-write-new-wrap.vac-new-comment { + background-color: rgba(0, 0, 0, 0.4); } + .video-js .vac-video-write-new-wrap .vac-video-write-new { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .video-js .vac-video-write-new-wrap .vac-video-write-new > div { + width: 80%; + max-width: 400px; + border-radius: 2px; + background: rgba(255, 255, 255, 0.85); + padding: 20px; } + .video-js .vac-video-write-new-wrap .vac-video-write-new > div h5 { + margin: 0; + padding: 0; + font-size: 15px; + color: #000; + font-weight: normal; } + .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox { + border-radius: 1px; + background-color: white; + margin-top: 20px; + width: 100%; + border-bottom: 2px solid #ee9828; } + .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox textarea { + border: none; + font-size: 13px; + color: #383838; + line-height: 16px; + padding: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + min-height: 110px; + width: 100%; + resize: none; } + .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div { + padding: 10px; + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 27px; } + .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div button { + float: right; + width: auto; + padding: 0 40px; + margin: 0; } + .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div a { + float: right; + font-size: 12px; + text-decoration: underline; + line-height: 27px; + display: inline-block; + color: #383838; + cursor: pointer; + margin-right: 20px; } + .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div a:hover { + color: #FF0000; } + .video-js .vac-video-write-new-wrap .vac-video-write-new.vac-is-comment { + display: block; } + .video-js .vac-video-write-new-wrap .vac-video-write-new.vac-is-comment .vac-comment-showbox { + position: absolute; + padding: 0; + margin: 0; + max-width: none; } + +.video-js .vac-shape { + position: absolute; + z-index: 1; + background-color: rgba(238, 152, 40, 0.65); + border: 2px dotted #ee9828; + display: none; } + +.video-js .vac-controls, .video-js .vac-add-controls { + z-index: 3; + position: absolute; + border-radius: 2px; + overflow: hidden; + background-color: rgba(0, 0, 0, 0.4); + top: 4px; + left: 4px; + padding: 4px 0 0 0; + font-size: 14px; + color: white; + width: 150px; + display: none; + text-align: center; } + .video-js .vac-controls i, .video-js .vac-add-controls i { + color: #dbdcdc; + font-size: 11px; + font-style: normal; + display: block; + padding: 4px 0 0; } + .video-js .vac-controls button, .video-js .vac-add-controls button { + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + margin: 10px; + line-height: 27px; + font-size: 13px; + padding: 0; + width: calc(100% - 20px); + text-align: center; + border-radius: 2px; + background: #00A6C2; + color: white; + display: block; + cursor: pointer; } + .video-js .vac-controls button:hover, .video-js .vac-add-controls button:hover { + background-color: #10dcff; } + .video-js .vac-controls.vac-add-controls button, .video-js .vac-add-controls.vac-add-controls button { + background-color: #eed428; + color: #383838; } + .video-js .vac-controls.vac-add-controls button:hover, .video-js .vac-add-controls.vac-add-controls button:hover { + background-color: #f4e26f; } + .video-js .vac-controls.vac-add-controls a, .video-js .vac-add-controls.vac-add-controls a { + margin: 3px auto 8px; + text-transform: uppercase; + display: inline-block; + color: white; + cursor: pointer; + text-decoration: underline; + font-size: 10px; } + .video-js .vac-controls.vac-add-controls a:hover, .video-js .vac-add-controls.vac-add-controls a:hover { + color: #FF0000; } + .video-js .vac-controls .vac-annotation-nav, .video-js .vac-controls .vac-video-move, .video-js .vac-add-controls .vac-annotation-nav, .video-js .vac-add-controls .vac-video-move { + margin-top: 8px; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .video-js .vac-controls .vac-annotation-nav div, .video-js .vac-controls .vac-video-move div, .video-js .vac-add-controls .vac-annotation-nav div, .video-js .vac-add-controls .vac-video-move div { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + background-color: rgba(0, 0, 0, 0.8); + text-align: center; + line-height: 22px; + color: #eed428; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + cursor: pointer; + font-size: 12px; } + .video-js .vac-controls .vac-annotation-nav div:hover, .video-js .vac-controls .vac-video-move div:hover, .video-js .vac-add-controls .vac-annotation-nav div:hover, .video-js .vac-add-controls .vac-video-move div:hover { + background-color: #eed428; + color: #000; } + .video-js .vac-controls .vac-annotation-nav div.vac-a-prev, .video-js .vac-controls .vac-video-move div.vac-a-prev, .video-js .vac-add-controls .vac-annotation-nav div.vac-a-prev, .video-js .vac-add-controls .vac-video-move div.vac-a-prev { + margin-right: 1px; } + +.video-js .vac-cursor-tool-tip { + position: absolute; + border-radius: 100%; + z-index: 999; + display: inline-block; + white-space: nowrap; } + +.video-js .vac-player-btn { + margin-right: 8px; + cursor: pointer; } + .video-js .vac-player-btn i.vac-player-icon svg { + fill: white; + -webkit-transition: fill .2s ease-in-out; + transition: fill .2s ease-in-out; } + .video-js .vac-player-btn i.vac-player-icon:hover svg { + fill: #5ce7ff; } + .video-js .vac-player-btn b { + position: absolute; + display: inline-block; + top: 3px; + right: 3px; + color: #FFF; + height: 14px; + line-height: 14px; + min-width: 14px; + text-align: center; + border-radius: 9px; + font-size: 10px; + font-weight: normal; + background-color: #FF0000; } + +.video-js .vac-marker-owrap { + display: none; + z-index: 10; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; } + .video-js .vac-marker-owrap .vac-marker-wrap { + margin: 0 10px; + height: 100%; + position: relative; + -webkit-box-flex: 1; + -ms-flex: auto; + flex: auto; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable { + position: absolute; + width: 7px; + margin-left: 0px; + height: 30px; + bottom: 6px; + background: #00A6C2; + border-radius: 2px; + cursor: pointer; + -webkit-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-hovering, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-force-tooltip, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-hovering, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-force-tooltip { + opacity: 1 !important; + background: #eed428; + height: 35px; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-hovering > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-force-tooltip > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-hovering > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-force-tooltip > div { + display: block; + opacity: 1; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-hovering.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-force-tooltip.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-hovering.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-force-tooltip.vac-ranged-marker { + -webkit-box-shadow: 7px 0 0 0 #eed428 inset; + box-shadow: 7px 0 0 0 #eed428 inset; + background-color: rgba(238, 212, 40, 0.65); } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-active, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-active { + background-color: #eed428; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-active.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-active.vac-ranged-marker { + -webkit-box-shadow: 7px 0 0 0 #eed428 inset; + box-shadow: 7px 0 0 0 #eed428 inset; + background-color: rgba(238, 212, 40, 0.65); } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-ranged-marker { + -webkit-box-shadow: 7px 0 0 0 #00A6C2 inset; + box-shadow: 7px 0 0 0 #00A6C2 inset; + background-color: rgba(0, 166, 194, 0.65); } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-marker-draggable, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-marker-draggable { + -webkit-box-shadow: 7px 0 0 0 #ee9828 inset; + box-shadow: 7px 0 0 0 #ee9828 inset; + background-color: rgba(238, 152, 40, 0.65); + cursor: ew-resize; + min-width: 7px !important; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div { + width: 100%; + position: relative; + display: none; + opacity: 0; + -webkit-transition: opacity .2s ease-in-out; + transition: opacity .2s ease-in-out; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div span, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div span { + text-overflow: ellipsis; + white-space: nowrap; + border-bottom: 1px solid #eed428; + display: block; + position: absolute; + max-width: 250px; + bottom: -1px; + line-height: 26px; + height: 28px; + overflow: hidden; + padding: 0 5px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 1px; + background: rgba(0, 0, 0, 0.8); + color: white; + font-family: Arial; + font-size: 12px; + left: 0px; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div span b, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div span b { + color: #eed428; + display: inline-block; + margin-right: 5px; + font-weight: normal; } + .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div span.vac-right-side, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div span.vac-right-side { + left: auto; + right: 0px; } + .video-js .vac-marker-owrap .vac-marker-wrap.vac-dim-all .vac-marker { + height: 30px; + opacity: .4; } + .video-js .vac-marker-owrap .vac-marker-wrap.vac-dim-all .vac-marker.vac-force-tooltip > div { + display: none; } + +.video-js .vac-comments-container { + position: absolute; + right: 0; + top: 0; + width: 15%; + min-width: 225px; + z-index: 11; + background-color: rgba(255, 255, 255, 0.6); + height: calc(100% - 42px); + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: all .15s linear; + transition: all .15s linear; } + .video-js .vac-comments-container:hover, .video-js .vac-comments-container.vac-active { + width: 60%; + max-width: 480px; } + .video-js .vac-comments-container:hover .vac-comments-wrap, .video-js .vac-comments-container.vac-active .vac-comments-wrap { + opacity: 1; } + .video-js .vac-comments-container:hover.vac-active .vac-add-new-shapebox, .video-js .vac-comments-container.vac-active.vac-active .vac-add-new-shapebox { + display: block; } + .video-js .vac-comments-container:hover.vac-active .vac-reply-btn, .video-js .vac-comments-container.vac-active.vac-active .vac-reply-btn { + display: none; } + .video-js .vac-comments-container .vac-comments-wrap { + opacity: .9; + height: calc(100% - 26px); + overflow-x: hidden; + overflow-y: auto; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 10px; + border-left: 1px solid #dbdcdc; } + .video-js .vac-comments-container .vac-comments-wrap::-webkit-scrollbar { + width: 6px; + background-color: transparent; } + .video-js .vac-comments-container .vac-comments-wrap::-webkit-scrollbar-thumb { + border-radius: 5px; + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + background-color: #383838; } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment { + border-radius: 1px; + -webkit-box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.43); + box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.43); } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header { + width: 100%; + padding: 2px 5px; + color: #FFF; + background-color: #383838; + text-align: left; } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header:hover .vac-delete-comment { + display: inline; } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-author-name, .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-timestamp { + display: inline-block; + line-height: 16px; } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-author-name.vac-author-name, .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-timestamp.vac-author-name { + font-weight: bold; + text-align: left; + font-size: 11px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-author-name.vac-timestamp, .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-timestamp.vac-timestamp { + float: right; + text-align: right; + font-size: 10px; } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-delete-comment { + display: none; + cursor: pointer; + color: #FF0000; } + .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-body { + width: 100%; + padding: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin-bottom: 10px; + background-color: #fff; + color: #000; + font-size: 13px; + line-height: 16px; + text-align: left; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom: 1px solid white; } + .video-js .vac-comments-container .vac-comments-wrap .vac-reply-btn { + margin: 10px 0 0 0; + width: 100%; } + .video-js .vac-comments-container .vac-comments-wrap .vac-add-new-shapebox { + margin: 10px 0 0 0; + border-radius: 2px; + height: 157px; + padding: 0; + color: orange; + display: none; } + .video-js .vac-comments-container .vac-comments-control-bar { + height: 26px; + border-bottom: 1px solid #eed428; + line-height: 26px; + padding: 0 10px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + background: #000; } + .video-js .vac-comments-container .vac-comments-control-bar .vac-range, .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons { + display: inline-block; + width: 49%; } + .video-js .vac-comments-container .vac-comments-control-bar .vac-range.vac-range, .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons.vac-range { + float: left; + text-align: left; + color: #eed428; } + .video-js .vac-comments-container .vac-comments-control-bar .vac-range.vac-range b, .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons.vac-range b { + color: white; } + .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons { + float: right; + text-align: right; + font-size: 10px; } + .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons a { + margin: 0 4px; + cursor: pointer; + color: red; } + .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons a.vac-close-comment-list { + color: white; } + .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons a:hover { + text-decoration: underline; } diff --git a/build/videojs-annotation-comments.cjs.js b/build/videojs-annotation-comments.cjs.js new file mode 100644 index 0000000..c122dc5 --- /dev/null +++ b/build/videojs-annotation-comments.cjs.js @@ -0,0 +1,8476 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.AnnotationComments = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 2.0.0-beta.1', + 7: '>= 4.0.0' +}; + +exports.REVISION_CHANGES = REVISION_CHANGES; +var objectType = '[object Object]'; + +function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); +} + +HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + } +}; + +var log = _logger2['default'].log; + +exports.log = log; +exports.createFrame = _utils.createFrame; +exports.logger = _logger2['default']; + + +},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.registerDefaultDecorators = registerDefaultDecorators; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _decoratorsInline = require('./decorators/inline'); + +var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + +function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); +} + + +},{"./decorators/inline":5}],5:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],6:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + +function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + column = undefined; + if (loc) { + line = loc.start.line; + column = loc.start.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + try { + if (loc) { + this.lineNumber = line; + + // Work around issue under safari where we can't directly set the column value + /* istanbul ignore next */ + if (Object.defineProperty) { + Object.defineProperty(this, 'column', { + value: column, + enumerable: true + }); + } else { + this.column = column; + } + } + } catch (nop) { + /* Ignore if the browser is very particular */ + } +} + +Exception.prototype = new Error(); + +exports['default'] = Exception; +module.exports = exports['default']; + + +},{}],7:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.registerDefaultHelpers = registerDefaultHelpers; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _helpersBlockHelperMissing = require('./helpers/block-helper-missing'); + +var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + +var _helpersEach = require('./helpers/each'); + +var _helpersEach2 = _interopRequireDefault(_helpersEach); + +var _helpersHelperMissing = require('./helpers/helper-missing'); + +var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + +var _helpersIf = require('./helpers/if'); + +var _helpersIf2 = _interopRequireDefault(_helpersIf); + +var _helpersLog = require('./helpers/log'); + +var _helpersLog2 = _interopRequireDefault(_helpersLog); + +var _helpersLookup = require('./helpers/lookup'); + +var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + +var _helpersWith = require('./helpers/with'); + +var _helpersWith2 = _interopRequireDefault(_helpersWith); + +function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); +} + + +},{"./helpers/block-helper-missing":8,"./helpers/each":9,"./helpers/helper-missing":10,"./helpers/if":11,"./helpers/log":12,"./helpers/lookup":13,"./helpers/with":14}],8:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],9:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utils = require('../utils'); + +var _exception = require('../exception'); + +var _exception2 = _interopRequireDefault(_exception); + +exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else { + var priorKey = undefined; + + for (var key in context) { + if (context.hasOwnProperty(key)) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + } + } + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); +}; + +module.exports = exports['default']; + + +},{"../exception":6,"../utils":19}],10:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _exception = require('../exception'); + +var _exception2 = _interopRequireDefault(_exception); + +exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); +}; + +module.exports = exports['default']; + + +},{"../exception":6}],11:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],12:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); +}; + +module.exports = exports['default']; + + +},{}],13:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field) { + return obj && obj[field]; + }); +}; + +module.exports = exports['default']; + + +},{}],14:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],15:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('./utils'); + +var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + if (!console[method]) { + // eslint-disable-line no-console + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } +}; + +exports['default'] = logger; +module.exports = exports['default']; + + +},{"./utils":19}],16:[function(require,module,exports){ +(function (global){ +/* global window */ +'use strict'; + +exports.__esModule = true; + +exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; +}; + +module.exports = exports['default']; + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],17:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.checkRevision = checkRevision; +exports.template = template; +exports.wrapProgram = wrapProgram; +exports.resolvePartial = resolvePartial; +exports.invokePartial = invokePartial; +exports.noop = noop; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _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; } } + +var _utils = require('./utils'); + +var Utils = _interopRequireWildcard(_utils); + +var _exception = require('./exception'); + +var _exception2 = _interopRequireDefault(_exception); + +var _base = require('./base'); + +function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision !== currentRevision) { + if (compilerRevision < currentRevision) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } +} + +function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as psuedo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + + partial = env.VM.resolvePartial.call(this, partial, context, options); + var result = env.VM.invokePartial.call(this, partial, context, options); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, options); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name) { + if (!(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj); + } + return obj[name]; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + if (depths[i] && depths[i][name] != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + merge: function merge(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + // An empty object to use as replacement for null-contexts + nullContext: Object.seal({}), + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + container.helpers = container.merge(options.helpers, env.helpers); + + if (templateSpec.usePartial) { + container.partials = container.merge(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = container.merge(options.decorators, env.decorators); + } + } else { + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; +} + +function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; +} + +function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; +} + +function invokePartial(partial, context, options) { + // Use the current closure context to save the partial-block if this partial + var currentPartialBlock = options.data && options.data['partial-block']; + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + (function () { + options.data = _base.createFrame(options.data); + // Wrapper function to get access to currentPartialBlock from the closure + var fn = options.fn; + partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + // Restore the partial-block from the closure for the execution of the block + // i.e. the part inside the block of the partial call. + options.data = _base.createFrame(options.data); + options.data['partial-block'] = currentPartialBlock; + return fn(context, options); + }; + if (fn.partials) { + options.partials = Utils.extend({}, options.partials, fn.partials); + } + })(); + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } +} + +function noop() { + return ''; +} + +function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; +} + +function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; +} + + +},{"./base":3,"./exception":6,"./utils":19}],18:[function(require,module,exports){ +// Build out our basic SafeString type +'use strict'; + +exports.__esModule = true; +function SafeString(string) { + this.string = string; +} + +SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; +}; + +exports['default'] = SafeString; +module.exports = exports['default']; + + +},{}],19:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.extend = extend; +exports.indexOf = indexOf; +exports.escapeExpression = escapeExpression; +exports.isEmpty = isEmpty; +exports.createFrame = createFrame; +exports.blockParams = blockParams; +exports.appendContextPath = appendContextPath; +var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' +}; + +var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + +function escapeChar(chr) { + return escape[chr]; +} + +function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; +} + +var toString = Object.prototype.toString; + +exports.toString = toString; +// Sourced from lodash +// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt +/* eslint-disable func-style */ +var isFunction = function isFunction(value) { + return typeof value === 'function'; +}; +// fallback for older versions of Chrome and Safari +/* istanbul ignore next */ +if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; +} +exports.isFunction = isFunction; + +/* eslint-enable func-style */ + +/* istanbul ignore next */ +var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; +}; + +exports.isArray = isArray; +// Older IE versions do not directly support indexOf so we must implement our own, sadly. + +function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; +} + +function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); +} + +function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } +} + +function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; +} + +function blockParams(params, ids) { + params.path = ids; + return params; +} + +function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; +} + + +},{}],20:[function(require,module,exports){ +// Create a simple path alias to allow browserify to resolve +// the runtime on a supported path. +module.exports = require('./dist/cjs/handlebars.runtime')['default']; + +},{"./dist/cjs/handlebars.runtime":2}],21:[function(require,module,exports){ +'use strict'; +if (!Array.prototype.find) { + Object.defineProperty(Array.prototype, 'find', { + value: function (predicate) { + + if (this == null) { + throw new TypeError('this is null or not defined'); + } + + var obj = Object(this); + var len = obj.length >>> 0; + + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + + var thisArg = arguments[1]; + + var index = 0; + + while (index < len) { + var iValue = obj[index]; + if (predicate.call(thisArg, iValue, index, obj)) { + return iValue; + } + index++; + } + + return undefined; + } + }); +} +},{}],22:[function(require,module,exports){ +//! moment.js + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, (function () { 'use strict'; + + var hookCallback; + + function hooks () { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } + + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } + + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } + + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } + } + + function isUndefined(input) { + return input === void 0; + } + + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; + } + + function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; + + function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; + + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate () { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + + function ordinal (number) { + return this._ordinal.replace('%d', number); + } + + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; + + function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var aliases = {}; + + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + var priorities = {}; + + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } + + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + + var regexes = {}; + + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PRIORITIES + + addUnitPriority('year', 1); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', true); + + function getIsLeapYear () { + return isLeapYear(this.year()); + } + + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } + + function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } + + function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } + + // MOMENTS + + function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } + + + function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + function mod(n, x) { + return ((n % x) + x) % x; + } + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } + + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PRIORITY + + addUnitPriority('month', 8); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } + + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } + + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } + + function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date = new Date(y, m, d, h, M, s, ms); + + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; + } + + function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PRIORITIES + + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + + // LOCALES + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + if (!m) { + return isArray(this._weekdays) ? this._weekdays : + this._weekdays['standalone']; + } + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } + + function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + + + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PRIORITY + addUnitPriority('hour', 13); + + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse + }; + + // internal storage for locale config files + var locales = {}; + var localeFamilies = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; + } + + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } + } + + return globalLocale._abbr; + } + + function defineLocale (name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + + // returns locale data + function getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function listLocales() { + return keys(locales); + } + + function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; + + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; + } + + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } + + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); + } + + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } + + var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } + } + + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); + } + + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // constant that refers to the ISO standard + hooks.ISO_8601 = function () {}; + + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); + } + + + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + + var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + + function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; + } + + function isValid$1() { + return this._isValid; + } + + function createInvalid$1() { + return createDuration(NaN); + } + + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); + } + + function isDuration (obj) { + return obj instanceof Duration; + } + + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // FORMATTING + + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } + } + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; + } + + function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; + } + + function isLocal () { + return this.isValid() ? !this._isUTC : false; + } + + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; + } + + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + + // ASP.NET json date format regex + var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + + function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; + + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; + } + + function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } + } + + var add = createAdder(1, 'add'); + var subtract = createAdder(-1, 'subtract'); + + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + } + + function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); + } + + function clone () { + return new Moment(this); + } + + function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } + + function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } + } + + function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); + } + + function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } + } + + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); + } + + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); + } + + function diff (input, units, asFloat) { + var that, + zoneDelta, + output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } + + return asFloat ? output : absFloor(output); + } + + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); + } + + function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } + + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData () { + return this._locale; + } + + function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + } + + function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + } + + function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } + + function unix () { + return Math.floor(this.valueOf() / 1000); + } + + function toDate () { + return new Date(this.valueOf()); + } + + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function isValid$2 () { + return isValid(this); + } + + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } + + function invalidAt () { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); + } + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); + } + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PRIORITY + + addUnitPriority('quarter', 7); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PRIORITY + addUnitPriority('date', 9); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PRIORITY + addUnitPriority('dayOfYear', 4); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PRIORITY + + addUnitPriority('minute', 14); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PRIORITY + + addUnitPriority('second', 15); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PRIORITY + + addUnitPriority('millisecond', 16); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var proto = Moment.prototype; + + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + function createUnix (input) { + return createLocal(input * 1000); + } + + function createInZone () { + return createLocal.apply(null, arguments).parseZone(); + } + + function preParsePostFormat (string) { + return string; + } + + var proto$1 = Locale.prototype; + + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; + + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); + } + + function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; + } + + function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); + } + + function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); + } + + function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); + } + + function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); + } + + function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); + } + + getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); + hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + + var mathAbs = Math.abs; + + function abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); + } + + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; + } + + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; + } + + function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function valueOf$1 () { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asYears = makeAs('y'); + + function clone$1 () { + return createDuration(this); + } + + function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } + + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } + + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks () { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; + } + + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; + } + + function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var abs$1 = Math.abs; + + function sign(x) { + return ((x > 0) - (x < 0)) || +x; + } + + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); + } + + var proto$2 = Duration.prototype; + + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; + + proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); + proto$2.lang = lang; + + // Side effect imports + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports + + + hooks.version = '2.22.1'; + + setHookCallback(createLocal); + + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; + + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'YYYY-[W]WW', // + MONTH: 'YYYY-MM' // + }; + + return hooks; + +}))); + +},{}],23:[function(require,module,exports){ +"use strict"; +/* + Main function and entry point + Can be registered to a videojs instance as a plugin +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +module.exports = function (videojs) { + require('./lib/polyfills'); + + var Plugin = videojs.getPlugin('plugin'), + Utils = require('./lib/utils'), + Controls = require("./components/controls"), + AnnotationState = require("./components/annotation_state"), + EventDispatcher = require("./lib/event_dispatcher"); + + var DEFAULT_OPTIONS = Object.freeze({ + bindArrowKeys: true, + meta: { user_id: null, user_name: null }, + annotationsObjects: [], + showControls: true, + showCommentList: true, + showFullScreen: true, + showMarkerShapeAndTooltips: true, + internalCommenting: true, + startInAnnotationMode: false + }); + + return function (_Plugin) { + _inherits(AnnotationComments, _Plugin); + + function AnnotationComments(player, options) { + _classCallCheck(this, AnnotationComments); + + options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options); + + var _this = _possibleConstructorReturn(this, (AnnotationComments.__proto__ || Object.getPrototypeOf(AnnotationComments)).call(this, player, options)); + + _this.eventDispatcher = new EventDispatcher(_this); + _this.eventDispatcher.registerListenersFor(_this, 'AnnotationComments'); + + _this.player = player; + _this.meta = options.meta; + _this.options = options; + + _this._readyCallbacks = []; + + // Assign reference to this class to player for access later by components where needed + player.annotationComments = function () { + return _this; + }.bind(_this); + + // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration + // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3 + if (player.readyState() >= 3) { + _this.postLoadDataConstructor(); + } else { + player.on('loadeddata', _this.postLoadDataConstructor.bind(_this)); + } + return _this; + } + + // Additional init/setup after video data + metadata is available + + + _createClass(AnnotationComments, [{ + key: 'postLoadDataConstructor', + value: function postLoadDataConstructor() { + // setup initial state and render UI + this.annotationState = new AnnotationState(this.player); + this.annotationState.annotations = this.options.annotationsObjects; + + this.controls = new Controls(this.player, this.options.bindArrowKeys); + this.bindEvents(); + this.setBounds(false); + if (this.options.startInAnnotationMode) this.toggleAnnotationMode(); + + this.pluginReady(); + } + + // Bind needed events for interaction w/ components + + }, { + key: 'bindEvents', + value: function bindEvents() { + var _this2 = this; + + // Set player boundaries on window size change or fullscreen change + $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500)); + this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500)); + + // Remove annotation features on fullscreen if showFullScreen: false + if (!this.options.showFullScreen) { + this.player.on('fullscreenchange', function () { + if (_this2.player.isFullscreen_) { + _this2.preFullscreenAnnotationsEnabled = _this2.active; + $(_this2.player.el()).addClass('vac-disable-fullscreen'); + } else { + $(_this2.player.el()).removeClass('vac-disable-fullscreen'); + } + if (_this2.preFullscreenAnnotationsEnabled) { + // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are + // in annotation mode, toggle the mode + _this2.toggleAnnotationMode(); + } + }.bind(this)); + } + } + + // A wrapper func to make it easier to use EventDispatcher from the client + // Ex: plugin.fire(type, data); + + }, { + key: 'fire', + value: function fire(type) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + this.eventDispatcher.fire(type, data); + } + + // Toggle annotations mode on/off + + }, { + key: 'toggleAnnotationMode', + value: function toggleAnnotationMode() { + this.active = !this.active; + this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements + this.annotationState.enabled = this.active; + + if (this.active) { + this.fire("annotationModeEnabled"); + } else { + this.fire("annotationModeDisabled"); + } + + // Handle control component UI if showControls: true + if (this.options.showControls) { + if (!this.active) { + this.controls.clear(true); + } else { + this.controls.render(); + } + } + } + + // Set player UI boundaries + + }, { + key: 'setBounds', + value: function setBounds() { + var triggerChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.bounds = {}; + var $player = $(this.player.el()), + $ctrls = $player.find('.vjs-control-bar'); + + this.bounds.left = $player.offset().left; + this.bounds.top = $player.offset().top; + this.bounds.right = this.bounds.left + $player.width(); + this.bounds.bottom = this.bounds.top + $player.height(); + this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height(); + + // fires an event when bounds have changed during resizing + if (triggerChange) this.fire('playerBoundsChanged', this.bounds); + } + + // Public function to register a callback for when plugin is ready + + }, { + key: 'onReady', + value: function onReady(callback) { + if (this.eventDispatcher.pluginReady) { + return callback(); + } + this._readyCallbacks.push(callback); + } + + // Mark plugin as ready and fire any pending callbacks + + }, { + key: 'pluginReady', + value: function pluginReady() { + this.eventDispatcher.pluginReady = true; + while (this._readyCallbacks.length) { + this._readyCallbacks.pop()(); + } + } + + // Teardown all components, remove all listeners, and remove elements from DOM + + }, { + key: 'dispose', + value: function dispose() { + this.controls = this.controls.teardown(); + this.annotationState = this.annotationState.teardown(); + this.eventDispatcher = this.eventDispatcher.teardown(); + this.teardown(); + if (this.player) { + this.player.annotationComments = null; + $(this.player.el()).removeClass('vac-active'); + $(this.player.el()).find("[class^='vac-']").remove(); + } + _get(AnnotationComments.prototype.__proto__ || Object.getPrototypeOf(AnnotationComments.prototype), 'dispose', this).call(this); + } + }, { + key: 'teardown', + value: function teardown() { + if (this.player) this.player.off('fullscreenchange'); + $(window).off('resize.vac-window-resize'); + } + }]); + + return AnnotationComments; + }(Plugin); +}; + +},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":35,"./lib/polyfills":39,"./lib/utils":40}],24:[function(require,module,exports){ +"use strict"; + +var _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; }; + +var Handlebars = require("handlebars/runtime"); +exports["comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n
\n
" + alias4(container.lambda((stack1 = depth0 != null ? depth0.meta : depth0) != null ? stack1.user_name : stack1, depth0)) + "
\n
" + alias4((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "timeSince", "hash": {}, "data": data }) : helper)) + "\n   X\n
\n
\n
\n " + alias4((helpers.breaklines || depth0 && depth0.breaklines || alias2).call(alias1, depth0 != null ? depth0.body : depth0, { "name": "breaklines", "hash": {}, "data": data })) + "\n
\n
\n"; + }, "useData": true }); +exports["comment_list"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data, blockParams) { + var stack1; + + return " " + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : "") + "\n"; + }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data, blockParams) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}; + + return "
\n
\n" + ((stack1 = helpers.each.call(alias1, depth0 != null ? depth0.commentsHTML : depth0, { "name": "each", "hash": {}, "fn": container.program(1, data, 1, blockParams), "inverse": container.noop, "data": data, "blockParams": blockParams })) != null ? stack1 : "") + "
ADD REPLY
\n
\n
\n
\n
@ " + container.escapeExpression((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(alias1, { "name": "rangeStr", "hash": {}, "data": data, "blockParams": blockParams }) : helper)) + "
\n
\n DELETE | CLOSE\n
\n
\n
\n"; + }, "useData": true, "useBlockParams": true }); +exports["controls"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { + var stack1; + + return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(2, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; + }, "2": function _(container, depth0, helpers, partials, data) { + var stack1; + + return "
\n \n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showNav : depth0, { "name": "if", "hash": {}, "fn": container.program(3, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; + }, "3": function _(container, depth0, helpers, partials, data) { + return "
\n
Prev
\n
Next
\n
\n"; + }, "5": function _(container, depth0, helpers, partials, data) { + var stack1, + alias1 = depth0 != null ? depth0 : container.nullContext || {}; + + return "
\n
\n
Click and drag to select
\n
\n
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.writingComment : depth0, { "name": "if", "hash": {}, "fn": container.program(9, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); + }, "6": function _(container, depth0, helpers, partials, data) { + var stack1; + + return "
\n Select shape + range\n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.internalCommenting : depth0, { "name": "if", "hash": {}, "fn": container.program(7, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n
-1 sec
\n
+1 sec
\n
\n
\n"; + }, "7": function _(container, depth0, helpers, partials, data) { + return " \n cancel\n"; + }, "9": function _(container, depth0, helpers, partials, data) { + var helper; + + return "
\n
\n
\n
New Annotation @ " + container.escapeExpression((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "rangeStr", "hash": {}, "data": data }) : helper)) + "
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n"; + }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var stack1, + alias1 = depth0 != null ? depth0 : container.nullContext || {}; + + return ((stack1 = helpers.unless.call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "unless", "hash": {}, "fn": container.program(1, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); + }, "useData": true }); +exports["draggable_marker"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n
\n"; + }, "useData": true }); +exports["marker"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { + return "vac-ranged-marker"; + }, "3": function _(container, depth0, helpers, partials, data) { + var helper; + + return "width:" + container.escapeExpression((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "width", "hash": {}, "data": data }) : helper)) + ";"; + }, "5": function _(container, depth0, helpers, partials, data) { + var stack1; + + return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.tooltipBody : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; + }, "6": function _(container, depth0, helpers, partials, data) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n \n " + alias4((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipTime", "hash": {}, "data": data }) : helper)) + " - " + alias4((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipBody", "hash": {}, "data": data }) : helper)) + "\n \n
\n"; + }, "7": function _(container, depth0, helpers, partials, data) { + return "vac-right-side"; + }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showTooltip : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; + }, "useData": true }); +exports["marker_wrap"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + return "
\n
\n
"; + }, "useData": true }); +exports["new_comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n"; + }, "useData": true }); +exports["player_button"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + return "\n\n \n \n \n \n"; + }, "useData": true }); + +},{"handlebars/runtime":20}],25:[function(require,module,exports){ +"use strict"; +/* + Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils.js"), + CommentList = require("./comment_list"), + Marker = require("./marker"), + Comment = require("./comment"), + Shape = require("./shape"); + +module.exports = function (_PlayerUIComponent) { + _inherits(Annotation, _PlayerUIComponent); + + function Annotation(data, player) { + _classCallCheck(this, Annotation); + + var _this = _possibleConstructorReturn(this, (Annotation.__proto__ || Object.getPrototypeOf(Annotation)).call(this, player)); + + _this.id = data.id || _this.componentId; + _this.range = data.range; + _this.shape = data.shape; + _this.secondsActive = _this.buildSecondsActiveArray(); + _this.buildComments(data); + _this.buildMarker(); + _this.buildShape(); + _this.bindEvents(); + + _this.isOpen = false; + return _this; + } + + _createClass(Annotation, [{ + key: "buildComments", + value: function buildComments(data) { + this.commentList = new CommentList({ "comments": data.comments, "annotation": this }, this.player); + } + }, { + key: "buildMarker", + value: function buildMarker() { + this.marker = new Marker(this.player, this.range, this.commentList.comments[0]); + this.marker.render(); + } + }, { + key: "buildShape", + value: function buildShape() { + this.annotationShape = new Shape(this.player, this.shape); + } + + // Serialize object + + }, { + key: "bindEvents", + value: function bindEvents() { + var _this2 = this; + + this.marker.$el.on('click.vac-marker', function (e) { + return _this2.plugin.annotationState.openAnnotation(_this2, true); + }); + } + + // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state + + }, { + key: "open", + value: function open() { + var withPause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + var _this3 = this; + + var previewOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var forceSnapToStart = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + this.isOpen = true; + var snapToStart = forceSnapToStart || !Utils.isWithinRange(this.range.start, this.range.end, Math.floor(this.currentTime)); + + var showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips; + this.marker.setActive(showTooltip); + if (!previewOnly && this.plugin.options.showCommentList) { + this.commentList.render(); + } + + if (!previewOnly || previewOnly && this.plugin.options.showMarkerShapeAndTooltips) { + this.annotationShape.render(); + + if (this.shape) { + this.annotationShape.$el.on("click.vac-annotation", function () { + _this3.plugin.annotationState.openAnnotation(_this3, false, false, false); + }); + } + } + + if (withPause) this.player.pause(); + if (snapToStart) this.currentTime = this.range.start; + + this.plugin.fire('annotationOpened', { + annotation: this.data, + triggered_by_timeline: previewOnly + }); + } + + // Closes the annotation. Handles marker, commendList, shape, and AnnotationState + + }, { + key: "close", + value: function close() { + var clearActive = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (!this.isOpen) return; + this.isOpen = false; + this.marker.deactivate(); + this.commentList.teardown(false); + if (this.annotationShape.$el) this.annotationShape.$el.off("click.vac-annotation"); + this.annotationShape.teardown(); + if (clearActive) this.plugin.annotationState.clearActive(); + this.plugin.fire('annotationClosed', this.data); + } + + // For preloading an array of seconds active on initialization + // Values used to build timeMap in AnnotationState + + }, { + key: "buildSecondsActiveArray", + value: function buildSecondsActiveArray() { + var seconds = []; + if (!!this.range.end) { + for (var i = this.range.start; i <= this.range.end; i++) { + seconds.push(i); + } + } else { + var start = this.range.start; + seconds.push(start); + if (start < this.duration) seconds.push(start + 1); + } + return seconds; + } + + // Tearsdown annotation and marker, removes object from AnnotationState + + }, { + key: "teardown", + value: function teardown() { + var removeFromCollection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.close(true); + this.marker.teardown(); + if (this.commentList) this.commentList.teardown(removeFromCollection); + if (removeFromCollection) this.plugin.annotationState.removeAnnotation(this); + if (this.annotationShape) this.annotationShape.teardown(); + if (removeFromCollection) _get(Annotation.prototype.__proto__ || Object.getPrototypeOf(Annotation.prototype), "teardown", this).call(this); + } + + // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref + + }, { + key: "data", + get: function get() { + return { + id: this.id, + range: this.range, + shape: this.shape, + comments: this.commentList.data + }; + } + }, { + key: "isActive", + get: function get() { + return this.plugin.annotationState.activeAnnotation === this; + } + }], [{ + key: "newFromData", + value: function newFromData(range, shape, commentStr, plugin) { + var id = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; + + var comment = Comment.dataObj(commentStr, plugin); + if (range) range = Utils.parseIntObj(range); + if (shape) shape = Utils.parseIntObj(shape); + var data = { + id: id, + range: range, + shape: shape, + comments: [comment] + }; + return new Annotation(data, plugin.player); + } + }]); + + return Annotation; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":38,"./../lib/utils.js":40,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(require,module,exports){ +"use strict"; +/* + Component for managing the state of annotations, including showing active annotation during playback, + toggling active states for annotations, navigating annotations forward/back, etc +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Utils = require('./../lib/utils'), + PlayerComponent = require("./../lib/player_component"), + Annotation = require("./annotation"); + +module.exports = function (_PlayerComponent) { + _inherits(AnnotationState, _PlayerComponent); + + function AnnotationState(player) { + _classCallCheck(this, AnnotationState); + + var _this = _possibleConstructorReturn(this, (AnnotationState.__proto__ || Object.getPrototypeOf(AnnotationState)).call(this, player)); + + _this.initAPI(_this, 'AnnotationState'); + _this.resetData(); + _this.bindEvents(); + return _this; + } + + // sets _enabled and closes or opens annotation as needed + + + _createClass(AnnotationState, [{ + key: "bindEvents", + + + // Bind events for setting liveAnnotation on video time change + value: function bindEvents() { + this.player.on("timeupdate", Utils.throttle(this.setLiveAnnotation.bind(this), 100)); + } + + // Sort annotations by range.start + + }, { + key: "sortAnnotations", + value: function sortAnnotations() { + this._annotations.sort(function (a, b) { + return a.range.start < b.range.start ? -1 : a.range.start > b.range.start ? 1 : 0; + }); + } + + // Add a new annotation + + }, { + key: "addNewAnnotation", + value: function addNewAnnotation(annotation) { + this._annotations.push(annotation); + this.openAnnotation(annotation, true, true, false, true); + this.stateChanged(); + } + + // Create and add a annotation + + }, { + key: "createAndAddAnnotation", + value: function createAndAddAnnotation(data) { + this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew(); + + var annotation = Annotation.newFromData(data.range, data.shape, data.commentStr || "", this.plugin, data.id); + this.addNewAnnotation(annotation); + } + + // Destroy an existing annotation + + }, { + key: "destroyAnnotationById", + value: function destroyAnnotationById(id) { + var annotation = this.findAnnotation(id); + if (annotation) annotation.teardown(); + } + + // Remove an annotation + + }, { + key: "removeAnnotation", + value: function removeAnnotation(annotation) { + var id = annotation.id, + i = this._annotations.indexOf(annotation); + this._annotations.splice(i, 1); + this.stateChanged(); + this.plugin.fire('annotationDeleted', { id: id }); + } + + // Set the live annotation based on current video time + + }, { + key: "setLiveAnnotation", + value: function setLiveAnnotation() { + if (!this.enabled) return; + var time = Math.floor(this.currentTime); + + if (this.skipLiveCheck) { + if (time !== this.lastVideoTime) this.skipLiveCheck = false; + return; + } + + var matches = this.activeAnnotationsForTime(time); + if (!matches.length) return this.activeAnnotation.close(); + + // Set live annotation as the last match + var liveAnnotation = this.annotations[matches[matches.length - 1]]; + + // Special cases if this or another annotation is active + if (this.activeAnnotation.range) { + if (liveAnnotation === this.activeAnnotation) return; + // Check if the active annotation and live annotation share a start time + // Is that start time at the current playhead? + // If so, don't switch which is active. + var liveStart = liveAnnotation.range.start, + activeStart = this.activeAnnotation.range.start; + if (liveStart === activeStart && liveStart === time) return; + } + + this.openAnnotation(liveAnnotation, false, false, true); + } + + // Get all active annotations for a time (in seconds) + + }, { + key: "activeAnnotationsForTime", + value: function activeAnnotationsForTime(time) { + if (!this.annotations.length) return []; + return this.annotationTimeMap[time] || []; + } + + /* + Rebuild the annotation time map + Example: this._annotations[1] and this._annotations[3] are active during second 4 + this.annotationTimeMap = { 4: [1, 3] } + */ + + }, { + key: "rebuildAnnotationTimeMap", + value: function rebuildAnnotationTimeMap() { + var _this2 = this; + + var timeMap = {}; + this.annotations.forEach(function (annotation) { + annotation.secondsActive.forEach(function (second) { + var val = timeMap[second] || []; + val.push(_this2.annotations.indexOf(annotation)); + timeMap[second] = val; + }); + }); + this.annotationTimeMap = timeMap; + } + + // Close active annotation and remove reference in state + + }, { + key: "clearActive", + value: function clearActive() { + this.activeAnnotation.close(false); + this._activeAnnotation = null; + } + + // Open annotation with options to pause and show preview + // skipLiveCheck will short circuit setLiveAnnotation() + + }, { + key: "openAnnotation", + value: function openAnnotation(annotation) { + var skipLiveCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var pause = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + var previewOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + var forceSnapToStart = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + if (!this.plugin.active) this.plugin.toggleAnnotationMode(); + this.skipLiveCheck = skipLiveCheck; + this.clearActive(); + annotation.open(pause, previewOnly, forceSnapToStart); + this.activeAnnotation = annotation; + this.lastVideoTime = this.activeAnnotation.range.start; + } + + // Open an annotation by ID (if it exists) + + }, { + key: "openAnnotationById", + value: function openAnnotationById(id) { + var annotation = this.findAnnotation(id); + if (annotation) this.openAnnotation(annotation); + } + + // Returns annotation object given ID + + }, { + key: "findAnnotation", + value: function findAnnotation(id) { + return this.annotations.find(function (a) { + return a.id == id; + }); + } + + // Returns comment object given ID + + }, { + key: "findComment", + value: function findComment(id) { + var _ref; + + var comments = this.annotations.map(function (a) { + return a.commentList.comments; + }); + comments = (_ref = []).concat.apply(_ref, _toConsumableArray(comments)); // flatten 2d array + return comments.find(function (c) { + return c.id == id; + }); + } + + // Finds the next annotation in collection and opens it + + }, { + key: "nextAnnotation", + value: function nextAnnotation() { + if (this._activeAnnotation) { + var ind = this.annotations.indexOf(this._activeAnnotation), + nextInd = ind === this.annotations.length - 1 ? 0 : ind + 1; + return this.openAnnotation(this.annotations[nextInd], true); + } + var time = Math.floor(this.currentTime); + for (var i = 0; i < this.annotations.length; i++) { + if (this.annotations[i].range.start > time) return this.openAnnotation(this.annotations[i], true); + } + this.openAnnotation(this.annotations[0], true); + } + + // Finds the previous annotation in collection and opens it + + }, { + key: "prevAnnotation", + value: function prevAnnotation() { + if (this._activeAnnotation) { + var ind = this.annotations.indexOf(this._activeAnnotation), + nextInd = ind === 0 ? this.annotations.length - 1 : ind - 1; + return this.openAnnotation(this.annotations[nextInd], true); + } + var time = Math.floor(this.currentTime); + for (var i = this.annotations.length - 1; i >= 0; i--) { + if (this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true); + } + this.openAnnotation(this.annotations[this.annotations.length - 1], true); + } + + // Use anywhere the annotation data changes + // Cleans internal state data, updates player button, triggers configurable callback + + }, { + key: "stateChanged", + value: function stateChanged() { + this.sortAnnotations(); + this.rebuildAnnotationTimeMap(); + this.plugin.fire('onStateChanged', this.data); + } + + // Reset internal state properties + + }, { + key: "resetData", + value: function resetData() { + this.annotations = []; + this.annotationTimeMap = {}; + this.activeAnnotation = null; + this.enabled = false; + this.skipNextTimeCheck = false; + this.lastVideoTime = 0; + } + + // Remove UI and unbind events for this and child components + + }, { + key: "teardown", + value: function teardown() { + this.annotations.forEach(function (annotation) { + annotation.teardown(false); + }); + this.resetData(); + _get(AnnotationState.prototype.__proto__ || Object.getPrototypeOf(AnnotationState.prototype), "teardown", this).call(this); + } + }, { + key: "enabled", + set: function set(shouldBeEnabled) { + this._enabled = shouldBeEnabled; + if (!shouldBeEnabled) this.activeAnnotation.close(); + if (shouldBeEnabled) { + this.skipLiveCheck = false; + this.setLiveAnnotation(); + } + }, + get: function get() { + return this._enabled; + } + + // Sets _annotations w/Annoation objects from input array + + }, { + key: "annotations", + set: function set(annotationsData) { + var _this3 = this; + + this._annotations = annotationsData.map(function (a) { + return new Annotation(a, _this3.player); + }); + this.sortAnnotations(); + this.rebuildAnnotationTimeMap(); + }, + get: function get() { + return this._annotations; + } + }, { + key: "activeAnnotation", + set: function set() { + var annotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + this._activeAnnotation = annotation; + } + + // Get current active annotation or a null object with .close() + , + get: function get() { + return this._activeAnnotation || { close: function close() {} }; + } + + // Serialize data + + }, { + key: "data", + get: function get() { + return this._annotations.map(function (a) { + return a.data; + }); + } + }]); + + return AnnotationState; +}(PlayerComponent); + +},{"./../lib/player_component":37,"./../lib/utils":40,"./annotation":25}],27:[function(require,module,exports){ +"use strict"; +/* + Component for an invidual comment +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + moment = require("moment"), + templateName = 'comment'; + +module.exports = function (_PlayerUIComponent) { + _inherits(Comment, _PlayerUIComponent); + + function Comment(data, player) { + _classCallCheck(this, Comment); + + var _this = _possibleConstructorReturn(this, (Comment.__proto__ || Object.getPrototypeOf(Comment)).call(this, player)); + + _this.commentList = data.commentList; + _this.id = data.id || _this.componentId; + _this.meta = data.meta; + _this.body = data.body; + _this.timestamp = moment(data.meta.datetime).unix(); + _this.timeSince = _this.timeSince(); + + _this.$el = $(_this.render()); + return _this; + } + + // Serialize data + + + _createClass(Comment, [{ + key: "render", + value: function render() { + return this.renderTemplate(templateName, { + id: this.id, + body: this.body, + meta: this.meta, + timeSince: this.timeSince + }); + } + + // Return time since comment timestamp + + }, { + key: "timeSince", + value: function timeSince() { + return moment(this.meta.datetime).fromNow(); + } + }, { + key: "teardown", + value: function teardown() { + var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + _get(Comment.prototype.__proto__ || Object.getPrototypeOf(Comment.prototype), "teardown", this).call(this, destroy); + } + + // Return a Comment obj given body content and plugin reference + + }, { + key: "data", + get: function get() { + return { + id: this.id, + meta: this.meta, + body: this.body + }; + } + }, { + key: "HTML", + get: function get() { + return this.$el[0].outerHTML; + } + }], [{ + key: "newFromData", + value: function newFromData(body, commentList, plugin) { + var data = this.dataObj(body, plugin); + return new Comment(data, plugin.player); + } + + // Return an object with plugin data, timestamp, unique id, and body content + + }, { + key: "dataObj", + value: function dataObj(body, plugin) { + return { + meta: Object.assign({ + datetime: moment().toISOString() + }, plugin.meta), + id: Utils.guid(), + body: body + }; + } + }]); + + return Comment; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":38,"./../lib/utils":40,"moment":22}],28:[function(require,module,exports){ +"use strict"; +/* + Component for a list of comments in a visible/active annotation +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + Comment = require("./comment"), + commentListTemplateName = 'comment_list', + newCommentTemplateName = 'new_comment'; + +module.exports = function (_PlayerUIComponent) { + _inherits(CommentList, _PlayerUIComponent); + + function CommentList(data, player) { + _classCallCheck(this, CommentList); + + var _this = _possibleConstructorReturn(this, (CommentList.__proto__ || Object.getPrototypeOf(CommentList)).call(this, player)); + + _this.annotation = data.annotation; + _this.comments = data.comments.map(function (commentData) { + commentData.commentList = _this; + return new Comment(commentData, player); + }); + _this.sortComments(); + return _this; + } + + // Serialize object + + + _createClass(CommentList, [{ + key: "bindListEvents", + + + // Bind all events needed for the comment list + value: function bindListEvents() { + var _this2 = this; + + this.$el.on("click.vac-comment", ".vac-close-comment-list", function () { + return _this2.annotation.close(); + }.bind(this)) // Hide CommentList UI with close button + .on("click.vac-comment", ".vac-reply-btn", this.addNewComment.bind(this)) // Open new reply UI with reply button + .on("click.vac-comment", ".vac-delete-annotation", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button + .on("click.vac-comment", ".vac-delete-comment", this.destroyComment.bind(this)) // Delete comment with delete comment button + .on("mousewheel.vac-comment DOMMouseScroll.vac-comment", ".vac-comments-wrap", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI + } + + // Bind event listeners for new comments form + + }, { + key: "bindCommentFormEvents", + value: function bindCommentFormEvents() { + this.$newCommentForm.on("click.vac-comment", ".vac-add-controls a, .vac-video-write-new.vac-is-comment a", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link + .on("click.vac-comment", ".vac-video-write-new.vac-is-comment button", this.saveNewComment.bind(this)); // Save new comment with save button + } + + // Render CommentList UI with all comments using template + + }, { + key: "render", + value: function render() { + this.$el = $(this.renderTemplate(commentListTemplateName, { + commentsHTML: this.comments.map(function (c) { + return c.HTML; + }), + rangeStr: Utils.humanTime(this.annotation.range) + })); + + this.$player.append(this.$el); + this.$wrap = this.$UI.commentsContainer; + this.bindListEvents(); + } + + // Re-render UI on state change + + }, { + key: "reRender", + value: function reRender() { + this.teardown(false); + this.render(); + } + + // Render new comment form + + }, { + key: "addNewComment", + value: function addNewComment() { + this.$wrap.addClass(this.UI_CLASSES.active).find(".vac-comments-wrap").scrollTop(999999); + var $shapebox = this.$wrap.find(".vac-add-new-shapebox"), + width = $shapebox.outerWidth(), + top = $shapebox.position().top + 10, + right = this.$wrap.outerWidth() - ($shapebox.position().left + width); + + this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, { width: width, top: top, right: right })); + this.bindCommentFormEvents(); + this.$player.append(this.$newCommentForm); + } + + // Save comment from new comment form, update state and re-render UI + + }, { + key: "saveNewComment", + value: function saveNewComment() { + this.$wrap.removeClass(this.UI_CLASSES.active); + + var user_id = 1, + body = this.$UI.newCommentTextarea.val(); + + if (!body) return; // empty comment - TODO add validation / err message + this.createComment(body); + } + }, { + key: "createComment", + value: function createComment(body) { + var comment = Comment.newFromData(body, this, this.plugin); + this.comments.push(comment); + this.sortComments(); + + // Don't mutate UI if comment is being created for an inactive annotation (via API) + if (this.annotation.isActive) { + this.reRender(false); + this.closeNewComment(); + } + + this.plugin.annotationState.stateChanged(); + } + + // Cancel comment adding process + + }, { + key: "closeNewComment", + value: function closeNewComment() { + this.unbindCommentFormEvents(); + if (this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active); + if (this.$newCommentForm) this.$newCommentForm.remove(); + } + + // Delete a comment. If it is the only comment, delete the annotation + // Update state and re-render UI + + }, { + key: "destroyComment", + value: function destroyComment(event) { + var annotationId = this.annotation.id; + if (this.comments.length == 1) { + this.annotation.teardown(); + } else { + var commentId = this.findCommentId(event), + comment = this.comments.find(function (c) { + return c.id == commentId; + }), + i = this.comments.indexOf(comment); + this.comments.splice(i, 1); + this.reRender(); + } + + this.plugin.annotationState.stateChanged(); + } + }, { + key: "findCommentId", + value: function findCommentId(event) { + var id = typeof event.detail.id === 'undefined' ? $(event.target).closest('.vac-comment').data('id') : event.detail.id; + return id; + } + + // Prevents outer page scroll when at the top or bottom of CommentList UI + // TODO: This might need to be fine-tuned? + + }, { + key: "disablePageScroll", + value: function disablePageScroll(event) { + var $target = $(event.currentTarget), + height = $target.height(), + ogEvent = event.originalEvent, + delta = ogEvent.wheelDelta || -ogEvent.detail, + dir = delta < 0 ? "down" : "up", + scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight); + + // if scrolling into top of div + if ($target.scrollTop() < 20 && dir == "up") { + $target.stop(); + $target.animate({ scrollTop: 0 }, 100); + event.preventDefault(); + } + + // if scrolling into bottom of div + if ($target.scrollTop() > scrollDiff - 10 && dir == "down") { + $target.stop(); + $target.animate({ scrollTop: height + 40 }, 100); + event.preventDefault(); + } + } + + // Sort comments by timestamp + + }, { + key: "sortComments", + value: function sortComments() { + this.comments.sort(function (a, b) { + return a.timestamp < b.timestamp ? -1 : a.timestamp > b.timestamp ? 1 : 0; + }); + } + + // Delete the annotation + + }, { + key: "handleDeleteAnnotationClick", + value: function handleDeleteAnnotationClick(e) { + var _this3 = this; + + var $confirmEl = $("").addClass("vac-delete-confirm").text("CONFIRM"); + $confirmEl.on("click.comment", function () { + $confirmEl.off("click.comment"); + _this3.annotation.teardown(); + }); + $(e.target).replaceWith($confirmEl); + } + + // Unbind listeners for new comments form + + }, { + key: "unbindCommentFormEvents", + value: function unbindCommentFormEvents() { + if (this.$newCommentForm) this.$newCommentForm.off("click.vac-comment"); + } + + // Teardown CommentList UI, unbind events + + }, { + key: "teardown", + value: function teardown() { + var destroyComments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (this.$el) { + this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"); + } + this.comments.forEach(function (c) { + return c.teardown(destroyComments); + }); + if (destroyComments) this.comments = []; + _get(CommentList.prototype.__proto__ || Object.getPrototypeOf(CommentList.prototype), "teardown", this).call(this); + } + }, { + key: "data", + get: function get() { + return this.comments.map(function (c) { + return c.data; + }); + } + }]); + + return CommentList; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./comment":27}],29:[function(require,module,exports){ +"use strict"; +/* + Component for managing annotation "control box" in upper left of video when in annotation mode, + including all functionality to add new annotations +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + DraggableMarker = require("./draggable_marker.js"), + SelectableShape = require("./selectable_shape.js"), + PlayerButton = require("./player_button"), + Annotation = require("./annotation"), + templateName = 'controls'; + +// Control uses a "ui state" to determine how UI is rendered - this object is the base state, containing a +// default value for each item in the state +var BASE_UI_STATE = Object.freeze({ + adding: false, // Are we currently adding a new annotation? (step 1 of flow) + writingComment: false // Are we currently writing the comment for annotation (step 2 of flow) +}); + +module.exports = function (_PlayerUIComponent) { + _inherits(Controls, _PlayerUIComponent); + + function Controls(player, bindArrowKeys) { + _classCallCheck(this, Controls); + + var _this = _possibleConstructorReturn(this, (Controls.__proto__ || Object.getPrototypeOf(Controls)).call(this, player)); + + _this.initAPI(_this, 'Controls'); + + _this.internalCommenting = _this.plugin.options.internalCommenting; + _this.showControls = _this.plugin.options.showControls; + _this.uiState = Utils.cloneObject(BASE_UI_STATE); + _this.bindEvents(bindArrowKeys); + + if (_this.showControls) { + // create player button in the control bar if controls are shown + _this.playerButton = new PlayerButton(_this.player); + } + + _this.render(); + return _this; + } + + // Bind all the events we need for UI interaction + + + _createClass(Controls, [{ + key: "bindEvents", + value: function bindEvents(bindArrowKeys) { + var _this2 = this; + + this.$player.on("click.vac-controls", ".vac-controls button", this.startAddNew.bind(this)) // Add new button click + .on("click.vac-controls", ".vac-annotation-nav .vac-a-next", function () { + return _this2.plugin.annotationState.nextAnnotation(); + }) // Click 'next' on annotation nav + .on("click.vac-controls", ".vac-annotation-nav .vac-a-prev", function () { + return _this2.plugin.annotationState.prevAnnotation(); + }) // Click 'prev' on annotation nav + .on("click.vac-controls", ".vac-video-move .vac-a-next", function () { + return _this2.marker.scrubStart(1); + }) // Click '+1 sec' on marker nav + .on("click.vac-controls", ".vac-video-move .vac-a-prev", function () { + return _this2.marker.scrubStart(-1); + }); // Click '-1 sec' on marker nav + + if (this.internalCommenting) { + this.$player.on("click.vac-controls", ".vac-add-controls button", this.writeComment.bind(this)) // 'Next' button click while adding + .on("click.vac-controls", ".vac-video-write-new.vac-is-annotation button", this.saveNew.bind(this)) // 'Save' button click while adding + .on("click.vac-controls", ".vac-add-controls a, .vac-video-write-new.vac-is-annotation a", this.cancelAddNew.bind(this)); // Cancel link click + } + if (bindArrowKeys) { + $(document).on("keyup.vac-nav-" + this.playerId, function (e) { + return _this2.handleArrowKeys(e); + }); // Use arrow keys to navigate annotations + } + } + + // Remove UI and unbind events for this and child components + + }, { + key: "teardown", + value: function teardown() { + this.clear(true); + this.$player.off('click.vac-controls'); + $(document).off("keyup.vac-nav-" + this.playerId + " mousemove.vac-tooltip-" + this.playerId); + if (this.playerButton) this.playerButton.teardown(); + _get(Controls.prototype.__proto__ || Object.getPrototypeOf(Controls.prototype), "teardown", this).call(this); + } + + // Clear existing UI (resetting components if need be) + + }, { + key: "clear", + value: function clear() { + var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (reset) { + if (this.uiState.adding) { + this.restoreNormalUI(); + this.marker.teardown(); + this.selectableShape.teardown(); + } + this.uiState = Utils.cloneObject(BASE_UI_STATE); + this.$player.find('.vac-video-cover-canvas').off('mousedown.vac-cursor-tooltip').off('mouseup.vac-cursor-tooltip'); + } + this.$tooltip_ = null; + this.$UI.controlElements.remove(); + } + + // Render the UI elements (based on uiState) + + }, { + key: "render", + value: function render() { + var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this.clear(reset); + var data = Object.assign({ + rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null, + showNav: this.plugin.annotationState.annotations.length > 1 + }, this.uiState, { internalCommenting: this.internalCommenting, showControls: this.showControls }); + + var $ctrls = this.renderTemplate(templateName, data); + this.$player.append($ctrls); + + if (this.playerButton) this.playerButton.updateNumAnnotations(); + } + + // User clicked to cancel in-progress add - restore to normal state + + }, { + key: "cancelAddNew", + value: function cancelAddNew() { + if (!(this.uiState.adding || this.uiState.writingComment)) return; + this.render(true); + this.marker.teardown(); + this.marker = null; + } + + // User clicked 'add' button in the controls - setup UI and marker + + }, { + key: "startAddNew", + value: function startAddNew() { + if (!this.plugin.active) this.plugin.toggleAnnotationMode(); + + this.player.pause(); + this.setAddingUI(); + this.uiState.adding = true; + this.render(); + + // construct new range and create marker + var range = { + start: parseInt(this.currentTime, 10), + stop: parseInt(this.currentTime, 10) + }; + this.marker = new DraggableMarker(this.player, range); + this.selectableShape = new SelectableShape(this.player); + + // show cursor help text if controls are hidden + if (!this.showControls) this.bindCursorTooltip(); + + this.plugin.fire('enteredAddingAnnotation', { range: range }); + } + + // User clicked 'next' action - show UI to write comment + + }, { + key: "writeComment", + value: function writeComment() { + this.uiState.writingComment = true; + this.render(); + } + + // User clicked to save a new annotation/comment during add new flow + + }, { + key: "saveNew", + value: function saveNew() { + var comment = this.$UI.newCommentTextarea.val(); + if (!comment) return; // empty comment - TODO add validation / err message + + var a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin); + this.plugin.annotationState.addNewAnnotation(a); + + this.cancelAddNew(); + } + + // Change normal UI (hide markers, hide playback, etc) on init add state + + }, { + key: "setAddingUI", + value: function setAddingUI() { + this.plugin.annotationState.enabled = false; + this.disablePlayingAndControl(); + } + + // Restore normal UI after add state + + }, { + key: "restoreNormalUI", + value: function restoreNormalUI() { + this.plugin.annotationState.enabled = this.plugin.active; + this.enablePlayingAndControl(); + $(document).off("mousemove.vac-tooltip-" + this.playerId); + } + + // On arrow key press, navigate to next or prev Annotation + + }, { + key: "handleArrowKeys", + value: function handleArrowKeys(e) { + if (!this.plugin.active) return; + var keyId = e.which; + + if (keyId == 37) this.plugin.annotationState.prevAnnotation(); + if (keyId == 39) this.plugin.annotationState.nextAnnotation(); + } + + // Adds help text to cursor during annotation mode + + }, { + key: "bindCursorTooltip", + value: function bindCursorTooltip() { + var _this3 = this; + + this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden); + + // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct + this.plugin.setBounds(false); + $(document).on("mousemove.vac-tooltip-" + this.playerId, Utils.throttle(function (event) { + if (!_this3.plugin.bounds) return; + + var x = event.pageX, + y = event.pageY, + outOfBounds = x < _this3.plugin.bounds.left || x > _this3.plugin.bounds.right || y < _this3.plugin.bounds.top || y > _this3.plugin.bounds.bottom, + withinControls = !outOfBounds && y >= _this3.plugin.bounds.bottomWithoutControls, + markerHovered = _this3.$tooltip.hasClass('vac-marker-hover'); + + if (outOfBounds) { + _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); + return; + } + + var cursorX = x - _this3.plugin.bounds.left, + cursorY = y - _this3.plugin.bounds.top, + margin = 10, + rightEdge = _this3.$player.width(), + bottomEdge = _this3.$player.height() - _this3.$UI.controlBar.height(), + atRightEdge = cursorX + _this3.tooltipArea.width + margin * 2 >= rightEdge, + atBottomEdge = cursorY + _this3.tooltipArea.height + margin * 2 >= bottomEdge; + + // is the tooltip too close to the right or bottom edge? + var posX = atRightEdge ? rightEdge - _this3.tooltipArea.width - margin : cursorX + margin, + posY = atBottomEdge ? bottomEdge - _this3.tooltipArea.height - margin : cursorY + margin; + + // hide if the cursor is over the control bar but not hovering over the draggable marker + // also hide if mouse is down + if (withinControls && !markerHovered || _this3.$tooltip.hasClass('vac-cursor-dragging')) { + _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); + } else { + _this3.$tooltip.removeClass(_this3.UI_CLASSES.hidden); + } + + _this3.$tooltip.css({ + left: posX + "px", + top: posY + "px" + }); + }.bind(this), 50)); + } + }, { + key: "$tooltip", + get: function get() { + this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip'); + return this.$tooltip_; + } + }]); + + return Controls; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(require,module,exports){ +"use strict"; +/* + Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range + as drag occurs +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Marker = require("./marker"), + Utils = require('./../lib/utils'), + markerTemplateName = 'draggable_marker'; + +module.exports = function (_Marker) { + _inherits(DraggableMarker, _Marker); + + function DraggableMarker(player, range) { + _classCallCheck(this, DraggableMarker); + + var _this = _possibleConstructorReturn(this, (DraggableMarker.__proto__ || Object.getPrototypeOf(DraggableMarker)).call(this, player, range)); + + _this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10 + _this.templateName = markerTemplateName; // Change template from base Marker template + _this.dragging = false; // Is a drag action currently occring? + _this.rangePin = range.start; // What's the original pinned timeline point when marker was added + _this.render(); + _this.$parent = _this.$UI.markerWrap; // Set parent as marker wrap + return _this; + } + + // Bind needed evnets for UI interaction + + + _createClass(DraggableMarker, [{ + key: "bindMarkerEvents", + value: function bindMarkerEvents() { + var _this2 = this; + + // On mouse down init drag + this.$el.on('mousedown.vac-marker', function (e) { + e.preventDefault(); + _this2.dragging = true; + // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms + $(document).on("mousemove.vac-dmarker-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 250)); + + // Add drag class to cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging').removeClass('vac-marker-hover'); + } + }); + + // On mouse up end drag action and unbind mousemove event + $(document).on("mouseup.vac-dmarker-" + this.playerId, function (e) { + if (!_this2.dragging) return; + $(document).off("mousemove.vac-dmarker-" + _this2.playerId); + _this2.dragging = false; + + // Remove drag class and hover class from cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging').removeClass('vac-marker-hover'); + } + }); + + // On mouse mouse enter, show cursor tooltip if controls are not shown + // This adds the class which is picked up in Controls + if (!this.plugin.options.showControls) { + var self = this; + self.$el.on('mouseenter.vac-cursor-tool-tip', function () { + self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover'); + }).on('mouseleave.vac-cursor-tool-tip', function () { + self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover'); + }); + }; + } + + // On drag action, calculate new range and re-render marker + + }, { + key: "onDrag", + value: function onDrag(e) { + var dragPercent = this.percentValFromXpos(e.pageX), + secVal = parseInt(this.duration * dragPercent); + + if (secVal > this.rangePin) { + this.range = { + start: this.rangePin, + end: secVal + }; + } else { + this.range = { + start: secVal, + end: this.rangePin + }; + } + this.render(); + this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); + } + + // Cal percentage (of video) position for a pixel-based X position on the document + + }, { + key: "percentValFromXpos", + value: function percentValFromXpos(xpos) { + var x = Math.max(0, xpos - this.$parent.offset().left), + // px val + max = this.$parent.innerWidth(), + per = x / max; + if (per > 1) per = 1; + if (per < 0) per = 0; + return per; + } + + // Remove bound events on destructon + + }, { + key: "teardown", + value: function teardown() { + $(document).off("mousemove.vac-dmarker-" + this.playerId + " mouseup.vac-dmarker-" + this.playerId); + this.$el.off('mouseenter.vac-cursor-tool-tip'); + this.$el.off('mouseleave.vac-cursor-tool-tip'); + this.$el.off('mousedown.vac-marker'); + this.$el.remove(); + } + + // Move the video & marker start by some num seconds (pos or neg) + + }, { + key: "scrubStart", + value: function scrubStart(secondsChanged) { + var newStart = this.range.start + secondsChanged; + this.currentTime = newStart; + this.range.start = newStart; + this.rangePin = newStart; + this.teardown(); + this.render(); + + this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); + } + }]); + + return DraggableMarker; +}(Marker); + +},{"./../lib/utils":40,"./marker":31}],31:[function(require,module,exports){ +"use strict"; +/* + Component for a timeline marker with capabilities to render on timeline, including tooltip for comment +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + markerTemplateName = 'marker', + markerWrapTemplateName = 'marker_wrap'; + +module.exports = function (_PlayerUIComponent) { + _inherits(Marker, _PlayerUIComponent); + + function Marker(player, range) { + var comment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + + _classCallCheck(this, Marker); + + var _this = _possibleConstructorReturn(this, (Marker.__proto__ || Object.getPrototypeOf(Marker)).call(this, player)); + + _this.range = range; + _this.comment = comment; + _this.templateName = markerTemplateName; + + if (!_this.$UI.markerWrap.length) { + _this.$UI.timeline.append(_this.renderTemplate(markerWrapTemplateName)); + } + return _this; + } + + // Set this marker as active (highlight) and optionally show tooltip also + + + _createClass(Marker, [{ + key: "setActive", + value: function setActive() { + var showTooltip = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this.$el.addClass(this.UI_CLASSES.active); + if (showTooltip) this.$el.addClass('vac-force-tooltip'); + } + + // Deactivate this marker + + }, { + key: "deactivate", + value: function deactivate() { + this.$el.removeClass(this.UI_CLASSES.active + " vac-force-tooltip"); + } + + // Draw marker on timeline for this.range; + + }, { + key: "render", + value: function render() { + // clear existing marker if this one was already rendered + this.$UI.timeline.find("[data-marker-id=\"" + this.componentId + "\"]").remove(); + + // Bind to local instance var, add to DOM, and setup events + this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData)); + this.$UI.markerWrap.append(this.$el); + this.bindMarkerEvents(); + } + + // Bind needed events for this marker + + }, { + key: "bindMarkerEvents", + value: function bindMarkerEvents() { + var _this2 = this; + + // handle dimming other markers + highlighting this one on mouseenter/leave + this.$el.on("mouseenter.vac-marker", function () { + _this2.$el.addClass('vac-hovering').closest(".vac-marker-wrap").addClass('vac-dim-all'); + }).on("mouseleave.vac-marker", function () { + _this2.$el.removeClass('vac-hovering').closest(".vac-marker-wrap").removeClass('vac-dim-all'); + }); + } + + // Build object for template + + }, { + key: "teardown", + + + // Unbind event listeners on teardown and remove DOM nodes + value: function teardown() { + this.$el.off('mouseenter.vac-marker').off('mouseleave.vac-marker').off('click.vac-marker'); + _get(Marker.prototype.__proto__ || Object.getPrototypeOf(Marker.prototype), "teardown", this).call(this); + } + }, { + key: "markerTemplateData", + get: function get() { + // the smaller the width, the higher the z-index so overlaps are clickable + var left = this.range.start / this.duration * 100, + width = this.range.end / this.duration * 100 - left, + zIndex = 100 - Math.floor(width) || 100; + return { + left: left + '%', + width: width + '%', + zIndex: zIndex, + showTooltip: this.plugin.options.showMarkerShapeAndTooltips, + tooltipRight: left > 50, + tooltipTime: Utils.humanTime(this.range), + tooltipBody: !this.comment ? null : this.comment.body, + rangeShow: !!this.range.end, + id: this.componentId + }; + } + }]); + + return Marker; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":38,"./../lib/utils":40}],32:[function(require,module,exports){ +"use strict"; +/* + Component main 'annotation toggle' button in the player controls, including notifier for # annotations +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + templateName = "player_button"; + +module.exports = function (_PlayerUIComponent) { + _inherits(PlayerButton, _PlayerUIComponent); + + function PlayerButton(player) { + _classCallCheck(this, PlayerButton); + + var _this = _possibleConstructorReturn(this, (PlayerButton.__proto__ || Object.getPrototypeOf(PlayerButton)).call(this, player)); + + _this.render(); + + _this.initAPI(_this, 'PlayerButton'); + + _this.$el.on('click.vac-player-button', function () { + _this.plugin.toggleAnnotationMode(); + }); + return _this; + } + + // Add button to player + + + _createClass(PlayerButton, [{ + key: "render", + value: function render() { + var btn = this.player.getChild('controlBar').addChild('button', {}); + btn.controlText("Toggle Animations"); + this.$el = $(btn.el()); + this.$el.addClass('vac-player-btn').find(".vjs-icon-placeholder").html(this.renderTemplate(templateName)); + } + + // Update the number of annotations displayed in the bubble + + }, { + key: "updateNumAnnotations", + value: function updateNumAnnotations() { + var num = this.plugin.annotationState.annotations.length, + $bubble = this.$el.find("b"); + $bubble.text(num); + num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden); + } + + // Unbind event listeners on teardown and remove DOM nodes + + }, { + key: "teardown", + value: function teardown() { + this.$el.off('click.vac-player-button'); + _get(PlayerButton.prototype.__proto__ || Object.getPrototypeOf(PlayerButton.prototype), "teardown", this).call(this); + } + }]); + + return PlayerButton; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":38}],33:[function(require,module,exports){ +"use strict"; +/* + Component for a shape that can be drug/sized on top of the video while adding a new annotation +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Shape = require("./shape"), + Utils = require('./../lib/utils'); + +module.exports = function (_Shape) { + _inherits(SelectableShape, _Shape); + + function SelectableShape(player) { + _classCallCheck(this, SelectableShape); + + var _this = _possibleConstructorReturn(this, (SelectableShape.__proto__ || Object.getPrototypeOf(SelectableShape)).call(this, player)); + + _this.$parent = _this.$player.find(".vac-video-cover-canvas"); + _this.bindEvents(); + _this.dragging = false; + return _this; + } + + // Bind all needed events for drag action + + + _createClass(SelectableShape, [{ + key: "bindEvents", + value: function bindEvents() { + var _this2 = this; + + // On mousedown initialize drag + this.$parent.on("mousedown.vac-selectable-shape", function (e) { + // Check a few conditions to see if we should *not* start drag + if (!$(e.target).hasClass('vac-video-cover-canvas')) return; //didn't click on overlay + if ($(e.target).hasClass('vac-shape')) return; //user clicked on annotation + + // Remove old shape if one existed + if (_this2.$el) _this2.$el.remove(); + + // Define default starting shape (just x/y coords of where user clicked no width/height yet) + var shape = { + x1: _this2.xCoordToPercent(e.pageX), + y1: _this2.YCoordToPercent(e.pageY) + }; + shape.x2 = shape.x1; + shape.y2 = shape.y2; + _this2.shape = shape; + + // Save origin points for future use + _this2.originX = shape.x1; + _this2.originY = shape.y1; + + // Draw shape and start drag state + _this2.render(); + _this2.dragging = true; + _this2.dragMoved = false; // used to determine if user actually dragged or just clicked + + // Bind event on doc mousemove to track drag, throttled to once each 100ms + $(document).on("mousemove.vac-sshape-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 100)); + + // Add drag class to cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging'); + } + }); + + // On mouseup, if during drag cancel drag event listeners + $(document).on("mouseup.vac-sshape-" + this.playerId, function (e) { + if (!_this2.dragging) return; + + $(document).off("mousemove.vac-sshape-" + _this2.playerId); + + if (!_this2.dragMoved) { + //clear shape if it's just a click (and not a drag) + _this2.shape = null; + if (_this2.$el) _this2.$el.remove(); + } + + _this2.dragging = false; + + // Remove drag class from cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging'); + } + }); + } + + // On each interation of drag action (mouse movement), recalc position and redraw shape + + }, { + key: "onDrag", + value: function onDrag(e) { + this.dragMoved = true; + + var xPer = this.xCoordToPercent(e.pageX), + yPer = this.YCoordToPercent(e.pageY); + + if (xPer < this.originX) { + this.shape.x2 = this.originX; + this.shape.x1 = Math.max(0, xPer); + } else { + this.shape.x2 = Math.min(100, xPer); + this.shape.x1 = this.originX; + } + if (yPer < this.originY) { + this.shape.y2 = this.originY; + this.shape.y1 = Math.max(0, yPer); + } else { + this.shape.y2 = Math.min(100, yPer); + this.shape.y1 = this.originY; + } + this.setDimsFromShape(); + + this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape }); + } + + // Convert pixel-based x position (relative to document) to percentage in video + + }, { + key: "xCoordToPercent", + value: function xCoordToPercent(x) { + x = x - this.$parent.offset().left; //pixel position + var max = this.$parent.innerWidth(); + return Number((x / max * 100).toFixed(2)); //round to 2 decimal places + } + + // Convert pixel-based y position (relative to document) to percentage in video + + }, { + key: "YCoordToPercent", + value: function YCoordToPercent(y) { + y = y - this.$parent.offset().top; //pixel position + var max = this.$parent.innerHeight(); + return Number((y / max * 100).toFixed(2)); //round to 2 decimal places + } + + // Unbind events and remove element + + }, { + key: "teardown", + value: function teardown() { + this.$parent.off('mousedown.vac-selectable-shape'); + $(document).off("mouseup.vac-sshape-" + this.playerId + " mousemove.vac-sshape-" + this.playerId); + _get(SelectableShape.prototype.__proto__ || Object.getPrototypeOf(SelectableShape.prototype), "teardown", this).call(this); + } + }]); + + return SelectableShape; +}(Shape); + +},{"./../lib/utils":40,"./shape":34}],34:[function(require,module,exports){ +"use strict"; +/* + Component for managing a shape (i.e. box drawn on the player) for an annotation +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"); + +module.exports = function (_PlayerUIComponent) { + _inherits(Shape, _PlayerUIComponent); + + function Shape(player) { + var shape = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, Shape); + + var _this = _possibleConstructorReturn(this, (Shape.__proto__ || Object.getPrototypeOf(Shape)).call(this, player)); + + _this.shape = shape; + _this.$parent = _this.$player; + return _this; + } + + // Draw the shape element on the $parent + + + _createClass(Shape, [{ + key: "render", + value: function render() { + if (!this.shape) return; + if (this.$el) this.$el.remove(); + + this.$el = $("
").addClass("vac-shape"); + this.setDimsFromShape(); + this.$parent.append(this.$el); + } + + // Set/update the dimensions of the shape based on this.shape + + }, { + key: "setDimsFromShape", + value: function setDimsFromShape() { + this.$el.css({ + left: this.shape.x1 + "%", + top: this.shape.y1 + "%", + width: this.shape.x2 - this.shape.x1 + "%", + height: this.shape.y2 - this.shape.y1 + "%" + }); + } + }]); + + return Shape; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":38}],35:[function(require,module,exports){ +'use strict'; +/* + Classes for registering and handling custom events for external interaction support. + Will be bound to plugin object as a message gateway between external elements and the plugin. +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Logger = require("./logger"); + +/* + A centralized collection of event callbacks organized by component and name + Main reference for external event api + These events will be bound to the plugin on initialization of their respective components + NOTE - 'self' as second param in each function is a workaround for transpiler not properly + keeping this , so we pass in instance to use as this for each fn - can't rely on bind + because this is rewritten from symbol registry in transpiler and it's not present +*/ + +var EventRegistry = { + AnnotationState: { + openAnnotation: function openAnnotation(event, _this) { + _this.openAnnotationById(event.detail.id); + }, + closeActiveAnnotation: function closeActiveAnnotation(event, _this) { + _this.clearActive(); + }, + newAnnotation: function newAnnotation(event, _this) { + _this.createAndAddAnnotation(event.detail); + }, + destroyAnnotation: function destroyAnnotation(event, _this) { + _this.destroyAnnotationById(event.detail.id); + }, + newComment: function newComment(event, _this) { + var annotation = _this.findAnnotation(event.detail.annotationId); + if (annotation) annotation.commentList.createComment(event.detail.body); + }, + destroyComment: function destroyComment(event, _this) { + var comment = _this.findComment(event.detail.id); + if (comment) comment.commentList.destroyComment(event); + } + }, + Controls: { + addingAnnotation: function addingAnnotation(event, _this) { + _this.startAddNew(); + }, + cancelAddingAnnotation: function cancelAddingAnnotation(event, _this) { + _this.cancelAddNew(); + } + }, + PlayerButton: { + onStateChanged: function onStateChanged(event, _this) { + _this.updateNumAnnotations(); + } + }, + AnnotationComments: { + toggleAnnotationMode: function toggleAnnotationMode(event, _this) { + _this.toggleAnnotationMode(); + } + } +}; + +module.exports = function () { + function EventDispatcher(plugin) { + _classCallCheck(this, EventDispatcher); + + this.plugin = plugin; + this.pluginReady = false; + this.pendingEvts = []; + this.registeredListeners = []; + this.eventRegistry = EventRegistry; + } + + // Use the EventRegistry to mass register events on each component initialization + + + _createClass(EventDispatcher, [{ + key: "registerListenersFor", + value: function registerListenersFor(obj, className) { + var _this2 = this; + + var matchingEvents = this.eventRegistry[className]; + if (matchingEvents) { + Object.keys(matchingEvents).forEach(function (key) { + // Don't register again if already in cached collection + if (!~_this2.registeredListeners.indexOf(key)) { + var callback = matchingEvents[key].bind(obj); + _this2.registerListener(key, function (evt) { + if (!_this2.pluginReady) return; + _this2.logCallback(key, className, evt); + callback(evt, obj); + }.bind(_this2)); + } + }); + } + } + + // Bind a listener to the plugin + + }, { + key: "registerListener", + value: function registerListener(type, callback) { + this.plugin.on(type, callback); + this.registeredListeners.push(type); + } + + // Unbind a listener from the plugin + + }, { + key: "unregisterListener", + value: function unregisterListener(type) { + this.plugin.off(type); + var i = this.registeredListeners.indexOf(type); + this.registeredListeners.splice(i, 1); + } + + // Trigger an event on the plugin + + }, { + key: "fire", + value: function fire(type, data) { + if (!this.pluginReady) return; + Logger.log("evt-dispatch-FIRE", type, data); + var evt = new CustomEvent(type, { 'detail': data }); + this.plugin.trigger(evt); + } + }, { + key: "teardown", + value: function teardown() { + var _this3 = this; + + this.registeredListeners.forEach(function (type) { + _this3.unregisterListener(type); + }); + } + }, { + key: "logCallback", + value: function logCallback(eventName, className, event) { + Logger.log("evt-dispatch-RECEIVE", eventName + " (" + className + ")", event); + } + }]); + + return EventDispatcher; +}(); + +},{"./logger":36}],36:[function(require,module,exports){ +'use strict'; +/* + General logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging +*/ + +// Prefix for appending to all logger messages + +var LOG_PREFIX = "::VAC::"; + +// Are we in debug mode? +function debug() { + return !!window.VAC_DEBUG; +} + +// Build arguments for console fn, adding prefix +function buildArgs(args) { + return [LOG_PREFIX].concat(args); +} + +// Log message/data +module.exports.log = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (!debug()) return; + console.log.apply(null, buildArgs(args)); +}; + +// Error message/data +module.exports.error = function () { + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + if (!debug()) return; + console.error.apply(null, buildArgs(args)); +}; + +// Info message/data +module.exports.info = function () { + for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + if (!debug()) return; + console.info.apply(null, buildArgs(args)); +}; + +},{}],37:[function(require,module,exports){ +"use strict"; +/* + Base class all player components interit from - it includes lots of helper functions (to get reference to + the player, the plugin, video state, etc) +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +module.exports = function () { + function PlayerComponent(player) { + _classCallCheck(this, PlayerComponent); + + this._player = player; + } + + // attribute to get reference to the main plugin object (main.js instance) + + + _createClass(PlayerComponent, [{ + key: "initAPI", + + + // Register all events in the EventRegistry matching this className + value: function initAPI(obj, className) { + this.plugin.eventDispatcher.registerListenersFor(obj, className); + } + + // Nullify player reference so objects can be removed safely + // All components should call super.teardown() within their teardown funcs + + }, { + key: "teardown", + value: function teardown() { + var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (destroy) this._player = null; + } + }, { + key: "plugin", + get: function get() { + return this.player.annotationComments(); + } + + // attribute to get player javascript instance + + }, { + key: "player", + get: function get() { + return this._player; + } + + // attribute to get video duration (in seconds) + + }, { + key: "duration", + get: function get() { + return this.player.duration(); + } + + // attribute to get player current time + + }, { + key: "currentTime", + get: function get() { + return this.player.currentTime(); + } + + // set current time of player + , + set: function set(time) { + this.player.currentTime(time); + } + }]); + + return PlayerComponent; +}(); + +},{}],38:[function(require,module,exports){ +"use strict"; +/* + Base class all player UI components interit from - it includes lots of helper functions (to get reference to + the player $el, various classes/helpers, template rendering, etc) +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerComponent = require("./player_component"), + Handlebars = require('handlebars/runtime'), + Templates = require('./../compiled/templates'), + Utils = require('./../lib/utils'); + +module.exports = function (_PlayerComponent) { + _inherits(PlayerUIComponent, _PlayerComponent); + + function PlayerUIComponent(player) { + _classCallCheck(this, PlayerUIComponent); + + return _possibleConstructorReturn(this, (PlayerUIComponent.__proto__ || Object.getPrototypeOf(PlayerUIComponent)).call(this, player)); + } + + // helpers to get various UI components of the player quickly, keeping commonly reused class names + // consolidated in case of need to change in the future (and for quick access) + + + _createClass(PlayerUIComponent, [{ + key: "disablePlayingAndControl", + + + // Disable play/control actions on the current player + value: function disablePlayingAndControl() { + this.$player.addClass('vac-disable-play'); + //TODO - catch spacebar being hit + //TODO - prevent scrubbing and timeline click to seek + } + + // Enable play/control actions on the controller + + }, { + key: "enablePlayingAndControl", + value: function enablePlayingAndControl() { + this.$player.removeClass('vac-disable-play'); + } + + // Render a handlebars template with local data passed in via key/val in object + + }, { + key: "renderTemplate", + value: function renderTemplate(templateName) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + this.registerHandlebarsHelpers(); + return Templates[templateName](options); + } + + // Handle escaped breaklines in Handlebars + + }, { + key: "registerHandlebarsHelpers", + value: function registerHandlebarsHelpers() { + if ('breaklines' in Handlebars.helpers) return; + + Handlebars.registerHelper('breaklines', function (text) { + text = Handlebars.Utils.escapeExpression(text); + text = text.replace(/(\r\n|\n|\r)/gm, '
'); + return new Handlebars.SafeString(text); + }); + } + + // Provide basic teardown function to inherit + + }, { + key: "teardown", + value: function teardown() { + if (this.$el) this.$el.remove(); + _get(PlayerUIComponent.prototype.__proto__ || Object.getPrototypeOf(PlayerUIComponent.prototype), "teardown", this).call(this); + } + }, { + key: "$UI", + get: function get() { + return Object.freeze({ + commentsContainer: this.$player.find(".vac-comments-container"), // outer container for all comments + controlElements: this.$player.find(".vac-control"), // Each of multiple control elements in the control bar + newCommentTextarea: this.$player.find(".vac-video-write-new textarea"), // Textarea for writing a new comment + timeline: this.$player.find('.vjs-progress-control'), // Timeline element + markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline + controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs + markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline + coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state + }); + } + + // utility classes used in various components + + }, { + key: "UI_CLASSES", + get: function get() { + return Object.freeze({ + hidden: "vac-hidden", + active: "vac-active" + }); + } + + // attribute to get player jquery element + + }, { + key: "$player", + get: function get() { + return $(this.player.el()); + } + + // attribute to get player id from DOM + + }, { + key: "playerId", + get: function get() { + return this.$player.attr('id'); + } + + // Generate a pseudo-guid ID for this component, to use as an ID in the DOM + + }, { + key: "componentId", + get: function get() { + this.cid_ = this.cid_ || Utils.guid(); + return this.cid_; + } + }]); + + return PlayerUIComponent; +}(PlayerComponent); + +},{"./../compiled/templates":24,"./../lib/utils":40,"./player_component":37,"handlebars/runtime":20}],39:[function(require,module,exports){ +'use strict'; + +/* + Collection of polyfills neededf or IE10+ support +*/ + +// Array.prototype.find() for IE10+ +require('ie-array-find-polyfill'); +// Object.assign for IE10+ +require('es6-object-assign').polyfill(); + +// Allow use of object.constructor.staticFunc() in IE +// Not yet supported by babel +// https://gist.github.com/edoardocavazza/47246856759f2273e48b +(function () { + if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') { + var bindFunction = function bindFunction(ctx, fn) { + return function () { + return fn.apply(this, arguments); + }; + }; + + var bindProperty = function bindProperty(ctx, prop, parentDescriptor) { + if (!parentDescriptor) { + var defaultValue = ctx.__proto__[prop]; + parentDescriptor = { + get: function get() { + return ctx['__' + prop] || defaultValue; + }, + set: function set(val) { + ctx['__' + prop] = val; + } + }; + } + Object.defineProperty(ctx, prop, { + get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined, + set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined, + configurable: true + }); + }; + + var iterateProps = function iterateProps(subClass, superClass) { + var props = Object.getOwnPropertyNames(superClass), + proto; + + subClass.__proto__ = superClass; + for (var i = 0, len = props.length; i < len; i++) { + var prop = props[i]; + if (prop === '__proto__') { + proto = superClass[prop]; + } else if (_exclude.indexOf(i) === -1) { + var descriptor = Object.getOwnPropertyDescriptor(subClass, prop); + if (!descriptor) { + var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop); + if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') { + subClass[prop] = bindFunction(subClass, superClass[prop]); + } else if (typeof superDescriptor.get == 'function') { + bindProperty(subClass, prop, superDescriptor); + } else { + bindProperty(subClass, prop); + } + } + } + } + if (proto) { + iterateProps(subClass, proto); + } + }; + + var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype']; + + Object.setPrototypeOf = iterateProps; + } +})(); + +// Use CustomEvent in IE +(function () { + if (typeof window.CustomEvent === "function") return false; + + function CustomEvent(event, params) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } + + CustomEvent.prototype = window.Event.prototype; + + window.CustomEvent = CustomEvent; +})(); + +},{"es6-object-assign":1,"ie-array-find-polyfill":21}],40:[function(require,module,exports){ +"use strict"; +/* + Geneal utility functions, sourced from underscore & scratch built as needed +*/ + +module.exports = { + + // Clone an object + cloneObject: function cloneObject(obj) { + return Object.assign({}, obj); + }, + + // _throttle from underscore + throttle: function throttle(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function later() { + previous = options.leading === false ? 0 : Date.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function () { + var now = Date.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + + // Parse all keys of an object to int + parseIntObj: function parseIntObj(obj) { + Object.keys(obj).forEach(function (key) { + if (parseInt(obj[key])) { + obj[key] = parseInt(obj[key]); + } + }); + return obj; + }, + + // Convert a range {start: int, (optional) end: int} to human readable time + humanTime: function humanTime(range) { + function readable(sec) { + var mins = Math.floor(sec / 60), + secs = String(sec % 60); + return mins + ":" + (secs.length == 1 ? "0" : "") + secs; + } + var time = [readable(range.start)]; + if (range.end) time.push(readable(range.end)); + return time.join("-"); + }, + + // Pseduo-random guid generator + guid: function guid() { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); + } + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); + }, + + // Returns the height and width of an element that is not visible + // clones el and tricks DOM into rendering it w the correct size + // beware the container may be important for scoped styles + areaOfHiddenEl: function areaOfHiddenEl($el, $container) { + var hideClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + + var $clone = $el.clone(), + data = {}; + $clone.css({ + visibility: 'hidden', + display: 'inline-block' + }); + $clone.removeClass(hideClass); + $container.append($clone); + data.width = $clone.outerWidth(); + data.height = $clone.outerHeight(); + $clone.remove(); + + return data; + }, + + // Determine if a value (n) is within a range (start <= n <= end) + isWithinRange: function isWithinRange(start, end, n) { + end = end || start + 1; // for ranges with NO end defined, assume a 1s range + return n >= start && n <= end; + } +}; + +},{}]},{},[23])(23) +}); + +//# sourceMappingURL=videojs-annotation-comments.cjs.js.map diff --git a/build/videojs-annotation-comments.cjs.js.map b/build/videojs-annotation-comments.cjs.js.map new file mode 100644 index 0000000..4e01399 --- /dev/null +++ b/build/videojs-annotation-comments.cjs.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/es6-object-assign/index.js","node_modules/handlebars/lib/handlebars.runtime.js","node_modules/handlebars/lib/handlebars/base.js","node_modules/handlebars/lib/handlebars/decorators.js","node_modules/handlebars/lib/handlebars/decorators/inline.js","node_modules/handlebars/lib/handlebars/exception.js","node_modules/handlebars/lib/handlebars/helpers.js","node_modules/handlebars/lib/handlebars/helpers/block-helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/each.js","node_modules/handlebars/lib/handlebars/helpers/helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/if.js","node_modules/handlebars/lib/handlebars/helpers/log.js","node_modules/handlebars/lib/handlebars/helpers/lookup.js","node_modules/handlebars/lib/handlebars/helpers/with.js","node_modules/handlebars/lib/handlebars/logger.js","node_modules/handlebars/dist/cjs/handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js","node_modules/handlebars/lib/handlebars/runtime.js","node_modules/handlebars/lib/handlebars/safe-string.js","node_modules/handlebars/lib/handlebars/utils.js","node_modules/handlebars/runtime.js","node_modules/ie-array-find-polyfill/index.js","node_modules/moment/moment.js","src/js/annotation_comments.js","src/js/compiled/templates.js","src/js/components/annotation.js","src/js/components/annotation_state.js","src/js/components/comment.js","src/js/components/comment_list.js","src/js/components/controls.js","src/js/components/draggable_marker.js","src/js/components/marker.js","src/js/components/player_button.js","src/js/components/selectable_shape.js","src/js/components/shape.js","src/js/lib/event_dispatcher.js","src/js/lib/logger.js","src/js/lib/player_component.js","src/js/lib/player_ui_component.js","src/js/lib/polyfills.js","src/js/lib/utils.js"],"names":[],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC15IA;AACA;;;;;;;;;;;;;;;AAKA,OAAO,OAAP,GAAiB,UAAC,OAAD,EAAa;AAC1B,YAAQ,iBAAR;;AAEA,QAAM,SAAS,QAAQ,SAAR,CAAkB,QAAlB,CAAf;AAAA,QACM,QAAQ,QAAQ,aAAR,CADd;AAAA,QAEM,WAAW,QAAQ,uBAAR,CAFjB;AAAA,QAGM,kBAAkB,QAAQ,+BAAR,CAHxB;AAAA,QAIM,kBAAkB,QAAQ,wBAAR,CAJxB;;AAMA,QAAM,kBAAkB,OAAO,MAAP,CAAc;AAClC,uBAA4B,IADM;AAElC,cAA4B,EAAE,SAAS,IAAX,EAAiB,WAAW,IAA5B,EAFM;AAGlC,4BAA4B,EAHM;AAIlC,sBAA4B,IAJM;AAKlC,yBAA4B,IALM;AAMlC,wBAA4B,IANM;AAOlC,oCAA4B,IAPM;AAQlC,4BAA4B,IARM;AASlC,+BAA4B;AATM,KAAd,CAAxB;;AAYA;AAAA;;AAEI,oCAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC1B,sBAAU,OAAO,MAAP,CAAc,MAAM,WAAN,CAAkB,eAAlB,CAAd,EAAkD,OAAlD,CAAV;;AAD0B,gJAEpB,MAFoB,EAEZ,OAFY;;AAI1B,kBAAK,eAAL,GAAuB,IAAI,eAAJ,OAAvB;AACA,kBAAK,eAAL,CAAqB,oBAArB,QAAgD,oBAAhD;;AAEA,kBAAK,MAAL,GAAc,MAAd;AACA,kBAAK,IAAL,GAAY,QAAQ,IAApB;AACA,kBAAK,OAAL,GAAe,OAAf;;AAEA,kBAAK,eAAL,GAAuB,EAAvB;;AAEA;AACA,mBAAO,kBAAP,GAA6B,YAAM;AAAE;AAAa,aAAtB,CAAwB,IAAxB,OAA5B;;AAEA;AACA;AACA,gBAAG,OAAO,UAAP,MAAuB,CAA1B,EAA4B;AACxB,sBAAK,uBAAL;AACH,aAFD,MAEK;AACD,uBAAO,EAAP,CAAU,YAAV,EAAwB,MAAK,uBAAL,CAA6B,IAA7B,OAAxB;AACH;AAtByB;AAuB7B;;AAED;;;AA3BJ;AAAA;AAAA,sDA4B+B;AACvB;AACA,qBAAK,eAAL,GAAuB,IAAI,eAAJ,CAAoB,KAAK,MAAzB,CAAvB;AACA,qBAAK,eAAL,CAAqB,WAArB,GAAmC,KAAK,OAAL,CAAa,kBAAhD;;AAEA,qBAAK,QAAL,GAAgB,IAAI,QAAJ,CAAa,KAAK,MAAlB,EAA0B,KAAK,OAAL,CAAa,aAAvC,CAAhB;AACA,qBAAK,UAAL;AACA,qBAAK,SAAL,CAAe,KAAf;AACA,oBAAG,KAAK,OAAL,CAAa,qBAAhB,EAAuC,KAAK,oBAAL;;AAEvC,qBAAK,WAAL;AACH;;AAED;;AAzCJ;AAAA;AAAA,yCA0CkB;AAAA;;AACV;AACA,kBAAE,MAAF,EAAU,EAAV,CAAa,0BAAb,EAAyC,MAAM,QAAN,CAAe,KAAK,SAAL,CAAe,IAAf,CAAoB,IAApB,CAAf,EAA0C,GAA1C,CAAzC;AACA,qBAAK,MAAL,CAAY,EAAZ,CAAe,kBAAf,EAAmC,MAAM,QAAN,CAAe,KAAK,SAAL,CAAe,IAAf,CAAoB,IAApB,CAAf,EAA0C,GAA1C,CAAnC;;AAEA;AACA,oBAAI,CAAC,KAAK,OAAL,CAAa,cAAlB,EAAkC;AAC9B,yBAAK,MAAL,CAAY,EAAZ,CAAe,kBAAf,EAAoC,YAAM;AACtC,4BAAI,OAAK,MAAL,CAAY,aAAhB,EAA+B;AAC3B,mCAAK,+BAAL,GAAuC,OAAK,MAA5C;AACA,8BAAE,OAAK,MAAL,CAAY,EAAZ,EAAF,EAAoB,QAApB,CAA6B,wBAA7B;AACH,yBAHD,MAGO;AACH,8BAAE,OAAK,MAAL,CAAY,EAAZ,EAAF,EAAoB,WAApB,CAAgC,wBAAhC;AACH;AACD,4BAAG,OAAK,+BAAR,EAAwC;AACpC;AACA;AACA,mCAAK,oBAAL;AACH;AACJ,qBAZkC,CAYhC,IAZgC,CAY3B,IAZ2B,CAAnC;AAaH;AACJ;;AAED;AACA;;AAlEJ;AAAA;AAAA,iCAmEU,IAnEV,EAmEyB;AAAA,oBAAT,IAAS,uEAAJ,EAAI;;AACjB,qBAAK,eAAL,CAAqB,IAArB,CAA0B,IAA1B,EAAgC,IAAhC;AACH;;AAED;;AAvEJ;AAAA;AAAA,mDAwE2B;AACnB,qBAAK,MAAL,GAAc,CAAC,KAAK,MAApB;AACA,qBAAK,MAAL,CAAY,WAAZ,CAAwB,YAAxB,EAFmB,CAEoB;AACvC,qBAAK,eAAL,CAAqB,OAArB,GAA+B,KAAK,MAApC;;AAEA,oBAAG,KAAK,MAAR,EAAe;AACX,yBAAK,IAAL,CAAU,uBAAV;AACH,iBAFD,MAEK;AACD,yBAAK,IAAL,CAAU,wBAAV;AACH;;AAED;AACA,oBAAG,KAAK,OAAL,CAAa,YAAhB,EAA6B;AACzB,wBAAG,CAAC,KAAK,MAAT,EAAgB;AACZ,6BAAK,QAAL,CAAc,KAAd,CAAoB,IAApB;AACH,qBAFD,MAEK;AACD,6BAAK,QAAL,CAAc,MAAd;AACH;AACJ;AACJ;;AAED;;AA7FJ;AAAA;AAAA,wCA8FmC;AAAA,oBAApB,aAAoB,uEAAN,IAAM;;AAC3B,qBAAK,MAAL,GAAc,EAAd;AACA,oBAAI,UAAU,EAAE,KAAK,MAAL,CAAY,EAAZ,EAAF,CAAd;AAAA,oBACI,SAAU,QAAQ,IAAR,CAAa,kBAAb,CADd;;AAGA,qBAAK,MAAL,CAAY,IAAZ,GAAmB,QAAQ,MAAR,GAAiB,IAApC;AACA,qBAAK,MAAL,CAAY,GAAZ,GAAkB,QAAQ,MAAR,GAAiB,GAAnC;AACA,qBAAK,MAAL,CAAY,KAAZ,GAAoB,KAAK,MAAL,CAAY,IAAZ,GAAmB,QAAQ,KAAR,EAAvC;AACA,qBAAK,MAAL,CAAY,MAAZ,GAAqB,KAAK,MAAL,CAAY,GAAZ,GAAkB,QAAQ,MAAR,EAAvC;AACA,qBAAK,MAAL,CAAY,qBAAZ,GAAoC,KAAK,MAAL,CAAY,MAAZ,GAAqB,OAAO,MAAP,EAAzD;;AAEA;AACA,oBAAG,aAAH,EAAkB,KAAK,IAAL,CAAU,qBAAV,EAAiC,KAAK,MAAtC;AACrB;;AAED;;AA7GJ;AAAA;AAAA,oCA8Ga,QA9Gb,EA8GuB;AACf,oBAAG,KAAK,eAAL,CAAqB,WAAxB,EAAoC;AAChC,2BAAO,UAAP;AACH;AACD,qBAAK,eAAL,CAAqB,IAArB,CAA0B,QAA1B;AACH;;AAED;;AArHJ;AAAA;AAAA,0CAsHmB;AACX,qBAAK,eAAL,CAAqB,WAArB,GAAmC,IAAnC;AACA,uBAAM,KAAK,eAAL,CAAqB,MAA3B,EAAkC;AAC9B,yBAAK,eAAL,CAAqB,GAArB;AACH;AACJ;;AAED;;AA7HJ;AAAA;AAAA,sCA8He;AACP,qBAAK,QAAL,GAAgB,KAAK,QAAL,CAAc,QAAd,EAAhB;AACA,qBAAK,eAAL,GAAuB,KAAK,eAAL,CAAqB,QAArB,EAAvB;AACA,qBAAK,eAAL,GAAuB,KAAK,eAAL,CAAqB,QAArB,EAAvB;AACA,qBAAK,QAAL;AACA,oBAAG,KAAK,MAAR,EAAgB;AACZ,yBAAK,MAAL,CAAY,kBAAZ,GAAiC,IAAjC;AACA,sBAAE,KAAK,MAAL,CAAY,EAAZ,EAAF,EAAoB,WAApB,CAAgC,YAAhC;AACA,sBAAE,KAAK,MAAL,CAAY,EAAZ,EAAF,EAAoB,IAApB,CAAyB,iBAAzB,EAA4C,MAA5C;AACH;AACD;AACH;AAzIL;AAAA;AAAA,uCA2IgB;AACR,oBAAG,KAAK,MAAR,EAAgB,KAAK,MAAL,CAAY,GAAZ,CAAgB,kBAAhB;AAChB,kBAAE,MAAF,EAAU,GAAV,CAAc,0BAAd;AACH;AA9IL;;AAAA;AAAA,MAAwC,MAAxC;AAgJH,CArKD;;;;;;;ACNA,IAAI,aAAa,QAAQ,oBAAR,CAAjB;AACC,QAAQ,SAAR,IAAqB,WAAW,QAAX,CAAoB,EAAC,YAAW,CAAC,CAAD,EAAG,UAAH,CAAZ,EAA2B,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACzH,YAAI,MAAJ;AAAA,YAAY,MAAZ;AAAA,YAAoB,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAA/E;AAAA,YAAoF,SAAO,QAAQ,aAAnG;AAAA,YAAkH,SAAO,UAAzH;AAAA,YAAqI,SAAO,UAAU,gBAAtJ;;AAEF,eAAO,0CACH,QAAS,SAAS,CAAC,SAAS,QAAQ,EAAR,KAAe,UAAU,IAAV,GAAiB,OAAO,EAAxB,GAA6B,MAA5C,CAAV,KAAkE,IAAlE,GAAyE,MAAzE,GAAkF,MAA5F,EAAqG,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,QAAO,IAA9B,EAAnB,CAA3B,GAAqF,MAAlM,EADG,GAEH,gFAFG,GAGH,OAAO,UAAU,MAAV,CAAkB,CAAC,SAAU,UAAU,IAAV,GAAiB,OAAO,IAAxB,GAA+B,MAA1C,KAAsD,IAAtD,GAA6D,OAAO,SAApE,GAAgF,MAAlG,EAA2G,MAA3G,CAAP,CAHG,GAIH,2CAJG,GAKH,QAAS,SAAS,CAAC,SAAS,QAAQ,SAAR,KAAsB,UAAU,IAAV,GAAiB,OAAO,SAAxB,GAAoC,MAA1D,CAAV,KAAgF,IAAhF,GAAuF,MAAvF,GAAgG,MAA1G,EAAmH,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,WAAR,EAAoB,QAAO,EAA3B,EAA8B,QAAO,IAArC,EAAnB,CAA3B,GAA4F,MAAvN,EALG,GAMH,iIANG,GAOH,OAAO,CAAC,QAAQ,UAAR,IAAuB,UAAU,OAAO,UAAxC,IAAuD,MAAxD,EAAgE,IAAhE,CAAqE,MAArE,EAA6E,UAAU,IAAV,GAAiB,OAAO,IAAxB,GAA+B,MAA5G,EAAoH,EAAC,QAAO,YAAR,EAAqB,QAAO,EAA5B,EAA+B,QAAO,IAAtC,EAApH,CAAP,CAPG,GAQH,sBARJ;AASD,KAZyC,EAYxC,WAAU,IAZ8B,EAApB,CAArB;AAaD,QAAQ,cAAR,IAA0B,WAAW,QAAX,CAAoB,EAAC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAgD,WAAhD,EAA6D;AAC5G,YAAI,MAAJ;;AAEF,eAAO,YACF,CAAC,SAAS,UAAU,MAAV,CAAiB,YAAY,CAAZ,EAAe,CAAf,CAAjB,EAAoC,MAApC,CAAV,KAA0D,IAA1D,GAAiE,MAAjE,GAA0E,EADxE,IAEH,IAFJ;AAGD,KAN6C,EAM5C,YAAW,CAAC,CAAD,EAAG,UAAH,CANiC,EAMlB,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAgD,WAAhD,EAA6D;AAC5F,YAAI,MAAJ;AAAA,YAAY,MAAZ;AAAA,YAAoB,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAA/E;;AAEF,eAAO,mFACF,CAAC,SAAS,QAAQ,IAAR,CAAa,IAAb,CAAkB,MAAlB,EAA0B,UAAU,IAAV,GAAiB,OAAO,YAAxB,GAAuC,MAAjE,EAAyE,EAAC,QAAO,MAAR,EAAe,QAAO,EAAtB,EAAyB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,EAA8B,WAA9B,CAA9B,EAAyE,WAAU,UAAU,IAA7F,EAAkG,QAAO,IAAzG,EAA8G,eAAc,WAA5H,EAAzE,CAAV,KAAiO,IAAjO,GAAwO,MAAxO,GAAiP,EAD/O,IAEH,2MAFG,GAGH,UAAU,gBAAV,EAA6B,SAAS,CAAC,SAAS,QAAQ,QAAR,KAAqB,UAAU,IAAV,GAAiB,OAAO,QAAxB,GAAmC,MAAxD,CAAV,KAA8E,IAA9E,GAAqF,MAArF,GAA8F,QAAQ,aAAhH,EAAgI,OAAO,MAAP,KAAkB,UAAlB,GAA+B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,UAAR,EAAmB,QAAO,EAA1B,EAA6B,QAAO,IAApC,EAAyC,eAAc,WAAvD,EAAnB,CAA/B,GAAyH,MAArR,EAHG,GAIH,sLAJJ;AAKD,KAd6C,EAc5C,WAAU,IAdkC,EAc7B,kBAAiB,IAdY,EAApB,CAA1B;AAeA,QAAQ,UAAR,IAAsB,WAAW,QAAX,CAAoB,EAAC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AAC5F,YAAI,MAAJ;;AAEF,eAAQ,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE,EAA4E,UAAU,IAAV,GAAiB,OAAO,YAAxB,GAAuC,MAAnH,EAA2H,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAA3H,CAAV,KAA0O,IAA1O,GAAiP,MAAjP,GAA0P,EAAlQ;AACD,KAJyC,EAIxC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,YAAI,MAAJ;;AAEF,eAAO,iHACF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE,EAA4E,UAAU,IAAV,GAAiB,OAAO,OAAxB,GAAkC,MAA9G,EAAsH,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAAtH,CAAV,KAAqO,IAArO,GAA4O,MAA5O,GAAqP,EADnP,IAEH,kBAFJ;AAGD,KAVyC,EAUxC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,eAAO,kMAAP;AACH,KAZyC,EAYxC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,YAAI,MAAJ;AAAA,YAAY,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE;;AAEF,eAAO,6NACF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,MAAnB,EAA2B,UAAU,IAAV,GAAiB,OAAO,YAAxB,GAAuC,MAAlE,EAA0E,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAA1E,CAAV,KAAyL,IAAzL,GAAgM,MAAhM,GAAyM,EADvM,IAEH,IAFG,IAGF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,MAAnB,EAA2B,UAAU,IAAV,GAAiB,OAAO,cAAxB,GAAyC,MAApE,EAA4E,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAA5E,CAAV,KAA2L,IAA3L,GAAkM,MAAlM,GAA2M,EAHzM,CAAP;AAID,KAnByC,EAmBxC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,YAAI,MAAJ;;AAEF,eAAO,qGACF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE,EAA4E,UAAU,IAAV,GAAiB,OAAO,kBAAxB,GAA6C,MAAzH,EAAiI,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAAjI,CAAV,KAAgP,IAAhP,GAAuP,MAAvP,GAAgQ,EAD9P,IAEH,kMAFJ;AAGD,KAzByC,EAyBxC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,eAAO,iGAAP;AACH,KA3ByC,EA2BxC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,YAAI,MAAJ;;AAEF,eAAO,6MACH,UAAU,gBAAV,EAA6B,SAAS,CAAC,SAAS,QAAQ,QAAR,KAAqB,UAAU,IAAV,GAAiB,OAAO,QAAxB,GAAmC,MAAxD,CAAV,KAA8E,IAA9E,GAAqF,MAArF,GAA8F,QAAQ,aAAhH,EAAgI,OAAO,MAAP,KAAkB,UAAlB,GAA+B,OAAO,IAAP,CAAY,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAhE,EAAoE,EAAC,QAAO,UAAR,EAAmB,QAAO,EAA1B,EAA6B,QAAO,IAApC,EAApE,CAA/B,GAAgJ,MAA5S,EADG,GAEH,4ZAFJ;AAGD,KAjCyC,EAiCxC,YAAW,CAAC,CAAD,EAAG,UAAH,CAjC6B,EAiCd,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AAChF,YAAI,MAAJ;AAAA,YAAY,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE;;AAEF,eAAO,CAAC,CAAC,SAAS,QAAQ,MAAR,CAAe,IAAf,CAAoB,MAApB,EAA4B,UAAU,IAAV,GAAiB,OAAO,MAAxB,GAAiC,MAA7D,EAAqE,EAAC,QAAO,QAAR,EAAiB,QAAO,EAAxB,EAA2B,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAAhC,EAA8D,WAAU,UAAU,IAAlF,EAAuF,QAAO,IAA9F,EAArE,CAAV,KAAwL,IAAxL,GAA+L,MAA/L,GAAwM,EAAzM,IACH,IADG,IAEF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,MAAnB,EAA2B,UAAU,IAAV,GAAiB,OAAO,MAAxB,GAAiC,MAA5D,EAAoE,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAApE,CAAV,KAAmL,IAAnL,GAA0L,MAA1L,GAAmM,EAFjM,CAAP;AAGD,KAvCyC,EAuCxC,WAAU,IAvC8B,EAApB,CAAtB;AAwCA,QAAQ,kBAAR,IAA8B,WAAW,QAAX,CAAoB,EAAC,YAAW,CAAC,CAAD,EAAG,UAAH,CAAZ,EAA2B,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACjI,YAAI,MAAJ;AAAA,YAAY,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE;AAAA,YAA4E,SAAO,QAAQ,aAA3F;AAAA,YAA0G,SAAO,UAAjH;AAAA,YAA6H,SAAO,UAAU,gBAA9I;;AAEF,eAAO,2BACH,QAAS,SAAS,CAAC,SAAS,QAAQ,EAAR,KAAe,UAAU,IAAV,GAAiB,OAAO,EAAxB,GAA6B,MAA5C,CAAV,KAAkE,IAAlE,GAAyE,MAAzE,GAAkF,MAA5F,EAAqG,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,QAAO,IAA9B,EAAnB,CAA3B,GAAqF,MAAlM,EADG,GAEH,oEAFG,GAGH,QAAS,SAAS,CAAC,SAAS,QAAQ,IAAR,KAAiB,UAAU,IAAV,GAAiB,OAAO,IAAxB,GAA+B,MAAhD,CAAV,KAAsE,IAAtE,GAA6E,MAA7E,GAAsF,MAAhG,EAAyG,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,MAAR,EAAe,QAAO,EAAtB,EAAyB,QAAO,IAAhC,EAAnB,CAA3B,GAAuF,MAAxM,EAHG,GAIH,UAJG,GAKH,QAAS,SAAS,CAAC,SAAS,QAAQ,KAAR,KAAkB,UAAU,IAAV,GAAiB,OAAO,KAAxB,GAAgC,MAAlD,CAAV,KAAwE,IAAxE,GAA+E,MAA/E,GAAwF,MAAlG,EAA2G,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,OAAR,EAAgB,QAAO,EAAvB,EAA0B,QAAO,IAAjC,EAAnB,CAA3B,GAAwF,MAA3M,EALG,GAMH,gBANJ;AAOD,KAViD,EAUhD,WAAU,IAVsC,EAApB,CAA9B;AAWA,QAAQ,QAAR,IAAoB,WAAW,QAAX,CAAoB,EAAC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AAC1F,eAAO,mBAAP;AACH,KAFuC,EAEtC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,YAAI,MAAJ;;AAEF,eAAO,WACH,UAAU,gBAAV,EAA6B,SAAS,CAAC,SAAS,QAAQ,KAAR,KAAkB,UAAU,IAAV,GAAiB,OAAO,KAAxB,GAAgC,MAAlD,CAAV,KAAwE,IAAxE,GAA+E,MAA/E,GAAwF,QAAQ,aAA1G,EAA0H,OAAO,MAAP,KAAkB,UAAlB,GAA+B,OAAO,IAAP,CAAY,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAhE,EAAoE,EAAC,QAAO,OAAR,EAAgB,QAAO,EAAvB,EAA0B,QAAO,IAAjC,EAApE,CAA/B,GAA6I,MAAnS,EADG,GAEH,GAFJ;AAGD,KARuC,EAQtC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,YAAI,MAAJ;;AAEF,eAAQ,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE,EAA4E,UAAU,IAAV,GAAiB,OAAO,WAAxB,GAAsC,MAAlH,EAA0H,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAA1H,CAAV,KAAyO,IAAzO,GAAgP,MAAhP,GAAyP,EAAjQ;AACD,KAZuC,EAYtC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,YAAI,MAAJ;AAAA,YAAY,MAAZ;AAAA,YAAoB,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAA/E;AAAA,YAAoF,SAAO,QAAQ,aAAnG;AAAA,YAAkH,SAAO,UAAzH;AAAA,YAAqI,SAAO,UAAU,gBAAtJ;;AAEF,eAAO,mEACF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,MAAnB,EAA2B,UAAU,IAAV,GAAiB,OAAO,YAAxB,GAAuC,MAAlE,EAA0E,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAA1E,CAAV,KAAyL,IAAzL,GAAgM,MAAhM,GAAyM,EADvM,IAEH,8BAFG,GAGH,QAAS,SAAS,CAAC,SAAS,QAAQ,WAAR,KAAwB,UAAU,IAAV,GAAiB,OAAO,WAAxB,GAAsC,MAA9D,CAAV,KAAoF,IAApF,GAA2F,MAA3F,GAAoG,MAA9G,EAAuH,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,aAAR,EAAsB,QAAO,EAA7B,EAAgC,QAAO,IAAvC,EAAnB,CAA3B,GAA8F,MAA7N,EAHG,GAIH,SAJG,GAKH,QAAS,SAAS,CAAC,SAAS,QAAQ,WAAR,KAAwB,UAAU,IAAV,GAAiB,OAAO,WAAxB,GAAsC,MAA9D,CAAV,KAAoF,IAApF,GAA2F,MAA3F,GAAoG,MAA9G,EAAuH,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,aAAR,EAAsB,QAAO,EAA7B,EAAgC,QAAO,IAAvC,EAAnB,CAA3B,GAA8F,MAA7N,EALG,GAMH,iDANJ;AAOD,KAtBuC,EAsBtC,KAAI,WAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AACnD,eAAO,gBAAP;AACH,KAxBuC,EAwBtC,YAAW,CAAC,CAAD,EAAG,UAAH,CAxB2B,EAwBZ,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AAChF,YAAI,MAAJ;AAAA,YAAY,MAAZ;AAAA,YAAoB,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAA/E;AAAA,YAAoF,SAAO,QAAQ,aAAnG;AAAA,YAAkH,SAAO,UAAzH;AAAA,YAAqI,SAAO,UAAU,gBAAtJ;;AAEF,eAAO,2BACH,QAAS,SAAS,CAAC,SAAS,QAAQ,EAAR,KAAe,UAAU,IAAV,GAAiB,OAAO,EAAxB,GAA6B,MAA5C,CAAV,KAAkE,IAAlE,GAAyE,MAAzE,GAAkF,MAA5F,EAAqG,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,QAAO,IAA9B,EAAnB,CAA3B,GAAqF,MAAlM,EADG,GAEH,wBAFG,IAGF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,MAAnB,EAA2B,UAAU,IAAV,GAAiB,OAAO,SAAxB,GAAoC,MAA/D,EAAuE,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAAvE,CAAV,KAAsL,IAAtL,GAA6L,MAA7L,GAAsM,EAHpM,IAIH,mBAJG,GAKH,QAAS,SAAS,CAAC,SAAS,QAAQ,IAAR,KAAiB,UAAU,IAAV,GAAiB,OAAO,IAAxB,GAA+B,MAAhD,CAAV,KAAsE,IAAtE,GAA6E,MAA7E,GAAsF,MAAhG,EAAyG,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,MAAR,EAAe,QAAO,EAAtB,EAAyB,QAAO,IAAhC,EAAnB,CAA3B,GAAuF,MAAxM,EALG,GAMH,IANG,IAOF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,MAAnB,EAA2B,UAAU,IAAV,GAAiB,OAAO,SAAxB,GAAoC,MAA/D,EAAuE,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAAvE,CAAV,KAAsL,IAAtL,GAA6L,MAA7L,GAAsM,EAPpM,IAQH,YARG,GASH,QAAS,SAAS,CAAC,SAAS,QAAQ,MAAR,KAAmB,UAAU,IAAV,GAAiB,OAAO,MAAxB,GAAiC,MAApD,CAAV,KAA0E,IAA1E,GAAiF,MAAjF,GAA0F,MAApG,EAA6G,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,QAAR,EAAiB,QAAO,EAAxB,EAA2B,QAAO,IAAlC,EAAnB,CAA3B,GAAyF,MAA9M,EATG,GAUH,OAVG,IAWF,CAAC,SAAS,QAAQ,IAAR,EAAc,IAAd,CAAmB,MAAnB,EAA2B,UAAU,IAAV,GAAiB,OAAO,WAAxB,GAAsC,MAAjE,EAAyE,EAAC,QAAO,IAAR,EAAa,QAAO,EAApB,EAAuB,MAAK,UAAU,OAAV,CAAkB,CAAlB,EAAqB,IAArB,EAA2B,CAA3B,CAA5B,EAA0D,WAAU,UAAU,IAA9E,EAAmF,QAAO,IAA1F,EAAzE,CAAV,KAAwL,IAAxL,GAA+L,MAA/L,GAAwM,EAXtM,IAYH,UAZJ;AAaD,KAxCuC,EAwCtC,WAAU,IAxC4B,EAApB,CAApB;AAyCA,QAAQ,aAAR,IAAyB,WAAW,QAAX,CAAoB,EAAC,YAAW,CAAC,CAAD,EAAG,UAAH,CAAZ,EAA2B,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AAC5H,eAAO,kFAAP;AACH,KAF4C,EAE3C,WAAU,IAFiC,EAApB,CAAzB;AAGA,QAAQ,aAAR,IAAyB,WAAW,QAAX,CAAoB,EAAC,YAAW,CAAC,CAAD,EAAG,UAAH,CAAZ,EAA2B,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AAC5H,YAAI,MAAJ;AAAA,YAAY,SAAO,UAAU,IAAV,GAAiB,MAAjB,GAA2B,UAAU,WAAV,IAAyB,EAAvE;AAAA,YAA4E,SAAO,QAAQ,aAA3F;AAAA,YAA0G,SAAO,UAAjH;AAAA,YAA6H,SAAO,UAAU,gBAA9I;;AAEF,eAAO,0KACH,QAAS,SAAS,CAAC,SAAS,QAAQ,KAAR,KAAkB,UAAU,IAAV,GAAiB,OAAO,KAAxB,GAAgC,MAAlD,CAAV,KAAwE,IAAxE,GAA+E,MAA/E,GAAwF,MAAlG,EAA2G,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,OAAR,EAAgB,QAAO,EAAvB,EAA0B,QAAO,IAAjC,EAAnB,CAA3B,GAAwF,MAA3M,EADG,GAEH,SAFG,GAGH,QAAS,SAAS,CAAC,SAAS,QAAQ,GAAR,KAAgB,UAAU,IAAV,GAAiB,OAAO,GAAxB,GAA8B,MAA9C,CAAV,KAAoE,IAApE,GAA2E,MAA3E,GAAoF,MAA9F,EAAuG,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,KAAR,EAAc,QAAO,EAArB,EAAwB,QAAO,IAA/B,EAAnB,CAA3B,GAAsF,MAArM,EAHG,GAIH,WAJG,GAKH,QAAS,SAAS,CAAC,SAAS,QAAQ,KAAR,KAAkB,UAAU,IAAV,GAAiB,OAAO,KAAxB,GAAgC,MAAlD,CAAV,KAAwE,IAAxE,GAA+E,MAA/E,GAAwF,MAAlG,EAA2G,QAAO,MAAP,yCAAO,MAAP,OAAkB,MAAlB,GAA2B,OAAO,IAAP,CAAY,MAAZ,EAAmB,EAAC,QAAO,OAAR,EAAgB,QAAO,EAAvB,EAA0B,QAAO,IAAjC,EAAnB,CAA3B,GAAwF,MAA3M,EALG,GAMH,iMANJ;AAOD,KAV4C,EAU3C,WAAU,IAViC,EAApB,CAAzB;AAWA,QAAQ,eAAR,IAA2B,WAAW,QAAX,CAAoB,EAAC,YAAW,CAAC,CAAD,EAAG,UAAH,CAAZ,EAA2B,QAAO,cAAS,SAAT,EAAmB,MAAnB,EAA0B,OAA1B,EAAkC,QAAlC,EAA2C,IAA3C,EAAiD;AAC9H,eAAO,oVAAP;AACH,KAF8C,EAE7C,WAAU,IAFmC,EAApB,CAA3B;;;ACvIA;AACA;;;;;;;;;;;;;;AAIA,IAAQ,oBAAoB,QAAQ,8BAAR,CAA5B;AAAA,IACQ,QAAQ,QAAQ,mBAAR,CADhB;AAAA,IAEQ,cAAc,QAAQ,gBAAR,CAFtB;AAAA,IAGQ,SAAS,QAAQ,UAAR,CAHjB;AAAA,IAIQ,UAAU,QAAQ,WAAR,CAJlB;AAAA,IAKQ,QAAQ,QAAQ,SAAR,CALhB;;AAOA,OAAO,OAAP;AAAA;;AAEI,wBAAa,IAAb,EAAmB,MAAnB,EAA2B;AAAA;;AAAA,4HACjB,MADiB;;AAEvB,cAAK,EAAL,GAAU,KAAK,EAAL,IAAW,MAAK,WAA1B;AACA,cAAK,KAAL,GAAa,KAAK,KAAlB;AACA,cAAK,KAAL,GAAa,KAAK,KAAlB;AACA,cAAK,aAAL,GAAqB,MAAK,uBAAL,EAArB;AACA,cAAK,aAAL,CAAmB,IAAnB;AACA,cAAK,WAAL;AACA,cAAK,UAAL;AACA,cAAK,UAAL;;AAEA,cAAK,MAAL,GAAc,KAAd;AAXuB;AAY1B;;AAdL;AAAA;AAAA,sCAgBkB,IAhBlB,EAgBwB;AAChB,iBAAK,WAAL,GAAmB,IAAI,WAAJ,CACf,EAAC,YAAY,KAAK,QAAlB,EAA4B,cAAc,IAA1C,EADe,EAEf,KAAK,MAFU,CAAnB;AAIH;AArBL;AAAA;AAAA,sCAuBmB;AACX,iBAAK,MAAL,GAAc,IAAI,MAAJ,CAAW,KAAK,MAAhB,EAAwB,KAAK,KAA7B,EAAoC,KAAK,WAAL,CAAiB,QAAjB,CAA0B,CAA1B,CAApC,CAAd;AACA,iBAAK,MAAL,CAAY,MAAZ;AACH;AA1BL;AAAA;AAAA,qCA4BiB;AACT,iBAAK,eAAL,GAAuB,IAAI,KAAJ,CAAU,KAAK,MAAf,EAAuB,KAAK,KAA5B,CAAvB;AACH;;AAED;;AAhCJ;AAAA;AAAA,qCA0CkB;AAAA;;AACV,iBAAK,MAAL,CAAY,GAAZ,CAAgB,EAAhB,CAAmB,kBAAnB,EAAuC,UAAC,CAAD;AAAA,uBAAO,OAAK,MAAL,CAAY,eAAZ,CAA4B,cAA5B,CAA2C,MAA3C,EAAiD,IAAjD,CAAP;AAAA,aAAvC;AACH;;AAED;;AA9CJ;AAAA;AAAA,+BA+CqE;AAAA,gBAA3D,SAA2D,uEAAjD,IAAiD;;AAAA;;AAAA,gBAA3C,WAA2C,uEAA/B,KAA+B;AAAA,gBAAxB,gBAAwB,uEAAP,KAAO;;AAC7D,iBAAK,MAAL,GAAc,IAAd;AACA,gBAAM,cAAc,oBAAoB,CAAC,MAAM,aAAN,CACrC,KAAK,KAAL,CAAW,KAD0B,EAErC,KAAK,KAAL,CAAW,GAF0B,EAGrC,KAAK,KAAL,CAAW,KAAK,WAAhB,CAHqC,CAAzC;;AAMA,gBAAI,cAAc,eAAe,KAAK,MAAL,CAAY,OAAZ,CAAoB,0BAArD;AACA,iBAAK,MAAL,CAAY,SAAZ,CAAsB,WAAtB;AACA,gBAAG,CAAC,WAAD,IAAgB,KAAK,MAAL,CAAY,OAAZ,CAAoB,eAAvC,EAAuD;AACnD,qBAAK,WAAL,CAAiB,MAAjB;AACH;;AAED,gBAAG,CAAC,WAAD,IAAiB,eAAe,KAAK,MAAL,CAAY,OAAZ,CAAoB,0BAAvD,EAAmF;AAC/E,qBAAK,eAAL,CAAqB,MAArB;;AAEA,oBAAG,KAAK,KAAR,EAAe;AACX,yBAAK,eAAL,CAAqB,GAArB,CAAyB,EAAzB,CAA4B,sBAA5B,EAAoD,YAAM;AACtD,+BAAK,MAAL,CAAY,eAAZ,CAA4B,cAA5B,CAA2C,MAA3C,EAAiD,KAAjD,EAAwD,KAAxD,EAA+D,KAA/D;AACH,qBAFD;AAGH;AACJ;;AAED,gBAAG,SAAH,EAAc,KAAK,MAAL,CAAY,KAAZ;AACd,gBAAG,WAAH,EAAgB,KAAK,WAAL,GAAmB,KAAK,KAAL,CAAW,KAA9B;;AAEhB,iBAAK,MAAL,CAAY,IAAZ,CAAiB,kBAAjB,EAAqC;AACjC,4BAAY,KAAK,IADgB;AAEjC,uCAAuB;AAFU,aAArC;AAIH;;AAED;;AAhFJ;AAAA;AAAA,gCAiF6B;AAAA,gBAAlB,WAAkB,uEAAN,IAAM;;AACrB,gBAAG,CAAC,KAAK,MAAT,EAAiB;AACjB,iBAAK,MAAL,GAAc,KAAd;AACA,iBAAK,MAAL,CAAY,UAAZ;AACA,iBAAK,WAAL,CAAiB,QAAjB,CAA0B,KAA1B;AACA,gBAAG,KAAK,eAAL,CAAqB,GAAxB,EAA6B,KAAK,eAAL,CAAqB,GAArB,CAAyB,GAAzB,CAA6B,sBAA7B;AAC7B,iBAAK,eAAL,CAAqB,QAArB;AACA,gBAAG,WAAH,EAAgB,KAAK,MAAL,CAAY,eAAZ,CAA4B,WAA5B;AAChB,iBAAK,MAAL,CAAY,IAAZ,CAAiB,kBAAjB,EAAqC,KAAK,IAA1C;AACH;;AAED;AACA;;AA7FJ;AAAA;AAAA,kDA8F+B;AACvB,gBAAI,UAAU,EAAd;AACA,gBAAG,CAAC,CAAC,KAAK,KAAL,CAAW,GAAhB,EAAqB;AACjB,qBAAK,IAAI,IAAI,KAAK,KAAL,CAAW,KAAxB,EAA+B,KAAK,KAAK,KAAL,CAAW,GAA/C,EAAoD,GAApD,EAAyD;AACrD,4BAAQ,IAAR,CAAa,CAAb;AACH;AACJ,aAJD,MAIO;AACH,oBAAI,QAAQ,KAAK,KAAL,CAAW,KAAvB;AACA,wBAAQ,IAAR,CAAa,KAAb;AACA,oBAAG,QAAQ,KAAK,QAAhB,EAA0B,QAAQ,IAAR,CAAa,QAAM,CAAnB;AAC7B;AACD,mBAAO,OAAP;AACH;;AAED;;AA5GJ;AAAA;AAAA,mCA6GyC;AAAA,gBAA3B,oBAA2B,uEAAN,IAAM;;AACjC,iBAAK,KAAL,CAAW,IAAX;AACA,iBAAK,MAAL,CAAY,QAAZ;AACA,gBAAG,KAAK,WAAR,EAAqB,KAAK,WAAL,CAAiB,QAAjB,CAA0B,oBAA1B;AACrB,gBAAG,oBAAH,EAAyB,KAAK,MAAL,CAAY,eAAZ,CAA4B,gBAA5B,CAA6C,IAA7C;AACzB,gBAAG,KAAK,eAAR,EAAyB,KAAK,eAAL,CAAqB,QAArB;AACzB,gBAAG,oBAAH,EAAyB;AAC5B;;AAED;;AAtHJ;AAAA;AAAA,4BAiCgB;AACR,mBAAO;AACH,oBAAY,KAAK,EADd;AAEH,uBAAY,KAAK,KAFd;AAGH,uBAAY,KAAK,KAHd;AAIH,0BAAY,KAAK,WAAL,CAAiB;AAJ1B,aAAP;AAMH;AAxCL;AAAA;AAAA,4BAoIoB;AACZ,mBAAO,KAAK,MAAL,CAAY,eAAZ,CAA4B,gBAA5B,KAAiD,IAAxD;AACH;AAtIL;AAAA;AAAA,oCAuHwB,KAvHxB,EAuH+B,KAvH/B,EAuHsC,UAvHtC,EAuHkD,MAvHlD,EAuHmE;AAAA,gBAAT,EAAS,uEAAN,IAAM;;AAC3D,gBAAI,UAAU,QAAQ,OAAR,CAAgB,UAAhB,EAA4B,MAA5B,CAAd;AACA,gBAAG,KAAH,EAAU,QAAQ,MAAM,WAAN,CAAkB,KAAlB,CAAR;AACV,gBAAG,KAAH,EAAU,QAAQ,MAAM,WAAN,CAAkB,KAAlB,CAAR;AACV,gBAAI,OAAO;AACP,sBADO;AAEP,4BAFO;AAGP,4BAHO;AAIP,0BAAU,CAAC,OAAD;AAJH,aAAX;AAMA,mBAAO,IAAI,UAAJ,CAAe,IAAf,EAAqB,OAAO,MAA5B,CAAP;AACH;AAlIL;;AAAA;AAAA,EAA0C,iBAA1C;;;ACZA;AACA;;;;;;;;;;;;;;;;;AAKA,IAAQ,QAAQ,QAAQ,gBAAR,CAAhB;AAAA,IACQ,kBAAkB,QAAQ,2BAAR,CAD1B;AAAA,IAEQ,aAAa,QAAQ,cAAR,CAFrB;;AAIA,OAAO,OAAP;AAAA;;AAEI,6BAAa,MAAb,EAAqB;AAAA;;AAAA,sIACX,MADW;;AAEjB,cAAK,OAAL,QAAmB,iBAAnB;AACA,cAAK,SAAL;AACA,cAAK,UAAL;AAJiB;AAKpB;;AAED;;;AATJ;AAAA;;;AAgDI;AAhDJ,qCAiDkB;AACV,iBAAK,MAAL,CAAY,EAAZ,CAAe,YAAf,EAA6B,MAAM,QAAN,CAAe,KAAK,iBAAL,CAAuB,IAAvB,CAA4B,IAA5B,CAAf,EAAkD,GAAlD,CAA7B;AACH;;AAED;;AArDJ;AAAA;AAAA,0CAsDuB;AACf,iBAAK,YAAL,CAAkB,IAAlB,CAAuB,UAAC,CAAD,EAAG,CAAH,EAAS;AAC5B,uBAAO,EAAE,KAAF,CAAQ,KAAR,GAAgB,EAAE,KAAF,CAAQ,KAAxB,GAAgC,CAAC,CAAjC,GAAsC,EAAE,KAAF,CAAQ,KAAR,GAAgB,EAAE,KAAF,CAAQ,KAAxB,GAAgC,CAAhC,GAAoC,CAAjF;AACH,aAFD;AAGH;;AAED;;AA5DJ;AAAA;AAAA,yCA6DsB,UA7DtB,EA6DkC;AAC1B,iBAAK,YAAL,CAAkB,IAAlB,CAAuB,UAAvB;AACA,iBAAK,cAAL,CAAoB,UAApB,EAAgC,IAAhC,EAAsC,IAAtC,EAA4C,KAA5C,EAAmD,IAAnD;AACA,iBAAK,YAAL;AACH;;AAED;;AAnEJ;AAAA;AAAA,+CAoE4B,IApE5B,EAoEkC;AAC1B,iBAAK,MAAL,CAAY,QAAZ,CAAqB,OAArB,CAA6B,MAA7B,IAAuC,KAAK,MAAL,CAAY,QAAZ,CAAqB,YAArB,EAAvC;;AAEA,gBAAI,aAAa,WAAW,WAAX,CACb,KAAK,KADQ,EAEb,KAAK,KAFQ,EAGb,KAAK,UAAL,IAAmB,EAHN,EAIb,KAAK,MAJQ,EAKb,KAAK,EALQ,CAAjB;AAOA,iBAAK,gBAAL,CAAsB,UAAtB;AACH;;AAED;;AAjFJ;AAAA;AAAA,8CAkF2B,EAlF3B,EAkF+B;AACvB,gBAAI,aAAa,KAAK,cAAL,CAAoB,EAApB,CAAjB;AACA,gBAAI,UAAJ,EAAgB,WAAW,QAAX;AACnB;;AAED;;AAvFJ;AAAA;AAAA,yCAwFsB,UAxFtB,EAwFkC;AAC1B,gBAAI,KAAK,WAAW,EAApB;AAAA,gBACI,IAAI,KAAK,YAAL,CAAkB,OAAlB,CAA0B,UAA1B,CADR;AAEA,iBAAK,YAAL,CAAkB,MAAlB,CAAyB,CAAzB,EAA4B,CAA5B;AACA,iBAAK,YAAL;AACA,iBAAK,MAAL,CAAY,IAAZ,CAAiB,mBAAjB,EAAsC,EAAC,MAAD,EAAtC;AACH;;AAED;;AAhGJ;AAAA;AAAA,4CAiGyB;AACjB,gBAAG,CAAC,KAAK,OAAT,EAAkB;AAClB,gBAAI,OAAO,KAAK,KAAL,CAAW,KAAK,WAAhB,CAAX;;AAEA,gBAAG,KAAK,aAAR,EAAuB;AACnB,oBAAG,SAAS,KAAK,aAAjB,EAAgC,KAAK,aAAL,GAAqB,KAArB;AAChC;AACH;;AAED,gBAAI,UAAU,KAAK,wBAAL,CAA8B,IAA9B,CAAd;AACA,gBAAG,CAAC,QAAQ,MAAZ,EAAoB,OAAO,KAAK,gBAAL,CAAsB,KAAtB,EAAP;;AAEpB;AACA,gBAAI,iBAAiB,KAAK,WAAL,CAAiB,QAAQ,QAAQ,MAAR,GAAe,CAAvB,CAAjB,CAArB;;AAEA;AACA,gBAAG,KAAK,gBAAL,CAAsB,KAAzB,EAAgC;AAC5B,oBAAG,mBAAmB,KAAK,gBAA3B,EAA6C;AAC7C;AACA;AACA;AACA,oBAAI,YAAY,eAAe,KAAf,CAAqB,KAArC;AAAA,oBACI,cAAc,KAAK,gBAAL,CAAsB,KAAtB,CAA4B,KAD9C;AAEA,oBAAG,cAAc,WAAd,IAA6B,cAAc,IAA9C,EAAoD;AACvD;;AAED,iBAAK,cAAL,CAAoB,cAApB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,IAAlD;AACH;;AAED;;AA9HJ;AAAA;AAAA,iDA+H8B,IA/H9B,EA+HoC;AAC5B,gBAAG,CAAC,KAAK,WAAL,CAAiB,MAArB,EAA6B,OAAO,EAAP;AAC7B,mBAAO,KAAK,iBAAL,CAAuB,IAAvB,KAAgC,EAAvC;AACH;;AAED;;;;;;AApIJ;AAAA;AAAA,mDAyIgC;AAAA;;AACxB,gBAAI,UAAU,EAAd;AACA,iBAAK,WAAL,CAAiB,OAAjB,CAAyB,UAAC,UAAD,EAAgB;AACrC,2BAAW,aAAX,CAAyB,OAAzB,CAAiC,UAAC,MAAD,EAAY;AACzC,wBAAI,MAAO,QAAQ,MAAR,KAAmB,EAA9B;AACA,wBAAI,IAAJ,CAAS,OAAK,WAAL,CAAiB,OAAjB,CAAyB,UAAzB,CAAT;AACA,4BAAQ,MAAR,IAAkB,GAAlB;AACH,iBAJD;AAKH,aAND;AAOA,iBAAK,iBAAL,GAAyB,OAAzB;AACH;;AAED;;AArJJ;AAAA;AAAA,sCAsJmB;AACX,iBAAK,gBAAL,CAAsB,KAAtB,CAA4B,KAA5B;AACA,iBAAK,iBAAL,GAAyB,IAAzB;AACH;;AAED;AACA;;AA5JJ;AAAA;AAAA,uCA6JoB,UA7JpB,EA6J4G;AAAA,gBAA5E,aAA4E,uEAA9D,KAA8D;AAAA,gBAAvD,KAAuD,uEAAjD,IAAiD;AAAA,gBAA3C,WAA2C,uEAA/B,KAA+B;AAAA,gBAAxB,gBAAwB,uEAAP,KAAO;;AACpG,gBAAG,CAAC,KAAK,MAAL,CAAY,MAAhB,EAAwB,KAAK,MAAL,CAAY,oBAAZ;AACxB,iBAAK,aAAL,GAAqB,aAArB;AACA,iBAAK,WAAL;AACA,uBAAW,IAAX,CAAgB,KAAhB,EAAuB,WAAvB,EAAoC,gBAApC;AACA,iBAAK,gBAAL,GAAwB,UAAxB;AACA,iBAAK,aAAL,GAAqB,KAAK,gBAAL,CAAsB,KAAtB,CAA4B,KAAjD;AACH;;AAED;;AAtKJ;AAAA;AAAA,2CAuKwB,EAvKxB,EAuK4B;AACpB,gBAAI,aAAa,KAAK,cAAL,CAAoB,EAApB,CAAjB;AACA,gBAAI,UAAJ,EAAgB,KAAK,cAAL,CAAoB,UAApB;AACnB;;AAED;;AA5KJ;AAAA;AAAA,uCA6KoB,EA7KpB,EA6KwB;AAChB,mBAAO,KAAK,WAAL,CAAiB,IAAjB,CAAsB,UAAC,CAAD;AAAA,uBAAO,EAAE,EAAF,IAAQ,EAAf;AAAA,aAAtB,CAAP;AACH;;AAED;;AAjLJ;AAAA;AAAA,oCAkLiB,EAlLjB,EAkLqB;AAAA;;AACb,gBAAI,WAAW,KAAK,WAAL,CAAiB,GAAjB,CAAqB,UAAC,CAAD;AAAA,uBAAO,EAAE,WAAF,CAAc,QAArB;AAAA,aAArB,CAAf;AACA,uBAAW,YAAG,MAAH,gCAAa,QAAb,EAAX,CAFa,CAEsB;AACnC,mBAAO,SAAS,IAAT,CAAc,UAAC,CAAD;AAAA,uBAAO,EAAE,EAAF,IAAQ,EAAf;AAAA,aAAd,CAAP;AACH;;AAED;;AAxLJ;AAAA;AAAA,yCAyLsB;AACd,gBAAG,KAAK,iBAAR,EAA0B;AACtB,oBAAI,MAAM,KAAK,WAAL,CAAiB,OAAjB,CAAyB,KAAK,iBAA9B,CAAV;AAAA,oBACI,UAAW,QAAQ,KAAK,WAAL,CAAiB,MAAjB,GAAwB,CAAhC,GAAoC,CAApC,GAAwC,MAAI,CAD3D;AAEA,uBAAO,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,OAAjB,CAApB,EAA+C,IAA/C,CAAP;AACH;AACD,gBAAI,OAAO,KAAK,KAAL,CAAW,KAAK,WAAhB,CAAX;AACA,iBAAI,IAAI,IAAE,CAAV,EAAa,IAAE,KAAK,WAAL,CAAiB,MAAhC,EAAwC,GAAxC,EAA4C;AACxC,oBAAG,KAAK,WAAL,CAAiB,CAAjB,EAAoB,KAApB,CAA0B,KAA1B,GAAkC,IAArC,EAA2C,OAAO,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,CAAjB,CAApB,EAAyC,IAAzC,CAAP;AAC9C;AACD,iBAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,CAAjB,CAApB,EAAyC,IAAzC;AACH;;AAED;;AAtMJ;AAAA;AAAA,yCAuMsB;AACd,gBAAG,KAAK,iBAAR,EAA0B;AACtB,oBAAI,MAAM,KAAK,WAAL,CAAiB,OAAjB,CAAyB,KAAK,iBAA9B,CAAV;AAAA,oBACQ,UAAW,QAAQ,CAAR,GAAY,KAAK,WAAL,CAAiB,MAAjB,GAAwB,CAApC,GAAwC,MAAI,CAD/D;AAEA,uBAAO,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,OAAjB,CAApB,EAA+C,IAA/C,CAAP;AACH;AACD,gBAAI,OAAO,KAAK,KAAL,CAAW,KAAK,WAAhB,CAAX;AACA,iBAAI,IAAI,IAAE,KAAK,WAAL,CAAiB,MAAjB,GAAwB,CAAlC,EAAqC,KAAG,CAAxC,EAA2C,GAA3C,EAA+C;AAC3C,oBAAG,KAAK,WAAL,CAAiB,CAAjB,EAAoB,KAApB,CAA0B,KAA1B,GAAkC,IAArC,EAA2C,OAAO,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,CAAjB,CAApB,EAAyC,IAAzC,CAAP;AAC9C;AACD,iBAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,KAAK,WAAL,CAAiB,MAAjB,GAAwB,CAAzC,CAApB,EAAiE,IAAjE;AACH;;AAED;AACA;;AArNJ;AAAA;AAAA,uCAsNoB;AACZ,iBAAK,eAAL;AACA,iBAAK,wBAAL;AACA,iBAAK,MAAL,CAAY,IAAZ,CAAiB,gBAAjB,EAAmC,KAAK,IAAxC;AACH;;AAED;;AA5NJ;AAAA;AAAA,oCA6NiB;AACT,iBAAK,WAAL,GAAyB,EAAzB;AACA,iBAAK,iBAAL,GAAyB,EAAzB;AACA,iBAAK,gBAAL,GAAyB,IAAzB;AACA,iBAAK,OAAL,GAAyB,KAAzB;AACA,iBAAK,iBAAL,GAAyB,KAAzB;AACA,iBAAK,aAAL,GAAyB,CAAzB;AACH;;AAED;;AAtOJ;AAAA;AAAA,mCAuOe;AACP,iBAAK,WAAL,CAAiB,OAAjB,CAAyB,UAAC,UAAD,EAAgB;AAAE,2BAAW,QAAX,CAAoB,KAApB;AAA6B,aAAxE;AACA,iBAAK,SAAL;AACA;AACH;AA3OL;AAAA;AAAA,0BAUiB,eAVjB,EAUkC;AAC1B,iBAAK,QAAL,GAAgB,eAAhB;AACA,gBAAG,CAAC,eAAJ,EAAqB,KAAK,gBAAL,CAAsB,KAAtB;AACrB,gBAAG,eAAH,EAAmB;AACf,qBAAK,aAAL,GAAqB,KAArB;AACA,qBAAK,iBAAL;AACH;AACJ,SAjBL;AAAA,4BAmBmB;AACX,mBAAO,KAAK,QAAZ;AACH;;AAED;;AAvBJ;AAAA;AAAA,0BAwBqB,eAxBrB,EAwBsC;AAAA;;AAC9B,iBAAK,YAAL,GAAoB,gBAAgB,GAAhB,CAAoB,UAAC,CAAD;AAAA,uBAAO,IAAI,UAAJ,CAAe,CAAf,EAAkB,OAAK,MAAvB,CAAP;AAAA,aAApB,CAApB;AACA,iBAAK,eAAL;AACA,iBAAK,wBAAL;AACH,SA5BL;AAAA,4BA8BuB;AACf,mBAAO,KAAK,YAAZ;AACH;AAhCL;AAAA;AAAA,4BAkC2C;AAAA,gBAAjB,UAAiB,uEAAN,IAAM;;AACnC,iBAAK,iBAAL,GAAyB,UAAzB;AACH;;AAED;AAtCJ;AAAA,4BAuC4B;AACpB,mBAAO,KAAK,iBAAL,IAA0B,EAAE,OAAQ,iBAAM,CAAE,CAAlB,EAAjC;AACH;;AAED;;AA3CJ;AAAA;AAAA,4BA4CgB;AACR,mBAAO,KAAK,YAAL,CAAkB,GAAlB,CAAsB,UAAC,CAAD;AAAA,uBAAO,EAAE,IAAT;AAAA,aAAtB,CAAP;AACH;AA9CL;;AAAA;AAAA,EAA+C,eAA/C;;;ACVA;AACA;;;;;;;;;;;;;;AAIA,IAAQ,oBAAoB,QAAQ,8BAAR,CAA5B;AAAA,IACQ,QAAQ,QAAQ,gBAAR,CADhB;AAAA,IAEQ,SAAS,QAAQ,QAAR,CAFjB;AAAA,IAGQ,eAAe,SAHvB;;AAKA,OAAO,OAAP;AAAA;;AAEI,qBAAa,IAAb,EAAmB,MAAnB,EAA2B;AAAA;;AAAA,sHACjB,MADiB;;AAEvB,cAAK,WAAL,GAAmB,KAAK,WAAxB;AACA,cAAK,EAAL,GAAU,KAAK,EAAL,IAAW,MAAK,WAA1B;AACA,cAAK,IAAL,GAAY,KAAK,IAAjB;AACA,cAAK,IAAL,GAAY,KAAK,IAAjB;AACA,cAAK,SAAL,GAAiB,OAAO,KAAK,IAAL,CAAU,QAAjB,EAA2B,IAA3B,EAAjB;AACA,cAAK,SAAL,GAAiB,MAAK,SAAL,EAAjB;;AAEA,cAAK,GAAL,GAAW,EAAE,MAAK,MAAL,EAAF,CAAX;AATuB;AAU1B;;AAED;;;AAdJ;AAAA;AAAA,iCA2Bc;AACN,mBAAO,KAAK,cAAL,CACH,YADG,EAEH;AACI,oBAAY,KAAK,EADrB;AAEI,sBAAY,KAAK,IAFrB;AAGI,sBAAY,KAAK,IAHrB;AAII,2BAAY,KAAK;AAJrB,aAFG,CAAP;AASH;;AAED;;AAvCJ;AAAA;AAAA,oCAwCiB;AACT,mBAAO,OAAO,KAAK,IAAL,CAAU,QAAjB,EAA2B,OAA3B,EAAP;AACH;AA1CL;AAAA;AAAA,mCA4C6B;AAAA,gBAAf,OAAe,uEAAP,KAAO;;AACrB,uHAAe,OAAf;AACH;;AAED;;AAhDJ;AAAA;AAAA,4BAegB;AACR,mBAAO;AACH,oBAAI,KAAK,EADN;AAEH,sBAAM,KAAK,IAFR;AAGH,sBAAM,KAAK;AAHR,aAAP;AAKH;AArBL;AAAA;AAAA,4BAuBgB;AACR,mBAAO,KAAK,GAAL,CAAS,CAAT,EAAY,SAAnB;AACH;AAzBL;AAAA;AAAA,oCAiDwB,IAjDxB,EAiD8B,WAjD9B,EAiD2C,MAjD3C,EAiDmD;AAC3C,gBAAI,OAAO,KAAK,OAAL,CAAa,IAAb,EAAmB,MAAnB,CAAX;AACA,mBAAO,IAAI,OAAJ,CAAY,IAAZ,EAAkB,OAAO,MAAzB,CAAP;AACH;;AAED;;AAtDJ;AAAA;AAAA,gCAuDoB,IAvDpB,EAuD0B,MAvD1B,EAuDkC;AAC1B,mBAAO;AACH,sBAAQ,OAAO,MAAP,CAAc;AACV,8BAAU,SAAS,WAAT;AADA,iBAAd,EAEG,OAAO,IAFV,CADL;AAIH,oBAAQ,MAAM,IAAN,EAJL;AAKH;AALG,aAAP;AAOH;AA/DL;;AAAA;AAAA,EAAuC,iBAAvC;;;ACVA;AACA;;;;;;;;;;;;;;AAIA,IAAQ,oBAAoB,QAAQ,8BAAR,CAA5B;AAAA,IACQ,QAAQ,QAAQ,gBAAR,CADhB;AAAA,IAEQ,UAAU,QAAQ,WAAR,CAFlB;AAAA,IAGQ,0BAA0B,cAHlC;AAAA,IAIQ,yBAAyB,aAJjC;;AAMA,OAAO,OAAP;AAAA;;AAEI,yBAAa,IAAb,EAAmB,MAAnB,EAA2B;AAAA;;AAAA,8HACjB,MADiB;;AAGvB,cAAK,UAAL,GAAkB,KAAK,UAAvB;AACA,cAAK,QAAL,GAAgB,KAAK,QAAL,CAAc,GAAd,CAAkB,UAAC,WAAD,EAAiB;AAC/C,wBAAY,WAAZ;AACA,mBAAO,IAAI,OAAJ,CAAY,WAAZ,EAAyB,MAAzB,CAAP;AACH,SAHe,CAAhB;AAIA,cAAK,YAAL;AARuB;AAS1B;;AAED;;;AAbJ;AAAA;;;AAkBI;AAlBJ,yCAmBsB;AAAA;;AACd,iBAAK,GAAL,CACK,EADL,CACQ,mBADR,EAC6B,yBAD7B,EACyD;AAAA,uBAAM,OAAK,UAAL,CAAgB,KAAhB,EAAN;AAAA,aAAD,CAAgC,IAAhC,CAAqC,IAArC,CADxD,EACoG;AADpG,aAEK,EAFL,CAEQ,mBAFR,EAE6B,gBAF7B,EAE+C,KAAK,aAAL,CAAmB,IAAnB,CAAwB,IAAxB,CAF/C,EAE8E;AAF9E,aAGK,EAHL,CAGQ,mBAHR,EAG6B,wBAH7B,EAGuD,KAAK,2BAAL,CAAiC,IAAjC,CAAsC,IAAtC,CAHvD,EAGoG;AAHpG,aAIK,EAJL,CAIQ,mBAJR,EAI6B,qBAJ7B,EAIoD,KAAK,cAAL,CAAoB,IAApB,CAAyB,IAAzB,CAJpD,EAIoF;AAJpF,aAKK,EALL,CAKQ,mDALR,EAK6D,oBAL7D,EAKmF,KAAK,iBAAL,CAAuB,IAAvB,CAA4B,IAA5B,CALnF,EADc,CAMyG;AAC1H;;AAED;;AA5BJ;AAAA;AAAA,gDA6B6B;AACrB,iBAAK,eAAL,CACK,EADL,CACQ,mBADR,EAC6B,4DAD7B,EAC2F,KAAK,eAAL,CAAqB,IAArB,CAA0B,IAA1B,CAD3F,EAC4H;AAD5H,aAEK,EAFL,CAEQ,mBAFR,EAE6B,4CAF7B,EAE2E,KAAK,cAAL,CAAoB,IAApB,CAAyB,IAAzB,CAF3E,EADqB,CAGuF;AAC/G;;AAED;;AAnCJ;AAAA;AAAA,iCAoCc;AACN,iBAAK,GAAL,GAAW,EAAE,KAAK,cAAL,CACT,uBADS,EAET;AACI,8BAAc,KAAK,QAAL,CAAc,GAAd,CAAkB,UAAC,CAAD;AAAA,2BAAO,EAAE,IAAT;AAAA,iBAAlB,CADlB;AAEI,0BAAU,MAAM,SAAN,CAAgB,KAAK,UAAL,CAAgB,KAAhC;AAFd,aAFS,CAAF,CAAX;;AAQA,iBAAK,OAAL,CAAa,MAAb,CAAoB,KAAK,GAAzB;AACA,iBAAK,KAAL,GAAa,KAAK,GAAL,CAAS,iBAAtB;AACA,iBAAK,cAAL;AACH;;AAED;;AAlDJ;AAAA;AAAA,mCAmDgB;AACR,iBAAK,QAAL,CAAc,KAAd;AACA,iBAAK,MAAL;AACH;;AAED;;AAxDJ;AAAA;AAAA,wCAyDqB;AACb,iBAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,UAAL,CAAgB,MAApC,EAA4C,IAA5C,CAAiD,oBAAjD,EAAuE,SAAvE,CAAiF,MAAjF;AACA,gBAAI,YAAY,KAAK,KAAL,CAAW,IAAX,CAAgB,uBAAhB,CAAhB;AAAA,gBACI,QAAQ,UAAU,UAAV,EADZ;AAAA,gBAEI,MAAM,UAAU,QAAV,GAAqB,GAArB,GAA2B,EAFrC;AAAA,gBAGI,QAAQ,KAAK,KAAL,CAAW,UAAX,MAA2B,UAAU,QAAV,GAAqB,IAArB,GAA4B,KAAvD,CAHZ;;AAKA,iBAAK,eAAL,GAAuB,EAAE,KAAK,cAAL,CAAoB,sBAApB,EAA4C,EAAC,YAAD,EAAQ,QAAR,EAAa,YAAb,EAA5C,CAAF,CAAvB;AACA,iBAAK,qBAAL;AACA,iBAAK,OAAL,CAAa,MAAb,CAAoB,KAAK,eAAzB;AACH;;AAED;;AArEJ;AAAA;AAAA,yCAsEsB;AACd,iBAAK,KAAL,CAAW,WAAX,CAAuB,KAAK,UAAL,CAAgB,MAAvC;;AAEA,gBAAI,UAAU,CAAd;AAAA,gBACI,OAAO,KAAK,GAAL,CAAS,kBAAT,CAA4B,GAA5B,EADX;;AAGA,gBAAG,CAAC,IAAJ,EAAU,OANI,CAMI;AAClB,iBAAK,aAAL,CAAmB,IAAnB;AACH;AA9EL;AAAA;AAAA,sCAgFmB,IAhFnB,EAgFyB;AACjB,gBAAI,UAAU,QAAQ,WAAR,CAAoB,IAApB,EAA0B,IAA1B,EAAgC,KAAK,MAArC,CAAd;AACA,iBAAK,QAAL,CAAc,IAAd,CAAmB,OAAnB;AACA,iBAAK,YAAL;;AAEA;AACA,gBAAG,KAAK,UAAL,CAAgB,QAAnB,EAA6B;AACzB,qBAAK,QAAL,CAAc,KAAd;AACA,qBAAK,eAAL;AACH;;AAED,iBAAK,MAAL,CAAY,eAAZ,CAA4B,YAA5B;AACH;;AAED;;AA9FJ;AAAA;AAAA,0CA+FuB;AACf,iBAAK,uBAAL;AACA,gBAAG,KAAK,KAAR,EAAe,KAAK,KAAL,CAAW,WAAX,CAAuB,KAAK,UAAL,CAAgB,MAAvC;AACf,gBAAG,KAAK,eAAR,EAAyB,KAAK,eAAL,CAAqB,MAArB;AAC5B;;AAED;AACA;;AAtGJ;AAAA;AAAA,uCAuGoB,KAvGpB,EAuG2B;AACnB,gBAAI,eAAe,KAAK,UAAL,CAAgB,EAAnC;AACA,gBAAG,KAAK,QAAL,CAAc,MAAd,IAAwB,CAA3B,EAA8B;AAC1B,qBAAK,UAAL,CAAgB,QAAhB;AACH,aAFD,MAEO;AACH,oBAAI,YAAa,KAAK,aAAL,CAAmB,KAAnB,CAAjB;AAAA,oBACI,UAAU,KAAK,QAAL,CAAc,IAAd,CAAmB,UAAC,CAAD;AAAA,2BAAO,EAAE,EAAF,IAAQ,SAAf;AAAA,iBAAnB,CADd;AAAA,oBAEI,IAAI,KAAK,QAAL,CAAc,OAAd,CAAsB,OAAtB,CAFR;AAGA,qBAAK,QAAL,CAAc,MAAd,CAAqB,CAArB,EAAwB,CAAxB;AACA,qBAAK,QAAL;AACH;;AAED,iBAAK,MAAL,CAAY,eAAZ,CAA4B,YAA5B;AACH;AApHL;AAAA;AAAA,sCAsHmB,KAtHnB,EAsH0B;AAClB,gBAAI,KAAK,OAAO,MAAM,MAAN,CAAa,EAApB,KAA2B,WAA3B,GACL,EAAE,MAAM,MAAR,EAAgB,OAAhB,CAAwB,cAAxB,EAAwC,IAAxC,CAA6C,IAA7C,CADK,GAEL,MAAM,MAAN,CAAa,EAFjB;AAGA,mBAAO,EAAP;AACH;;AAED;AACA;;AA9HJ;AAAA;AAAA,0CA+HuB,KA/HvB,EA+H8B;AACtB,gBAAI,UAAU,EAAE,MAAM,aAAR,CAAd;AAAA,gBACI,SAAU,QAAQ,MAAR,EADd;AAAA,gBAEI,UAAU,MAAM,aAFpB;AAAA,gBAGI,QAAU,QAAQ,UAAR,IAAsB,CAAC,QAAQ,MAH7C;AAAA,gBAII,MAAU,QAAQ,CAAR,GAAY,MAAZ,GAAqB,IAJnC;AAAA,gBAKI,aAAa,KAAK,GAAL,CAAS,MAAM,aAAN,CAAoB,YAApB,GAAmC,MAAM,aAAN,CAAoB,YAAhE,CALjB;;AAOA;AACA,gBAAI,QAAQ,SAAR,KAAsB,EAAtB,IAA4B,OAAO,IAAvC,EAA6C;AACzC,wBAAQ,IAAR;AACA,wBAAQ,OAAR,CAAgB,EAAC,WAAW,CAAZ,EAAhB,EAAgC,GAAhC;AACA,sBAAM,cAAN;AACH;;AAED;AACA,gBAAI,QAAQ,SAAR,KAAuB,aAAa,EAApC,IAA2C,OAAO,MAAtD,EAA8D;AAC1D,wBAAQ,IAAR;AACA,wBAAQ,OAAR,CAAgB,EAAC,WAAW,SAAS,EAArB,EAAhB,EAA0C,GAA1C;AACA,sBAAM,cAAN;AACH;AACJ;;AAED;;AAtJJ;AAAA;AAAA,uCAuJoB;AACZ,iBAAK,QAAL,CAAc,IAAd,CAAmB,UAAC,CAAD,EAAG,CAAH,EAAS;AACxB,uBAAO,EAAE,SAAF,GAAc,EAAE,SAAhB,GAA4B,CAAC,CAA7B,GAAkC,EAAE,SAAF,GAAc,EAAE,SAAhB,GAA4B,CAA5B,GAAgC,CAAzE;AACH,aAFD;AAGH;;AAED;;AA7JJ;AAAA;AAAA,oDA8JiC,CA9JjC,EA8JoC;AAAA;;AAC5B,gBAAI,aAAa,EAAE,MAAF,EAAU,QAAV,CAAmB,oBAAnB,EAAyC,IAAzC,CAA8C,SAA9C,CAAjB;AACA,uBAAW,EAAX,CAAc,eAAd,EAA+B,YAAM;AACjC,2BAAW,GAAX,CAAe,eAAf;AACA,uBAAK,UAAL,CAAgB,QAAhB;AACH,aAHD;AAIA,cAAE,EAAE,MAAJ,EAAY,WAAZ,CAAwB,UAAxB;AACH;;AAED;;AAvKJ;AAAA;AAAA,kDAwK+B;AACvB,gBAAG,KAAK,eAAR,EAAyB,KAAK,eAAL,CAAqB,GAArB,CAAyB,mBAAzB;AAC5B;;AAED;;AA5KJ;AAAA;AAAA,mCA6KoC;AAAA,gBAAtB,eAAsB,uEAAN,IAAM;;AAC5B,gBAAG,KAAK,GAAR,EAAa;AACT,qBAAK,GAAL,CAAS,GAAT,CAAa,qEAAb;AACH;AACD,iBAAK,QAAL,CAAc,OAAd,CAAsB,UAAC,CAAD;AAAA,uBAAO,EAAE,QAAF,CAAW,eAAX,CAAP;AAAA,aAAtB;AACA,gBAAG,eAAH,EAAoB,KAAK,QAAL,GAAgB,EAAhB;AACpB;AACH;AApLL;AAAA;AAAA,4BAcgB;AACR,mBAAO,KAAK,QAAL,CAAc,GAAd,CAAkB,UAAC,CAAD;AAAA,uBAAO,EAAE,IAAT;AAAA,aAAlB,CAAP;AACH;AAhBL;;AAAA;AAAA,EAA2C,iBAA3C;;;ACXA;AACA;;;;;;;;;;;;;;;AAKA,IAAQ,oBAAoB,QAAQ,8BAAR,CAA5B;AAAA,IACQ,QAAQ,QAAQ,gBAAR,CADhB;AAAA,IAEQ,kBAAkB,QAAQ,uBAAR,CAF1B;AAAA,IAGQ,kBAAkB,QAAQ,uBAAR,CAH1B;AAAA,IAIQ,eAAe,QAAQ,iBAAR,CAJvB;AAAA,IAKQ,aAAa,QAAQ,cAAR,CALrB;AAAA,IAMQ,eAAe,UANvB;;AAQA;AACA;AACA,IAAM,gBAAgB,OAAO,MAAP,CAAc;AAChC,YAAQ,KADwB,EACR;AACxB,oBAAgB,KAFgB,CAER;AAFQ,CAAd,CAAtB;;AAKA,OAAO,OAAP;AAAA;;AAEI,sBAAa,MAAb,EAAqB,aAArB,EAAoC;AAAA;;AAAA,wHAC1B,MAD0B;;AAEhC,cAAK,OAAL,QAAmB,UAAnB;;AAEA,cAAK,kBAAL,GAA0B,MAAK,MAAL,CAAY,OAAZ,CAAoB,kBAA9C;AACA,cAAK,YAAL,GAAoB,MAAK,MAAL,CAAY,OAAZ,CAAoB,YAAxC;AACA,cAAK,OAAL,GAAe,MAAM,WAAN,CAAkB,aAAlB,CAAf;AACA,cAAK,UAAL,CAAgB,aAAhB;;AAEA,YAAG,MAAK,YAAR,EAAqB;AACjB;AACA,kBAAK,YAAL,GAAoB,IAAI,YAAJ,CAAiB,MAAK,MAAtB,CAApB;AACH;;AAED,cAAK,MAAL;AAdgC;AAenC;;AAED;;;AAnBJ;AAAA;AAAA,mCAoBgB,aApBhB,EAoB+B;AAAA;;AACvB,iBAAK,OAAL,CAAa,EAAb,CAAgB,oBAAhB,EAAsC,sBAAtC,EAA8D,KAAK,WAAL,CAAiB,IAAjB,CAAsB,IAAtB,CAA9D,EAA2F;AAA3F,aACK,EADL,CACQ,oBADR,EAC8B,iCAD9B,EACiE;AAAA,uBAAM,OAAK,MAAL,CAAY,eAAZ,CAA4B,cAA5B,EAAN;AAAA,aADjE,EACsH;AADtH,aAEK,EAFL,CAEQ,oBAFR,EAE8B,iCAF9B,EAEiE;AAAA,uBAAM,OAAK,MAAL,CAAY,eAAZ,CAA4B,cAA5B,EAAN;AAAA,aAFjE,EAEsH;AAFtH,aAGK,EAHL,CAGQ,oBAHR,EAG8B,6BAH9B,EAG6D;AAAA,uBAAM,OAAK,MAAL,CAAY,UAAZ,CAAuB,CAAvB,CAAN;AAAA,aAH7D,EAG+F;AAH/F,aAIK,EAJL,CAIQ,oBAJR,EAI8B,6BAJ9B,EAI6D;AAAA,uBAAM,OAAK,MAAL,CAAY,UAAZ,CAAuB,CAAC,CAAxB,CAAN;AAAA,aAJ7D,EADuB,CAK0E;;AAEjG,gBAAG,KAAK,kBAAR,EAA4B;AACxB,qBAAK,OAAL,CAAa,EAAb,CAAgB,oBAAhB,EAAsC,0BAAtC,EAAkE,KAAK,YAAL,CAAkB,IAAlB,CAAuB,IAAvB,CAAlE,EAAgG;AAAhG,iBACK,EADL,CACQ,oBADR,EAC8B,+CAD9B,EAC+E,KAAK,OAAL,CAAa,IAAb,CAAkB,IAAlB,CAD/E,EACwG;AADxG,iBAEK,EAFL,CAEQ,oBAFR,EAE8B,+DAF9B,EAE+F,KAAK,YAAL,CAAkB,IAAlB,CAAuB,IAAvB,CAF/F,EADwB,CAGqG;AAChI;AACD,gBAAG,aAAH,EAAiB;AACb,kBAAE,QAAF,EAAY,EAAZ,oBAAgC,KAAK,QAArC,EAAiD,UAAC,CAAD;AAAA,2BAAO,OAAK,eAAL,CAAqB,CAArB,CAAP;AAAA,iBAAjD,EADa,CACqE;AACrF;AACJ;;AAED;;AArCJ;AAAA;AAAA,mCAsCgB;AACR,iBAAK,KAAL,CAAW,IAAX;AACA,iBAAK,OAAL,CAAa,GAAb,CAAiB,oBAAjB;AACA,cAAE,QAAF,EAAY,GAAZ,oBAAiC,KAAK,QAAtC,+BAAwE,KAAK,QAA7E;AACA,gBAAG,KAAK,YAAR,EAAsB,KAAK,YAAL,CAAkB,QAAlB;AACtB;AACH;;AAED;;AA9CJ;AAAA;AAAA,gCA+CwB;AAAA,gBAAb,KAAa,uEAAP,KAAO;;AAChB,gBAAG,KAAH,EAAS;AACL,oBAAG,KAAK,OAAL,CAAa,MAAhB,EAAuB;AACnB,yBAAK,eAAL;AACA,yBAAK,MAAL,CAAY,QAAZ;AACA,yBAAK,eAAL,CAAqB,QAArB;AACH;AACD,qBAAK,OAAL,GAAe,MAAM,WAAN,CAAkB,aAAlB,CAAf;AACA,qBAAK,OAAL,CAAa,IAAb,CAAkB,yBAAlB,EACK,GADL,CACS,8BADT,EAEK,GAFL,CAES,4BAFT;AAGH;AACD,iBAAK,SAAL,GAAiB,IAAjB;AACA,iBAAK,GAAL,CAAS,eAAT,CAAyB,MAAzB;AACH;;AAED;;AA/DJ;AAAA;AAAA,iCAgEyB;AAAA,gBAAb,KAAa,uEAAP,KAAO;;AACjB,iBAAK,KAAL,CAAW,KAAX;AACA,gBAAI,OAAO,OAAO,MAAP,CACP;AACI,0BAAU,KAAK,MAAL,GAAc,MAAM,SAAN,CAAgB,KAAK,MAAL,CAAY,KAA5B,CAAd,GAAmD,IADjE;AAEI,yBAAS,KAAK,MAAL,CAAY,eAAZ,CAA4B,WAA5B,CAAwC,MAAxC,GAAiD;AAF9D,aADO,EAKP,KAAK,OALE,EAMP,EAAE,oBAAoB,KAAK,kBAA3B,EAA+C,cAAc,KAAK,YAAlE,EANO,CAAX;;AASA,gBAAI,SAAS,KAAK,cAAL,CAAoB,YAApB,EAAkC,IAAlC,CAAb;AACA,iBAAK,OAAL,CAAa,MAAb,CAAoB,MAApB;;AAEA,gBAAG,KAAK,YAAR,EAAsB,KAAK,YAAL,CAAkB,oBAAlB;AACzB;;AAED;;AAjFJ;AAAA;AAAA,uCAkFoB;AACZ,gBAAG,EAAE,KAAK,OAAL,CAAa,MAAb,IAAuB,KAAK,OAAL,CAAa,cAAtC,CAAH,EAA0D;AAC1D,iBAAK,MAAL,CAAY,IAAZ;AACA,iBAAK,MAAL,CAAY,QAAZ;AACA,iBAAK,MAAL,GAAc,IAAd;AACH;;AAED;;AAzFJ;AAAA;AAAA,sCA0FmB;AACX,gBAAG,CAAC,KAAK,MAAL,CAAY,MAAhB,EAAwB,KAAK,MAAL,CAAY,oBAAZ;;AAExB,iBAAK,MAAL,CAAY,KAAZ;AACA,iBAAK,WAAL;AACA,iBAAK,OAAL,CAAa,MAAb,GAAsB,IAAtB;AACA,iBAAK,MAAL;;AAEA;AACA,gBAAI,QAAQ;AACR,uBAAO,SAAS,KAAK,WAAd,EAA0B,EAA1B,CADC;AAER,sBAAM,SAAS,KAAK,WAAd,EAA0B,EAA1B;AAFE,aAAZ;AAIA,iBAAK,MAAL,GAAc,IAAI,eAAJ,CAAoB,KAAK,MAAzB,EAAiC,KAAjC,CAAd;AACA,iBAAK,eAAL,GAAuB,IAAI,eAAJ,CAAoB,KAAK,MAAzB,CAAvB;;AAEA;AACA,gBAAG,CAAC,KAAK,YAAT,EAAuB,KAAK,iBAAL;;AAEvB,iBAAK,MAAL,CAAY,IAAZ,CAAiB,yBAAjB,EAA4C,EAAE,OAAO,KAAT,EAA5C;AACH;;AAED;;AAhHJ;AAAA;AAAA,uCAiHoB;AACZ,iBAAK,OAAL,CAAa,cAAb,GAA8B,IAA9B;AACA,iBAAK,MAAL;AACH;;AAED;;AAtHJ;AAAA;AAAA,kCAuHe;AACP,gBAAI,UAAU,KAAK,GAAL,CAAS,kBAAT,CAA4B,GAA5B,EAAd;AACA,gBAAG,CAAC,OAAJ,EAAa,OAFN,CAEc;;AAErB,gBAAI,IAAI,WAAW,WAAX,CAAuB,KAAK,MAAL,CAAY,KAAnC,EAA0C,KAAK,eAAL,CAAqB,KAA/D,EAAsE,OAAtE,EAA+E,KAAK,MAApF,CAAR;AACA,iBAAK,MAAL,CAAY,eAAZ,CAA4B,gBAA5B,CAA6C,CAA7C;;AAEA,iBAAK,YAAL;AACH;;AAED;;AAjIJ;AAAA;AAAA,sCAkImB;AACX,iBAAK,MAAL,CAAY,eAAZ,CAA4B,OAA5B,GAAsC,KAAtC;AACA,iBAAK,wBAAL;AACH;;AAED;;AAvIJ;AAAA;AAAA,0CAwIuB;AACf,iBAAK,MAAL,CAAY,eAAZ,CAA4B,OAA5B,GAAsC,KAAK,MAAL,CAAY,MAAlD;AACA,iBAAK,uBAAL;AACA,cAAE,QAAF,EAAY,GAAZ,4BAAyC,KAAK,QAA9C;AACH;;AAED;;AA9IJ;AAAA;AAAA,wCA+IqB,CA/IrB,EA+IwB;AAChB,gBAAG,CAAC,KAAK,MAAL,CAAY,MAAhB,EAAwB;AACxB,gBAAI,QAAQ,EAAE,KAAd;;AAEA,gBAAG,SAAS,EAAZ,EAAgB,KAAK,MAAL,CAAY,eAAZ,CAA4B,cAA5B;AAChB,gBAAG,SAAS,EAAZ,EAAgB,KAAK,MAAL,CAAY,eAAZ,CAA4B,cAA5B;AACnB;;AAED;;AAvJJ;AAAA;AAAA,4CAwJyB;AAAA;;AACjB,iBAAK,WAAL,GAAmB,MAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,KAAK,GAAL,CAAS,WAA7C,EAA0D,KAAK,UAAL,CAAgB,MAA1E,CAAnB;;AAEA;AACA,iBAAK,MAAL,CAAY,SAAZ,CAAsB,KAAtB;AACA,cAAE,QAAF,EAAY,EAAZ,4BAAwC,KAAK,QAA7C,EAAyD,MAAM,QAAN,CAAgB,UAAC,KAAD,EAAW;AAChF,oBAAG,CAAC,OAAK,MAAL,CAAY,MAAhB,EAAwB;;AAExB,oBAAI,IAAI,MAAM,KAAd;AAAA,oBACI,IAAI,MAAM,KADd;AAAA,oBAEI,cACK,IAAI,OAAK,MAAL,CAAY,MAAZ,CAAmB,IAAvB,IAA+B,IAAI,OAAK,MAAL,CAAY,MAAZ,CAAmB,KAAvD,IACC,IAAI,OAAK,MAAL,CAAY,MAAZ,CAAmB,GAAvB,IAA8B,IAAI,OAAK,MAAL,CAAY,MAAZ,CAAmB,MAJ9D;AAAA,oBAKI,iBAAiB,CAAC,WAAD,IAAgB,KAAK,OAAK,MAAL,CAAY,MAAZ,CAAmB,qBAL7D;AAAA,oBAMI,gBAAgB,OAAK,QAAL,CAAc,QAAd,CAAuB,kBAAvB,CANpB;;AAQA,oBAAG,WAAH,EAAgB;AACZ,2BAAK,QAAL,CAAc,QAAd,CAAuB,OAAK,UAAL,CAAgB,MAAvC;AACA;AACH;;AAED,oBAAI,UAAe,IAAI,OAAK,MAAL,CAAY,MAAZ,CAAmB,IAA1C;AAAA,oBACI,UAAe,IAAI,OAAK,MAAL,CAAY,MAAZ,CAAmB,GAD1C;AAAA,oBAEI,SAAe,EAFnB;AAAA,oBAGI,YAAe,OAAK,OAAL,CAAa,KAAb,EAHnB;AAAA,oBAII,aAAe,OAAK,OAAL,CAAa,MAAb,KAAwB,OAAK,GAAL,CAAS,UAAT,CAAoB,MAApB,EAJ3C;AAAA,oBAKI,cAAgB,UAAU,OAAK,WAAL,CAAiB,KAA3B,GAAmC,SAAO,CAA3C,IAAiD,SALpE;AAAA,oBAMI,eAAgB,UAAU,OAAK,WAAL,CAAiB,MAA3B,GAAoC,SAAO,CAA5C,IAAkD,UANrE;;AAQA;AACA,oBAAI,OAAO,cAAe,YAAY,OAAK,WAAL,CAAiB,KAA7B,GAAqC,MAApD,GAA+D,UAAU,MAApF;AAAA,oBACI,OAAO,eAAgB,aAAa,OAAK,WAAL,CAAiB,MAA9B,GAAuC,MAAvD,GAAkE,UAAU,MADvF;;AAGA;AACA;AACA,oBAAI,kBAAkB,CAAC,aAApB,IAAsC,OAAK,QAAL,CAAc,QAAd,CAAuB,qBAAvB,CAAzC,EAAwF;AACpF,2BAAK,QAAL,CAAc,QAAd,CAAuB,OAAK,UAAL,CAAgB,MAAvC;AACH,iBAFD,MAEO;AACH,2BAAK,QAAL,CAAc,WAAd,CAA0B,OAAK,UAAL,CAAgB,MAA1C;AACH;;AAED,uBAAK,QAAL,CAAc,GAAd,CAAkB;AACd,0BAAS,IAAT,OADc;AAEd,yBAAQ,IAAR;AAFc,iBAAlB;AAIH,aAxCuE,CAwCrE,IAxCqE,CAwChE,IAxCgE,CAAf,EAwC1C,EAxC0C,CAAzD;AAyCH;AAtML;AAAA;AAAA,4BAwMoB;AACZ,iBAAK,SAAL,GAAiB,KAAK,SAAL,IAAkB,KAAK,OAAL,CAAa,IAAb,CAAkB,sBAAlB,CAAnC;AACA,mBAAO,KAAK,SAAZ;AACH;AA3ML;;AAAA;AAAA,EAAwC,iBAAxC;;;ACrBA;AACA;;;;;;;;;;;;;AAKA,IAAQ,SAAS,QAAQ,UAAR,CAAjB;AAAA,IACQ,QAAQ,QAAQ,gBAAR,CADhB;AAAA,IAEQ,qBAAqB,kBAF7B;;AAIA,OAAO,OAAP;AAAA;;AAEI,6BAAa,MAAb,EAAqB,KAArB,EAA4B;AAAA;;AAAA,sIAClB,MADkB,EACV,KADU;;AAExB,cAAK,KAAL,GAAa,KAAb,CAFwB,CAEkB;AAC1C,cAAK,YAAL,GAAoB,kBAApB,CAHwB,CAGkB;AAC1C,cAAK,QAAL,GAAgB,KAAhB,CAJwB,CAIkB;AAC1C,cAAK,QAAL,GAAgB,MAAM,KAAtB,CALwB,CAKkB;AAC1C,cAAK,MAAL;AACA,cAAK,OAAL,GAAe,MAAK,GAAL,CAAS,UAAxB,CAPwB,CAOkB;AAPlB;AAQ3B;;AAED;;;AAZJ;AAAA;AAAA,2CAawB;AAAA;;AAChB;AACA,iBAAK,GAAL,CAAS,EAAT,CAAY,sBAAZ,EAAoC,UAAC,CAAD,EAAO;AACvC,kBAAE,cAAF;AACA,uBAAK,QAAL,GAAgB,IAAhB;AACA;AACA,kBAAE,QAAF,EAAY,EAAZ,4BAAwC,OAAK,QAA7C,EAAyD,MAAM,QAAN,CAAe,OAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB,CAAf,EAAuC,GAAvC,CAAzD;;AAEA;AACA,oBAAG,CAAC,OAAK,MAAL,CAAY,OAAZ,CAAoB,YAAxB,EAAsC;AAClC,2BAAK,OAAL,CAAa,IAAb,CAAkB,sBAAlB,EACK,QADL,CACc,qBADd,EAEK,WAFL,CAEiB,kBAFjB;AAGH;AACJ,aAZD;;AAcA;AACA,cAAE,QAAF,EAAY,EAAZ,0BAAsC,KAAK,QAA3C,EAAuD,UAAC,CAAD,EAAO;AACzD,oBAAG,CAAC,OAAK,QAAT,EAAmB;AACnB,kBAAE,QAAF,EAAY,GAAZ,4BAAyC,OAAK,QAA9C;AACA,uBAAK,QAAL,GAAgB,KAAhB;;AAEA;AACA,oBAAG,CAAC,OAAK,MAAL,CAAY,OAAZ,CAAoB,YAAxB,EAAsC;AAClC,2BAAK,OAAL,CAAa,IAAb,CAAkB,sBAAlB,EACI,WADJ,CACgB,qBADhB,EAEI,WAFJ,CAEgB,kBAFhB;AAGH;AACL,aAXD;;AAaA;AACA;AACA,gBAAG,CAAC,KAAK,MAAL,CAAY,OAAZ,CAAoB,YAAxB,EAAsC;AAClC,oBAAI,OAAO,IAAX;AACA,qBAAK,GAAL,CACK,EADL,CACQ,gCADR,EAC0C,YAAM;AACxC,yBAAK,OAAL,CAAa,IAAb,CAAkB,sBAAlB,EAA0C,QAA1C,CAAmD,kBAAnD;AACH,iBAHL,EAIK,EAJL,CAIQ,gCAJR,EAI0C,YAAM;AACxC,yBAAK,OAAL,CAAa,IAAb,CAAkB,sBAAlB,EAA0C,WAA1C,CAAsD,kBAAtD;AACH,iBANL;AAOH;AACJ;;AAED;;AAzDJ;AAAA;AAAA,+BA0DY,CA1DZ,EA0De;AACP,gBAAI,cAAc,KAAK,kBAAL,CAAwB,EAAE,KAA1B,CAAlB;AAAA,gBACI,SAAS,SAAS,KAAK,QAAL,GAAgB,WAAzB,CADb;;AAGA,gBAAG,SAAS,KAAK,QAAjB,EAA0B;AACtB,qBAAK,KAAL,GAAa;AACT,2BAAQ,KAAK,QADJ;AAET,yBAAQ;AAFC,iBAAb;AAIH,aALD,MAKK;AACD,qBAAK,KAAL,GAAa;AACT,2BAAQ,MADC;AAET,yBAAQ,KAAK;AAFJ,iBAAb;AAIH;AACD,iBAAK,MAAL;AACA,iBAAK,MAAL,CAAY,IAAZ,CAAiB,6BAAjB,EAAgD,EAAE,OAAO,KAAK,KAAd,EAAhD;AACH;;AAED;;AA7EJ;AAAA;AAAA,2CA8EwB,IA9ExB,EA8E8B;AACtB,gBAAI,IAAI,KAAK,GAAL,CAAS,CAAT,EAAY,OAAO,KAAK,OAAL,CAAa,MAAb,GAAsB,IAAzC,CAAR;AAAA,gBAAwD;AACpD,kBAAM,KAAK,OAAL,CAAa,UAAb,EADV;AAAA,gBAEI,MAAO,IAAI,GAFf;AAGA,gBAAG,MAAM,CAAT,EAAY,MAAM,CAAN;AACZ,gBAAG,MAAM,CAAT,EAAY,MAAM,CAAN;AACZ,mBAAO,GAAP;AACH;;AAED;;AAvFJ;AAAA;AAAA,mCAwFgB;AACR,cAAE,QAAF,EAAY,GAAZ,4BAAyC,KAAK,QAA9C,6BAA8E,KAAK,QAAnF;AACA,iBAAK,GAAL,CAAS,GAAT,CAAa,gCAAb;AACA,iBAAK,GAAL,CAAS,GAAT,CAAa,gCAAb;AACA,iBAAK,GAAL,CAAS,GAAT,CAAa,sBAAb;AACA,iBAAK,GAAL,CAAS,MAAT;AACH;;AAED;;AAhGJ;AAAA;AAAA,mCAiGgB,cAjGhB,EAiGgC;AACxB,gBAAI,WAAW,KAAK,KAAL,CAAW,KAAX,GAAmB,cAAlC;AACA,iBAAK,WAAL,GAAmB,QAAnB;AACA,iBAAK,KAAL,CAAW,KAAX,GAAmB,QAAnB;AACA,iBAAK,QAAL,GAAgB,QAAhB;AACA,iBAAK,QAAL;AACA,iBAAK,MAAL;;AAEA,iBAAK,MAAL,CAAY,IAAZ,CAAiB,6BAAjB,EAAgD,EAAE,OAAO,KAAK,KAAd,EAAhD;AACH;AA1GL;;AAAA;AAAA,EAA+C,MAA/C;;;ACVA;AACA;;;;;;;;;;;;;;AAIA,IAAQ,oBAAoB,QAAQ,8BAAR,CAA5B;AAAA,IACQ,QAAQ,QAAQ,gBAAR,CADhB;AAAA,IAEQ,qBAAqB,QAF7B;AAAA,IAGQ,yBAAyB,aAHjC;;AAKA,OAAO,OAAP;AAAA;;AAEI,oBAAa,MAAb,EAAqB,KAArB,EAA0C;AAAA,YAAd,OAAc,uEAAN,IAAM;;AAAA;;AAAA,oHAChC,MADgC;;AAEtC,cAAK,KAAL,GAAa,KAAb;AACA,cAAK,OAAL,GAAe,OAAf;AACA,cAAK,YAAL,GAAoB,kBAApB;;AAEA,YAAG,CAAC,MAAK,GAAL,CAAS,UAAT,CAAoB,MAAxB,EAA+B;AAC3B,kBAAK,GAAL,CAAS,QAAT,CAAkB,MAAlB,CACI,MAAK,cAAL,CAAoB,sBAApB,CADJ;AAGH;AAVqC;AAWzC;;AAED;;;AAfJ;AAAA;AAAA,oCAgBkC;AAAA,gBAAnB,WAAmB,uEAAP,KAAO;;AAC1B,iBAAK,GAAL,CAAS,QAAT,CAAkB,KAAK,UAAL,CAAgB,MAAlC;AACA,gBAAG,WAAH,EAAgB,KAAK,GAAL,CAAS,QAAT,CAAkB,mBAAlB;AACnB;;AAED;;AArBJ;AAAA;AAAA,qCAsBkB;AACV,iBAAK,GAAL,CAAS,WAAT,CAAwB,KAAK,UAAL,CAAgB,MAAxC;AACH;;AAED;;AA1BJ;AAAA;AAAA,iCA2Bc;AACN;AACA,iBAAK,GAAL,CAAS,QAAT,CAAkB,IAAlB,wBAA2C,KAAK,WAAhD,UAAiE,MAAjE;;AAEA;AACA,iBAAK,GAAL,GAAW,EAAE,KAAK,cAAL,CAAoB,KAAK,YAAzB,EAAuC,KAAK,kBAA5C,CAAF,CAAX;AACA,iBAAK,GAAL,CAAS,UAAT,CAAoB,MAApB,CAA2B,KAAK,GAAhC;AACA,iBAAK,gBAAL;AACH;;AAED;;AArCJ;AAAA;AAAA,2CAsCwB;AAAA;;AAChB;AACA,iBAAK,GAAL,CAAS,EAAT,CAAY,uBAAZ,EAAqC,YAAM;AACvC,uBAAK,GAAL,CAAS,QAAT,CAAkB,cAAlB,EAAkC,OAAlC,CAA0C,kBAA1C,EAA8D,QAA9D,CAAuE,aAAvE;AACH,aAFD,EAEG,EAFH,CAEM,uBAFN,EAE+B,YAAM;AACjC,uBAAK,GAAL,CAAS,WAAT,CAAqB,cAArB,EAAqC,OAArC,CAA6C,kBAA7C,EAAiE,WAAjE,CAA6E,aAA7E;AACH,aAJD;AAKH;;AAED;;AA/CJ;AAAA;;;AAkEI;AAlEJ,mCAmEgB;AACR,iBAAK,GAAL,CACK,GADL,CACS,uBADT,EAEK,GAFL,CAES,uBAFT,EAGK,GAHL,CAGS,kBAHT;AAIA;AACH;AAzEL;AAAA;AAAA,4BAgD8B;AACrB;AACD,gBAAI,OAAQ,KAAK,KAAL,CAAW,KAAX,GAAmB,KAAK,QAAzB,GAAqC,GAAhD;AAAA,gBACI,QAAU,KAAK,KAAL,CAAW,GAAX,GAAiB,KAAK,QAAvB,GAAmC,GAApC,GAA2C,IADvD;AAAA,gBAEI,SAAU,MAAM,KAAK,KAAL,CAAW,KAAX,CAAP,IAA6B,GAF1C;AAGA,mBAAO;AACH,sBAAc,OAAO,GADlB;AAEH,uBAAc,QAAQ,GAFnB;AAGH,wBAAc,MAHX;AAIH,6BAAc,KAAK,MAAL,CAAY,OAAZ,CAAoB,0BAJ/B;AAKH,8BAAc,OAAO,EALlB;AAMH,6BAAc,MAAM,SAAN,CAAgB,KAAK,KAArB,CANX;AAOH,6BAAc,CAAC,KAAK,OAAN,GAAgB,IAAhB,GAAuB,KAAK,OAAL,CAAa,IAP/C;AAQH,2BAAc,CAAC,CAAC,KAAK,KAAL,CAAW,GARxB;AASH,oBAAc,KAAK;AAThB,aAAP;AAWH;AAhEL;;AAAA;AAAA,EAAsC,iBAAtC;;;ACVA;AACA;;;;;;;;;;;;;;AAIA,IAAM,oBAAoB,QAAQ,8BAAR,CAA1B;AAAA,IACM,eAAe,eADrB;;AAGA,OAAO,OAAP;AAAA;;AAEI,0BAAa,MAAb,EAAqB;AAAA;;AAAA,gIACX,MADW;;AAEjB,cAAK,MAAL;;AAEA,cAAK,OAAL,QAAmB,cAAnB;;AAEA,cAAK,GAAL,CAAS,EAAT,CAAY,yBAAZ,EAAuC,YAAM;AACzC,kBAAK,MAAL,CAAY,oBAAZ;AACH,SAFD;AANiB;AASpB;;AAED;;;AAbJ;AAAA;AAAA,iCAcc;AACN,gBAAI,MAAM,KAAK,MAAL,CAAY,QAAZ,CAAqB,YAArB,EAAmC,QAAnC,CAA4C,QAA5C,EAAsD,EAAtD,CAAV;AACA,gBAAI,WAAJ,CAAgB,mBAAhB;AACA,iBAAK,GAAL,GAAW,EAAE,IAAI,EAAJ,EAAF,CAAX;AACA,iBAAK,GAAL,CAAS,QAAT,CAAkB,gBAAlB,EAAoC,IAApC,CAAyC,uBAAzC,EAAkE,IAAlE,CAAuE,KAAK,cAAL,CAAoB,YAApB,CAAvE;AACH;;AAED;;AArBJ;AAAA;AAAA,+CAsB4B;AACpB,gBAAI,MAAM,KAAK,MAAL,CAAY,eAAZ,CAA4B,WAA5B,CAAwC,MAAlD;AAAA,gBACI,UAAU,KAAK,GAAL,CAAS,IAAT,CAAc,GAAd,CADd;AAEA,oBAAQ,IAAR,CAAa,GAAb;AACA,kBAAM,CAAN,GAAU,QAAQ,WAAR,CAAoB,KAAK,UAAL,CAAgB,MAApC,CAAV,GAAwD,QAAQ,QAAR,CAAiB,KAAK,UAAL,CAAgB,MAAjC,CAAxD;AACH;;AAED;;AA7BJ;AAAA;AAAA,mCA8BgB;AACR,iBAAK,GAAL,CAAS,GAAT,CAAa,yBAAb;AACA;AACH;AAjCL;;AAAA;AAAA,EAA4C,iBAA5C;;;ACRA;AACA;;;;;;;;;;;;;;AAIA,IAAQ,QAAQ,QAAQ,SAAR,CAAhB;AAAA,IACQ,QAAQ,QAAQ,gBAAR,CADhB;;AAGA,OAAO,OAAP;AAAA;;AAEI,6BAAa,MAAb,EAAqB;AAAA;;AAAA,sIACX,MADW;;AAEjB,cAAK,OAAL,GAAe,MAAK,OAAL,CAAa,IAAb,CAAkB,yBAAlB,CAAf;AACA,cAAK,UAAL;AACA,cAAK,QAAL,GAAgB,KAAhB;AAJiB;AAKpB;;AAED;;;AATJ;AAAA;AAAA,qCAUkB;AAAA;;AACV;AACA,iBAAK,OAAL,CAAa,EAAb,CAAgB,gCAAhB,EAAkD,UAAC,CAAD,EAAO;AACrD;AACA,oBAAI,CAAE,EAAE,EAAE,MAAJ,EAAY,QAAZ,CAAqB,wBAArB,CAAN,EAAwD,OAFH,CAEW;AAChE,oBAAI,EAAE,EAAE,MAAJ,EAAY,QAAZ,CAAqB,WAArB,CAAJ,EAAwC,OAHa,CAGL;;AAEhD;AACA,oBAAG,OAAK,GAAR,EAAa,OAAK,GAAL,CAAS,MAAT;;AAEb;AACA,oBAAI,QAAQ;AACR,wBAAI,OAAK,eAAL,CAAqB,EAAE,KAAvB,CADI;AAER,wBAAI,OAAK,eAAL,CAAqB,EAAE,KAAvB;AAFI,iBAAZ;AAIA,sBAAM,EAAN,GAAW,MAAM,EAAjB;AACA,sBAAM,EAAN,GAAW,MAAM,EAAjB;AACA,uBAAK,KAAL,GAAa,KAAb;;AAEA;AACA,uBAAK,OAAL,GAAe,MAAM,EAArB;AACA,uBAAK,OAAL,GAAe,MAAM,EAArB;;AAEA;AACA,uBAAK,MAAL;AACA,uBAAK,QAAL,GAAgB,IAAhB;AACA,uBAAK,SAAL,GAAiB,KAAjB,CAxBqD,CAwB7B;;AAExB;AACA,kBAAE,QAAF,EAAY,EAAZ,2BAAuC,OAAK,QAA5C,EAAwD,MAAM,QAAN,CAAe,OAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB,CAAf,EAAuC,GAAvC,CAAxD;;AAEA;AACA,oBAAG,CAAC,OAAK,MAAL,CAAY,OAAZ,CAAoB,YAAxB,EAAsC;AAClC,2BAAK,OAAL,CAAa,IAAb,CAAkB,sBAAlB,EAA0C,QAA1C,CAAmD,qBAAnD;AACH;AACJ,aAjCD;;AAmCA;AACA,cAAE,QAAF,EAAY,EAAZ,yBAAqC,KAAK,QAA1C,EAAsD,UAAC,CAAD,EAAO;AACzD,oBAAG,CAAC,OAAK,QAAT,EAAmB;;AAEnB,kBAAE,QAAF,EAAY,GAAZ,2BAAwC,OAAK,QAA7C;;AAEA,oBAAG,CAAC,OAAK,SAAT,EAAmB;AACf;AACA,2BAAK,KAAL,GAAa,IAAb;AACA,wBAAG,OAAK,GAAR,EAAa,OAAK,GAAL,CAAS,MAAT;AAChB;;AAED,uBAAK,QAAL,GAAgB,KAAhB;;AAEA;AACA,oBAAG,CAAC,OAAK,MAAL,CAAY,OAAZ,CAAoB,YAAxB,EAAsC;AAClC,2BAAK,OAAL,CAAa,IAAb,CAAkB,sBAAlB,EAA0C,WAA1C,CAAsD,qBAAtD;AACH;AACJ,aAjBD;AAkBH;;AAED;;AApEJ;AAAA;AAAA,+BAqEY,CArEZ,EAqEe;AACP,iBAAK,SAAL,GAAiB,IAAjB;;AAEA,gBAAI,OAAO,KAAK,eAAL,CAAqB,EAAE,KAAvB,CAAX;AAAA,gBACI,OAAO,KAAK,eAAL,CAAqB,EAAE,KAAvB,CADX;;AAGA,gBAAG,OAAO,KAAK,OAAf,EAAuB;AACnB,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,OAArB;AACA,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,IAAZ,CAAhB;AACH,aAHD,MAGK;AACD,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,GAAL,CAAS,GAAT,EAAc,IAAd,CAAhB;AACA,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,OAArB;AACH;AACD,gBAAG,OAAO,KAAK,OAAf,EAAuB;AACnB,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,OAArB;AACA,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,IAAZ,CAAhB;AACH,aAHD,MAGK;AACD,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,GAAL,CAAS,GAAT,EAAc,IAAd,CAAhB;AACA,qBAAK,KAAL,CAAW,EAAX,GAAgB,KAAK,OAArB;AACH;AACD,iBAAK,gBAAL;;AAEA,iBAAK,MAAL,CAAY,IAAZ,CAAiB,6BAAjB,EAAgD,EAAE,OAAO,KAAK,KAAd,EAAhD;AACH;;AAED;;AA9FJ;AAAA;AAAA,wCA+FqB,CA/FrB,EA+FwB;AAChB,gBAAI,IAAI,KAAK,OAAL,CAAa,MAAb,GAAsB,IAA9B,CADgB,CACoB;AACpC,gBAAI,MAAM,KAAK,OAAL,CAAa,UAAb,EAAV;AACA,mBAAO,OAAO,CAAE,IAAI,GAAL,GAAY,GAAb,EAAkB,OAAlB,CAA0B,CAA1B,CAAP,CAAP,CAHgB,CAG6B;AAChD;;AAED;;AArGJ;AAAA;AAAA,wCAsGqB,CAtGrB,EAsGwB;AAChB,gBAAI,IAAI,KAAK,OAAL,CAAa,MAAb,GAAsB,GAA9B,CADgB,CACmB;AACnC,gBAAI,MAAM,KAAK,OAAL,CAAa,WAAb,EAAV;AACA,mBAAO,OAAO,CAAE,IAAI,GAAL,GAAY,GAAb,EAAkB,OAAlB,CAA0B,CAA1B,CAAP,CAAP,CAHgB,CAG6B;AAChD;;AAED;;AA5GJ;AAAA;AAAA,mCA6GgB;AACR,iBAAK,OAAL,CAAa,GAAb,CAAiB,gCAAjB;AACA,cAAE,QAAF,EAAY,GAAZ,yBAAsC,KAAK,QAA3C,8BAA4E,KAAK,QAAjF;AACA;AACH;AAjHL;;AAAA;AAAA,EAA+C,KAA/C;;;ACRA;AACA;;;;;;;;;;;;AAIA,IAAM,oBAAoB,QAAQ,8BAAR,CAA1B;;AAEA,OAAO,OAAP;AAAA;;AAEI,mBAAa,MAAb,EAAiC;AAAA,YAAZ,KAAY,uEAAN,IAAM;;AAAA;;AAAA,kHACvB,MADuB;;AAE7B,cAAK,KAAL,GAAa,KAAb;AACA,cAAK,OAAL,GAAe,MAAK,OAApB;AAH6B;AAIhC;;AAED;;;AARJ;AAAA;AAAA,iCASc;AACN,gBAAG,CAAC,KAAK,KAAT,EAAgB;AAChB,gBAAG,KAAK,GAAR,EAAa,KAAK,GAAL,CAAS,MAAT;;AAEb,iBAAK,GAAL,GAAW,EAAE,QAAF,EAAY,QAAZ,CAAqB,WAArB,CAAX;AACA,iBAAK,gBAAL;AACA,iBAAK,OAAL,CAAa,MAAb,CAAoB,KAAK,GAAzB;AACH;;AAED;;AAlBJ;AAAA;AAAA,2CAmBwB;AAChB,iBAAK,GAAL,CAAS,GAAT,CAAa;AACT,sBAAQ,KAAK,KAAL,CAAW,EAAX,GAAgB,GADf;AAET,qBAAQ,KAAK,KAAL,CAAW,EAAX,GAAgB,GAFf;AAGT,uBAAS,KAAK,KAAL,CAAW,EAAX,GAAc,KAAK,KAAL,CAAW,EAA1B,GAAgC,GAH/B;AAIT,wBAAS,KAAK,KAAL,CAAW,EAAX,GAAc,KAAK,KAAL,CAAW,EAA1B,GAAgC;AAJ/B,aAAb;AAMH;AA1BL;;AAAA;AAAA,EAAqC,iBAArC;;;ACPA;AACA;;;;;;;;;AAKA,IAAM,SAAS,QAAQ,UAAR,CAAf;;AAEA;;;;;;;;;AASA,IAAM,gBAAgB;AAClB,qBAAiB;AACb,wBAAgB,wBAAC,KAAD,EAAQ,KAAR,EAAkB;AAC9B,kBAAM,kBAAN,CAAyB,MAAM,MAAN,CAAa,EAAtC;AACH,SAHY;AAIb,+BAAuB,+BAAC,KAAD,EAAQ,KAAR,EAAkB;AACrC,kBAAM,WAAN;AACH,SANY;AAOb,uBAAe,uBAAC,KAAD,EAAQ,KAAR,EAAkB;AAC7B,kBAAM,sBAAN,CAA6B,MAAM,MAAnC;AACH,SATY;AAUb,2BAAmB,2BAAC,KAAD,EAAQ,KAAR,EAAkB;AACjC,kBAAM,qBAAN,CAA4B,MAAM,MAAN,CAAa,EAAzC;AACH,SAZY;AAab,oBAAY,oBAAC,KAAD,EAAQ,KAAR,EAAkB;AAC1B,gBAAI,aAAa,MAAM,cAAN,CAAqB,MAAM,MAAN,CAAa,YAAlC,CAAjB;AACA,gBAAG,UAAH,EAAe,WAAW,WAAX,CAAuB,aAAvB,CAAqC,MAAM,MAAN,CAAa,IAAlD;AAClB,SAhBY;AAiBb,wBAAgB,wBAAC,KAAD,EAAQ,KAAR,EAAkB;AAC9B,gBAAI,UAAU,MAAM,WAAN,CAAkB,MAAM,MAAN,CAAa,EAA/B,CAAd;AACA,gBAAG,OAAH,EAAY,QAAQ,WAAR,CAAoB,cAApB,CAAmC,KAAnC;AACf;AApBY,KADC;AAuBlB,cAAU;AACN,0BAAkB,0BAAC,KAAD,EAAQ,KAAR,EAAkB;AAChC,kBAAM,WAAN;AACH,SAHK;AAIN,gCAAwB,gCAAC,KAAD,EAAQ,KAAR,EAAkB;AACtC,kBAAM,YAAN;AACH;AANK,KAvBQ;AA+BlB,kBAAc;AACV,wBAAgB,wBAAC,KAAD,EAAQ,KAAR,EAAkB;AAC9B,kBAAM,oBAAN;AACH;AAHS,KA/BI;AAoClB,wBAAoB;AAChB,8BAAsB,8BAAC,KAAD,EAAQ,KAAR,EAAkB;AACpC,kBAAM,oBAAN;AACH;AAHe;AApCF,CAAtB;;AA2CA,OAAO,OAAP;AAEI,6BAAa,MAAb,EAAqB;AAAA;;AACjB,aAAK,MAAL,GAAc,MAAd;AACA,aAAK,WAAL,GAAmB,KAAnB;AACA,aAAK,WAAL,GAAmB,EAAnB;AACA,aAAK,mBAAL,GAA2B,EAA3B;AACA,aAAK,aAAL,GAAqB,aAArB;AACH;;AAED;;;AAVJ;AAAA;AAAA,6CAW0B,GAX1B,EAW+B,SAX/B,EAW0C;AAAA;;AAClC,gBAAI,iBAAiB,KAAK,aAAL,CAAmB,SAAnB,CAArB;AACA,gBAAI,cAAJ,EAAoB;AAChB,uBAAO,IAAP,CAAY,cAAZ,EAA4B,OAA5B,CAAoC,UAAC,GAAD,EAAS;AACzC;AACA,wBAAI,CAAC,CAAC,OAAK,mBAAL,CAAyB,OAAzB,CAAiC,GAAjC,CAAN,EAA6C;AACzC,4BAAI,WAAW,eAAe,GAAf,EAAoB,IAApB,CAAyB,GAAzB,CAAf;AACA,+BAAK,gBAAL,CAAsB,GAAtB,EAA4B,UAAC,GAAD,EAAS;AACjC,gCAAG,CAAC,OAAK,WAAT,EAAsB;AACtB,mCAAK,WAAL,CAAiB,GAAjB,EAAsB,SAAtB,EAAiC,GAAjC;AACA,qCAAS,GAAT,EAAc,GAAd;AACH,yBAJ0B,CAIxB,IAJwB,CAInB,MAJmB,CAA3B;AAKH;AACJ,iBAVD;AAWH;AACJ;;AAED;;AA5BJ;AAAA;AAAA,yCA6BsB,IA7BtB,EA6B4B,QA7B5B,EA6BsC;AAC9B,iBAAK,MAAL,CAAY,EAAZ,CAAe,IAAf,EAAqB,QAArB;AACA,iBAAK,mBAAL,CAAyB,IAAzB,CAA8B,IAA9B;AACH;;AAED;;AAlCJ;AAAA;AAAA,2CAmCwB,IAnCxB,EAmC8B;AACtB,iBAAK,MAAL,CAAY,GAAZ,CAAgB,IAAhB;AACA,gBAAI,IAAI,KAAK,mBAAL,CAAyB,OAAzB,CAAiC,IAAjC,CAAR;AACA,iBAAK,mBAAL,CAAyB,MAAzB,CAAgC,CAAhC,EAAmC,CAAnC;AACH;;AAED;;AAzCJ;AAAA;AAAA,6BA0CU,IA1CV,EA0CgB,IA1ChB,EA0CsB;AACd,gBAAG,CAAC,KAAK,WAAT,EAAsB;AACtB,mBAAO,GAAP,CAAW,mBAAX,EAAgC,IAAhC,EAAsC,IAAtC;AACA,gBAAI,MAAM,IAAI,WAAJ,CAAgB,IAAhB,EAAsB,EAAE,UAAU,IAAZ,EAAtB,CAAV;AACA,iBAAK,MAAL,CAAY,OAAZ,CAAoB,GAApB;AACH;AA/CL;AAAA;AAAA,mCAiDgB;AAAA;;AACR,iBAAK,mBAAL,CAAyB,OAAzB,CAAiC,UAAC,IAAD,EAAU;AAAE,uBAAK,kBAAL,CAAwB,IAAxB;AAA+B,aAA5E;AACH;AAnDL;AAAA;AAAA,oCAqDiB,SArDjB,EAqD4B,SArD5B,EAqDuC,KArDvC,EAqD8C;AACtC,mBAAO,GAAP,CAAW,sBAAX,EAAsC,SAAtC,UAAoD,SAApD,QAAkE,KAAlE;AACH;AAvDL;;AAAA;AAAA;;;AC5DA;AACA;;;;AAIA;;AACA,IAAM,aAAa,SAAnB;;AAEA;AACA,SAAS,KAAT,GAAgB;AACf,WAAO,CAAC,CAAC,OAAO,SAAhB;AACA;;AAED;AACA,SAAS,SAAT,CAAmB,IAAnB,EAAwB;AACvB,WAAO,CAAC,UAAD,EAAa,MAAb,CAAoB,IAApB,CAAP;AACA;;AAED;AACA,OAAO,OAAP,CAAe,GAAf,GAAqB,YAAa;AAAA,sCAAT,IAAS;AAAT,YAAS;AAAA;;AAC9B,QAAG,CAAC,OAAJ,EAAa;AACb,YAAQ,GAAR,CAAY,KAAZ,CAAkB,IAAlB,EAAwB,UAAU,IAAV,CAAxB;AACH,CAHD;;AAKA;AACA,OAAO,OAAP,CAAe,KAAf,GAAuB,YAAa;AAAA,uCAAT,IAAS;AAAT,YAAS;AAAA;;AAChC,QAAG,CAAC,OAAJ,EAAa;AACb,YAAQ,KAAR,CAAc,KAAd,CAAoB,IAApB,EAA0B,UAAU,IAAV,CAA1B;AACH,CAHD;;AAKA;AACA,OAAO,OAAP,CAAe,IAAf,GAAsB,YAAa;AAAA,uCAAT,IAAS;AAAT,YAAS;AAAA;;AAC/B,QAAG,CAAC,OAAJ,EAAa;AACb,YAAQ,IAAR,CAAa,KAAb,CAAmB,IAAnB,EAAyB,UAAU,IAAV,CAAzB;AACH,CAHD;;;AC/BA;AACA;;;;;;;;;AAKA,OAAO,OAAP;AAEI,6BAAa,MAAb,EAAqB;AAAA;;AACjB,aAAK,OAAL,GAAe,MAAf;AACH;;AAED;;;AANJ;AAAA;;;AA+BI;AA/BJ,gCAgCa,GAhCb,EAgCkB,SAhClB,EAgC6B;AACrB,iBAAK,MAAL,CAAY,eAAZ,CAA4B,oBAA5B,CAAiD,GAAjD,EAAsD,SAAtD;AACH;;AAED;AACA;;AArCJ;AAAA;AAAA,mCAsC6B;AAAA,gBAAf,OAAe,uEAAP,KAAO;;AACrB,gBAAG,OAAH,EAAY,KAAK,OAAL,GAAe,IAAf;AACf;AAxCL;AAAA;AAAA,4BAOkB;AACV,mBAAO,KAAK,MAAL,CAAY,kBAAZ,EAAP;AACH;;AAED;;AAXJ;AAAA;AAAA,4BAYkB;AACV,mBAAO,KAAK,OAAZ;AACH;;AAED;;AAhBJ;AAAA;AAAA,4BAiBoB;AACZ,mBAAO,KAAK,MAAL,CAAY,QAAZ,EAAP;AACH;;AAED;;AArBJ;AAAA;AAAA,4BAsBuB;AACf,mBAAO,KAAK,MAAL,CAAY,WAAZ,EAAP;AACH;;AAED;AA1BJ;AAAA,0BA2BqB,IA3BrB,EA2B2B;AACnB,iBAAK,MAAL,CAAY,WAAZ,CAAwB,IAAxB;AACH;AA7BL;;AAAA;AAAA;;;ACNA;AACA;;;;;;;;;;;;;;;AAKA,IAAM,kBAAkB,QAAQ,oBAAR,CAAxB;AAAA,IACM,aAAa,QAAQ,oBAAR,CADnB;AAAA,IAEM,YAAY,QAAQ,yBAAR,CAFlB;AAAA,IAGM,QAAQ,QAAQ,gBAAR,CAHd;;AAKA,OAAO,OAAP;AAAA;;AAEI,+BAAa,MAAb,EAAqB;AAAA;;AAAA,qIACX,MADW;AAEpB;;AAED;AACA;;;AAPJ;AAAA;;;AA8CI;AA9CJ,mDA+CgC;AACxB,iBAAK,OAAL,CAAa,QAAb,CAAsB,kBAAtB;AACA;AACA;AACH;;AAED;;AArDJ;AAAA;AAAA,kDAsD+B;AACvB,iBAAK,OAAL,CAAa,WAAb,CAAyB,kBAAzB;AACH;;AAED;;AA1DJ;AAAA;AAAA,uCA2DoB,YA3DpB,EA2DgD;AAAA,gBAAd,OAAc,uEAAJ,EAAI;;AACxC,iBAAK,yBAAL;AACA,mBAAO,UAAU,YAAV,EAAwB,OAAxB,CAAP;AACH;;AAED;;AAhEJ;AAAA;AAAA,oDAiEiC;AACzB,gBAAG,gBAAgB,WAAW,OAA9B,EAAuC;;AAEvC,uBAAW,cAAX,CAA0B,YAA1B,EAAwC,UAAC,IAAD,EAAU;AAC9C,uBAAO,WAAW,KAAX,CAAiB,gBAAjB,CAAkC,IAAlC,CAAP;AACA,uBAAO,KAAK,OAAL,CAAa,gBAAb,EAA+B,MAA/B,CAAP;AACA,uBAAO,IAAI,WAAW,UAAf,CAA0B,IAA1B,CAAP;AACH,aAJD;AAKH;;AAED;;AA3EJ;AAAA;AAAA,mCA4EgB;AACR,gBAAG,KAAK,GAAR,EAAa,KAAK,GAAL,CAAS,MAAT;AACb;AACH;AA/EL;AAAA;AAAA,4BAQe;AACP,mBAAO,OAAO,MAAP,CAAc;AACjB,mCAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,yBAAlB,CADP,EAC2D;AAC5E,iCAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,cAAlB,CAFP,EAE2D;AAC5E,oCAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,+BAAlB,CAHP,EAG2D;AAC5E,0BAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,uBAAlB,CAJP,EAI2D;AAC5E,sCAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,uBAAlB,CALP,EAK2D;AAC5E,4BAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,kBAAlB,CANP,EAM2D;AAC5E,4BAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,kBAAlB,CAPP,EAO2D;AAC5E,6BAAwB,KAAK,OAAL,CAAa,IAAb,CAAkB,yBAAlB,CARP,CAQ2D;AAR3D,aAAd,CAAP;AAUH;;AAED;;AArBJ;AAAA;AAAA,4BAsBsB;AACd,mBAAO,OAAO,MAAP,CAAc;AACjB,wBAAQ,YADS;AAEjB,wBAAQ;AAFS,aAAd,CAAP;AAIH;;AAED;;AA7BJ;AAAA;AAAA,4BA8BmB;AACX,mBAAO,EAAE,KAAK,MAAL,CAAY,EAAZ,EAAF,CAAP;AACH;;AAGD;;AAnCJ;AAAA;AAAA,4BAoCoB;AACZ,mBAAO,KAAK,OAAL,CAAa,IAAb,CAAkB,IAAlB,CAAP;AACH;;AAEG;;AAxCR;AAAA;AAAA,4BAyCuB;AACf,iBAAK,IAAL,GAAY,KAAK,IAAL,IAAa,MAAM,IAAN,EAAzB;AACA,mBAAO,KAAK,IAAZ;AACH;AA5CL;;AAAA;AAAA,EAAiD,eAAjD;;;;;ACXA;;;;AAIA;AACA,QAAQ,wBAAR;AACA;AACA,QAAQ,mBAAR,EAA6B,QAA7B;;AAEA;AACA;AACA;AACA,CAAC,YAAY;AACT,QAAI,OAAO,OAAO,cAAd,KAAiC,WAAjC,IAAgD,OAAO,OAAO,mBAAd,KAAsC,UAA1F,EAAsG;AAAA,YAGzF,YAHyF,GAGlG,SAAS,YAAT,CAAsB,GAAtB,EAA2B,EAA3B,EAA+B;AAC3B,mBAAO,YAAW;AACd,uBAAO,GAAG,KAAH,CAAS,IAAT,EAAe,SAAf,CAAP;AACH,aAFD;AAGH,SAPiG;;AAAA,YASzF,YATyF,GASlG,SAAS,YAAT,CAAsB,GAAtB,EAA2B,IAA3B,EAAiC,gBAAjC,EAAmD;AAC/C,gBAAI,CAAC,gBAAL,EAAuB;AACnB,oBAAI,eAAe,IAAI,SAAJ,CAAc,IAAd,CAAnB;AACA,mCAAmB;AACf,yBAAK,eAAY;AACb,+BAAO,IAAI,OAAO,IAAX,KAAoB,YAA3B;AACH,qBAHc;AAIf,yBAAK,aAAU,GAAV,EAAe;AAChB,4BAAI,OAAO,IAAX,IAAmB,GAAnB;AACH;AANc,iBAAnB;AAQH;AACD,mBAAO,cAAP,CAAsB,GAAtB,EAA2B,IAA3B,EAAiC;AAC7B,qBAAK,iBAAiB,GAAjB,GAAuB,iBAAiB,GAAjB,CAAqB,IAArB,CAA0B,GAA1B,CAAvB,GAAwD,SADhC;AAE7B,qBAAK,iBAAiB,GAAjB,GAAuB,iBAAiB,GAAjB,CAAqB,IAArB,CAA0B,GAA1B,CAAvB,GAAwD,SAFhC;AAG7B,8BAAc;AAHe,aAAjC;AAMH,SA3BiG;;AAAA,YA6BzF,YA7ByF,GA6BlG,SAAS,YAAT,CAAsB,QAAtB,EAAgC,UAAhC,EAA4C;AACxC,gBAAI,QAAQ,OAAO,mBAAP,CAA2B,UAA3B,CAAZ;AAAA,gBACI,KADJ;;AAGA,qBAAS,SAAT,GAAqB,UAArB;AACA,iBAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAC9C,oBAAI,OAAO,MAAM,CAAN,CAAX;AACA,oBAAI,SAAS,WAAb,EAA0B;AACtB,4BAAQ,WAAW,IAAX,CAAR;AACH,iBAFD,MAEO,IAAI,SAAS,OAAT,CAAiB,CAAjB,MAAwB,CAAC,CAA7B,EAAgC;AACnC,wBAAI,aAAa,OAAO,wBAAP,CAAgC,QAAhC,EAA0C,IAA1C,CAAjB;AACA,wBAAI,CAAC,UAAL,EAAiB;AACb,4BAAI,kBAAkB,OAAO,wBAAP,CAAgC,UAAhC,EAA4C,IAA5C,CAAtB;AACA,4BAAI,OAAO,gBAAgB,GAAvB,KAA+B,UAA/B,IAA6C,OAAO,WAAW,IAAX,CAAP,KAA4B,UAA7E,EAAyF;AACrF,qCAAS,IAAT,IAAiB,aAAa,QAAb,EAAuB,WAAW,IAAX,CAAvB,CAAjB;AACH,yBAFD,MAEO,IAAI,OAAO,gBAAgB,GAAvB,IAA8B,UAAlC,EAA8C;AACjD,yCAAa,QAAb,EAAuB,IAAvB,EAA6B,eAA7B;AACH,yBAFM,MAEA;AACH,yCAAa,QAAb,EAAuB,IAAvB;AACH;AACJ;AACJ;AACJ;AACD,gBAAI,KAAJ,EAAW;AACP,6BAAa,QAAb,EAAuB,KAAvB;AACH;AACJ,SAvDiG;;AAClG,YAAI,WAAW,CAAC,QAAD,EAAW,MAAX,EAAmB,WAAnB,EAAgC,QAAhC,EAA0C,WAA1C,CAAf;;AAwDA,eAAO,cAAP,GAAwB,YAAxB;AACH;AACJ,CA5DD;;AA8DA;AACA,CAAC,YAAY;AACX,QAAK,OAAO,OAAO,WAAd,KAA8B,UAAnC,EAAgD,OAAO,KAAP;;AAEhD,aAAS,WAAT,CAAuB,KAAvB,EAA8B,MAA9B,EAAuC;AACrC,iBAAS,UAAU,EAAE,SAAS,KAAX,EAAkB,YAAY,KAA9B,EAAqC,QAAQ,SAA7C,EAAnB;AACA,YAAI,MAAM,SAAS,WAAT,CAAsB,aAAtB,CAAV;AACA,YAAI,eAAJ,CAAqB,KAArB,EAA4B,OAAO,OAAnC,EAA4C,OAAO,UAAnD,EAA+D,OAAO,MAAtE;AACA,eAAO,GAAP;AACA;;AAEF,gBAAY,SAAZ,GAAwB,OAAO,KAAP,CAAa,SAArC;;AAEA,WAAO,WAAP,GAAqB,WAArB;AACD,CAbD;;;AC3EA;AACA;;;;AAIA,OAAO,OAAP,GAAiB;;AAEb;AACA,iBAAa,qBAAC,GAAD;AAAA,eAAS,OAAO,MAAP,CAAc,EAAd,EAAkB,GAAlB,CAAT;AAAA,KAHA;;AAKb;AACA,cAAU,kBAAC,IAAD,EAAO,IAAP,EAAa,OAAb,EAAyB;AAC/B,YAAI,OAAJ,EAAa,IAAb,EAAmB,MAAnB;AACA,YAAI,UAAU,IAAd;AACA,YAAI,WAAW,CAAf;AACA,YAAI,CAAC,OAAL,EAAc,UAAU,EAAV;AACd,YAAI,QAAQ,SAAR,KAAQ,GAAW;AACrB,uBAAW,QAAQ,OAAR,KAAoB,KAApB,GAA4B,CAA5B,GAAgC,KAAK,GAAL,EAA3C;AACA,sBAAU,IAAV;AACA,qBAAS,KAAK,KAAL,CAAW,OAAX,EAAoB,IAApB,CAAT;AACA,gBAAI,CAAC,OAAL,EAAc,UAAU,OAAO,IAAjB;AACf,SALD;AAMA,eAAO,YAAW;AAChB,gBAAI,MAAM,KAAK,GAAL,EAAV;AACA,gBAAI,CAAC,QAAD,IAAa,QAAQ,OAAR,KAAoB,KAArC,EAA4C,WAAW,GAAX;AAC5C,gBAAI,YAAY,QAAQ,MAAM,QAAd,CAAhB;AACA,sBAAU,IAAV;AACA,mBAAO,SAAP;AACA,gBAAI,aAAa,CAAb,IAAkB,YAAY,IAAlC,EAAwC;AACtC,oBAAI,OAAJ,EAAa;AACX,iCAAa,OAAb;AACA,8BAAU,IAAV;AACD;AACD,2BAAW,GAAX;AACA,yBAAS,KAAK,KAAL,CAAW,OAAX,EAAoB,IAApB,CAAT;AACA,oBAAI,CAAC,OAAL,EAAc,UAAU,OAAO,IAAjB;AACf,aARD,MAQO,IAAI,CAAC,OAAD,IAAY,QAAQ,QAAR,KAAqB,KAArC,EAA4C;AACjD,0BAAU,WAAW,KAAX,EAAkB,SAAlB,CAAV;AACD;AACD,mBAAO,MAAP;AACD,SAlBD;AAmBH,KApCY;;AAsCb;AACA,iBAAa,qBAAC,GAAD,EAAS;AAClB,eAAO,IAAP,CAAY,GAAZ,EAAiB,OAAjB,CAAyB,UAAC,GAAD,EAAS;AAC9B,gBAAG,SAAS,IAAI,GAAJ,CAAT,CAAH,EAAuB;AACnB,oBAAI,GAAJ,IAAW,SAAS,IAAI,GAAJ,CAAT,CAAX;AACH;AACJ,SAJD;AAKA,eAAO,GAAP;AACH,KA9CY;;AAgDb;AACA,eAAW,mBAAC,KAAD,EAAW;AAClB,iBAAS,QAAT,CAAkB,GAAlB,EAAsB;AAClB,gBAAI,OAAO,KAAK,KAAL,CAAW,MAAI,EAAf,CAAX;AAAA,gBACA,OAAO,OAAO,MAAM,EAAb,CADP;AAEA,mBAAO,OAAO,GAAP,IAAc,KAAK,MAAL,IAAa,CAAb,GAAiB,GAAjB,GAAuB,EAArC,IAA2C,IAAlD;AACH;AACD,YAAI,OAAO,CAAC,SAAS,MAAM,KAAf,CAAD,CAAX;AACA,YAAG,MAAM,GAAT,EAAc,KAAK,IAAL,CAAU,SAAS,MAAM,GAAf,CAAV;AACd,eAAO,KAAK,IAAL,CAAU,GAAV,CAAP;AACH,KA1DY;;AA4Db;AACA,UAAM,gBAAM;AACR,iBAAS,EAAT,GAAc;AACV,mBAAO,KAAK,KAAL,CAAW,CAAC,IAAI,KAAK,MAAL,EAAL,IAAsB,OAAjC,EAA0C,QAA1C,CAAmD,EAAnD,EAAuD,SAAvD,CAAiE,CAAjE,CAAP;AACH;AACD,eAAO,OAAO,IAAP,GAAc,GAAd,GAAoB,IAApB,GAA2B,GAA3B,GAAiC,IAAjC,GAAwC,GAAxC,GAA+C,IAA/C,GAAsD,GAAtD,GAA4D,IAA5D,GAAmE,IAAnE,GAA0E,IAAjF;AACH,KAlEY;;AAoEb;AACA;AACA;AACA,oBAAgB,wBAAC,GAAD,EAAM,UAAN,EAAmC;AAAA,YAAjB,SAAiB,uEAAP,EAAO;;AAC/C,YAAI,SAAS,IAAI,KAAJ,EAAb;AAAA,YACI,OAAO,EADX;AAEA,eAAO,GAAP,CAAW;AACP,wBAAY,QADL;AAEP,qBAAS;AAFF,SAAX;AAIA,eAAO,WAAP,CAAmB,SAAnB;AACA,mBAAW,MAAX,CAAkB,MAAlB;AACA,aAAK,KAAL,GAAa,OAAO,UAAP,EAAb;AACA,aAAK,MAAL,GAAc,OAAO,WAAP,EAAd;AACA,eAAO,MAAP;;AAEA,eAAO,IAAP;AACH,KArFY;;AAuFb;AACA,mBAAe,uBAAC,KAAD,EAAQ,GAAR,EAAa,CAAb,EAAmB;AAC9B,cAAM,OAAO,QAAQ,CAArB,CAD8B,CACN;AACxB,eAAO,KAAK,KAAL,IAAc,KAAK,GAA1B;AACH;AA3FY,CAAjB","file":"videojs-annotation-comments.cjs.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i= 2.0.0-beta.1',\n 7: '>= 4.0.0'\n};\n\nconst objectType = '[object Object]';\n\nexport function HandlebarsEnvironment(helpers, partials, decorators) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n this.decorators = decorators || {};\n\n registerDefaultHelpers(this);\n registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: logger,\n log: logger.log,\n\n registerHelper: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple helpers'); }\n extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function(name, partial) {\n if (toString.call(name) === objectType) {\n extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new Exception(`Attempting to register a partial called \"${name}\" as undefined`);\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function(name) {\n delete this.partials[name];\n },\n\n registerDecorator: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple decorators'); }\n extend(this.decorators, name);\n } else {\n this.decorators[name] = fn;\n }\n },\n unregisterDecorator: function(name) {\n delete this.decorators[name];\n }\n};\n\nexport let log = logger.log;\n\nexport {createFrame, logger};\n","import registerInline from './decorators/inline';\n\nexport function registerDefaultDecorators(instance) {\n registerInline(instance);\n}\n\n","import {extend} from '../utils';\n\nexport default function(instance) {\n instance.registerDecorator('inline', function(fn, props, container, options) {\n let ret = fn;\n if (!props.partials) {\n props.partials = {};\n ret = function(context, options) {\n // Create a new partials stack frame prior to exec.\n let original = container.partials;\n container.partials = extend({}, original, props.partials);\n let ret = fn(context, options);\n container.partials = original;\n return ret;\n };\n }\n\n props.partials[options.args[0]] = options.fn;\n\n return ret;\n });\n}\n","\nconst errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n let loc = node && node.loc,\n line,\n column;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n let tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (let idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n try {\n if (loc) {\n this.lineNumber = line;\n\n // Work around issue under safari where we can't directly set the column value\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(this, 'column', {\n value: column,\n enumerable: true\n });\n } else {\n this.column = column;\n }\n }\n } catch (nop) {\n /* Ignore if the browser is very particular */\n }\n}\n\nException.prototype = new Error();\n\nexport default Exception;\n","import registerBlockHelperMissing from './helpers/block-helper-missing';\nimport registerEach from './helpers/each';\nimport registerHelperMissing from './helpers/helper-missing';\nimport registerIf from './helpers/if';\nimport registerLog from './helpers/log';\nimport registerLookup from './helpers/lookup';\nimport registerWith from './helpers/with';\n\nexport function registerDefaultHelpers(instance) {\n registerBlockHelperMissing(instance);\n registerEach(instance);\n registerHelperMissing(instance);\n registerIf(instance);\n registerLog(instance);\n registerLookup(instance);\n registerWith(instance);\n}\n","import {appendContextPath, createFrame, isArray} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('blockHelperMissing', function(context, options) {\n let inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n let data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.name);\n options = {data: data};\n }\n\n return fn(context, options);\n }\n });\n}\n","import {appendContextPath, blockParams, createFrame, isArray, isFunction} from '../utils';\nimport Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('each', function(context, options) {\n if (!options) {\n throw new Exception('Must pass iterator to #each');\n }\n\n let fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data,\n contextPath;\n\n if (options.data && options.ids) {\n contextPath = appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (isFunction(context)) { context = context.call(this); }\n\n if (options.data) {\n data = createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (isArray(context)) {\n for (let j = context.length; i < j; i++) {\n if (i in context) {\n execIteration(i, i, i === context.length - 1);\n }\n }\n } else {\n let priorKey;\n\n for (let key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n}\n","import Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('helperMissing', function(/* [args, ]options */) {\n if (arguments.length === 1) {\n // A missing field in a {{foo}} construct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new Exception('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n}\n","import {isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('if', function(conditional, options) {\n if (isFunction(conditional)) { conditional = conditional.call(this); }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if ((!options.hash.includeZero && !conditional) || isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function(conditional, options) {\n return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});\n });\n}\n","export default function(instance) {\n instance.registerHelper('log', function(/* message, options */) {\n let args = [undefined],\n options = arguments[arguments.length - 1];\n for (let i = 0; i < arguments.length - 1; i++) {\n args.push(arguments[i]);\n }\n\n let level = 1;\n if (options.hash.level != null) {\n level = options.hash.level;\n } else if (options.data && options.data.level != null) {\n level = options.data.level;\n }\n args[0] = level;\n\n instance.log(... args);\n });\n}\n","export default function(instance) {\n instance.registerHelper('lookup', function(obj, field) {\n return obj && obj[field];\n });\n}\n","import {appendContextPath, blockParams, createFrame, isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('with', function(context, options) {\n if (isFunction(context)) { context = context.call(this); }\n\n let fn = options.fn;\n\n if (!isEmpty(context)) {\n let data = options.data;\n if (options.data && options.ids) {\n data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.ids[0]);\n }\n\n return fn(context, {\n data: data,\n blockParams: blockParams([context], [data && data.contextPath])\n });\n } else {\n return options.inverse(this);\n }\n });\n}\n","import {indexOf} from './utils';\n\nlet logger = {\n methodMap: ['debug', 'info', 'warn', 'error'],\n level: 'info',\n\n // Maps a given level value to the `methodMap` indexes above.\n lookupLevel: function(level) {\n if (typeof level === 'string') {\n let levelMap = indexOf(logger.methodMap, level.toLowerCase());\n if (levelMap >= 0) {\n level = levelMap;\n } else {\n level = parseInt(level, 10);\n }\n }\n\n return level;\n },\n\n // Can be overridden in the host environment\n log: function(level, ...message) {\n level = logger.lookupLevel(level);\n\n if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n let method = logger.methodMap[level];\n if (!console[method]) { // eslint-disable-line no-console\n method = 'log';\n }\n console[method](...message); // eslint-disable-line no-console\n }\n }\n};\n\nexport default logger;\n","/* global window */\nexport default function(Handlebars) {\n /* istanbul ignore next */\n let root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function() {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n return Handlebars;\n };\n}\n","import * as Utils from './utils';\nimport Exception from './exception';\nimport { COMPILER_REVISION, REVISION_CHANGES, createFrame } from './base';\n\nexport function checkRevision(compilerInfo) {\n const compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n const runtimeVersions = REVISION_CHANGES[currentRevision],\n compilerVersions = REVISION_CHANGES[compilerRevision];\n throw new Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' +\n 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' +\n 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nexport function template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new Exception('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new Exception('Unknown template object: ' + typeof templateSpec);\n }\n\n templateSpec.main.decorator = templateSpec.main_d;\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n if (options.ids) {\n options.ids[0] = true;\n }\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n let result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n let lines = result.split('\\n');\n for (let i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n let container = {\n strict: function(obj, name) {\n if (!(name in obj)) {\n throw new Exception('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function(depths, name) {\n const len = depths.length;\n for (let i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function(i) {\n let ret = templateSpec[i];\n ret.decorator = templateSpec[i + '_d'];\n return ret;\n },\n\n programs: [],\n program: function(i, data, declaredBlockParams, blockParams, depths) {\n let programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function(param, common) {\n let obj = param || common;\n\n if (param && common && (param !== common)) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n // An empty object to use as replacement for null-contexts\n nullContext: Object.seal({}),\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context, options = {}) {\n let data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n let depths,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n if (options.depths) {\n depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;\n } else {\n depths = [context];\n }\n }\n\n function main(context/*, options*/) {\n return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n return main(context, options);\n }\n ret.isTop = true;\n\n ret._setup = function(options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n if (templateSpec.usePartial || templateSpec.useDecorators) {\n container.decorators = container.merge(options.decorators, env.decorators);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n container.decorators = options.decorators;\n }\n };\n\n ret._child = function(i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new Exception('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new Exception('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nexport function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context, options = {}) {\n let currentDepths = depths;\n if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {\n currentDepths = [context].concat(depths);\n }\n\n return fn(container,\n context,\n container.helpers, container.partials,\n options.data || data,\n blockParams && [options.blockParams].concat(blockParams),\n currentDepths);\n }\n\n prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nexport function resolvePartial(partial, context, options) {\n if (!partial) {\n if (options.name === '@partial-block') {\n partial = options.data['partial-block'];\n } else {\n partial = options.partials[options.name];\n }\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nexport function invokePartial(partial, context, options) {\n // Use the current closure context to save the partial-block if this partial\n const currentPartialBlock = options.data && options.data['partial-block'];\n options.partial = true;\n if (options.ids) {\n options.data.contextPath = options.ids[0] || options.data.contextPath;\n }\n\n let partialBlock;\n if (options.fn && options.fn !== noop) {\n options.data = createFrame(options.data);\n // Wrapper function to get access to currentPartialBlock from the closure\n let fn = options.fn;\n partialBlock = options.data['partial-block'] = function partialBlockWrapper(context, options = {}) {\n\n // Restore the partial-block from the closure for the execution of the block\n // i.e. the part inside the block of the partial call.\n options.data = createFrame(options.data);\n options.data['partial-block'] = currentPartialBlock;\n return fn(context, options);\n };\n if (fn.partials) {\n options.partials = Utils.extend({}, options.partials, fn.partials);\n }\n }\n\n if (partial === undefined && partialBlock) {\n partial = partialBlock;\n }\n\n if (partial === undefined) {\n throw new Exception('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nexport function noop() { return ''; }\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n if (fn.decorator) {\n let props = {};\n prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n Utils.extend(prog, props);\n }\n return prog;\n}\n","// Build out our basic SafeString type\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function() {\n return '' + this.string;\n};\n\nexport default SafeString;\n","const escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '=': '='\n};\n\nconst badChars = /[&<>\"'`=]/g,\n possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nexport function extend(obj/* , ...source */) {\n for (let i = 1; i < arguments.length; i++) {\n for (let key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nexport let toString = Object.prototype.toString;\n\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nlet isFunction = function(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n isFunction = function(value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nexport {isFunction};\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nexport const isArray = Array.isArray || function(value) {\n return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;\n};\n\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\nexport function indexOf(array, value) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\n\nexport function escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) { return string; }\n return string.replace(badChars, escapeChar);\n}\n\nexport function isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nexport function createFrame(object) {\n let frame = extend({}, object);\n frame._parent = object;\n return frame;\n}\n\nexport function blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nexport function appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n","// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = require('./dist/cjs/handlebars.runtime')['default'];\n","'use strict';\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function (predicate) {\n\n if (this == null) {\n throw new TypeError('this is null or not defined');\n }\n\n var obj = Object(this);\n var len = obj.length >>> 0;\n\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n var thisArg = arguments[1];\n\n var index = 0;\n\n while (index < len) {\n var iValue = obj[index];\n if (predicate.call(thisArg, iValue, index, obj)) {\n return iValue;\n }\n index++;\n }\n\n return undefined;\n }\n });\n}","//! moment.js\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n}(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return (Object.getOwnPropertyNames(obj).length === 0);\n } else {\n var k;\n for (k in obj) {\n if (obj.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n }\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.weekdayMismatch &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n // Plugins that add properties should also add the key here (null value),\n // so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n // Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n // compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n // token: 'M'\n // padded: ['MM', 2]\n // ordinal: 'Mo'\n // callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n // format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n // any word (or two) characters or numbers including two/three word month in arabic.\n // includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n // ALIASES\n\n addUnitAlias('year', 'y');\n\n // PRIORITIES\n\n addUnitPriority('year', 1);\n\n // PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n // HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n // HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n // MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid() && !isNaN(value)) {\n if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n }\n else {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n }\n\n // MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function mod(n, x) {\n return ((n % x) + x) % x;\n }\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n function daysInMonth(year, month) {\n if (isNaN(year) || isNaN(month)) {\n return NaN;\n }\n var modMonth = mod(month, 12);\n year += (month - modMonth) / 12;\n return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n }\n\n // FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n // ALIASES\n\n addUnitAlias('month', 'M');\n\n // PRIORITY\n\n addUnitPriority('month', 8);\n\n // PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n // LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n // FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n // ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n // PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n // PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n // HELPERS\n\n // LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n // MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n // ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n // PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n // PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n // HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n // LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n // FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n // ALIASES\n\n addUnitAlias('hour', 'h');\n\n // PRIORITY\n addUnitPriority('hour', 13);\n\n // PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n // LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n // MOMENTS\n\n // Setting the hour should keep the time, because the user explicitly\n // specified which hour they want. So trying to maintain the same hour (in\n // a new timezone) makes sense. Adding/subtracting hours does not follow\n // this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n // internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n // pick the locale from the array\n // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return globalLocale;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n var aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {}\n }\n return locales[name];\n }\n\n // This function will load locale and then set the global locale. If\n // no arguments are passed in, it will simply return the current global\n // locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n else {\n if ((typeof console !== 'undefined') && console.warn) {\n //warn user if arguments are passed but the locale could not be set\n console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n }\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var locale, parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n locale = loadLocale(config.parentLocale);\n if (locale != null) {\n parentConfig = locale._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, tmpLocale, parentConfig = baseConfig;\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n // returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n // Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n // convert an array to a date.\n // the array should mirror the parameters below\n // note: all values past the year are optional and will default to the lowest possible value.\n // [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n\n // check for mismatching day of week\n if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n // iso 8601 regex\n // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n // iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n // date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\n function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n var result = [\n untruncateYear(yearStr),\n defaultLocaleMonthsShort.indexOf(monthStr),\n parseInt(dayStr, 10),\n parseInt(hourStr, 10),\n parseInt(minuteStr, 10)\n ];\n\n if (secondStr) {\n result.push(parseInt(secondStr, 10));\n }\n\n return result;\n }\n\n function untruncateYear(yearStr) {\n var year = parseInt(yearStr, 10);\n if (year <= 49) {\n return 2000 + year;\n } else if (year <= 999) {\n return 1900 + year;\n }\n return year;\n }\n\n function preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n }\n\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n }\n\n var obsOffsets = {\n UT: 0,\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60\n };\n\n function calculateOffset(obsOffset, militaryOffset, numOffset) {\n if (obsOffset) {\n return obsOffsets[obsOffset];\n } else if (militaryOffset) {\n // the only allowed military tz is Z\n return 0;\n } else {\n var hm = parseInt(numOffset, 10);\n var m = hm % 100, h = (hm - m) / 100;\n return h * 60 + m;\n }\n }\n\n // date and time from ref 2822 format\n function configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i));\n if (match) {\n var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n if (!checkWeekday(match[1], parsedArray, config)) {\n return;\n }\n\n config._a = parsedArray;\n config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n config._d = createUTCDate.apply(null, config._a);\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n // date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n // constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n // constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n // date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n // date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n // Pick a moment m from moments so that m[fn](other) is true for all\n // other. This relies on the function fn to be transitive.\n //\n // moments should either be an array of moment objects or an array, whose\n // first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n // TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible to translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n // FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n // PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n // HELPERS\n\n // timezone chunker\n // '+10:00' > ['10', '00']\n // '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n // Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n // HOOKS\n\n // This function will be called whenever a moment is mutated.\n // It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n // MOMENTS\n\n // keepLocalTime = true means only change the timezone, without\n // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n // +0200, so we adjust the time as needed, to be valid.\n //\n // Keeping the time actually adds/subtracts (one hour)\n // from the actual represented time. That is why we call updateOffset\n // a second time. In case it wants us to change the offset again\n // _changeInProgress == true case, then we have to adjust, because\n // there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n // ASP.NET json date format regex\n var aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n // and further modified to allow for strings containing both week and day\n var isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n // TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units || 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n switch (units) {\n case 'year': output = monthDiff(this, that) / 12; break;\n case 'month': output = monthDiff(this, that); break;\n case 'quarter': output = monthDiff(this, that) / 3; break;\n case 'second': output = (this - that) / 1e3; break; // 1000\n case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default: output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true;\n var m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n if (utc) {\n return this.toDate().toISOString();\n } else {\n return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n // If passed a locale key, it will set the locale for this\n // instance. Otherwise, it will return the locale configuration\n // variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n /* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n /* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n /* falls through */\n case 'hour':\n this.minutes(0);\n /* falls through */\n case 'minute':\n this.seconds(0);\n /* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n // FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n // ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n // PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n // PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n // MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n // FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n // ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n // PRIORITY\n\n addUnitPriority('quarter', 7);\n\n // PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n // MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // ALIASES\n\n addUnitAlias('date', 'D');\n\n // PRIORITY\n addUnitPriority('date', 9);\n\n // PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n });\n\n // MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n // FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n // ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n // PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n // PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n // HELPERS\n\n // MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n // FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n // ALIASES\n\n addUnitAlias('minute', 'm');\n\n // PRIORITY\n\n addUnitPriority('minute', 14);\n\n // PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n // MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n // FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n // ALIASES\n\n addUnitAlias('second', 's');\n\n // PRIORITY\n\n addUnitPriority('second', 15);\n\n // PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n // MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n // FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n // ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n // PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n // MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n // FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n // MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n proto.quarter = proto.quarters = getSetQuarter;\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n proto.hour = proto.hours = getSetHour;\n proto.minute = proto.minutes = getSetMinute;\n proto.second = proto.seconds = getSetSecond;\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n // ()\n // (5)\n // (fmt, 5)\n // (fmt)\n // (true)\n // (true, 5)\n // (true, fmt, 5)\n // (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n // Side effect imports\n\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n // supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n // TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function clone$1 () {\n return createDuration(this);\n }\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n // This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n // This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n }\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n var totalSign = total < 0 ? '-' : '';\n var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return totalSign + 'P' +\n (Y ? ymSign + Y + 'Y' : '') +\n (M ? ymSign + M + 'M' : '') +\n (D ? daysSign + D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? hmsSign + h + 'H' : '') +\n (m ? hmsSign + m + 'M' : '') +\n (s ? hmsSign + s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.clone = clone$1;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n // Side effect imports\n\n // FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n // PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n // Side effect imports\n\n\n hooks.version = '2.22.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n // currently HTML5 input type only supports 24-hour formats\n hooks.HTML5_FMT = {\n DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // \n DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // \n DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // \n DATE: 'YYYY-MM-DD', // \n TIME: 'HH:mm', // \n TIME_SECONDS: 'HH:mm:ss', // \n TIME_MS: 'HH:mm:ss.SSS', // \n WEEK: 'YYYY-[W]WW', // \n MONTH: 'YYYY-MM' // \n };\n\n return hooks;\n\n})));\n","\"use strict\";\n/*\n Main function and entry point\n Can be registered to a videojs instance as a plugin\n*/\n\nmodule.exports = (videojs) => {\n require('./lib/polyfills');\n\n const Plugin = videojs.getPlugin('plugin'),\n Utils = require('./lib/utils'),\n Controls = require(\"./components/controls\"),\n AnnotationState = require(\"./components/annotation_state\"),\n EventDispatcher = require(\"./lib/event_dispatcher\");\n\n const DEFAULT_OPTIONS = Object.freeze({\n bindArrowKeys: true,\n meta: { user_id: null, user_name: null },\n annotationsObjects: [],\n showControls: true,\n showCommentList: true,\n showFullScreen: true,\n showMarkerShapeAndTooltips: true,\n internalCommenting: true,\n startInAnnotationMode: false\n });\n\n return class AnnotationComments extends Plugin {\n\n constructor (player, options) {\n options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options);\n super(player, options);\n\n this.eventDispatcher = new EventDispatcher(this);\n this.eventDispatcher.registerListenersFor(this, 'AnnotationComments');\n\n this.player = player;\n this.meta = options.meta;\n this.options = options;\n\n this._readyCallbacks = [];\n\n // Assign reference to this class to player for access later by components where needed\n player.annotationComments = (() => { return this }).bind(this);\n\n // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration\n // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3\n if(player.readyState() >= 3){\n this.postLoadDataConstructor();\n }else{\n player.on('loadeddata', this.postLoadDataConstructor.bind(this));\n }\n }\n\n // Additional init/setup after video data + metadata is available\n postLoadDataConstructor () {\n // setup initial state and render UI\n this.annotationState = new AnnotationState(this.player);\n this.annotationState.annotations = this.options.annotationsObjects;\n\n this.controls = new Controls(this.player, this.options.bindArrowKeys);\n this.bindEvents();\n this.setBounds(false);\n if(this.options.startInAnnotationMode) this.toggleAnnotationMode();\n\n this.pluginReady();\n }\n\n // Bind needed events for interaction w/ components\n bindEvents () {\n // Set player boundaries on window size change or fullscreen change\n $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500));\n this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500));\n\n // Remove annotation features on fullscreen if showFullScreen: false\n if (!this.options.showFullScreen) {\n this.player.on('fullscreenchange', (() => {\n if (this.player.isFullscreen_) {\n this.preFullscreenAnnotationsEnabled = this.active;\n $(this.player.el()).addClass('vac-disable-fullscreen');\n } else {\n $(this.player.el()).removeClass('vac-disable-fullscreen');\n }\n if(this.preFullscreenAnnotationsEnabled){\n // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are\n // in annotation mode, toggle the mode\n this.toggleAnnotationMode();\n }\n }).bind(this));\n }\n }\n\n // A wrapper func to make it easier to use EventDispatcher from the client\n // Ex: plugin.fire(type, data);\n fire (type, data={}) {\n this.eventDispatcher.fire(type, data);\n }\n\n // Toggle annotations mode on/off\n toggleAnnotationMode() {\n this.active = !this.active;\n this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements\n this.annotationState.enabled = this.active;\n\n if(this.active){\n this.fire(\"annotationModeEnabled\");\n }else{\n this.fire(\"annotationModeDisabled\")\n }\n\n // Handle control component UI if showControls: true\n if(this.options.showControls){\n if(!this.active){\n this.controls.clear(true);\n }else{\n this.controls.render();\n }\n }\n }\n\n // Set player UI boundaries\n setBounds (triggerChange=true) {\n this.bounds = {};\n let $player = $(this.player.el()),\n $ctrls = $player.find('.vjs-control-bar');\n\n this.bounds.left = $player.offset().left;\n this.bounds.top = $player.offset().top;\n this.bounds.right = this.bounds.left + $player.width();\n this.bounds.bottom = this.bounds.top + $player.height();\n this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height();\n\n // fires an event when bounds have changed during resizing\n if(triggerChange) this.fire('playerBoundsChanged', this.bounds);\n }\n\n // Public function to register a callback for when plugin is ready\n onReady (callback) {\n if(this.eventDispatcher.pluginReady){\n return callback();\n }\n this._readyCallbacks.push(callback);\n }\n\n // Mark plugin as ready and fire any pending callbacks\n pluginReady () {\n this.eventDispatcher.pluginReady = true;\n while(this._readyCallbacks.length){\n this._readyCallbacks.pop()();\n }\n }\n\n // Teardown all components, remove all listeners, and remove elements from DOM\n dispose () {\n this.controls = this.controls.teardown();\n this.annotationState = this.annotationState.teardown();\n this.eventDispatcher = this.eventDispatcher.teardown();\n this.teardown();\n if(this.player) {\n this.player.annotationComments = null;\n $(this.player.el()).removeClass('vac-active');\n $(this.player.el()).find(\"[class^='vac-']\").remove();\n }\n super.dispose();\n }\n\n teardown () {\n if(this.player) this.player.off('fullscreenchange');\n $(window).off('resize.vac-window-resize');\n }\n }\n}\n","var Handlebars = require(\"handlebars/runtime\");\n exports[\"comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\"\n + alias4(container.lambda(((stack1 = (depth0 != null ? depth0.meta : depth0)) != null ? stack1.user_name : stack1), depth0))\n + \"
\\n
\"\n + alias4(((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"timeSince\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n   X\\n
\\n
\\n
\\n \"\n + alias4((helpers.breaklines || (depth0 && depth0.breaklines) || alias2).call(alias1,(depth0 != null ? depth0.body : depth0),{\"name\":\"breaklines\",\"hash\":{},\"data\":data}))\n + \"\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"comment_list\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1;\n\n return \" \"\n + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : \"\")\n + \"\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n\";\n},\"useData\":true,\"useBlockParams\":true});\nexports[\"controls\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n \\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showNav : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \"
\\n
Prev
\\n
Next
\\n
\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n
\\n
Click and drag to select
\\n
\\n
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.writingComment : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n Select shape + range\\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.internalCommenting : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n
-1 sec
\\n
+1 sec
\\n
\\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \" \\n cancel\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"
\\n
\\n
\\n
New Annotation @ \"\n + container.escapeExpression(((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"rangeStr\",\"hash\":{},\"data\":data}) : helper)))\n + \"
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n
\\n
\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\nexports[\"draggable_marker\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n\";\n},\"useData\":true});\nexports[\"marker\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n return \"vac-ranged-marker\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"width:\"\n + container.escapeExpression(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"width\",\"hash\":{},\"data\":data}) : helper)))\n + \";\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.tooltipBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n \\n \"\n + alias4(((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipTime\",\"hash\":{},\"data\":data}) : helper)))\n + \" - \"\n + alias4(((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipBody\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n \\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \"vac-right-side\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showTooltip : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"useData\":true});\nexports[\"marker_wrap\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"
\\n\t
\\n
\";\n},\"useData\":true});\nexports[\"new_comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"player_button\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"\\n\\n\t\\n\t \\n\t \\n\t\\n\";\n},\"useData\":true});","\"use strict\";\n/*\n Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils.js\"),\n CommentList = require(\"./comment_list\"),\n Marker = require(\"./marker\"),\n Comment = require(\"./comment\"),\n Shape = require(\"./shape\");\n\nmodule.exports = class Annotation extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.id = data.id || this.componentId;\n this.range = data.range;\n this.shape = data.shape;\n this.secondsActive = this.buildSecondsActiveArray();\n this.buildComments(data);\n this.buildMarker();\n this.buildShape();\n this.bindEvents();\n\n this.isOpen = false;\n }\n\n buildComments(data) {\n this.commentList = new CommentList(\n {\"comments\": data.comments, \"annotation\": this},\n this.player\n );\n }\n\n buildMarker () {\n this.marker = new Marker(this.player, this.range, this.commentList.comments[0]);\n this.marker.render();\n }\n\n buildShape() {\n this.annotationShape = new Shape(this.player, this.shape);\n }\n\n // Serialize object\n get data () {\n return {\n id: this.id,\n range: this.range,\n shape: this.shape,\n comments: this.commentList.data\n };\n }\n\n bindEvents () {\n this.marker.$el.on('click.vac-marker', (e) => this.plugin.annotationState.openAnnotation(this, true));\n }\n\n // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state\n open (withPause=true, previewOnly=false, forceSnapToStart=false) {\n this.isOpen = true;\n const snapToStart = forceSnapToStart || !Utils.isWithinRange(\n this.range.start,\n this.range.end,\n Math.floor(this.currentTime)\n );\n\n let showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips;\n this.marker.setActive(showTooltip);\n if(!previewOnly && this.plugin.options.showCommentList){\n this.commentList.render();\n }\n\n if(!previewOnly || (previewOnly && this.plugin.options.showMarkerShapeAndTooltips)){\n this.annotationShape.render();\n\n if(this.shape) {\n this.annotationShape.$el.on(\"click.vac-annotation\", () => {\n this.plugin.annotationState.openAnnotation(this, false, false, false);\n });\n }\n }\n\n if(withPause) this.player.pause();\n if(snapToStart) this.currentTime = this.range.start;\n\n this.plugin.fire('annotationOpened', {\n annotation: this.data,\n triggered_by_timeline: previewOnly\n });\n }\n\n // Closes the annotation. Handles marker, commendList, shape, and AnnotationState\n close (clearActive=true) {\n if(!this.isOpen) return;\n this.isOpen = false;\n this.marker.deactivate();\n this.commentList.teardown(false);\n if(this.annotationShape.$el) this.annotationShape.$el.off(\"click.vac-annotation\");\n this.annotationShape.teardown();\n if(clearActive) this.plugin.annotationState.clearActive();\n this.plugin.fire('annotationClosed', this.data);\n }\n\n // For preloading an array of seconds active on initialization\n // Values used to build timeMap in AnnotationState\n buildSecondsActiveArray () {\n let seconds = [];\n if(!!this.range.end) {\n for (let i = this.range.start; i <= this.range.end; i++) {\n seconds.push(i);\n }\n } else {\n let start = this.range.start;\n seconds.push(start);\n if(start < this.duration) seconds.push(start+1);\n }\n return seconds;\n }\n\n // Tearsdown annotation and marker, removes object from AnnotationState\n teardown (removeFromCollection=true) {\n this.close(true);\n this.marker.teardown();\n if(this.commentList) this.commentList.teardown(removeFromCollection);\n if(removeFromCollection) this.plugin.annotationState.removeAnnotation(this);\n if(this.annotationShape) this.annotationShape.teardown();\n if(removeFromCollection) super.teardown();\n }\n\n // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref\n static newFromData (range, shape, commentStr, plugin, id=null) {\n let comment = Comment.dataObj(commentStr, plugin);\n if(range) range = Utils.parseIntObj(range);\n if(shape) shape = Utils.parseIntObj(shape);\n let data = {\n id,\n range,\n shape,\n comments: [comment]\n };\n return new Annotation(data, plugin.player);\n }\n\n get isActive () {\n return this.plugin.annotationState.activeAnnotation === this;\n }\n}\n","\"use strict\";\n/*\n Component for managing the state of annotations, including showing active annotation during playback,\n toggling active states for annotations, navigating annotations forward/back, etc\n*/\n\nconst Utils = require('./../lib/utils'),\n PlayerComponent = require(\"./../lib/player_component\"),\n Annotation = require(\"./annotation\");\n\nmodule.exports = class AnnotationState extends PlayerComponent {\n\n constructor (player) {\n super(player);\n this.initAPI(this, 'AnnotationState');\n this.resetData();\n this.bindEvents();\n }\n\n // sets _enabled and closes or opens annotation as needed\n set enabled (shouldBeEnabled) {\n this._enabled = shouldBeEnabled;\n if(!shouldBeEnabled) this.activeAnnotation.close();\n if(shouldBeEnabled){\n this.skipLiveCheck = false;\n this.setLiveAnnotation();\n }\n }\n\n get enabled () {\n return this._enabled;\n }\n\n // Sets _annotations w/Annoation objects from input array\n set annotations (annotationsData) {\n this._annotations = annotationsData.map((a) => new Annotation(a, this.player));\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n }\n\n get annotations () {\n return this._annotations;\n }\n\n set activeAnnotation (annotation=null) {\n this._activeAnnotation = annotation;\n }\n\n // Get current active annotation or a null object with .close()\n get activeAnnotation () {\n return this._activeAnnotation || { close: (() => {}) };\n }\n\n // Serialize data\n get data () {\n return this._annotations.map((a) => a.data);\n }\n\n // Bind events for setting liveAnnotation on video time change\n bindEvents () {\n this.player.on(\"timeupdate\", Utils.throttle(this.setLiveAnnotation.bind(this), 100));\n }\n\n // Sort annotations by range.start\n sortAnnotations () {\n this._annotations.sort((a,b) => {\n return a.range.start < b.range.start ? -1 : (a.range.start > b.range.start ? 1 : 0);\n });\n }\n\n // Add a new annotation\n addNewAnnotation (annotation) {\n this._annotations.push(annotation);\n this.openAnnotation(annotation, true, true, false, true);\n this.stateChanged();\n }\n\n // Create and add a annotation\n createAndAddAnnotation (data) {\n this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew();\n\n let annotation = Annotation.newFromData(\n data.range,\n data.shape,\n data.commentStr || \"\",\n this.plugin,\n data.id\n )\n this.addNewAnnotation(annotation)\n }\n\n // Destroy an existing annotation\n destroyAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) annotation.teardown();\n }\n\n // Remove an annotation\n removeAnnotation (annotation) {\n let id = annotation.id,\n i = this._annotations.indexOf(annotation);\n this._annotations.splice(i, 1);\n this.stateChanged();\n this.plugin.fire('annotationDeleted', {id});\n }\n\n // Set the live annotation based on current video time\n setLiveAnnotation () {\n if(!this.enabled) return;\n let time = Math.floor(this.currentTime);\n\n if(this.skipLiveCheck) {\n if(time !== this.lastVideoTime) this.skipLiveCheck = false;\n return;\n }\n\n let matches = this.activeAnnotationsForTime(time);\n if(!matches.length) return this.activeAnnotation.close();\n\n // Set live annotation as the last match\n let liveAnnotation = this.annotations[matches[matches.length-1]];\n\n // Special cases if this or another annotation is active\n if(this.activeAnnotation.range) {\n if(liveAnnotation === this.activeAnnotation) return;\n // Check if the active annotation and live annotation share a start time\n // Is that start time at the current playhead?\n // If so, don't switch which is active.\n let liveStart = liveAnnotation.range.start,\n activeStart = this.activeAnnotation.range.start;\n if(liveStart === activeStart && liveStart === time) return;\n }\n\n this.openAnnotation(liveAnnotation, false, false, true);\n }\n\n // Get all active annotations for a time (in seconds)\n activeAnnotationsForTime (time) {\n if(!this.annotations.length) return [];\n return this.annotationTimeMap[time] || [];\n }\n\n /*\n Rebuild the annotation time map\n Example: this._annotations[1] and this._annotations[3] are active during second 4\n this.annotationTimeMap = { 4: [1, 3] }\n */\n rebuildAnnotationTimeMap () {\n let timeMap = {};\n this.annotations.forEach((annotation) => {\n annotation.secondsActive.forEach((second) => {\n let val = (timeMap[second] || []);\n val.push(this.annotations.indexOf(annotation));\n timeMap[second] = val;\n });\n });\n this.annotationTimeMap = timeMap;\n }\n\n // Close active annotation and remove reference in state\n clearActive () {\n this.activeAnnotation.close(false);\n this._activeAnnotation = null;\n }\n\n // Open annotation with options to pause and show preview\n // skipLiveCheck will short circuit setLiveAnnotation()\n openAnnotation (annotation, skipLiveCheck=false, pause=true, previewOnly=false, forceSnapToStart=false) {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n this.skipLiveCheck = skipLiveCheck;\n this.clearActive();\n annotation.open(pause, previewOnly, forceSnapToStart);\n this.activeAnnotation = annotation;\n this.lastVideoTime = this.activeAnnotation.range.start;\n }\n\n // Open an annotation by ID (if it exists)\n openAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) this.openAnnotation(annotation);\n }\n\n // Returns annotation object given ID\n findAnnotation (id) {\n return this.annotations.find((a) => a.id == id);\n }\n\n // Returns comment object given ID\n findComment (id) {\n let comments = this.annotations.map((a) => a.commentList.comments);\n comments = [].concat(...comments); // flatten 2d array\n return comments.find((c) => c.id == id);\n }\n\n // Finds the next annotation in collection and opens it\n nextAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === this.annotations.length-1 ? 0 : ind+1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=0; i time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[0], true);\n }\n\n // Finds the previous annotation in collection and opens it\n prevAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === 0 ? this.annotations.length-1 : ind-1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=this.annotations.length-1; i>=0; i--){\n if(this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[this.annotations.length-1], true);\n }\n\n // Use anywhere the annotation data changes\n // Cleans internal state data, updates player button, triggers configurable callback\n stateChanged () {\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n this.plugin.fire('onStateChanged', this.data);\n }\n\n // Reset internal state properties\n resetData () {\n this.annotations = [];\n this.annotationTimeMap = {};\n this.activeAnnotation = null;\n this.enabled = false;\n this.skipNextTimeCheck = false;\n this.lastVideoTime = 0;\n }\n\n // Remove UI and unbind events for this and child components\n teardown() {\n this.annotations.forEach((annotation) => { annotation.teardown(false); });\n this.resetData();\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for an invidual comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n moment = require(\"moment\"),\n templateName = 'comment';\n\nmodule.exports = class Comment extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.commentList = data.commentList;\n this.id = data.id || this.componentId;\n this.meta = data.meta;\n this.body = data.body;\n this.timestamp = moment(data.meta.datetime).unix();\n this.timeSince = this.timeSince();\n\n this.$el = $(this.render());\n }\n\n // Serialize data\n get data () {\n return {\n id: this.id,\n meta: this.meta,\n body: this.body\n };\n }\n\n get HTML () {\n return this.$el[0].outerHTML;\n }\n\n render () {\n return this.renderTemplate(\n templateName,\n {\n id: this.id,\n body: this.body,\n meta: this.meta,\n timeSince: this.timeSince\n }\n );\n }\n\n // Return time since comment timestamp\n timeSince () {\n return moment(this.meta.datetime).fromNow();\n }\n\n teardown (destroy=false) {\n super.teardown(destroy);\n }\n\n // Return a Comment obj given body content and plugin reference\n static newFromData (body, commentList, plugin) {\n let data = this.dataObj(body, plugin);\n return new Comment(data, plugin.player);\n }\n\n // Return an object with plugin data, timestamp, unique id, and body content\n static dataObj (body, plugin) {\n return {\n meta: Object.assign({\n datetime: moment().toISOString()\n }, plugin.meta),\n id: Utils.guid(),\n body\n };\n }\n}\n","\"use strict\";\n/*\n Component for a list of comments in a visible/active annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n Comment = require(\"./comment\"),\n commentListTemplateName = 'comment_list',\n newCommentTemplateName = 'new_comment';\n\nmodule.exports = class CommentList extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n\n this.annotation = data.annotation;\n this.comments = data.comments.map((commentData) => {\n commentData.commentList = this;\n return new Comment(commentData, player);\n });\n this.sortComments();\n }\n\n // Serialize object\n get data () {\n return this.comments.map((c) => c.data);\n }\n\n // Bind all events needed for the comment list\n bindListEvents () {\n this.$el\n .on(\"click.vac-comment\", \".vac-close-comment-list\", (() => this.annotation.close()).bind(this)) // Hide CommentList UI with close button\n .on(\"click.vac-comment\", \".vac-reply-btn\", this.addNewComment.bind(this)) // Open new reply UI with reply button\n .on(\"click.vac-comment\", \".vac-delete-annotation\", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button\n .on(\"click.vac-comment\", \".vac-delete-comment\", this.destroyComment.bind(this)) // Delete comment with delete comment button\n .on(\"mousewheel.vac-comment DOMMouseScroll.vac-comment\", \".vac-comments-wrap\", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI\n }\n\n // Bind event listeners for new comments form\n bindCommentFormEvents () {\n this.$newCommentForm\n .on(\"click.vac-comment\", \".vac-add-controls a, .vac-video-write-new.vac-is-comment a\", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link\n .on(\"click.vac-comment\", \".vac-video-write-new.vac-is-comment button\", this.saveNewComment.bind(this)); // Save new comment with save button\n }\n\n // Render CommentList UI with all comments using template\n render () {\n this.$el = $(this.renderTemplate(\n commentListTemplateName,\n {\n commentsHTML: this.comments.map((c) => c.HTML),\n rangeStr: Utils.humanTime(this.annotation.range)\n }\n ));\n\n this.$player.append(this.$el);\n this.$wrap = this.$UI.commentsContainer;\n this.bindListEvents();\n }\n\n // Re-render UI on state change\n reRender () {\n this.teardown(false);\n this.render();\n }\n\n // Render new comment form\n addNewComment () {\n this.$wrap.addClass(this.UI_CLASSES.active).find(\".vac-comments-wrap\").scrollTop(999999);\n var $shapebox = this.$wrap.find(\".vac-add-new-shapebox\"),\n width = $shapebox.outerWidth(),\n top = $shapebox.position().top + 10,\n right = this.$wrap.outerWidth() - ($shapebox.position().left + width);\n\n this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, {width, top, right}));\n this.bindCommentFormEvents();\n this.$player.append(this.$newCommentForm);\n }\n\n // Save comment from new comment form, update state and re-render UI\n saveNewComment () {\n this.$wrap.removeClass(this.UI_CLASSES.active);\n\n let user_id = 1,\n body = this.$UI.newCommentTextarea.val();\n\n if(!body) return; // empty comment - TODO add validation / err message\n this.createComment(body);\n }\n\n createComment (body) {\n let comment = Comment.newFromData(body, this, this.plugin);\n this.comments.push(comment);\n this.sortComments();\n\n // Don't mutate UI if comment is being created for an inactive annotation (via API)\n if(this.annotation.isActive) {\n this.reRender(false);\n this.closeNewComment();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n // Cancel comment adding process\n closeNewComment () {\n this.unbindCommentFormEvents();\n if(this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active);\n if(this.$newCommentForm) this.$newCommentForm.remove();\n }\n\n // Delete a comment. If it is the only comment, delete the annotation\n // Update state and re-render UI\n destroyComment (event) {\n let annotationId = this.annotation.id;\n if(this.comments.length == 1) {\n this.annotation.teardown();\n } else {\n let commentId = this.findCommentId(event),\n comment = this.comments.find((c) => c.id == commentId),\n i = this.comments.indexOf(comment);\n this.comments.splice(i, 1);\n this.reRender();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n findCommentId (event) {\n let id = typeof event.detail.id === 'undefined' ?\n $(event.target).closest('.vac-comment').data('id') :\n event.detail.id;\n return id;\n }\n\n // Prevents outer page scroll when at the top or bottom of CommentList UI\n // TODO: This might need to be fine-tuned?\n disablePageScroll (event) {\n let $target = $(event.currentTarget),\n height = $target.height(),\n ogEvent = event.originalEvent,\n delta = ogEvent.wheelDelta || -ogEvent.detail,\n dir = delta < 0 ? \"down\" : \"up\",\n scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight);\n\n // if scrolling into top of div\n if ($target.scrollTop() < 20 && dir == \"up\") {\n $target.stop();\n $target.animate({scrollTop: 0}, 100);\n event.preventDefault();\n }\n\n // if scrolling into bottom of div\n if ($target.scrollTop() > (scrollDiff - 10) && dir == \"down\") {\n $target.stop();\n $target.animate({scrollTop: height + 40}, 100);\n event.preventDefault();\n }\n }\n\n // Sort comments by timestamp\n sortComments () {\n this.comments.sort((a,b) => {\n return a.timestamp < b.timestamp ? -1 : (a.timestamp > b.timestamp ? 1 : 0);\n });\n }\n\n // Delete the annotation\n handleDeleteAnnotationClick (e) {\n let $confirmEl = $(\"\").addClass(\"vac-delete-confirm\").text(\"CONFIRM\");\n $confirmEl.on(\"click.comment\", () => {\n $confirmEl.off(\"click.comment\");\n this.annotation.teardown();\n });\n $(e.target).replaceWith($confirmEl);\n }\n\n // Unbind listeners for new comments form\n unbindCommentFormEvents () {\n if(this.$newCommentForm) this.$newCommentForm.off(\"click.vac-comment\");\n }\n\n // Teardown CommentList UI, unbind events\n teardown (destroyComments=true) {\n if(this.$el) {\n this.$el.off(\"click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment\");\n }\n this.comments.forEach((c) => c.teardown(destroyComments));\n if(destroyComments) this.comments = [];\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing annotation \"control box\" in upper left of video when in annotation mode,\n including all functionality to add new annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n DraggableMarker = require(\"./draggable_marker.js\"),\n SelectableShape = require(\"./selectable_shape.js\"),\n PlayerButton = require(\"./player_button\"),\n Annotation = require(\"./annotation\"),\n templateName = 'controls';\n\n// Control uses a \"ui state\" to determine how UI is rendered - this object is the base state, containing a\n// default value for each item in the state\nconst BASE_UI_STATE = Object.freeze({\n adding: false, // Are we currently adding a new annotation? (step 1 of flow)\n writingComment: false // Are we currently writing the comment for annotation (step 2 of flow)\n});\n\nmodule.exports = class Controls extends PlayerUIComponent {\n\n constructor (player, bindArrowKeys) {\n super(player);\n this.initAPI(this, 'Controls');\n\n this.internalCommenting = this.plugin.options.internalCommenting;\n this.showControls = this.plugin.options.showControls;\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.bindEvents(bindArrowKeys);\n\n if(this.showControls){\n // create player button in the control bar if controls are shown\n this.playerButton = new PlayerButton(this.player);\n }\n\n this.render();\n }\n\n // Bind all the events we need for UI interaction\n bindEvents (bindArrowKeys) {\n this.$player.on(\"click.vac-controls\", \".vac-controls button\", this.startAddNew.bind(this)) // Add new button click\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-next\", () => this.plugin.annotationState.nextAnnotation() ) // Click 'next' on annotation nav\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-prev\", () => this.plugin.annotationState.prevAnnotation() ) // Click 'prev' on annotation nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-next\", () => this.marker.scrubStart(1) ) // Click '+1 sec' on marker nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-prev\", () => this.marker.scrubStart(-1) ); // Click '-1 sec' on marker nav\n\n if(this.internalCommenting) {\n this.$player.on(\"click.vac-controls\", \".vac-add-controls button\", this.writeComment.bind(this)) // 'Next' button click while adding\n .on(\"click.vac-controls\", \".vac-video-write-new.vac-is-annotation button\", this.saveNew.bind(this)) // 'Save' button click while adding\n .on(\"click.vac-controls\", \".vac-add-controls a, .vac-video-write-new.vac-is-annotation a\", this.cancelAddNew.bind(this)) // Cancel link click\n }\n if(bindArrowKeys){\n $(document).on(`keyup.vac-nav-${this.playerId}`, (e) => this.handleArrowKeys(e)); // Use arrow keys to navigate annotations\n }\n }\n\n // Remove UI and unbind events for this and child components\n teardown () {\n this.clear(true);\n this.$player.off('click.vac-controls');\n $(document).off(`keyup.vac-nav-${this.playerId} mousemove.vac-tooltip-${this.playerId}`);\n if(this.playerButton) this.playerButton.teardown();\n super.teardown();\n }\n\n // Clear existing UI (resetting components if need be)\n clear (reset=false) {\n if(reset){\n if(this.uiState.adding){\n this.restoreNormalUI();\n this.marker.teardown();\n this.selectableShape.teardown();\n }\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.$player.find('.vac-video-cover-canvas')\n .off('mousedown.vac-cursor-tooltip')\n .off('mouseup.vac-cursor-tooltip');\n }\n this.$tooltip_ = null;\n this.$UI.controlElements.remove();\n }\n\n // Render the UI elements (based on uiState)\n render (reset=false) {\n this.clear(reset);\n let data = Object.assign(\n {\n rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null,\n showNav: this.plugin.annotationState.annotations.length > 1\n },\n this.uiState,\n { internalCommenting: this.internalCommenting, showControls: this.showControls }\n );\n\n let $ctrls = this.renderTemplate(templateName, data);\n this.$player.append($ctrls);\n\n if(this.playerButton) this.playerButton.updateNumAnnotations();\n }\n\n // User clicked to cancel in-progress add - restore to normal state\n cancelAddNew () {\n if(!(this.uiState.adding || this.uiState.writingComment)) return;\n this.render(true);\n this.marker.teardown();\n this.marker = null;\n }\n\n // User clicked 'add' button in the controls - setup UI and marker\n startAddNew () {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n\n this.player.pause();\n this.setAddingUI();\n this.uiState.adding = true;\n this.render();\n\n // construct new range and create marker\n let range = {\n start: parseInt(this.currentTime,10),\n stop: parseInt(this.currentTime,10)\n };\n this.marker = new DraggableMarker(this.player, range);\n this.selectableShape = new SelectableShape(this.player);\n\n // show cursor help text if controls are hidden\n if(!this.showControls) this.bindCursorTooltip();\n\n this.plugin.fire('enteredAddingAnnotation', { range: range });\n }\n\n // User clicked 'next' action - show UI to write comment\n writeComment () {\n this.uiState.writingComment = true;\n this.render();\n }\n\n // User clicked to save a new annotation/comment during add new flow\n saveNew () {\n let comment = this.$UI.newCommentTextarea.val();\n if(!comment) return; // empty comment - TODO add validation / err message\n\n let a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin);\n this.plugin.annotationState.addNewAnnotation(a);\n\n this.cancelAddNew();\n }\n\n // Change normal UI (hide markers, hide playback, etc) on init add state\n setAddingUI () {\n this.plugin.annotationState.enabled = false;\n this.disablePlayingAndControl();\n }\n\n // Restore normal UI after add state\n restoreNormalUI () {\n this.plugin.annotationState.enabled = this.plugin.active;\n this.enablePlayingAndControl();\n $(document).off(`mousemove.vac-tooltip-${this.playerId}`);\n }\n\n // On arrow key press, navigate to next or prev Annotation\n handleArrowKeys (e) {\n if(!this.plugin.active) return;\n let keyId = e.which;\n\n if(keyId == 37) this.plugin.annotationState.prevAnnotation();\n if(keyId == 39) this.plugin.annotationState.nextAnnotation();\n }\n\n // Adds help text to cursor during annotation mode\n bindCursorTooltip () {\n this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden);\n\n // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct\n this.plugin.setBounds(false);\n $(document).on(`mousemove.vac-tooltip-${this.playerId}`, Utils.throttle(((event) => {\n if(!this.plugin.bounds) return;\n\n let x = event.pageX,\n y = event.pageY,\n outOfBounds =\n (x < this.plugin.bounds.left || x > this.plugin.bounds.right) ||\n (y < this.plugin.bounds.top || y > this.plugin.bounds.bottom),\n withinControls = !outOfBounds && y >= this.plugin.bounds.bottomWithoutControls,\n markerHovered = this.$tooltip.hasClass('vac-marker-hover');\n\n if(outOfBounds) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n return\n }\n\n let cursorX = x - this.plugin.bounds.left,\n cursorY = y - this.plugin.bounds.top,\n margin = 10,\n rightEdge = this.$player.width(),\n bottomEdge = this.$player.height() - this.$UI.controlBar.height(),\n atRightEdge = (cursorX + this.tooltipArea.width + margin*2) >= rightEdge,\n atBottomEdge = (cursorY + this.tooltipArea.height + margin*2) >= bottomEdge;\n\n // is the tooltip too close to the right or bottom edge?\n let posX = atRightEdge ? (rightEdge - this.tooltipArea.width - margin) : (cursorX + margin),\n posY = atBottomEdge ? (bottomEdge - this.tooltipArea.height - margin) : (cursorY + margin);\n\n // hide if the cursor is over the control bar but not hovering over the draggable marker\n // also hide if mouse is down\n if((withinControls && !markerHovered) || this.$tooltip.hasClass('vac-cursor-dragging')) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n } else {\n this.$tooltip.removeClass(this.UI_CLASSES.hidden);\n }\n\n this.$tooltip.css({\n left: `${posX}px`,\n top: `${posY}px`\n });\n }).bind(this), 50));\n }\n\n get $tooltip () {\n this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip');\n return this.$tooltip_;\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range\n as drag occurs\n*/\n\nconst Marker = require(\"./marker\"),\n Utils = require('./../lib/utils'),\n markerTemplateName = 'draggable_marker';\n\nmodule.exports = class DraggableMarker extends Marker {\n\n constructor (player, range) {\n super(player, range);\n this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10\n this.templateName = markerTemplateName; // Change template from base Marker template\n this.dragging = false; // Is a drag action currently occring?\n this.rangePin = range.start; // What's the original pinned timeline point when marker was added\n this.render();\n this.$parent = this.$UI.markerWrap; // Set parent as marker wrap\n }\n\n // Bind needed evnets for UI interaction\n bindMarkerEvents () {\n // On mouse down init drag\n this.$el.on('mousedown.vac-marker', (e) => {\n e.preventDefault();\n this.dragging = true;\n // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms\n $(document).on(`mousemove.vac-dmarker-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 250) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .addClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse up end drag action and unbind mousemove event\n $(document).on(`mouseup.vac-dmarker-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n $(document).off(`mousemove.vac-dmarker-${this.playerId}`);\n this.dragging = false;\n\n // Remove drag class and hover class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .removeClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse mouse enter, show cursor tooltip if controls are not shown\n // This adds the class which is picked up in Controls\n if(!this.plugin.options.showControls) {\n var self = this;\n self.$el\n .on('mouseenter.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover');\n })\n .on('mouseleave.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover');\n });\n };\n }\n\n // On drag action, calculate new range and re-render marker\n onDrag (e) {\n var dragPercent = this.percentValFromXpos(e.pageX),\n secVal = parseInt(this.duration * dragPercent);\n\n if(secVal > this.rangePin){\n this.range = {\n start: this.rangePin,\n end: secVal\n };\n }else{\n this.range = {\n start: secVal,\n end: this.rangePin\n };\n }\n this.render();\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n\n // Cal percentage (of video) position for a pixel-based X position on the document\n percentValFromXpos (xpos) {\n var x = Math.max(0, xpos - this.$parent.offset().left), // px val\n max = this.$parent.innerWidth(),\n per = (x / max);\n if(per > 1) per = 1;\n if(per < 0) per = 0;\n return per;\n }\n\n // Remove bound events on destructon\n teardown () {\n $(document).off(`mousemove.vac-dmarker-${this.playerId} mouseup.vac-dmarker-${this.playerId}`);\n this.$el.off('mouseenter.vac-cursor-tool-tip');\n this.$el.off('mouseleave.vac-cursor-tool-tip');\n this.$el.off('mousedown.vac-marker');\n this.$el.remove();\n }\n\n // Move the video & marker start by some num seconds (pos or neg)\n scrubStart (secondsChanged) {\n let newStart = this.range.start + secondsChanged;\n this.currentTime = newStart;\n this.range.start = newStart;\n this.rangePin = newStart;\n this.teardown();\n this.render();\n\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker with capabilities to render on timeline, including tooltip for comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n markerTemplateName = 'marker',\n markerWrapTemplateName = 'marker_wrap';\n\nmodule.exports = class Marker extends PlayerUIComponent {\n\n constructor (player, range, comment=null) {\n super(player);\n this.range = range;\n this.comment = comment;\n this.templateName = markerTemplateName;\n\n if(!this.$UI.markerWrap.length){\n this.$UI.timeline.append(\n this.renderTemplate(markerWrapTemplateName)\n );\n }\n }\n\n // Set this marker as active (highlight) and optionally show tooltip also\n setActive (showTooltip=false) {\n this.$el.addClass(this.UI_CLASSES.active);\n if(showTooltip) this.$el.addClass('vac-force-tooltip');\n }\n\n // Deactivate this marker\n deactivate () {\n this.$el.removeClass(`${this.UI_CLASSES.active} vac-force-tooltip`);\n }\n\n // Draw marker on timeline for this.range;\n render () {\n // clear existing marker if this one was already rendered\n this.$UI.timeline.find(`[data-marker-id=\"${this.componentId}\"]`).remove();\n\n // Bind to local instance var, add to DOM, and setup events\n this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData));\n this.$UI.markerWrap.append(this.$el);\n this.bindMarkerEvents();\n }\n\n // Bind needed events for this marker\n bindMarkerEvents () {\n // handle dimming other markers + highlighting this one on mouseenter/leave\n this.$el.on(\"mouseenter.vac-marker\", () => {\n this.$el.addClass('vac-hovering').closest(\".vac-marker-wrap\").addClass('vac-dim-all');\n }).on(\"mouseleave.vac-marker\", () => {\n this.$el.removeClass('vac-hovering').closest(\".vac-marker-wrap\").removeClass('vac-dim-all');\n });\n }\n\n // Build object for template\n get markerTemplateData () {\n // the smaller the width, the higher the z-index so overlaps are clickable\n let left = (this.range.start / this.duration) * 100,\n width = ((this.range.end / this.duration) * 100) - left,\n zIndex = (100 - Math.floor(width)) || 100;\n return {\n left: left + '%',\n width: width + '%',\n zIndex: zIndex,\n showTooltip: this.plugin.options.showMarkerShapeAndTooltips,\n tooltipRight: left > 50,\n tooltipTime: Utils.humanTime(this.range),\n tooltipBody: !this.comment ? null : this.comment.body,\n rangeShow: !!this.range.end,\n id: this.componentId\n };\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el\n .off('mouseenter.vac-marker')\n .off('mouseleave.vac-marker')\n .off('click.vac-marker');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component main 'annotation toggle' button in the player controls, including notifier for # annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n templateName = \"player_button\";\n\nmodule.exports = class PlayerButton extends PlayerUIComponent {\n\n constructor (player) {\n super(player);\n this.render();\n\n this.initAPI(this, 'PlayerButton');\n\n this.$el.on('click.vac-player-button', () => {\n this.plugin.toggleAnnotationMode();\n });\n }\n\n // Add button to player\n render () {\n let btn = this.player.getChild('controlBar').addChild('button', {});\n btn.controlText(\"Toggle Animations\");\n this.$el = $(btn.el());\n this.$el.addClass('vac-player-btn').find(\".vjs-icon-placeholder\").html(this.renderTemplate(templateName));\n }\n\n // Update the number of annotations displayed in the bubble\n updateNumAnnotations () {\n let num = this.plugin.annotationState.annotations.length,\n $bubble = this.$el.find(\"b\");\n $bubble.text(num);\n num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden);\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el.off('click.vac-player-button');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for a shape that can be drug/sized on top of the video while adding a new annotation\n*/\n\nconst Shape = require(\"./shape\"),\n Utils = require('./../lib/utils');\n\nmodule.exports = class SelectableShape extends Shape {\n\n constructor (player) {\n super(player);\n this.$parent = this.$player.find(\".vac-video-cover-canvas\");\n this.bindEvents();\n this.dragging = false;\n }\n\n // Bind all needed events for drag action\n bindEvents () {\n // On mousedown initialize drag\n this.$parent.on(\"mousedown.vac-selectable-shape\", (e) => {\n // Check a few conditions to see if we should *not* start drag\n if( !($(e.target).hasClass('vac-video-cover-canvas')) ) return; //didn't click on overlay\n if( $(e.target).hasClass('vac-shape') ) return; //user clicked on annotation\n\n // Remove old shape if one existed\n if(this.$el) this.$el.remove();\n\n // Define default starting shape (just x/y coords of where user clicked no width/height yet)\n let shape = {\n x1: this.xCoordToPercent(e.pageX),\n y1: this.YCoordToPercent(e.pageY)\n };\n shape.x2 = shape.x1;\n shape.y2 = shape.y2;\n this.shape = shape;\n\n // Save origin points for future use\n this.originX = shape.x1;\n this.originY = shape.y1;\n\n // Draw shape and start drag state\n this.render();\n this.dragging = true;\n this.dragMoved = false; // used to determine if user actually dragged or just clicked\n\n // Bind event on doc mousemove to track drag, throttled to once each 100ms\n $(document).on(`mousemove.vac-sshape-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 100) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging');\n }\n });\n\n // On mouseup, if during drag cancel drag event listeners\n $(document).on(`mouseup.vac-sshape-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n\n $(document).off(`mousemove.vac-sshape-${this.playerId}`);\n\n if(!this.dragMoved){\n //clear shape if it's just a click (and not a drag)\n this.shape = null;\n if(this.$el) this.$el.remove();\n }\n\n this.dragging = false;\n\n // Remove drag class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging');\n }\n });\n }\n\n // On each interation of drag action (mouse movement), recalc position and redraw shape\n onDrag (e) {\n this.dragMoved = true;\n\n let xPer = this.xCoordToPercent(e.pageX),\n yPer = this.YCoordToPercent(e.pageY);\n\n if(xPer < this.originX){\n this.shape.x2 = this.originX;\n this.shape.x1 = Math.max(0, xPer);\n }else{\n this.shape.x2 = Math.min(100, xPer);\n this.shape.x1 = this.originX;\n }\n if(yPer < this.originY){\n this.shape.y2 = this.originY;\n this.shape.y1 = Math.max(0, yPer);\n }else{\n this.shape.y2 = Math.min(100, yPer);\n this.shape.y1 = this.originY;\n }\n this.setDimsFromShape();\n\n this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape });\n }\n\n // Convert pixel-based x position (relative to document) to percentage in video\n xCoordToPercent (x) {\n x = x - this.$parent.offset().left; //pixel position\n let max = this.$parent.innerWidth();\n return Number(((x / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Convert pixel-based y position (relative to document) to percentage in video\n YCoordToPercent (y) {\n y = y - this.$parent.offset().top; //pixel position\n let max = this.$parent.innerHeight();\n return Number(((y / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Unbind events and remove element\n teardown () {\n this.$parent.off('mousedown.vac-selectable-shape');\n $(document).off(`mouseup.vac-sshape-${this.playerId} mousemove.vac-sshape-${this.playerId}`);\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing a shape (i.e. box drawn on the player) for an annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\");\n\nmodule.exports = class Shape extends PlayerUIComponent {\n\n constructor (player, shape=null) {\n super(player);\n this.shape = shape;\n this.$parent = this.$player;\n }\n\n // Draw the shape element on the $parent\n render () {\n if(!this.shape) return;\n if(this.$el) this.$el.remove();\n\n this.$el = $(\"
\").addClass(\"vac-shape\");\n this.setDimsFromShape();\n this.$parent.append(this.$el);\n }\n\n // Set/update the dimensions of the shape based on this.shape\n setDimsFromShape () {\n this.$el.css({\n left: this.shape.x1 + \"%\",\n top: this.shape.y1 + \"%\",\n width: (this.shape.x2-this.shape.x1) + \"%\",\n height: (this.shape.y2-this.shape.y1) + \"%\"\n });\n }\n}\n","'use strict';\n/*\n Classes for registering and handling custom events for external interaction support.\n Will be bound to plugin object as a message gateway between external elements and the plugin.\n*/\n\nconst Logger = require(\"./logger\");\n\n/*\n A centralized collection of event callbacks organized by component and name\n Main reference for external event api\n These events will be bound to the plugin on initialization of their respective components\n NOTE - 'self' as second param in each function is a workaround for transpiler not properly\n keeping this , so we pass in instance to use as this for each fn - can't rely on bind\n because this is rewritten from symbol registry in transpiler and it's not present\n*/\n\nconst EventRegistry = {\n AnnotationState: {\n openAnnotation: (event, _this) => {\n _this.openAnnotationById(event.detail.id);\n },\n closeActiveAnnotation: (event, _this) => {\n _this.clearActive();\n },\n newAnnotation: (event, _this) => {\n _this.createAndAddAnnotation(event.detail);\n },\n destroyAnnotation: (event, _this) => {\n _this.destroyAnnotationById(event.detail.id);\n },\n newComment: (event, _this) => {\n let annotation = _this.findAnnotation(event.detail.annotationId);\n if(annotation) annotation.commentList.createComment(event.detail.body);\n },\n destroyComment: (event, _this) => {\n let comment = _this.findComment(event.detail.id);\n if(comment) comment.commentList.destroyComment(event);\n }\n },\n Controls: {\n addingAnnotation: (event, _this) => {\n _this.startAddNew();\n },\n cancelAddingAnnotation: (event, _this) => {\n _this.cancelAddNew();\n }\n },\n PlayerButton: {\n onStateChanged: (event, _this) => {\n _this.updateNumAnnotations();\n }\n },\n AnnotationComments: {\n toggleAnnotationMode: (event, _this) => {\n _this.toggleAnnotationMode();\n }\n }\n};\n\nmodule.exports = class EventDispatcher {\n\n constructor (plugin) {\n this.plugin = plugin;\n this.pluginReady = false;\n this.pendingEvts = [];\n this.registeredListeners = [];\n this.eventRegistry = EventRegistry;\n }\n\n // Use the EventRegistry to mass register events on each component initialization\n registerListenersFor (obj, className) {\n let matchingEvents = this.eventRegistry[className];\n if (matchingEvents) {\n Object.keys(matchingEvents).forEach((key) => {\n // Don't register again if already in cached collection\n if (!~this.registeredListeners.indexOf(key)) {\n let callback = matchingEvents[key].bind(obj);\n this.registerListener(key, ((evt) => {\n if(!this.pluginReady) return;\n this.logCallback(key, className, evt);\n callback(evt, obj);\n }).bind(this));\n }\n });\n }\n }\n\n // Bind a listener to the plugin\n registerListener (type, callback) {\n this.plugin.on(type, callback);\n this.registeredListeners.push(type);\n }\n\n // Unbind a listener from the plugin\n unregisterListener (type) {\n this.plugin.off(type);\n let i = this.registeredListeners.indexOf(type);\n this.registeredListeners.splice(i, 1);\n }\n\n // Trigger an event on the plugin\n fire (type, data) {\n if(!this.pluginReady) return;\n Logger.log(\"evt-dispatch-FIRE\", type, data);\n let evt = new CustomEvent(type, { 'detail': data });\n this.plugin.trigger(evt);\n }\n\n teardown () {\n this.registeredListeners.forEach((type) => { this.unregisterListener(type) });\n }\n\n logCallback (eventName, className, event) {\n Logger.log(\"evt-dispatch-RECEIVE\", `${eventName} (${className})`, event);\n }\n}\n","'use strict';\n/*\n\tGeneral logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging\n*/\n\n// Prefix for appending to all logger messages\nconst LOG_PREFIX = \"::VAC::\";\n\n// Are we in debug mode?\nfunction debug(){\n\treturn !!window.VAC_DEBUG;\n}\n\n// Build arguments for console fn, adding prefix\nfunction buildArgs(args){\n\treturn [LOG_PREFIX].concat(args);\n}\n\n// Log message/data\nmodule.exports.log = (...args) => {\n if(!debug()) return;\n console.log.apply(null, buildArgs(args));\n}\n\n// Error message/data\nmodule.exports.error = (...args) => {\n if(!debug()) return;\n console.error.apply(null, buildArgs(args));\n}\n\n// Info message/data\nmodule.exports.info = (...args) => {\n if(!debug()) return;\n console.info.apply(null, buildArgs(args));\n}\n","\"use strict\";\n/*\n Base class all player components interit from - it includes lots of helper functions (to get reference to\n the player, the plugin, video state, etc)\n*/\n\nmodule.exports = class PlayerComponent {\n\n constructor (player) {\n this._player = player;\n }\n\n // attribute to get reference to the main plugin object (main.js instance)\n get plugin () {\n return this.player.annotationComments();\n }\n\n // attribute to get player javascript instance\n get player () {\n return this._player;\n }\n\n // attribute to get video duration (in seconds)\n get duration () {\n return this.player.duration();\n }\n\n // attribute to get player current time\n get currentTime () {\n return this.player.currentTime();\n }\n\n // set current time of player\n set currentTime (time) {\n this.player.currentTime(time);\n }\n\n // Register all events in the EventRegistry matching this className\n initAPI (obj, className) {\n this.plugin.eventDispatcher.registerListenersFor(obj, className);\n }\n\n // Nullify player reference so objects can be removed safely\n // All components should call super.teardown() within their teardown funcs\n teardown (destroy=false) {\n if(destroy) this._player = null;\n }\n}\n","\"use strict\";\n/*\n Base class all player UI components interit from - it includes lots of helper functions (to get reference to\n the player $el, various classes/helpers, template rendering, etc)\n*/\n\nconst PlayerComponent = require(\"./player_component\"),\n Handlebars = require('handlebars/runtime'),\n Templates = require('./../compiled/templates'),\n Utils = require('./../lib/utils');\n\nmodule.exports = class PlayerUIComponent extends PlayerComponent {\n\n constructor (player) {\n super(player);\n }\n\n // helpers to get various UI components of the player quickly, keeping commonly reused class names\n // consolidated in case of need to change in the future (and for quick access)\n get $UI () {\n return Object.freeze({\n commentsContainer: this.$player.find(\".vac-comments-container\"), // outer container for all comments\n controlElements: this.$player.find(\".vac-control\"), // Each of multiple control elements in the control bar\n newCommentTextarea: this.$player.find(\".vac-video-write-new textarea\"), // Textarea for writing a new comment\n timeline: this.$player.find('.vjs-progress-control'), // Timeline element\n markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline\n controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs\n markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline\n coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state\n });\n }\n\n // utility classes used in various components\n get UI_CLASSES () {\n return Object.freeze({\n hidden: \"vac-hidden\",\n active: \"vac-active\"\n });\n }\n\n // attribute to get player jquery element\n get $player () {\n return $(this.player.el());\n }\n\n\n // attribute to get player id from DOM\n get playerId () {\n return this.$player.attr('id');\n }\n\n // Generate a pseudo-guid ID for this component, to use as an ID in the DOM\n get componentId () {\n this.cid_ = this.cid_ || Utils.guid()\n return this.cid_;\n }\n\n // Disable play/control actions on the current player\n disablePlayingAndControl () {\n this.$player.addClass('vac-disable-play');\n //TODO - catch spacebar being hit\n //TODO - prevent scrubbing and timeline click to seek\n }\n\n // Enable play/control actions on the controller\n enablePlayingAndControl () {\n this.$player.removeClass('vac-disable-play');\n }\n\n // Render a handlebars template with local data passed in via key/val in object\n renderTemplate (templateName, options = {}) {\n this.registerHandlebarsHelpers();\n return Templates[templateName](options);\n }\n\n // Handle escaped breaklines in Handlebars\n registerHandlebarsHelpers () {\n if('breaklines' in Handlebars.helpers) return;\n\n Handlebars.registerHelper('breaklines', (text) => {\n text = Handlebars.Utils.escapeExpression(text);\n text = text.replace(/(\\r\\n|\\n|\\r)/gm, '
');\n return new Handlebars.SafeString(text);\n });\n }\n\n // Provide basic teardown function to inherit\n teardown () {\n if(this.$el) this.$el.remove();\n super.teardown();\n }\n}\n","/*\n Collection of polyfills neededf or IE10+ support\n*/\n\n// Array.prototype.find() for IE10+\nrequire('ie-array-find-polyfill');\n// Object.assign for IE10+\nrequire('es6-object-assign').polyfill();\n\n// Allow use of object.constructor.staticFunc() in IE\n// Not yet supported by babel\n// https://gist.github.com/edoardocavazza/47246856759f2273e48b\n(function () {\n if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') {\n var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype'];\n\n function bindFunction(ctx, fn) {\n return function() {\n return fn.apply(this, arguments);\n }\n }\n\n function bindProperty(ctx, prop, parentDescriptor) {\n if (!parentDescriptor) {\n var defaultValue = ctx.__proto__[prop];\n parentDescriptor = {\n get: function () {\n return ctx['__' + prop] || defaultValue\n },\n set: function (val) {\n ctx['__' + prop] = val;\n }\n }\n }\n Object.defineProperty(ctx, prop, {\n get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined,\n set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined,\n configurable: true\n });\n\n }\n\n function iterateProps(subClass, superClass) {\n var props = Object.getOwnPropertyNames(superClass),\n proto;\n\n subClass.__proto__ = superClass;\n for (var i = 0, len = props.length; i < len; i++) {\n var prop = props[i];\n if (prop === '__proto__') {\n proto = superClass[prop];\n } else if (_exclude.indexOf(i) === -1) {\n var descriptor = Object.getOwnPropertyDescriptor(subClass, prop);\n if (!descriptor) {\n var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop);\n if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') {\n subClass[prop] = bindFunction(subClass, superClass[prop]);\n } else if (typeof superDescriptor.get == 'function') {\n bindProperty(subClass, prop, superDescriptor);\n } else {\n bindProperty(subClass, prop);\n }\n }\n }\n }\n if (proto) {\n iterateProps(subClass, proto);\n }\n }\n\n Object.setPrototypeOf = iterateProps;\n }\n})();\n\n// Use CustomEvent in IE\n(function () {\n if ( typeof window.CustomEvent === \"function\" ) return false;\n\n function CustomEvent ( event, params ) {\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n var evt = document.createEvent( 'CustomEvent' );\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\n return evt;\n }\n\n CustomEvent.prototype = window.Event.prototype;\n\n window.CustomEvent = CustomEvent;\n})();\n","\"use strict\";\n/*\n Geneal utility functions, sourced from underscore & scratch built as needed\n*/\n\nmodule.exports = {\n\n // Clone an object\n cloneObject: (obj) => Object.assign({}, obj),\n\n // _throttle from underscore\n throttle: (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function() {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function() {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n // Parse all keys of an object to int\n parseIntObj: (obj) => {\n Object.keys(obj).forEach((key) => {\n if(parseInt(obj[key])) {\n obj[key] = parseInt(obj[key]);\n }\n });\n return obj;\n },\n\n // Convert a range {start: int, (optional) end: int} to human readable time\n humanTime: (range) => {\n function readable(sec){\n let mins = Math.floor(sec/60),\n secs = String(sec % 60);\n return mins + \":\" + (secs.length==1 ? \"0\" : \"\") + secs;\n }\n let time = [readable(range.start)];\n if(range.end) time.push(readable(range.end));\n return time.join(\"-\");\n },\n\n // Pseduo-random guid generator\n guid: () => {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n },\n\n // Returns the height and width of an element that is not visible\n // clones el and tricks DOM into rendering it w the correct size\n // beware the container may be important for scoped styles\n areaOfHiddenEl: ($el, $container, hideClass='') => {\n let $clone = $el.clone(),\n data = {};\n $clone.css({\n visibility: 'hidden',\n display: 'inline-block'\n });\n $clone.removeClass(hideClass);\n $container.append($clone);\n data.width = $clone.outerWidth();\n data.height = $clone.outerHeight();\n $clone.remove();\n\n return data;\n },\n\n // Determine if a value (n) is within a range (start <= n <= end)\n isWithinRange: (start, end, n) => {\n end = end || start + 1; // for ranges with NO end defined, assume a 1s range\n return n >= start && n <= end;\n }\n};\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZXM2LW9iamVjdC1hc3NpZ24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy5ydW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9kZWNvcmF0b3JzL2lubGluZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2Jsb2NrLWhlbHBlci1taXNzaW5nLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9lYWNoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9oZWxwZXItbWlzc2luZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2xvZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy93aXRoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvbG9nZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9uby1jb25mbGljdC5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9zYWZlLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvcnVudGltZS5qcyIsIm5vZGVfbW9kdWxlcy9pZS1hcnJheS1maW5kLXBvbHlmaWxsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJzcmMvanMvYW5ub3RhdGlvbl9jb21tZW50cy5qcyIsInNyYy9qcy9jb21waWxlZC90ZW1wbGF0ZXMuanMiLCJzcmMvanMvY29tcG9uZW50cy9hbm5vdGF0aW9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYW5ub3RhdGlvbl9zdGF0ZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL2NvbW1lbnQuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb21tZW50X2xpc3QuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb250cm9scy5qcyIsInNyYy9qcy9jb21wb25lbnRzL2RyYWdnYWJsZV9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9wbGF5ZXJfYnV0dG9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvc2VsZWN0YWJsZV9zaGFwZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL3NoYXBlLmpzIiwic3JjL2pzL2xpYi9ldmVudF9kaXNwYXRjaGVyLmpzIiwic3JjL2pzL2xpYi9sb2dnZXIuanMiLCJzcmMvanMvbGliL3BsYXllcl9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BsYXllcl91aV9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BvbHlmaWxscy5qcyIsInNyYy9qcy9saWIvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OzhCQzlDc0IsbUJBQW1COztJQUE3QixJQUFJOzs7OztvQ0FJTywwQkFBMEI7Ozs7bUNBQzNCLHdCQUF3Qjs7OzsrQkFDdkIsb0JBQW9COztJQUEvQixLQUFLOztpQ0FDUSxzQkFBc0I7O0lBQW5DLE9BQU87O29DQUVJLDBCQUEwQjs7Ozs7QUFHakQsU0FBUyxNQUFNLEdBQUc7QUFDaEIsTUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7QUFFMUMsT0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkIsSUFBRSxDQUFDLFVBQVUsb0NBQWEsQ0FBQztBQUMzQixJQUFFLENBQUMsU0FBUyxtQ0FBWSxDQUFDO0FBQ3pCLElBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLElBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7O0FBRTdDLElBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ2hCLElBQUUsQ0FBQyxRQUFRLEdBQUcsVUFBUyxJQUFJLEVBQUU7QUFDM0IsV0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztHQUNuQyxDQUFDOztBQUVG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RTtBQUN2QyxRQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNsQixTQUFPLE1BQU0sQ0FBQztDQUNmOztBQUVNLFNBQVMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRTtBQUNqRCxTQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFBLEdBQUksRUFBRSxDQUFDO0NBQ3BEOzs7O0FDM0dEO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LENBQVA7QUFDSDtBQUNELGVBQU8sT0FBTyxJQUFQLEdBQWMsR0FBZCxHQUFvQixJQUFwQixHQUEyQixHQUEzQixHQUFpQyxJQUFqQyxHQUF3QyxHQUF4QyxHQUErQyxJQUEvQyxHQUFzRCxHQUF0RCxHQUE0RCxJQUE1RCxHQUFtRSxJQUFuRSxHQUEwRSxJQUFqRjtBQUNILEtBbEVZOztBQW9FYjtBQUNBO0FBQ0E7QUFDQSxvQkFBZ0Isd0JBQUMsR0FBRCxFQUFNLFVBQU4sRUFBbUM7QUFBQSxZQUFqQixTQUFpQix1RUFBUCxFQUFPOztBQUMvQyxZQUFJLFNBQVMsSUFBSSxLQUFKLEVBQWI7QUFBQSxZQUNJLE9BQU8sRUFEWDtBQUVBLGVBQU8sR0FBUCxDQUFXO0FBQ1Asd0JBQVksUUFETDtBQUVQLHFCQUFTO0FBRkYsU0FBWDtBQUlBLGVBQU8sV0FBUCxDQUFtQixTQUFuQjtBQUNBLG1CQUFXLE1BQVgsQ0FBa0IsTUFBbEI7QUFDQSxhQUFLLEtBQUwsR0FBYSxPQUFPLFVBQVAsRUFBYjtBQUNBLGFBQUssTUFBTCxHQUFjLE9BQU8sV0FBUCxFQUFkO0FBQ0EsZUFBTyxNQUFQOztBQUVBLGVBQU8sSUFBUDtBQUNILEtBckZZOztBQXVGYjtBQUNBLG1CQUFlLHVCQUFDLEtBQUQsRUFBUSxHQUFSLEVBQWEsQ0FBYixFQUFtQjtBQUM5QixjQUFNLE9BQU8sUUFBUSxDQUFyQixDQUQ4QixDQUNOO0FBQ3hCLGVBQU8sS0FBSyxLQUFMLElBQWMsS0FBSyxHQUExQjtBQUNIO0FBM0ZZLENBQWpCIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLyoqXG4gKiBDb2RlIHJlZmFjdG9yZWQgZnJvbSBNb3ppbGxhIERldmVsb3BlciBOZXR3b3JrOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgZmlyc3RTb3VyY2UpIHtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGZpcnN0IGFyZ3VtZW50IHRvIG9iamVjdCcpO1xuICB9XG5cbiAgdmFyIHRvID0gT2JqZWN0KHRhcmdldCk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5leHRTb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgaWYgKG5leHRTb3VyY2UgPT09IHVuZGVmaW5lZCB8fCBuZXh0U291cmNlID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5c0FycmF5ID0gT2JqZWN0LmtleXMoT2JqZWN0KG5leHRTb3VyY2UpKTtcbiAgICBmb3IgKHZhciBuZXh0SW5kZXggPSAwLCBsZW4gPSBrZXlzQXJyYXkubGVuZ3RoOyBuZXh0SW5kZXggPCBsZW47IG5leHRJbmRleCsrKSB7XG4gICAgICB2YXIgbmV4dEtleSA9IGtleXNBcnJheVtuZXh0SW5kZXhdO1xuICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5leHRTb3VyY2UsIG5leHRLZXkpO1xuICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCAmJiBkZXNjLmVudW1lcmFibGUpIHtcbiAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG87XG59XG5cbmZ1bmN0aW9uIHBvbHlmaWxsKCkge1xuICBpZiAoIU9iamVjdC5hc3NpZ24pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LCAnYXNzaWduJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBhc3NpZ25cbiAgICB9KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYXNzaWduOiBhc3NpZ24sXG4gIHBvbHlmaWxsOiBwb2x5ZmlsbFxufTtcbiIsImltcG9ydCAqIGFzIGJhc2UgZnJvbSAnLi9oYW5kbGViYXJzL2Jhc2UnO1xuXG4vLyBFYWNoIG9mIHRoZXNlIGF1Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBObyBuZWVkIHRvIHNldHVwIGhlcmUuXG4vLyAoVGhpcyBpcyBkb25lIHRvIGVhc2lseSBzaGFyZSBjb2RlIGJldHdlZW4gY29tbW9uanMgYW5kIGJyb3dzZSBlbnZzKVxuaW1wb3J0IFNhZmVTdHJpbmcgZnJvbSAnLi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9oYW5kbGViYXJzL2V4Y2VwdGlvbic7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL2hhbmRsZWJhcnMvdXRpbHMnO1xuaW1wb3J0ICogYXMgcnVudGltZSBmcm9tICcuL2hhbmRsZWJhcnMvcnVudGltZSc7XG5cbmltcG9ydCBub0NvbmZsaWN0IGZyb20gJy4vaGFuZGxlYmFycy9uby1jb25mbGljdCc7XG5cbi8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZVxuZnVuY3Rpb24gY3JlYXRlKCkge1xuICBsZXQgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTtcblxuICBVdGlscy5leHRlbmQoaGIsIGJhc2UpO1xuICBoYi5TYWZlU3RyaW5nID0gU2FmZVN0cmluZztcbiAgaGIuRXhjZXB0aW9uID0gRXhjZXB0aW9uO1xuICBoYi5VdGlscyA9IFV0aWxzO1xuICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjtcblxuICBoYi5WTSA9IHJ1bnRpbWU7XG4gIGhiLnRlbXBsYXRlID0gZnVuY3Rpb24oc3BlYykge1xuICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTtcbiAgfTtcblxuICByZXR1cm4gaGI7XG59XG5cbmxldCBpbnN0ID0gY3JlYXRlKCk7XG5pbnN0LmNyZWF0ZSA9IGNyZWF0ZTtcblxubm9Db25mbGljdChpbnN0KTtcblxuaW5zdFsnZGVmYXVsdCddID0gaW5zdDtcblxuZXhwb3J0IGRlZmF1bHQgaW5zdDtcbiIsImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4wLjExJztcbmV4cG9ydCBjb25zdCBDT01QSUxFUl9SRVZJU0lPTiA9IDc7XG5cbmV4cG9ydCBjb25zdCBSRVZJU0lPTl9DSEFOR0VTID0ge1xuICAxOiAnPD0gMS4wLnJjLjInLCAvLyAxLjAucmMuMiBpcyBhY3R1YWxseSByZXYyIGJ1dCBkb2Vzbid0IHJlcG9ydCBpdFxuICAyOiAnPT0gMS4wLjAtcmMuMycsXG4gIDM6ICc9PSAxLjAuMC1yYy40JyxcbiAgNDogJz09IDEueC54JyxcbiAgNTogJz09IDIuMC4wLWFscGhhLngnLFxuICA2OiAnPj0gMi4wLjAtYmV0YS4xJyxcbiAgNzogJz49IDQuMC4wJ1xufTtcblxuY29uc3Qgb2JqZWN0VHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG5leHBvcnQgZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7XG4gIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307XG4gIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTtcbiAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTtcblxuICByZWdpc3RlckRlZmF1bHRIZWxwZXJzKHRoaXMpO1xuICByZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzKHRoaXMpO1xufVxuXG5IYW5kbGViYXJzRW52aXJvbm1lbnQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogSGFuZGxlYmFyc0Vudmlyb25tZW50LFxuXG4gIGxvZ2dlcjogbG9nZ2VyLFxuICBsb2c6IGxvZ2dlci5sb2csXG5cbiAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsgfVxuICAgICAgZXh0ZW5kKHRoaXMuaGVscGVycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVscGVyc1tuYW1lXSA9IGZuO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLmhlbHBlcnNbbmFtZV07XG4gIH0sXG5cbiAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lLCBwYXJ0aWFsKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGBBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGEgcGFydGlhbCBjYWxsZWQgXCIke25hbWV9XCIgYXMgdW5kZWZpbmVkYCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcnRpYWxzW25hbWVdID0gcGFydGlhbDtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMucGFydGlhbHNbbmFtZV07XG4gIH0sXG5cbiAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGRlY29yYXRvcnMnKTsgfVxuICAgICAgZXh0ZW5kKHRoaXMuZGVjb3JhdG9ycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVjb3JhdG9yc1tuYW1lXSA9IGZuO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07XG4gIH1cbn07XG5cbmV4cG9ydCBsZXQgbG9nID0gbG9nZ2VyLmxvZztcblxuZXhwb3J0IHtjcmVhdGVGcmFtZSwgbG9nZ2VyfTtcbiIsImltcG9ydCByZWdpc3RlcklubGluZSBmcm9tICcuL2RlY29yYXRvcnMvaW5saW5lJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHtcbiAgcmVnaXN0ZXJJbmxpbmUoaW5zdGFuY2UpO1xufVxuXG4iLCJpbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckRlY29yYXRvcignaW5saW5lJywgZnVuY3Rpb24oZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgcmV0ID0gZm47XG4gICAgaWYgKCFwcm9wcy5wYXJ0aWFscykge1xuICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTtcbiAgICAgIHJldCA9IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhcnRpYWxzIHN0YWNrIGZyYW1lIHByaW9yIHRvIGV4ZWMuXG4gICAgICAgIGxldCBvcmlnaW5hbCA9IGNvbnRhaW5lci5wYXJ0aWFscztcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gZXh0ZW5kKHt9LCBvcmlnaW5hbCwgcHJvcHMucGFydGlhbHMpO1xuICAgICAgICBsZXQgcmV0ID0gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9yaWdpbmFsO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm9wcy5wYXJ0aWFsc1tvcHRpb25zLmFyZ3NbMF1dID0gb3B0aW9ucy5mbjtcblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuIiwiXG5jb25zdCBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTtcblxuZnVuY3Rpb24gRXhjZXB0aW9uKG1lc3NhZ2UsIG5vZGUpIHtcbiAgbGV0IGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MsXG4gICAgICBsaW5lLFxuICAgICAgY29sdW1uO1xuICBpZiAobG9jKSB7XG4gICAgbGluZSA9IGxvYy5zdGFydC5saW5lO1xuICAgIGNvbHVtbiA9IGxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjtcbiAgfVxuXG4gIGxldCB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay5cbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAobG9jKSB7XG4gICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lO1xuXG4gICAgICAvLyBXb3JrIGFyb3VuZCBpc3N1ZSB1bmRlciBzYWZhcmkgd2hlcmUgd2UgY2FuJ3QgZGlyZWN0bHkgc2V0IHRoZSBjb2x1bW4gdmFsdWVcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29sdW1uJywge1xuICAgICAgICAgIHZhbHVlOiBjb2x1bW4sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAobm9wKSB7XG4gICAgLyogSWdub3JlIGlmIHRoZSBicm93c2VyIGlzIHZlcnkgcGFydGljdWxhciAqL1xuICB9XG59XG5cbkV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcblxuZXhwb3J0IGRlZmF1bHQgRXhjZXB0aW9uO1xuIiwiaW1wb3J0IHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9ibG9jay1oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJFYWNoIGZyb20gJy4vaGVscGVycy9lYWNoJztcbmltcG9ydCByZWdpc3RlckhlbHBlck1pc3NpbmcgZnJvbSAnLi9oZWxwZXJzL2hlbHBlci1taXNzaW5nJztcbmltcG9ydCByZWdpc3RlcklmIGZyb20gJy4vaGVscGVycy9pZic7XG5pbXBvcnQgcmVnaXN0ZXJMb2cgZnJvbSAnLi9oZWxwZXJzL2xvZyc7XG5pbXBvcnQgcmVnaXN0ZXJMb29rdXAgZnJvbSAnLi9oZWxwZXJzL2xvb2t1cCc7XG5pbXBvcnQgcmVnaXN0ZXJXaXRoIGZyb20gJy4vaGVscGVycy93aXRoJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMoaW5zdGFuY2UpIHtcbiAgcmVnaXN0ZXJCbG9ja0hlbHBlck1pc3NpbmcoaW5zdGFuY2UpO1xuICByZWdpc3RlckVhY2goaW5zdGFuY2UpO1xuICByZWdpc3RlckhlbHBlck1pc3NpbmcoaW5zdGFuY2UpO1xuICByZWdpc3RlcklmKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb2coaW5zdGFuY2UpO1xuICByZWdpc3Rlckxvb2t1cChpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyV2l0aChpbnN0YW5jZSk7XG59XG4iLCJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBjcmVhdGVGcmFtZSwgaXNBcnJheX0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignYmxvY2tIZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgIGxldCBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLFxuICAgICAgICBmbiA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZuKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gZmFsc2UgfHwgY29udGV4dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzLmVhY2goY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICBsZXQgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMubmFtZSk7XG4gICAgICAgIG9wdGlvbnMgPSB7ZGF0YTogZGF0YX07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHthcHBlbmRDb250ZXh0UGF0aCwgYmxvY2tQYXJhbXMsIGNyZWF0ZUZyYW1lLCBpc0FycmF5LCBpc0Z1bmN0aW9ufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdlYWNoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignTXVzdCBwYXNzIGl0ZXJhdG9yIHRvICNlYWNoJyk7XG4gICAgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbixcbiAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIHJldCA9ICcnLFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb250ZXh0UGF0aDtcblxuICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhlY0l0ZXJhdGlvbihmaWVsZCwgaW5kZXgsIGxhc3QpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEua2V5ID0gZmllbGQ7XG4gICAgICAgIGRhdGEuaW5kZXggPSBpbmRleDtcbiAgICAgICAgZGF0YS5maXJzdCA9IGluZGV4ID09PSAwO1xuICAgICAgICBkYXRhLmxhc3QgPSAhIWxhc3Q7XG5cbiAgICAgICAgaWYgKGNvbnRleHRQYXRoKSB7XG4gICAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoICsgZmllbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zKFtjb250ZXh0W2ZpZWxkXSwgZmllbGRdLCBbY29udGV4dFBhdGggKyBmaWVsZCwgbnVsbF0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChpc0FycmF5KGNvbnRleHQpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBjb250ZXh0Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgIGlmIChpIGluIGNvbnRleHQpIHtcbiAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24oaSwgaSwgaSA9PT0gY29udGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwcmlvcktleTtcblxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS5cbiAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5O1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICByZXQgPSBpbnZlcnNlKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuIiwiaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKC8qIFthcmdzLCBdb3B0aW9ucyAqLykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBBIG1pc3NpbmcgZmllbGQgaW4gYSB7e2Zvb319IGNvbnN0cnVjdC5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNvbWVvbmUgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvIGNhbGwgc29tZXRoaW5nLCBibG93IHVwLlxuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignTWlzc2luZyBoZWxwZXI6IFwiJyArIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0ubmFtZSArICdcIicpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQge2lzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2lmJywgZnVuY3Rpb24oY29uZGl0aW9uYWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihjb25kaXRpb25hbCkpIHsgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbC5jYWxsKHRoaXMpOyB9XG5cbiAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuXG4gICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGVcbiAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLlxuICAgIGlmICgoIW9wdGlvbnMuaGFzaC5pbmNsdWRlWmVybyAmJiAhY29uZGl0aW9uYWwpIHx8IGlzRW1wdHkoY29uZGl0aW9uYWwpKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzWydpZiddLmNhbGwodGhpcywgY29uZGl0aW9uYWwsIHtmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2h9KTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24oLyogbWVzc2FnZSwgb3B0aW9ucyAqLykge1xuICAgIGxldCBhcmdzID0gW3VuZGVmaW5lZF0sXG4gICAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgbGV0IGxldmVsID0gMTtcbiAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHtcbiAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDtcbiAgICB9XG4gICAgYXJnc1swXSA9IGxldmVsO1xuXG4gICAgaW5zdGFuY2UubG9nKC4uLiBhcmdzKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9va3VwJywgZnVuY3Rpb24ob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIG1ldGhvZCA9ICdsb2cnO1xuICAgICAgfVxuICAgICAgY29uc29sZVttZXRob2RdKC4uLm1lc3NhZ2UpOyAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbGV0IHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdyxcbiAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAocm9vdC5IYW5kbGViYXJzID09PSBIYW5kbGViYXJzKSB7XG4gICAgICByb290LkhhbmRsZWJhcnMgPSAkSGFuZGxlYmFycztcbiAgICB9XG4gICAgcmV0dXJuIEhhbmRsZWJhcnM7XG4gIH07XG59XG4iLCJpbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9leGNlcHRpb24nO1xuaW1wb3J0IHsgQ09NUElMRVJfUkVWSVNJT04sIFJFVklTSU9OX0NIQU5HRVMsIGNyZWF0ZUZyYW1lIH0gZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7XG4gIGNvbnN0IGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8gJiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJyZW50UmV2aXNpb24pIHtcbiAgICBpZiAoY29tcGlsZXJSZXZpc2lvbiA8IGN1cnJlbnRSZXZpc2lvbikge1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICtcbiAgICAgICAgICAgICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXRcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMsIGVudikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWVudikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ05vIGVudmlyb25tZW50IHBhc3NlZCB0byB0ZW1wbGF0ZScpO1xuICB9XG4gIGlmICghdGVtcGxhdGVTcGVjIHx8ICF0ZW1wbGF0ZVNwZWMubWFpbikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICB0ZW1wbGF0ZVNwZWMubWFpbi5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWMubWFpbl9kO1xuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc3VlZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7XG4gICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgICBsZXQgcmVzdWx0ID0gZW52LlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gcmVzdWx0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5lc1tpXSA9IG9wdGlvbnMuaW5kZW50ICsgbGluZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgbGV0IGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uKG9iaiwgbmFtZSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBvYmopKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW25hbWVdO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbihkZXB0aHMsIG5hbWUpIHtcbiAgICAgIGNvbnN0IGxlbiA9IGRlcHRocy5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBsYW1iZGE6IGZ1bmN0aW9uKGN1cnJlbnQsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJyA/IGN1cnJlbnQuY2FsbChjb250ZXh0KSA6IGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sXG4gICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsXG5cbiAgICBmbjogZnVuY3Rpb24oaSkge1xuICAgICAgbGV0IHJldCA9IHRlbXBsYXRlU3BlY1tpXTtcbiAgICAgIHJldC5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWNbaSArICdfZCddO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuXG4gICAgcHJvZ3JhbXM6IFtdLFxuICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICAgIGxldCBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sXG4gICAgICAgICAgZm4gPSB0aGlzLmZuKGkpO1xuICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikge1xuICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7XG4gICAgfSxcblxuICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2U6IGZ1bmN0aW9uKHBhcmFtLCBjb21tb24pIHtcbiAgICAgIGxldCBvYmogPSBwYXJhbSB8fCBjb21tb247XG5cbiAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgKHBhcmFtICE9PSBjb21tb24pKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLmV4dGVuZCh7fSwgY29tbW9uLCBwYXJhbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICAvLyBBbiBlbXB0eSBvYmplY3QgdG8gdXNlIGFzIHJlcGxhY2VtZW50IGZvciBudWxsLWNvbnRleHRzXG4gICAgbnVsbENvbnRleHQ6IE9iamVjdC5zZWFsKHt9KSxcblxuICAgIG5vb3A6IGVudi5WTS5ub29wLFxuICAgIGNvbXBpbGVySW5mbzogdGVtcGxhdGVTcGVjLmNvbXBpbGVyXG4gIH07XG5cbiAgZnVuY3Rpb24gcmV0KGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgcmV0Ll9zZXR1cChvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCAmJiB0ZW1wbGF0ZVNwZWMudXNlRGF0YSkge1xuICAgICAgZGF0YSA9IGluaXREYXRhKGNvbnRleHQsIGRhdGEpO1xuICAgIH1cbiAgICBsZXQgZGVwdGhzLFxuICAgICAgICBibG9ja1BhcmFtcyA9IHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzKSB7XG4gICAgICBpZiAob3B0aW9ucy5kZXB0aHMpIHtcbiAgICAgICAgZGVwdGhzID0gY29udGV4dCAhPSBvcHRpb25zLmRlcHRoc1swXSA/IFtjb250ZXh0XS5jb25jYXQob3B0aW9ucy5kZXB0aHMpIDogb3B0aW9ucy5kZXB0aHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXB0aHMgPSBbY29udGV4dF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFpbihjb250ZXh0LyosIG9wdGlvbnMqLykge1xuICAgICAgcmV0dXJuICcnICsgdGVtcGxhdGVTcGVjLm1haW4oY29udGFpbmVyLCBjb250ZXh0LCBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICB9XG4gICAgbWFpbiA9IGV4ZWN1dGVEZWNvcmF0b3JzKHRlbXBsYXRlU3BlYy5tYWluLCBtYWluLCBjb250YWluZXIsIG9wdGlvbnMuZGVwdGhzIHx8IFtdLCBkYXRhLCBibG9ja1BhcmFtcyk7XG4gICAgcmV0dXJuIG1haW4oY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmhlbHBlcnMsIGVudi5oZWxwZXJzKTtcblxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLnBhcnRpYWxzLCBlbnYucGFydGlhbHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsIHx8IHRlbXBsYXRlU3BlYy51c2VEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuZGVjb3JhdG9ycywgZW52LmRlY29yYXRvcnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IG9wdGlvbnMuZGVjb3JhdG9ycztcbiAgICB9XG4gIH07XG5cbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zICYmICFibG9ja1BhcmFtcykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIHRlbXBsYXRlU3BlY1tpXSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGN1cnJlbnREZXB0aHMgPSBkZXB0aHM7XG4gICAgaWYgKGRlcHRocyAmJiBjb250ZXh0ICE9IGRlcHRoc1swXSAmJiAhKGNvbnRleHQgPT09IGNvbnRhaW5lci5udWxsQ29udGV4dCAmJiBkZXB0aHNbMF0gPT09IG51bGwpKSB7XG4gICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpO1xuICAgIH1cblxuICAgIHJldHVybiBmbihjb250YWluZXIsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsXG4gICAgICAgIG9wdGlvbnMuZGF0YSB8fCBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtcyAmJiBbb3B0aW9ucy5ibG9ja1BhcmFtc10uY29uY2F0KGJsb2NrUGFyYW1zKSxcbiAgICAgICAgY3VycmVudERlcHRocyk7XG4gIH1cblxuICBwcm9nID0gZXhlY3V0ZURlY29yYXRvcnMoZm4sIHByb2csIGNvbnRhaW5lciwgZGVwdGhzLCBkYXRhLCBibG9ja1BhcmFtcyk7XG5cbiAgcHJvZy5wcm9ncmFtID0gaTtcbiAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwO1xuICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwO1xuICByZXR1cm4gcHJvZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ0BwYXJ0aWFsLWJsb2NrJykge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICghcGFydGlhbC5jYWxsICYmICFvcHRpb25zLm5hbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBwYXJ0aWFsIHRoYXQgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICBvcHRpb25zLm5hbWUgPSBwYXJ0aWFsO1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW3BhcnRpYWxdO1xuICB9XG4gIHJldHVybiBwYXJ0aWFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIC8vIFVzZSB0aGUgY3VycmVudCBjbG9zdXJlIGNvbnRleHQgdG8gc2F2ZSB0aGUgcGFydGlhbC1ibG9jayBpZiB0aGlzIHBhcnRpYWxcbiAgY29uc3QgY3VycmVudFBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgbGV0IHBhcnRpYWxCbG9jaztcbiAgaWYgKG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gbm9vcCkge1xuICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0byBnZXQgYWNjZXNzIHRvIGN1cnJlbnRQYXJ0aWFsQmxvY2sgZnJvbSB0aGUgY2xvc3VyZVxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm47XG4gICAgcGFydGlhbEJsb2NrID0gb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBmdW5jdGlvbiBwYXJ0aWFsQmxvY2tXcmFwcGVyKGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuXG4gICAgICAvLyBSZXN0b3JlIHRoZSBwYXJ0aWFsLWJsb2NrIGZyb20gdGhlIGNsb3N1cmUgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICAvLyBpLmUuIHRoZSBwYXJ0IGluc2lkZSB0aGUgYmxvY2sgb2YgdGhlIHBhcnRpYWwgY2FsbC5cbiAgICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IGN1cnJlbnRQYXJ0aWFsQmxvY2s7XG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBpZiAoZm4ucGFydGlhbHMpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIGZuLnBhcnRpYWxzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykge1xuICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7XG4gIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7IHJldHVybiAnJzsgfVxuXG5mdW5jdGlvbiBpbml0RGF0YShjb250ZXh0LCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhKCdyb290JyBpbiBkYXRhKSkge1xuICAgIGRhdGEgPSBkYXRhID8gY3JlYXRlRnJhbWUoZGF0YSkgOiB7fTtcbiAgICBkYXRhLnJvb3QgPSBjb250ZXh0O1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7XG4gIGlmIChmbi5kZWNvcmF0b3IpIHtcbiAgICBsZXQgcHJvcHMgPSB7fTtcbiAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iLCIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiIsImNvbnN0IGVzY2FwZSA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnLFxuICBcIidcIjogJyYjeDI3OycsXG4gICdgJzogJyYjeDYwOycsXG4gICc9JzogJyYjeDNEOydcbn07XG5cbmNvbnN0IGJhZENoYXJzID0gL1smPD5cIidgPV0vZyxcbiAgICAgIHBvc3NpYmxlID0gL1smPD5cIidgPV0vO1xuXG5mdW5jdGlvbiBlc2NhcGVDaGFyKGNocikge1xuICByZXR1cm4gZXNjYXBlW2Nocl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQob2JqLyogLCAuLi5zb3VyY2UgKi8pIHtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gYXJndW1lbnRzW2ldKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3VtZW50c1tpXSwga2V5KSkge1xuICAgICAgICBvYmpba2V5XSA9IGFyZ3VtZW50c1tpXVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBsZXQgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vLyBTb3VyY2VkIGZyb20gbG9kYXNoXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0XG4vKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5sZXQgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59O1xuLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKGlzRnVuY3Rpb24oL3gvKSkge1xuICBpc0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICB9O1xufVxuZXhwb3J0IHtpc0Z1bmN0aW9ufTtcbi8qIGVzbGludC1lbmFibGUgZnVuYy1zdHlsZSAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgPyB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJyA6IGZhbHNlO1xufTtcblxuLy8gT2xkZXIgSUUgdmVyc2lvbnMgZG8gbm90IGRpcmVjdGx5IHN1cHBvcnQgaW5kZXhPZiBzbyB3ZSBtdXN0IGltcGxlbWVudCBvdXIgb3duLCBzYWRseS5cbmV4cG9ydCBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoYXJyYXlbaV0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVFeHByZXNzaW9uKHN0cmluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBlc2NhcGUgU2FmZVN0cmluZ3MsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBzYWZlXG4gICAgaWYgKHN0cmluZyAmJiBzdHJpbmcudG9IVE1MKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLnRvSFRNTCgpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2UgaWYgKCFzdHJpbmcpIHtcbiAgICAgIHJldHVybiBzdHJpbmcgKyAnJztcbiAgICB9XG5cbiAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmRcbiAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWZcbiAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC5cbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZztcbiAgfVxuXG4gIGlmICghcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJpbmc7IH1cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGJhZENoYXJzLCBlc2NhcGVDaGFyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7XG4gIGxldCBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTtcbiAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDtcbiAgcmV0dXJuIGZyYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tQYXJhbXMocGFyYW1zLCBpZHMpIHtcbiAgcGFyYW1zLnBhdGggPSBpZHM7XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRDb250ZXh0UGF0aChjb250ZXh0UGF0aCwgaWQpIHtcbiAgcmV0dXJuIChjb250ZXh0UGF0aCA/IGNvbnRleHRQYXRoICsgJy4nIDogJycpICsgaWQ7XG59XG4iLCIvLyBDcmVhdGUgYSBzaW1wbGUgcGF0aCBhbGlhcyB0byBhbGxvdyBicm93c2VyaWZ5IHRvIHJlc29sdmVcbi8vIHRoZSBydW50aW1lIG9uIGEgc3VwcG9ydGVkIHBhdGguXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGlzdC9janMvaGFuZGxlYmFycy5ydW50aW1lJylbJ2RlZmF1bHQnXTtcbiIsIid1c2Ugc3RyaWN0JztcbmlmICghQXJyYXkucHJvdG90eXBlLmZpbmQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnZmluZCcsIHtcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbnVsbCBvciBub3QgZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb2JqID0gT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGggPj4+IDA7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcblxuICAgICAgICAgICAgdmFyIGluZGV4ID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlWYWx1ZSA9IG9ialtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIGlWYWx1ZSwgaW5kZXgsIG9iaikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pO1xufSIsIi8vISBtb21lbnQuanNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgZ2xvYmFsLm1vbWVudCA9IGZhY3RvcnkoKVxufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgaG9va0NhbGxiYWNrO1xuXG4gICAgZnVuY3Rpb24gaG9va3MgKCkge1xuICAgICAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbiAgICAvLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICBmdW5jdGlvbiBzZXRIb29rQ2FsbGJhY2sgKGNhbGxiYWNrKSB7XG4gICAgICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgICAgICAvLyBJRTggd2lsbCB0cmVhdCB1bmRlZmluZWQgYW5kIG51bGwgYXMgb2JqZWN0IGlmIGl0IHdhc24ndCBmb3JcbiAgICAgICAgLy8gaW5wdXQgIT0gbnVsbFxuICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggPT09IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXMucHVzaChmbihhcnJbaV0sIGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZChhLCBiKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gYikge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoYiwgaSkpIHtcbiAgICAgICAgICAgICAgICBhW2ldID0gYltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd0b1N0cmluZycpKSB7XG4gICAgICAgICAgICBhLnRvU3RyaW5nID0gYi50b1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd2YWx1ZU9mJykpIHtcbiAgICAgICAgICAgIGEudmFsdWVPZiA9IGIudmFsdWVPZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtcHR5ICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgdW51c2VkVG9rZW5zICAgIDogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dCAgICAgOiBbXSxcbiAgICAgICAgICAgIG92ZXJmbG93ICAgICAgICA6IC0yLFxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlciAgIDogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dCAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoICAgIDogbnVsbCxcbiAgICAgICAgICAgIGludmFsaWRGb3JtYXQgICA6IGZhbHNlLFxuICAgICAgICAgICAgdXNlckludmFsaWRhdGVkIDogZmFsc2UsXG4gICAgICAgICAgICBpc28gICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlZERhdGVQYXJ0cyA6IFtdLFxuICAgICAgICAgICAgbWVyaWRpZW0gICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHJmYzI4MjIgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgd2Vla2RheU1pc21hdGNoIDogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgICAgICBpZiAobS5fcGYgPT0gbnVsbCkge1xuICAgICAgICAgICAgbS5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX3BmO1xuICAgIH1cblxuICAgIHZhciBzb21lO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuc29tZSkge1xuICAgICAgICBzb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc29tZSA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gdCAmJiBmdW4uY2FsbCh0aGlzLCB0W2ldLCBpLCB0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcbiAgICAgICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pO1xuICAgICAgICAgICAgdmFyIHBhcnNlZFBhcnRzID0gc29tZS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAhPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaXNOb3dWYWxpZCA9ICFpc05hTihtLl9kLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgICAgICBmbGFncy5vdmVyZmxvdyA8IDAgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuZW1wdHkgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRXZWVrZGF5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLndlZWtkYXlNaXNtYXRjaCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5udWxsSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy51c2VySW52YWxpZGF0ZWQgJiZcbiAgICAgICAgICAgICAgICAoIWZsYWdzLm1lcmlkaWVtIHx8IChmbGFncy5tZXJpZGllbSAmJiBwYXJzZWRQYXJ0cykpO1xuXG4gICAgICAgICAgICBpZiAobS5fc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgaXNOb3dWYWxpZCA9IGlzTm93VmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY2hhcnNMZWZ0T3ZlciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy51bnVzZWRUb2tlbnMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmJpZ0hvdXIgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbiA9PSBudWxsIHx8ICFPYmplY3QuaXNGcm96ZW4obSkpIHtcbiAgICAgICAgICAgICAgICBtLl9pc1ZhbGlkID0gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc05vd1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQgKGZsYWdzKSB7XG4gICAgICAgIHZhciBtID0gY3JlYXRlVVRDKE5hTik7XG4gICAgICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHRlbmQoZ2V0UGFyc2luZ0ZsYWdzKG0pLCBmbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIFBsdWdpbnMgdGhhdCBhZGQgcHJvcGVydGllcyBzaG91bGQgYWxzbyBhZGQgdGhlIGtleSBoZXJlIChudWxsIHZhbHVlKSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxuICAgIHZhciBtb21lbnRQcm9wZXJ0aWVzID0gaG9va3MubW9tZW50UHJvcGVydGllcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gY29weUNvbmZpZyh0bywgZnJvbSkge1xuICAgICAgICB2YXIgaSwgcHJvcCwgdmFsO1xuXG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faXNBTW9tZW50T2JqZWN0KSkge1xuICAgICAgICAgICAgdG8uX2lzQU1vbWVudE9iamVjdCA9IGZyb20uX2lzQU1vbWVudE9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2kpKSB7XG4gICAgICAgICAgICB0by5faSA9IGZyb20uX2k7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9mKSkge1xuICAgICAgICAgICAgdG8uX2YgPSBmcm9tLl9mO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbCkpIHtcbiAgICAgICAgICAgIHRvLl9sID0gZnJvbS5fbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3N0cmljdCkpIHtcbiAgICAgICAgICAgIHRvLl9zdHJpY3QgPSBmcm9tLl9zdHJpY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl90em0pKSB7XG4gICAgICAgICAgICB0by5fdHptID0gZnJvbS5fdHptO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faXNVVEMpKSB7XG4gICAgICAgICAgICB0by5faXNVVEMgPSBmcm9tLl9pc1VUQztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX29mZnNldCkpIHtcbiAgICAgICAgICAgIHRvLl9vZmZzZXQgPSBmcm9tLl9vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9wZikpIHtcbiAgICAgICAgICAgIHRvLl9wZiA9IGdldFBhcnNpbmdGbGFncyhmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2xvY2FsZSkpIHtcbiAgICAgICAgICAgIHRvLl9sb2NhbGUgPSBmcm9tLl9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9tZW50UHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbW9tZW50UHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhbCA9IGZyb21bcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG5cbiAgICB2YXIgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgLy8gTW9tZW50IHByb3RvdHlwZSBvYmplY3RcbiAgICBmdW5jdGlvbiBNb21lbnQoY29uZmlnKSB7XG4gICAgICAgIGNvcHlDb25maWcodGhpcywgY29uZmlnKTtcbiAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5fZCAhPSBudWxsID8gY29uZmlnLl9kLmdldFRpbWUoKSA6IE5hTik7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHVwZGF0ZU9mZnNldCBjcmVhdGVzIG5ldyBtb21lbnRcbiAgICAgICAgLy8gb2JqZWN0cy5cbiAgICAgICAgaWYgKHVwZGF0ZUluUHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTW9tZW50IChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE1vbWVudCB8fCAob2JqICE9IG51bGwgJiYgb2JqLl9pc0FNb21lbnRPYmplY3QgIT0gbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzRmxvb3IgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgLy8gLTAgLT4gMFxuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpIHx8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgICAgICB2YXIgY29lcmNlZE51bWJlciA9ICthcmd1bWVudEZvckNvZXJjaW9uLFxuICAgICAgICAgICAgdmFsdWUgPSAwO1xuXG4gICAgICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGFic0Zsb29yKGNvZXJjZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIGNvbXBhcmUgdHdvIGFycmF5cywgcmV0dXJuIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXNcbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBsZW5ndGhEaWZmID0gTWF0aC5hYnMoYXJyYXkxLmxlbmd0aCAtIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgICAgICghZG9udENvbnZlcnQgJiYgdG9JbnQoYXJyYXkxW2ldKSAhPT0gdG9JbnQoYXJyYXkyW2ldKSkpIHtcbiAgICAgICAgICAgICAgICBkaWZmcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWZmcyArIGxlbmd0aERpZmY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIGNvbnNvbGUgIT09ICAndW5kZWZpbmVkJykgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RlcHJlY2F0aW9uIHdhcm5pbmc6ICcgKyBtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlKG1zZywgZm4pIHtcbiAgICAgICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCwgbXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBhcmc7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9ICdcXG5bJyArIGkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1swXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKDAsIC0yKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGFuZCBzcGFjZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YXJuKG1zZyArICdcXG5Bcmd1bWVudHM6ICcgKyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKS5qb2luKCcnKSArICdcXG4nICsgKG5ldyBFcnJvcigpKS5zdGFjayk7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgZm4pO1xuICAgIH1cblxuICAgIHZhciBkZXByZWNhdGlvbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobmFtZSwgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0IChjb25maWcpIHtcbiAgICAgICAgdmFyIHByb3AsIGk7XG4gICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIHByb3AgPSBjb25maWdbaV07XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAvLyBudW1iZXIgKyAocG9zc2libHkpIHN0dWZmIGNvbWluZyBmcm9tIF9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICh0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLnNvdXJjZSB8fCB0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKSArXG4gICAgICAgICAgICAgICAgJ3wnICsgKC9cXGR7MSwyfS8pLnNvdXJjZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY2hpbGRDb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IGV4dGVuZCh7fSwgcGFyZW50Q29uZmlnKSwgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIHBhcmVudENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkQ29uZmlnW3Byb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gY2hpbGRDb25maWdbcHJvcF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChwcm9wIGluIHBhcmVudENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBleHRlbmQoe30sIHJlc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgdmFyIGksIHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdENhbGVuZGFyID0ge1xuICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICBuZXh0RGF5IDogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgbGFzdFdlZWsgOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyIChrZXksIG1vbSwgbm93KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhcltrZXldIHx8IHRoaXMuX2NhbGVuZGFyWydzYW1lRWxzZSddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvdXRwdXQpID8gb3V0cHV0LmNhbGwobW9tLCBub3cpIDogb3V0cHV0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgICAgIExUUyAgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgTFQgICA6ICdoOm1tIEEnLFxuICAgICAgICBMICAgIDogJ01NL0REL1lZWVknLFxuICAgICAgICBMTCAgIDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgIExMTCAgOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIExMTEwgOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSdcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9uZ0RhdGVGb3JtYXQgKGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgICAgIGZvcm1hdFVwcGVyID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChmb3JtYXQgfHwgIWZvcm1hdFVwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IGZvcm1hdFVwcGVyLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnNsaWNlKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdEludmFsaWREYXRlID0gJ0ludmFsaWQgZGF0ZSc7XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkRGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE9yZGluYWwgPSAnJWQnO1xuICAgIHZhciBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSA9IC9cXGR7MSwyfS87XG5cbiAgICBmdW5jdGlvbiBvcmRpbmFsIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZSgnJWQnLCBudW1iZXIpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UmVsYXRpdmVUaW1lID0ge1xuICAgICAgICBmdXR1cmUgOiAnaW4gJXMnLFxuICAgICAgICBwYXN0ICAgOiAnJXMgYWdvJyxcbiAgICAgICAgcyAgOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgIHNzIDogJyVkIHNlY29uZHMnLFxuICAgICAgICBtICA6ICdhIG1pbnV0ZScsXG4gICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICBoICA6ICdhbiBob3VyJyxcbiAgICAgICAgaGggOiAnJWQgaG91cnMnLFxuICAgICAgICBkICA6ICdhIGRheScsXG4gICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICBNICA6ICdhIG1vbnRoJyxcbiAgICAgICAgTU0gOiAnJWQgbW9udGhzJyxcbiAgICAgICAgeSAgOiAnYSB5ZWFyJyxcbiAgICAgICAgeXkgOiAnJWQgeWVhcnMnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZSAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbc3RyaW5nXTtcbiAgICAgICAgcmV0dXJuIChpc0Z1bmN0aW9uKG91dHB1dCkpID9cbiAgICAgICAgICAgIG91dHB1dChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIDpcbiAgICAgICAgICAgIG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhc3RGdXR1cmUgKGRpZmYsIG91dHB1dCkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW2RpZmYgPiAwID8gJ2Z1dHVyZScgOiAncGFzdCddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihmb3JtYXQpID8gZm9ybWF0KG91dHB1dCkgOiBmb3JtYXQucmVwbGFjZSgvJXMvaSwgb3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWxpYXNlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkVW5pdEFsaWFzICh1bml0LCBzaG9ydGhhbmQpIHtcbiAgICAgICAgdmFyIGxvd2VyQ2FzZSA9IHVuaXQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYWxpYXNlc1tsb3dlckNhc2VdID0gYWxpYXNlc1tsb3dlckNhc2UgKyAncyddID0gYWxpYXNlc1tzaG9ydGhhbmRdID0gdW5pdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJyA/IGFsaWFzZXNbdW5pdHNdIHx8IGFsaWFzZXNbdW5pdHMudG9Mb3dlckNhc2UoKV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AsXG4gICAgICAgICAgICBwcm9wO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoaW5wdXRPYmplY3QsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG4gICAgfVxuXG4gICAgdmFyIHByaW9yaXRpZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRQcmlvcml0eSh1bml0LCBwcmlvcml0eSkge1xuICAgICAgICBwcmlvcml0aWVzW3VuaXRdID0gcHJpb3JpdHk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0c09iaikge1xuICAgICAgICB2YXIgdW5pdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgdSBpbiB1bml0c09iaikge1xuICAgICAgICAgICAgdW5pdHMucHVzaCh7dW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV19KTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5pdHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgemVyb3NUb0ZpbGwgPSB0YXJnZXRMZW5ndGggLSBhYnNOdW1iZXIubGVuZ3RoLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgICAgICByZXR1cm4gKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgICAgICBNYXRoLnBvdygxMCwgTWF0aC5tYXgoMCwgemVyb3NUb0ZpbGwpKS50b1N0cmluZygpLnN1YnN0cigxKSArIGFic051bWJlcjtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98WVlZWVlZfFlZWVlZfFlZWVl8WVl8Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2c7XG5cbiAgICB2YXIgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZztcblxuICAgIHZhciBmb3JtYXRGdW5jdGlvbnMgPSB7fTtcblxuICAgIHZhciBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgLy8gdG9rZW46ICAgICdNJ1xuICAgIC8vIHBhZGRlZDogICBbJ01NJywgMl1cbiAgICAvLyBvcmRpbmFsOiAgJ01vJ1xuICAgIC8vIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7IHRoaXMubW9udGgoKSArIDEgfVxuICAgIGZ1bmN0aW9uIGFkZEZvcm1hdFRva2VuICh0b2tlbiwgcGFkZGVkLCBvcmRpbmFsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tjYWxsYmFja10oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWRkZWQpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3BhZGRlZFswXV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9GaWxsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgcGFkZGVkWzFdLCBwYWRkZWRbMl0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkaW5hbCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbb3JkaW5hbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0b2tlbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIHZhciBhcnJheSA9IGZvcm1hdC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSwgaSwgbGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9ICcnLCBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGlzRnVuY3Rpb24oYXJyYXlbaV0pID8gYXJyYXlbaV0uY2FsbChtb20sIGZvcm1hdCkgOiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IGRhdGUgdXNpbmcgbmF0aXZlIGRhdGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gZm9ybWF0TW9tZW50KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGV4cGFuZEZvcm1hdChmb3JtYXQsIG0ubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPSBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSB8fCBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcblxuICAgICAgICByZXR1cm4gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0obSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBpID0gNTtcblxuICAgICAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoaW5wdXQpIHx8IGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChpID49IDAgJiYgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UobG9jYWxGb3JtYXR0aW5nVG9rZW5zLCByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMpO1xuICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICBpIC09IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHZhciBtYXRjaDEgICAgICAgICA9IC9cXGQvOyAgICAgICAgICAgIC8vICAgICAgIDAgLSA5XG4gICAgdmFyIG1hdGNoMiAgICAgICAgID0gL1xcZFxcZC87ICAgICAgICAgIC8vICAgICAgMDAgLSA5OVxuICAgIHZhciBtYXRjaDMgICAgICAgICA9IC9cXGR7M30vOyAgICAgICAgIC8vICAgICAwMDAgLSA5OTlcbiAgICB2YXIgbWF0Y2g0ICAgICAgICAgPSAvXFxkezR9LzsgICAgICAgICAvLyAgICAwMDAwIC0gOTk5OVxuICAgIHZhciBtYXRjaDYgICAgICAgICA9IC9bKy1dP1xcZHs2fS87ICAgIC8vIC05OTk5OTkgLSA5OTk5OTlcbiAgICB2YXIgbWF0Y2gxdG8yICAgICAgPSAvXFxkXFxkPy87ICAgICAgICAgLy8gICAgICAgMCAtIDk5XG4gICAgdmFyIG1hdGNoM3RvNCAgICAgID0gL1xcZFxcZFxcZFxcZD8vOyAgICAgLy8gICAgIDk5OSAtIDk5OTlcbiAgICB2YXIgbWF0Y2g1dG82ICAgICAgPSAvXFxkXFxkXFxkXFxkXFxkXFxkPy87IC8vICAgOTk5OTkgLSA5OTk5OTlcbiAgICB2YXIgbWF0Y2gxdG8zICAgICAgPSAvXFxkezEsM30vOyAgICAgICAvLyAgICAgICAwIC0gOTk5XG4gICAgdmFyIG1hdGNoMXRvNCAgICAgID0gL1xcZHsxLDR9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2gxdG82ICAgICAgPSAvWystXT9cXGR7MSw2fS87ICAvLyAtOTk5OTk5IC0gOTk5OTk5XG5cbiAgICB2YXIgbWF0Y2hVbnNpZ25lZCAgPSAvXFxkKy87ICAgICAgICAgICAvLyAgICAgICAwIC0gaW5mXG4gICAgdmFyIG1hdGNoU2lnbmVkICAgID0gL1srLV0/XFxkKy87ICAgICAgLy8gICAgLWluZiAtIGluZlxuXG4gICAgdmFyIG1hdGNoT2Zmc2V0ICAgID0gL1p8WystXVxcZFxcZDo/XFxkXFxkL2dpOyAvLyArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICB2YXIgbWF0Y2hTaG9ydE9mZnNldCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/L2dpOyAvLyArMDAgLTAwICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuXG4gICAgdmFyIG1hdGNoVGltZXN0YW1wID0gL1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/LzsgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcblxuICAgIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuICAgIC8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbiAgICB2YXIgbWF0Y2hXb3JkID0gL1swLTldezAsMjU2fVsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRjA3XFx1RkYxMC1cXHVGRkVGXXsxLDI1Nn18W1xcdTA2MDAtXFx1MDZGRlxcL117MSwyNTZ9KFxccyo/W1xcdTA2MDAtXFx1MDZGRl17MSwyNTZ9KXsxLDJ9L2k7XG5cbiAgICB2YXIgcmVnZXhlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUmVnZXhUb2tlbiAodG9rZW4sIHJlZ2V4LCBzdHJpY3RSZWdleCkge1xuICAgICAgICByZWdleGVzW3Rva2VuXSA9IGlzRnVuY3Rpb24ocmVnZXgpID8gcmVnZXggOiBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZURhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiAoaXNTdHJpY3QgJiYgc3RyaWN0UmVnZXgpID8gc3RyaWN0UmVnZXggOiByZWdleDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4gKHRva2VuLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHJlZ2V4ZXMsIHRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodW5lc2NhcGVGb3JtYXQodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWdleGVzW3Rva2VuXShjb25maWcuX3N0cmljdCwgY29uZmlnLl9sb2NhbGUpO1xuICAgIH1cblxuICAgIC8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbiAgICBmdW5jdGlvbiB1bmVzY2FwZUZvcm1hdChzKSB7XG4gICAgICAgIHJldHVybiByZWdleEVzY2FwZShzLnJlcGxhY2UoJ1xcXFwnLCAnJykucmVwbGFjZSgvXFxcXChcXFspfFxcXFwoXFxdKXxcXFsoW15cXF1cXFtdKilcXF18XFxcXCguKS9nLCBmdW5jdGlvbiAobWF0Y2hlZCwgcDEsIHAyLCBwMywgcDQpIHtcbiAgICAgICAgICAgIHJldHVybiBwMSB8fCBwMiB8fCBwMyB8fCBwNDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4gICAgfVxuXG4gICAgdmFyIHRva2VucyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUGFyc2VUb2tlbiAodG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBpLCBmdW5jID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0b2tlbiA9IFt0b2tlbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTnVtYmVyKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtjYWxsYmFja10gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuW2ldXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrUGFyc2VUb2tlbiAodG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0LCBjb25maWcuX3csIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBoYXNPd25Qcm9wKHRva2VucywgdG9rZW4pKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5dKGlucHV0LCBjb25maWcuX2EsIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFlFQVIgPSAwO1xuICAgIHZhciBNT05USCA9IDE7XG4gICAgdmFyIERBVEUgPSAyO1xuICAgIHZhciBIT1VSID0gMztcbiAgICB2YXIgTUlOVVRFID0gNDtcbiAgICB2YXIgU0VDT05EID0gNTtcbiAgICB2YXIgTUlMTElTRUNPTkQgPSA2O1xuICAgIHZhciBXRUVLID0gNztcbiAgICB2YXIgV0VFS0RBWSA9IDg7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnllYXIoKTtcbiAgICAgICAgcmV0dXJuIHkgPD0gOTk5OSA/ICcnICsgeSA6ICcrJyArIHk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZJywgICA0XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZJywgIDVdLCAgICAgICAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3llYXInLCAneScpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd5ZWFyJywgMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdZJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVknLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVknLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZWScsICBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ1lZWVlZJywgJ1lZWVlZWSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IGlucHV0Lmxlbmd0aCA9PT0gMiA/IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KSA6IHRvSW50KGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBwYXJzZUludChpbnB1dCwgMTApO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApIHx8IHllYXIgJSA0MDAgPT09IDA7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG4gICAgfTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGdldElzTGVhcFllYXIgKCkge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldFNldCAodW5pdCwga2VlcFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZXQkMSh0aGlzLCB1bml0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIGtlZXBUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQgKG1vbSwgdW5pdCkge1xuICAgICAgICByZXR1cm4gbW9tLmlzVmFsaWQoKSA/XG4gICAgICAgICAgICBtb20uX2RbJ2dldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0oKSA6IE5hTjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQkMSAobW9tLCB1bml0LCB2YWx1ZSkge1xuICAgICAgICBpZiAobW9tLmlzVmFsaWQoKSAmJiAhaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodW5pdCA9PT0gJ0Z1bGxZZWFyJyAmJiBpc0xlYXBZZWFyKG1vbS55ZWFyKCkpICYmIG1vbS5tb250aCgpID09PSAxICYmIG1vbS5kYXRlKCkgPT09IDI5KSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlLCBtb20ubW9udGgoKSwgZGF5c0luTW9udGgodmFsdWUsIG1vbS5tb250aCgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc3RyaW5nR2V0ICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1NldCAodW5pdHMsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIHZhciBwcmlvcml0aXplZCA9IGdldFByaW9yaXRpemVkVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmlvcml0aXplZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXNbcHJpb3JpdGl6ZWRbaV0udW5pdF0odW5pdHNbcHJpb3JpdGl6ZWRbaV0udW5pdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vZChuLCB4KSB7XG4gICAgICAgIHJldHVybiAoKG4gJSB4KSArIHgpICUgeDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXhPZjtcblxuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgICAgICBpbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXhPZiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAvLyBJIGtub3dcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1tpXSA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kTW9udGggPSBtb2QobW9udGgsIDEyKTtcbiAgICAgICAgeWVhciArPSAobW9udGggLSBtb2RNb250aCkgLyAxMjtcbiAgICAgICAgcmV0dXJuIG1vZE1vbnRoID09PSAxID8gKGlzTGVhcFllYXIoeWVhcikgPyAyOSA6IDI4KSA6ICgzMSAtIG1vZE1vbnRoICUgNyAlIDIpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNJywgWydNTScsIDJdLCAnTW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtb250aCcsICdNJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtb250aCcsIDgpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignTScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU0nLCAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU0nLCAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTScsICdNTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9IHRvSW50KGlucHV0KSAtIDE7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTU1NJywgJ01NTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbW9udGggPSBjb25maWcuX2xvY2FsZS5tb250aHNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXG4gICAgICAgIGlmIChtb250aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhcnJheVtNT05USF0gPSBtb250aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRNb250aCA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICB2YXIgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LztcbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRocyA9ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyAobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKSA/IHRoaXMuX21vbnRocyA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzWydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKSA/IHRoaXMuX21vbnRoc1ttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1sodGhpcy5fbW9udGhzLmlzRm9ybWF0IHx8IE1PTlRIU19JTl9GT1JNQVQpLnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQgPSAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzU2hvcnQgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KSA/IHRoaXMuX21vbnRoc1Nob3J0IDpcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFsnc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KSA/IHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV0gOlxuICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbTU9OVEhTX0lOX0ZPUk1BVC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBpaSwgbW9tLCBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1BhcnNlIChtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCBtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXJcbiAgICAgICAgLy8gc2VlIHNvcnRpbmcgaW4gY29tcHV0ZU1vbnRoc1BhcnNlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc3RyaWN0ICYmICF0aGlzLl9tb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykgKyAnfF4nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ01NTU0nICYmIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ01NTScgJiYgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl9tb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHNldE1vbnRoIChtb20sIHZhbHVlKSB7XG4gICAgICAgIHZhciBkYXlPZk1vbnRoO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybiBtb207XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKC9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogQW5vdGhlciBzaWxlbnQgZmFpbHVyZT9cbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRheU9mTW9udGggPSBNYXRoLm1pbihtb20uZGF0ZSgpLCBkYXlzSW5Nb250aChtb20ueWVhcigpLCB2YWx1ZSkpO1xuICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgJ01vbnRoJ10odmFsdWUsIGRheU9mTW9udGgpO1xuICAgICAgICByZXR1cm4gbW9tO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldE1vbnRoICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0TW9udGgodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsICdNb250aCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF5c0luTW9udGggKCkge1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIG1vbnRoc1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFJlZ2V4ID0gZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE1vbnRoc1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIG1vbnRoc1JlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4IDogdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlTW9udGhzUGFyc2UgKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvcnRQaWVjZXMgPSBbXSwgbG9uZ1BpZWNlcyA9IFtdLCBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSwgbW9tO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGUgKHksIG0sIGQsIGgsIE0sIHMsIG1zKSB7XG4gICAgICAgIC8vIGNhbid0IGp1c3QgYXBwbHkoKSB0byBjcmVhdGUgYSBkYXRlOlxuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMTgxMzQ4XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xuXG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDAgJiYgaXNGaW5pdGUoZGF0ZS5nZXRGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVENEYXRlICh5KSB7XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG5cbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDAgJiYgaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuICAgIGZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgICAgICBmd2QgPSA3ICsgZG93IC0gZG95LFxuICAgICAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlaywgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1dXJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWsgKG1vbSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheScsICdkJyk7XG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrZGF5JywgJ2UnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtkYXknLCAnRScpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheScsIDExKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrZGF5JywgMTEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5cyA9ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyAobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fd2Vla2RheXMpID8gdGhpcy5fd2Vla2RheXMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzWydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fd2Vla2RheXMpID8gdGhpcy5fd2Vla2RheXNbbS5kYXkoKV0gOlxuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20uZGF5KCldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNTaG9ydCAobSkge1xuICAgICAgICByZXR1cm4gKG0pID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiA9ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbiAobSkge1xuICAgICAgICByZXR1cm4gKG0pID8gdGhpcy5fd2Vla2RheXNNaW5bbS5kYXkoKV0gOiB0aGlzLl93ZWVrZGF5c01pbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZSQxKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgaWksIG1vbSwgbGxjID0gd2Vla2RheU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkge1xuICAgICAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1BhcnNlICh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPSAnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZGRkJyAmJiB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkJyAmJiB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkJyAmJiB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheSA9IHRoaXMuX2lzVVRDID8gdGhpcy5fZC5nZXRVVENEYXkoKSA6IHRoaXMuX2QuZ2V0RGF5KCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGlucHV0IC0gZGF5LCAnZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRheTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldExvY2FsZURheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gKHRoaXMuZGF5KCkgKyA3IC0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSAlIDc7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09EYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJlaGF2ZXMgdGhlIHNhbWUgYXMgbW9tZW50I2RheSBleGNlcHRcbiAgICAgICAgLy8gYXMgYSBnZXR0ZXIsIHJldHVybnMgNyBpbnN0ZWFkIG9mIDAgKDEtNyByYW5nZSBpbnN0ZWFkIG9mIDAtNilcbiAgICAgICAgLy8gYXMgYSBzZXR0ZXIsIHN1bmRheSBzaG91bGQgYmVsb25nIHRvIHRoZSBwcmV2aW91cyB3ZWVrLlxuXG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgd2Vla2RheSA9IHBhcnNlSXNvV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KHRoaXMuZGF5KCkgJSA3ID8gd2Vla2RheSA6IHdlZWtkYXkgLSA3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpIHx8IDc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gd2Vla2RheXNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBkZWZhdWx0V2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzU2hvcnRSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gd2Vla2RheXNNaW5SZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzTWluUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSBkZWZhdWx0V2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVdlZWtkYXlzUGFyc2UgKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluUGllY2VzID0gW10sIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbSwgbWlucCwgc2hvcnRwLCBsb25ncDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBtaW5wID0gdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgIHNob3J0cCA9IHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgIGxvbmdwID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKTtcbiAgICAgICAgICAgIG1pblBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIHdlZWtkYXkgKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBtaW5QaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIHNob3J0UGllY2VzW2ldID0gcmVnZXhFc2NhcGUoc2hvcnRQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbG9uZ1BpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKGxvbmdQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1pblBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gaEZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgfHwgMjQ7XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0gnLCBbJ0hIJywgMl0sIDAsICdob3VyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2gnLCBbJ2hoJywgMl0sIDAsIGhGb3JtYXQpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdrJywgWydraycsIDJdLCAwLCBrRm9ybWF0KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyB0aGlzLmhvdXJzKCkgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW0gKHRva2VuLCBsb3dlcmNhc2UpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbSh0aGlzLmhvdXJzKCksIHRoaXMubWludXRlcygpLCBsb3dlcmNhc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBtZXJpZGllbSgnYScsIHRydWUpO1xuICAgIG1lcmlkaWVtKCdBJywgZmFsc2UpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdob3VyJywgJ2gnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdob3VyJywgMTMpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgZnVuY3Rpb24gbWF0Y2hNZXJpZGllbSAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9tZXJpZGllbVBhcnNlO1xuICAgIH1cblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignQScsICBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdIJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignaCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2snLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdISCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdoaCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdraycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignaG1tc3MnLCBtYXRjaDV0bzYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tc3MnLCBtYXRjaDV0bzYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0gnLCAnSEgnXSwgSE9VUik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2snLCAna2snXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBrSW5wdXQgPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGFycmF5W0hPVVJdID0ga0lucHV0ID09PSAyNCA/IDAgOiBrSW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2EnLCAnQSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9pc1BtID0gY29uZmlnLl9sb2NhbGUuaXNQTShpbnB1dCk7XG4gICAgICAgIGNvbmZpZy5fbWVyaWRpZW0gPSBpbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaCcsICdoaCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNDtcbiAgICAgICAgdmFyIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVJc1BNIChpbnB1dCkge1xuICAgICAgICAvLyBJRTggUXVpcmtzIE1vZGUgJiBJRTcgU3RhbmRhcmRzIE1vZGUgZG8gbm90IGFsbG93IGFjY2Vzc2luZyBzdHJpbmdzIGxpa2UgYXJyYXlzXG4gICAgICAgIC8vIFVzaW5nIGNoYXJBdCBzaG91bGQgYmUgbW9yZSBjb21wYXRpYmxlLlxuICAgICAgICByZXR1cm4gKChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UgPSAvW2FwXVxcLj9tP1xcLj8vaTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNZXJpZGllbSAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BtJyA6ICdQTSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBTZXR0aW5nIHRoZSBob3VyIHNob3VsZCBrZWVwIHRoZSB0aW1lLCBiZWNhdXNlIHRoZSB1c2VyIGV4cGxpY2l0bHlcbiAgICAvLyBzcGVjaWZpZWQgd2hpY2ggaG91ciB0aGV5IHdhbnQuIFNvIHRyeWluZyB0byBtYWludGFpbiB0aGUgc2FtZSBob3VyIChpblxuICAgIC8vIGEgbmV3IHRpbWV6b25lKSBtYWtlcyBzZW5zZS4gQWRkaW5nL3N1YnRyYWN0aW5nIGhvdXJzIGRvZXMgbm90IGZvbGxvd1xuICAgIC8vIHRoaXMgcnVsZS5cbiAgICB2YXIgZ2V0U2V0SG91ciA9IG1ha2VHZXRTZXQoJ0hvdXJzJywgdHJ1ZSk7XG5cbiAgICB2YXIgYmFzZUNvbmZpZyA9IHtcbiAgICAgICAgY2FsZW5kYXI6IGRlZmF1bHRDYWxlbmRhcixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IGRlZmF1bHRMb25nRGF0ZUZvcm1hdCxcbiAgICAgICAgaW52YWxpZERhdGU6IGRlZmF1bHRJbnZhbGlkRGF0ZSxcbiAgICAgICAgb3JkaW5hbDogZGVmYXVsdE9yZGluYWwsXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlLFxuICAgICAgICByZWxhdGl2ZVRpbWU6IGRlZmF1bHRSZWxhdGl2ZVRpbWUsXG5cbiAgICAgICAgbW9udGhzOiBkZWZhdWx0TG9jYWxlTW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LFxuXG4gICAgICAgIHdlZWs6IGRlZmF1bHRMb2NhbGVXZWVrLFxuXG4gICAgICAgIHdlZWtkYXlzOiBkZWZhdWx0TG9jYWxlV2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlXG4gICAgfTtcblxuICAgIC8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxvY2FsZSBjb25maWcgZmlsZXNcbiAgICB2YXIgbG9jYWxlcyA9IHt9O1xuICAgIHZhciBsb2NhbGVGYW1pbGllcyA9IHt9O1xuICAgIHZhciBnbG9iYWxMb2NhbGU7XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVMb2NhbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgPyBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdfJywgJy0nKSA6IGtleTtcbiAgICB9XG5cbiAgICAvLyBwaWNrIHRoZSBsb2NhbGUgZnJvbSB0aGUgYXJyYXlcbiAgICAvLyB0cnkgWydlbi1hdScsICdlbi1nYiddIGFzICdlbi1hdScsICdlbi1nYicsICdlbicsIGFzIGluIG1vdmUgdGhyb3VnaCB0aGUgbGlzdCB0cnlpbmcgZWFjaFxuICAgIC8vIHN1YnN0cmluZyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3QsIGJ1dCBtb3ZlIHRvIHRoZSBuZXh0IGFycmF5IGl0ZW0gaWYgaXQncyBhIG1vcmUgc3BlY2lmaWMgdmFyaWFudCB0aGFuIHRoZSBjdXJyZW50IHJvb3RcbiAgICBmdW5jdGlvbiBjaG9vc2VMb2NhbGUobmFtZXMpIHtcbiAgICAgICAgdmFyIGkgPSAwLCBqLCBuZXh0LCBsb2NhbGUsIHNwbGl0O1xuXG4gICAgICAgIHdoaWxlIChpIDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzcGxpdCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpXSkuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGogPSBzcGxpdC5sZW5ndGg7XG4gICAgICAgICAgICBuZXh0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2kgKyAxXSk7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dCA/IG5leHQuc3BsaXQoJy0nKSA6IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKHNwbGl0LnNsaWNlKDAsIGopLmpvaW4oJy0nKSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0Lmxlbmd0aCA+PSBqICYmIGNvbXBhcmVBcnJheXMoc3BsaXQsIG5leHQsIHRydWUpID49IGogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobmFtZSkge1xuICAgICAgICB2YXIgb2xkTG9jYWxlID0gbnVsbDtcbiAgICAgICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gcmVnaXN0ZXIgYW5kIGxvYWQgYWxsIHRoZSBsb2NhbGVzIGluIE5vZGVcbiAgICAgICAgaWYgKCFsb2NhbGVzW25hbWVdICYmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb2xkTG9jYWxlID0gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhc2VkUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUoJy4vbG9jYWxlLycgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUob2xkTG9jYWxlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbG9jYWxlIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxvY2FsZS4gIElmXG4gICAgLy8gbm8gYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4sIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCBnbG9iYWxcbiAgICAvLyBsb2NhbGUga2V5LlxuICAgIGZ1bmN0aW9uIGdldFNldEdsb2JhbExvY2FsZSAoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRlZmluZUxvY2FsZShrZXksIHZhbHVlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9tZW50LmR1cmF0aW9uLl9sb2NhbGUgPSBtb21lbnQuX2xvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgZ2xvYmFsTG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIGNvbnNvbGUgIT09ICAndW5kZWZpbmVkJykgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vd2FybiB1c2VyIGlmIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ1dCB0aGUgbG9jYWxlIGNvdWxkIG5vdCBiZSBzZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdMb2NhbGUgJyArIGtleSArICAnIG5vdCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gbG9hZCBpdD8nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZSAobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICBjb25maWcuYWJiciA9IG5hbWU7XG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKCdkZWZpbmVMb2NhbGVPdmVycmlkZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAndXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYW4gZXhpc3RpbmcgbG9jYWxlLiBtb21lbnQuZGVmaW5lTG9jYWxlKGxvY2FsZU5hbWUsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uJyk7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tuYW1lXS5fY29uZmlnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0uX2NvbmZpZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGNvbmZpZy5wYXJlbnRMb2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IG5ldyBMb2NhbGUobWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKSk7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVGYW1pbGllc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lTG9jYWxlKHgubmFtZSwgeC5jb25maWcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGxvY2FsZSBBRlRFUiBhbGwgY2hpbGQgbG9jYWxlcyBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIGNyZWF0ZWQsIHNvIHdlIHdvbid0IGVuZCB1cCB3aXRoIHRoZSBjaGlsZCBsb2NhbGUgc2V0LlxuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuXG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsIHRtcExvY2FsZSwgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcbiAgICAgICAgICAgIC8vIE1FUkdFXG4gICAgICAgICAgICB0bXBMb2NhbGUgPSBsb2FkTG9jYWxlKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHRtcExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gdG1wTG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpO1xuICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShjb25maWcpO1xuICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlO1xuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3MgbnVsbCBmb3IgY29uZmlnIHRvIHVudXBkYXRlLCB1c2VmdWwgZm9yIHRlc3RzXG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGxvY2FsZSBkYXRhXG4gICAgZnVuY3Rpb24gZ2V0TG9jYWxlIChrZXkpIHtcbiAgICAgICAgdmFyIGxvY2FsZTtcblxuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cgKG0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93O1xuICAgICAgICB2YXIgYSA9IG0uX2E7XG5cbiAgICAgICAgaWYgKGEgJiYgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID09PSAtMikge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPVxuICAgICAgICAgICAgICAgIGFbTU9OVEhdICAgICAgIDwgMCB8fCBhW01PTlRIXSAgICAgICA+IDExICA/IE1PTlRIIDpcbiAgICAgICAgICAgICAgICBhW0RBVEVdICAgICAgICA8IDEgfHwgYVtEQVRFXSAgICAgICAgPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSkgPyBEQVRFIDpcbiAgICAgICAgICAgICAgICBhW0hPVVJdICAgICAgICA8IDAgfHwgYVtIT1VSXSAgICAgICAgPiAyNCB8fCAoYVtIT1VSXSA9PT0gMjQgJiYgKGFbTUlOVVRFXSAhPT0gMCB8fCBhW1NFQ09ORF0gIT09IDAgfHwgYVtNSUxMSVNFQ09ORF0gIT09IDApKSA/IEhPVVIgOlxuICAgICAgICAgICAgICAgIGFbTUlOVVRFXSAgICAgIDwgMCB8fCBhW01JTlVURV0gICAgICA+IDU5ICA/IE1JTlVURSA6XG4gICAgICAgICAgICAgICAgYVtTRUNPTkRdICAgICAgPCAwIHx8IGFbU0VDT05EXSAgICAgID4gNTkgID8gU0VDT05EIDpcbiAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSA8IDAgfHwgYVtNSUxMSVNFQ09ORF0gPiA5OTkgPyBNSUxMSVNFQ09ORCA6XG4gICAgICAgICAgICAgICAgLTE7XG5cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93RGF5T2ZZZWFyICYmIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla3MgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrZGF5ICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFS0RBWTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQaWNrIHRoZSBmaXJzdCBkZWZpbmVkIG9mIHR3byBvciB0aHJlZSBhcmd1bWVudHMuXG4gICAgZnVuY3Rpb24gZGVmYXVsdHMoYSwgYiwgYykge1xuICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZykge1xuICAgICAgICAvLyBob29rcyBpcyBhY3R1YWxseSB0aGUgZXhwb3J0ZWQgbW9tZW50IG9iamVjdFxuICAgICAgICB2YXIgbm93VmFsdWUgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIGlmIChjb25maWcuX3VzZVVUQykge1xuICAgICAgICAgICAgcmV0dXJuIFtub3dWYWx1ZS5nZXRVVENGdWxsWWVhcigpLCBub3dWYWx1ZS5nZXRVVENNb250aCgpLCBub3dWYWx1ZS5nZXRVVENEYXRlKCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheSAoY29uZmlnKSB7XG4gICAgICAgIHZhciBpLCBkYXRlLCBpbnB1dCA9IFtdLCBjdXJyZW50RGF0ZSwgZXhwZWN0ZWRXZWVrZGF5LCB5ZWFyVG9Vc2U7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZyk7XG5cbiAgICAgICAgLy9jb21wdXRlIGRheSBvZiB0aGUgeWVhciBmcm9tIHdlZWtzIGFuZCB3ZWVrZGF5c1xuICAgICAgICBpZiAoY29uZmlnLl93ICYmIGNvbmZpZy5fYVtEQVRFXSA9PSBudWxsICYmIGNvbmZpZy5fYVtNT05USF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSBkYXkgb2YgdGhlIHllYXIgaXMgc2V0LCBmaWd1cmUgb3V0IHdoYXQgaXQgaXNcbiAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHllYXJUb1VzZSA9IGRlZmF1bHRzKGNvbmZpZy5fYVtZRUFSXSwgY3VycmVudERhdGVbWUVBUl0pO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXJUb1VzZSkgfHwgY29uZmlnLl9kYXlPZlllYXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dEYXlPZlllYXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNT05USF0gPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgICAgICAgICBjb25maWcuX2FbREFURV0gPSBkYXRlLmdldFVUQ0RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCBkYXRlLlxuICAgICAgICAvLyAqIGlmIG5vIHllYXIsIG1vbnRoLCBkYXkgb2YgbW9udGggYXJlIGdpdmVuLCBkZWZhdWx0IHRvIHRvZGF5XG4gICAgICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgICAgIC8vICogaWYgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgb25seSB5ZWFyXG4gICAgICAgIC8vICogaWYgeWVhciBpcyBnaXZlbiwgZG9uJ3QgZGVmYXVsdCBhbnl0aGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IGN1cnJlbnREYXRlW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IChjb25maWcuX2FbaV0gPT0gbnVsbCkgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciAyNDowMDowMC4wMDBcbiAgICAgICAgaWYgKGNvbmZpZy5fYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtTRUNPTkRdID09PSAwICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTExJU0VDT05EXSA9PT0gMCkge1xuICAgICAgICAgICAgY29uZmlnLl9uZXh0RGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBjcmVhdGVVVENEYXRlIDogY3JlYXRlRGF0ZSkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgICAgICBleHBlY3RlZFdlZWtkYXkgPSBjb25maWcuX3VzZVVUQyA/IGNvbmZpZy5fZC5nZXRVVENEYXkoKSA6IGNvbmZpZy5fZC5nZXREYXkoKTtcblxuICAgICAgICAvLyBBcHBseSB0aW1lem9uZSBvZmZzZXQgZnJvbSBpbnB1dC4gVGhlIGFjdHVhbCB1dGNPZmZzZXQgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgLy8gd2l0aCBwYXJzZVpvbmUuXG4gICAgICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMjQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBmb3IgbWlzbWF0Y2hpbmcgZGF5IG9mIHdlZWtcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiB0eXBlb2YgY29uZmlnLl93LmQgIT09ICd1bmRlZmluZWQnICYmIGNvbmZpZy5fdy5kICE9PSBleHBlY3RlZFdlZWtkYXkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKSB7XG4gICAgICAgIHZhciB3LCB3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3ksIHRlbXAsIHdlZWtkYXlPdmVyZmxvdztcblxuICAgICAgICB3ID0gY29uZmlnLl93O1xuICAgICAgICBpZiAody5HRyAhPSBudWxsIHx8IHcuVyAhPSBudWxsIHx8IHcuRSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkb3cgPSAxO1xuICAgICAgICAgICAgZG95ID0gNDtcblxuICAgICAgICAgICAgLy8gVE9ETzogV2UgbmVlZCB0byB0YWtlIHRoZSBjdXJyZW50IGlzb1dlZWtZZWFyLCBidXQgdGhhdCBkZXBlbmRzIG9uXG4gICAgICAgICAgICAvLyBob3cgd2UgaW50ZXJwcmV0IG5vdyAobG9jYWwsIHV0YywgZml4ZWQgb2Zmc2V0KS4gU28gY3JlYXRlXG4gICAgICAgICAgICAvLyBhIG5vdyB2ZXJzaW9uIG9mIGN1cnJlbnQgY29uZmlnICh0YWtlIGxvY2FsL3V0Yy9vZmZzZXQgZmxhZ3MsIGFuZFxuICAgICAgICAgICAgLy8gY3JlYXRlIG5vdykuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuR0csIGNvbmZpZy5fYVtZRUFSXSwgd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCAxLCA0KS55ZWFyKTtcbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LlcsIDEpO1xuICAgICAgICAgICAgd2Vla2RheSA9IGRlZmF1bHRzKHcuRSwgMSk7XG4gICAgICAgICAgICBpZiAod2Vla2RheSA8IDEgfHwgd2Vla2RheSA+IDcpIHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICAgICAgZG95ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG95O1xuXG4gICAgICAgICAgICB2YXIgY3VyV2VlayA9IHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgZG93LCBkb3kpO1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHdlZWsuXG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody53LCBjdXJXZWVrLndlZWspO1xuXG4gICAgICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZWVrZGF5IC0tIGxvdyBkYXkgbnVtYmVycyBhcmUgY29uc2lkZXJlZCBuZXh0IHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5kO1xuICAgICAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2NhbCB3ZWVrZGF5IC0tIGNvdW50aW5nIHN0YXJ0cyBmcm9tIGJlZ2luaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5lICsgZG93O1xuICAgICAgICAgICAgICAgIGlmICh3LmUgPCAwIHx8IHcuZSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC87XG4gICAgdmFyIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuXG4gICAgdmFyIHR6UmVnZXggPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy87XG5cbiAgICB2YXIgaXNvRGF0ZXMgPSBbXG4gICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICBbJ1lZWVktTU0tREQnLCAvXFxkezR9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L10sXG4gICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgWydZWVlZTU1ERCcsIC9cXGR7OH0vXSxcbiAgICAgICAgLy8gWVlZWU1NIGlzIE5PVCBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZFxuICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICBbJ0dHR0dbV11XVycsIC9cXGR7NH1XXFxkezJ9LywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L11cbiAgICBdO1xuXG4gICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgIHZhciBpc29UaW1lcyA9IFtcbiAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISG1tc3MsU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICBbJ0hIJywgL1xcZFxcZC9dXG4gICAgXTtcblxuICAgIHZhciBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pO1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQsIHR6Rm9ybWF0O1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgdmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvO1xuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyh5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCAnICcpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja1dlZWtkYXkod2Vla2RheVN0ciwgcGFyc2VkSW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAod2Vla2RheVN0cikge1xuICAgICAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB0aGUgdmFuaWxsYSBKUyBEYXRlIG9iamVjdCB3aXRoIGFuIGluZGVwZW50ZW50IGRheS1vZi13ZWVrIGNoZWNrLlxuICAgICAgICAgICAgdmFyIHdlZWtkYXlQcm92aWRlZCA9IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0ciksXG4gICAgICAgICAgICAgICAgd2Vla2RheUFjdHVhbCA9IG5ldyBEYXRlKHBhcnNlZElucHV0WzBdLCBwYXJzZWRJbnB1dFsxXSwgcGFyc2VkSW5wdXRbMl0pLmdldERheSgpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXlQcm92aWRlZCAhPT0gd2Vla2RheUFjdHVhbCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBvYnNPZmZzZXRzID0ge1xuICAgICAgICBVVDogMCxcbiAgICAgICAgR01UOiAwLFxuICAgICAgICBFRFQ6IC00ICogNjAsXG4gICAgICAgIEVTVDogLTUgKiA2MCxcbiAgICAgICAgQ0RUOiAtNSAqIDYwLFxuICAgICAgICBDU1Q6IC02ICogNjAsXG4gICAgICAgIE1EVDogLTYgKiA2MCxcbiAgICAgICAgTVNUOiAtNyAqIDYwLFxuICAgICAgICBQRFQ6IC03ICogNjAsXG4gICAgICAgIFBTVDogLTggKiA2MFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVPZmZzZXQob2JzT2Zmc2V0LCBtaWxpdGFyeU9mZnNldCwgbnVtT2Zmc2V0KSB7XG4gICAgICAgIGlmIChvYnNPZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNPZmZzZXRzW29ic09mZnNldF07XG4gICAgICAgIH0gZWxzZSBpZiAobWlsaXRhcnlPZmZzZXQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBvbmx5IGFsbG93ZWQgbWlsaXRhcnkgdHogaXMgWlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBwYXJzZUludChudW1PZmZzZXQsIDEwKTtcbiAgICAgICAgICAgIHZhciBtID0gaG0gJSAxMDAsIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgdmFyIHBhcnNlZEFycmF5ID0gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhtYXRjaFs0XSwgbWF0Y2hbM10sIG1hdGNoWzJdLCBtYXRjaFs1XSwgbWF0Y2hbNl0sIG1hdGNoWzddKTtcbiAgICAgICAgICAgIGlmICghY2hlY2tXZWVrZGF5KG1hdGNoWzFdLCBwYXJzZWRBcnJheSwgY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uZmlnLl9hID0gcGFyc2VkQXJyYXk7XG4gICAgICAgICAgICBjb25maWcuX3R6bSA9IGNhbGN1bGF0ZU9mZnNldChtYXRjaFs4XSwgbWF0Y2hbOV0sIG1hdGNoWzEwXSk7XG5cbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGNyZWF0ZVVUQ0RhdGUuYXBwbHkobnVsbCwgY29uZmlnLl9hKTtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnJmYzI4MjIgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdCBvciBmYWxsYmFja1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaGVkID0gYXNwTmV0SnNvblJlZ2V4LmV4ZWMoY29uZmlnLl9pKTtcblxuICAgICAgICBpZiAobWF0Y2hlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK21hdGNoZWRbMV0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICd3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBSRkMyODIyL0lTTyBkYXRlIGZvcm1hdHMgYXJlICcgK1xuICAgICAgICAnZGlzY291cmFnZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyBtYWpvciByZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gJyArXG4gICAgICAgICdodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uJyxcbiAgICAgICAgZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoY29uZmlnLl9pICsgKGNvbmZpZy5fdXNlVVRDID8gJyBVVEMnIDogJycpKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgSVNPIHN0YW5kYXJkXG4gICAgaG9va3MuSVNPXzg2MDEgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBSRkMgMjgyMiBmb3JtXG4gICAgaG9va3MuUkZDXzI4MjIgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZykge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBjcmVhdGlvbiBmbG93IHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwc1xuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5JU09fODYwMSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLlJGQ18yODIyKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZy5fYSA9IFtdO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IHRydWU7XG5cbiAgICAgICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgY29uZmlnLl9pLFxuICAgICAgICAgICAgaSwgcGFyc2VkSW5wdXQsIHRva2VucywgdG9rZW4sIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDA7XG5cbiAgICAgICAgdG9rZW5zID0gZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgY29uZmlnLl9sb2NhbGUpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpIHx8IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHwgW10pWzBdO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rva2VuJywgdG9rZW4sICdwYXJzZWRJbnB1dCcsIHBhcnNlZElucHV0LFxuICAgICAgICAgICAgLy8gICAgICAgICAncmVnZXgnLCBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc2tpcHBlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmNoYXJzTGVmdE92ZXIgPSBzdHJpbmdMZW5ndGggLSB0b3RhbFBhcnNlZElucHV0TGVuZ3RoO1xuICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIF8xMmggZmxhZyBpZiBob3VyIGlzIDw9IDEyXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5wYXJzZWREYXRlUGFydHMgPSBjb25maWcuX2Euc2xpY2UoMCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLm1lcmlkaWVtID0gY29uZmlnLl9tZXJpZGllbTtcbiAgICAgICAgLy8gaGFuZGxlIG1lcmlkaWVtXG4gICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IG1lcmlkaWVtRml4V3JhcChjb25maWcuX2xvY2FsZSwgY29uZmlnLl9hW0hPVVJdLCBjb25maWcuX21lcmlkaWVtKTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgY2hlY2tPdmVyZmxvdyhjb25maWcpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwIChsb2NhbGUsIGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgIHZhciBpc1BtO1xuXG4gICAgICAgIGlmIChtZXJpZGllbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlLm1lcmlkaWVtSG91ciAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLm1lcmlkaWVtSG91cihob3VyLCBtZXJpZGllbSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxlLmlzUE0gIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgICAgIGlzUG0gPSBsb2NhbGUuaXNQTShtZXJpZGllbSk7XG4gICAgICAgICAgICBpZiAoaXNQbSAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1BtICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlblxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIHRlbXBDb25maWcsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWcuX2YubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gY29weUNvbmZpZyh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLmNoYXJzTGVmdE92ZXI7XG5cbiAgICAgICAgICAgIC8vb3IgdG9rZW5zXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnVudXNlZFRva2Vucy5sZW5ndGggKiAxMDtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoc2NvcmVUb0JlYXQgPT0gbnVsbCB8fCBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSk7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChbaS55ZWFyLCBpLm1vbnRoLCBpLmRheSB8fCBpLmRhdGUsIGkuaG91ciwgaS5taW51dGUsIGkuc2Vjb25kLCBpLm1pbGxpc2Vjb25kXSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyAoY29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3cocHJlcGFyZUNvbmZpZyhjb25maWcpKSk7XG4gICAgICAgIGlmIChyZXMuX25leHREYXkpIHtcbiAgICAgICAgICAgIC8vIEFkZGluZyBpcyBzbWFydCBlbm91Z2ggYXJvdW5kIERTVFxuICAgICAgICAgICAgcmVzLmFkZCgxLCAnZCcpO1xuICAgICAgICAgICAgcmVzLl9uZXh0RGF5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwYXJlQ29uZmlnIChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLl9mO1xuXG4gICAgICAgIGNvbmZpZy5fbG9jYWxlID0gY29uZmlnLl9sb2NhbGUgfHwgZ2V0TG9jYWxlKGNvbmZpZy5fbCk7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IChmb3JtYXQgPT09IHVuZGVmaW5lZCAmJiBpbnB1dCA9PT0gJycpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCh7bnVsbElucHV0OiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnLl9pID0gaW5wdXQgPSBjb25maWcuX2xvY2FsZS5wcmVwYXJzZShpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjaGVja092ZXJmbG93KGlucHV0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSAgZWxzZSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZChjb25maWcpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSW5wdXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBtYXAoaW5wdXQuc2xpY2UoMCksIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbU9iamVjdChjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbE9yVVRDIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgaXNVVEMpIHtcbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBpZiAobG9jYWxlID09PSB0cnVlIHx8IGxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoaXNPYmplY3QoaW5wdXQpICYmIGlzT2JqZWN0RW1wdHkoaW5wdXQpKSB8fFxuICAgICAgICAgICAgICAgIChpc0FycmF5KGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgYy5fdXNlVVRDID0gYy5faXNVVEMgPSBpc1VUQztcbiAgICAgICAgYy5fbCA9IGxvY2FsZTtcbiAgICAgICAgYy5faSA9IGlucHV0O1xuICAgICAgICBjLl9mID0gZm9ybWF0O1xuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21Db25maWcoYyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWwgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZU1pbiA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIHZhciBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyID4gdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBQaWNrIGEgbW9tZW50IG0gZnJvbSBtb21lbnRzIHNvIHRoYXQgbVtmbl0ob3RoZXIpIGlzIHRydWUgZm9yIGFsbFxuICAgIC8vIG90aGVyLiBUaGlzIHJlbGllcyBvbiB0aGUgZnVuY3Rpb24gZm4gdG8gYmUgdHJhbnNpdGl2ZS5cbiAgICAvL1xuICAgIC8vIG1vbWVudHMgc2hvdWxkIGVpdGhlciBiZSBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cyBvciBhbiBhcnJheSwgd2hvc2VcbiAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzLlxuICAgIGZ1bmN0aW9uIHBpY2tCeShmbiwgbW9tZW50cykge1xuICAgICAgICB2YXIgcmVzLCBpO1xuICAgICAgICBpZiAobW9tZW50cy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShtb21lbnRzWzBdKSkge1xuICAgICAgICAgICAgbW9tZW50cyA9IG1vbWVudHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gbW9tZW50c1swXTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG1vbWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50c1tpXS5pc1ZhbGlkKCkgfHwgbW9tZW50c1tpXVtmbl0ocmVzKSkge1xuICAgICAgICAgICAgICAgIHJlcyA9IG1vbWVudHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgW10uc29ydCBpbnN0ZWFkP1xuICAgIGZ1bmN0aW9uIG1pbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF4ICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xuICAgIH1cblxuICAgIHZhciBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdyA/IERhdGUubm93KCkgOiArKG5ldyBEYXRlKCkpO1xuICAgIH07XG5cbiAgICB2YXIgb3JkZXJpbmcgPSBbJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXTtcblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb25WYWxpZChtKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoIShpbmRleE9mLmNhbGwob3JkZXJpbmcsIGtleSkgIT09IC0xICYmIChtW2tleV0gPT0gbnVsbCB8fCAhaXNOYU4obVtrZXldKSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVuaXRIYXNEZWNpbWFsID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtW29yZGVyaW5nW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9ubHkgYWxsb3cgbm9uLWludGVnZXJzIGZvciBzbWFsbGVzdCB1bml0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKE5hTik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24gKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBpc0R1cmF0aW9uVmFsaWQobm9ybWFsaXplZElucHV0KTtcblxuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZUFkZFJlbW92ZVxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSArbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDEwMDAgKiA2MCAqIDYwOyAvL3VzaW5nIDEwMDAgKiA2MCAqIDYwIGluc3RlYWQgb2YgMzZlNSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzI5NzhcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICtcbiAgICAgICAgICAgIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArXG4gICAgICAgICAgICBxdWFydGVycyAqIDMgK1xuICAgICAgICAgICAgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNSb3VuZCAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgtMSAqIG51bWJlcikgKiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBvZmZzZXQgKHRva2VuLCBzZXBhcmF0b3IpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICAgICAgdmFyIHNpZ24gPSAnKyc7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaWduICsgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArIHNlcGFyYXRvciArIHplcm9GaWxsKH5+KG9mZnNldCkgJSA2MCwgMik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCAgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUmVnZXhUb2tlbignWlonLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnWicsICdaWiddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjb25maWcuX3R6bSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gdGltZXpvbmUgY2h1bmtlclxuICAgIC8vICcrMTA6MDAnID4gWycxMCcsICAnMDAnXVxuICAgIC8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxuICAgIHZhciBjaHVua09mZnNldCA9IC8oW1xcK1xcLV18XFxkXFxkKS9naTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEZyb21TdHJpbmcobWF0Y2hlciwgc3RyaW5nKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlcik7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNodW5rICAgPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW107XG4gICAgICAgIHZhciBwYXJ0cyAgID0gKGNodW5rICsgJycpLm1hdGNoKGNodW5rT2Zmc2V0KSB8fCBbJy0nLCAwLCAwXTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBtaW51dGVzID09PSAwID9cbiAgICAgICAgICAwIDpcbiAgICAgICAgICBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vbWVudCBmcm9tIGlucHV0LCB0aGF0IGlzIGxvY2FsL3V0Yy96b25lIGVxdWl2YWxlbnQgdG8gbW9kZWwuXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgICAgICB2YXIgcmVzLCBkaWZmO1xuICAgICAgICBpZiAobW9kZWwuX2lzVVRDKSB7XG4gICAgICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICAgICAgZGlmZiA9IChpc01vbWVudChpbnB1dCkgfHwgaXNEYXRlKGlucHV0KSA/IGlucHV0LnZhbHVlT2YoKSA6IGNyZWF0ZUxvY2FsKGlucHV0KS52YWx1ZU9mKCkpIC0gcmVzLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIC8vIFVzZSBsb3ctbGV2ZWwgYXBpLCBiZWNhdXNlIHRoaXMgZm4gaXMgbG93LWxldmVsIGFwaS5cbiAgICAgICAgICAgIHJlcy5fZC5zZXRUaW1lKHJlcy5fZC52YWx1ZU9mKCkgKyBkaWZmKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChyZXMsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQpLmxvY2FsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRlT2Zmc2V0IChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpIC8gMTUpICogMTU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICBob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIC8vIGtlZXBMb2NhbFRpbWUgPSB0cnVlIG1lYW5zIG9ubHkgY2hhbmdlIHRoZSB0aW1lem9uZSwgd2l0aG91dFxuICAgIC8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4gICAgLy8gNTozMToyNiArMDIwMCBJdCBpcyBwb3NzaWJsZSB0aGF0IDU6MzE6MjYgZG9lc24ndCBleGlzdCB3aXRoIG9mZnNldFxuICAgIC8vICswMjAwLCBzbyB3ZSBhZGp1c3QgdGhlIHRpbWUgYXMgbmVlZGVkLCB0byBiZSB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEtlZXBpbmcgdGhlIHRpbWUgYWN0dWFsbHkgYWRkcy9zdWJ0cmFjdHMgKG9uZSBob3VyKVxuICAgIC8vIGZyb20gdGhlIGFjdHVhbCByZXByZXNlbnRlZCB0aW1lLiBUaGF0IGlzIHdoeSB3ZSBjYWxsIHVwZGF0ZU9mZnNldFxuICAgIC8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbiAgICAvLyBfY2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlIGNhc2UsIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QsIGJlY2F1c2VcbiAgICAvLyB0aGVyZSBpcyBubyBzdWNoIHRpbWUgaW4gdGhlIGdpdmVuIHRpbWV6b25lLlxuICAgIGZ1bmN0aW9uIGdldFNldE9mZnNldCAoaW5wdXQsIGtlZXBMb2NhbFRpbWUsIGtlZXBNaW51dGVzKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgIGxvY2FsQWRqdXN0O1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNiAmJiAha2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVVRDICYmIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICBsb2NhbEFkanVzdCA9IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBpbnB1dDtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb2NhbEFkanVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQobG9jYWxBZGp1c3QsICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlmICgha2VlcExvY2FsVGltZSB8fCB0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGNyZWF0ZUR1cmF0aW9uKGlucHV0IC0gb2Zmc2V0LCAnbScpLCAxLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IG9mZnNldCA6IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRab25lIChpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvVVRDIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb0xvY2FsIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VidHJhY3QoZ2V0RGF0ZU9mZnNldCh0aGlzKSwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdFpvbmUgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoT2Zmc2V0LCB0aGlzLl9pKTtcbiAgICAgICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodFpvbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IGlucHV0ID8gY3JlYXRlTG9jYWwoaW5wdXQpLnV0Y09mZnNldCgpIDogMDtcblxuICAgICAgICByZXR1cm4gKHRoaXMudXRjT2Zmc2V0KCkgLSBpbnB1dCkgJSA2MCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZSAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkICgpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9pc0RTVFNoaWZ0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgICAgICBjID0gcHJlcGFyZUNvbmZpZyhjKTtcblxuICAgICAgICBpZiAoYy5fYSkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgY29tcGFyZUFycmF5cyhjLl9hLCBvdGhlci50b0FycmF5KCkpID4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGNPZmZzZXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgdmFyIGFzcE5ldFJlZ2V4ID0gL14oXFwtfFxcKyk/KD86KFxcZCopWy4gXSk/KFxcZCspXFw6KFxcZCspKD86XFw6KFxcZCspKFxcLlxcZCopPyk/JC87XG5cbiAgICAvLyBmcm9tIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX2RhdGVfZGF0ZS5qcy5zb3VyY2UuaHRtbFxuICAgIC8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbiAgICAvLyBhbmQgZnVydGhlciBtb2RpZmllZCB0byBhbGxvdyBmb3Igc3RyaW5ncyBjb250YWluaW5nIGJvdGggd2VlayBhbmQgZGF5XG4gICAgdmFyIGlzb1JlZ2V4ID0gL14oLXxcXCspP1AoPzooWy0rXT9bMC05LC5dKilZKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilXKT8oPzooWy0rXT9bMC05LC5dKilEKT8oPzpUKD86KFstK10/WzAtOSwuXSopSCk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopUyk/KT8kLztcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUR1cmF0aW9uIChpbnB1dCwga2V5KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGlucHV0LFxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgICAgIG1hdGNoID0gbnVsbCxcbiAgICAgICAgICAgIHNpZ24sXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBkaWZmUmVzO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbXMgOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQgIDogaW5wdXQuX2RheXMsXG4gICAgICAgICAgICAgICAgTSAgOiBpbnB1dC5fbW9udGhzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gaW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSAnLScpID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeSAgOiAwLFxuICAgICAgICAgICAgICAgIGQgIDogdG9JbnQobWF0Y2hbREFURV0pICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBoICA6IHRvSW50KG1hdGNoW0hPVVJdKSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbSAgOiB0b0ludChtYXRjaFtNSU5VVEVdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIHMgIDogdG9JbnQobWF0Y2hbU0VDT05EXSkgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBtcyA6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24gLy8gdGhlIG1pbGxpc2Vjb25kIGRlY2ltYWwgcG9pbnQgaXMgaW5jbHVkZWQgaW4gdGhlIG1hdGNoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gaXNvUmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSAnLScpID8gLTEgOiAobWF0Y2hbMV0gPT09ICcrJykgPyAxIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHkgOiBwYXJzZUlzbyhtYXRjaFsyXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgTSA6IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3IDogcGFyc2VJc28obWF0Y2hbNF0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGQgOiBwYXJzZUlzbyhtYXRjaFs1XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgaCA6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtIDogcGFyc2VJc28obWF0Y2hbN10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHMgOiBwYXJzZUlzbyhtYXRjaFs4XSwgc2lnbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZHVyYXRpb24gPT0gbnVsbCkgey8vIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJiAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pKSB7XG4gICAgICAgICAgICBkaWZmUmVzID0gbW9tZW50c0RpZmZlcmVuY2UoY3JlYXRlTG9jYWwoZHVyYXRpb24uZnJvbSksIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLnRvKSk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcbiAgICBjcmVhdGVEdXJhdGlvbi5pbnZhbGlkID0gY3JlYXRlSW52YWxpZCQxO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VJc28gKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcblxuICAgICAgICByZXMubW9udGhzID0gb3RoZXIubW9udGgoKSAtIGJhc2UubW9udGgoKSArXG4gICAgICAgICAgICAob3RoZXIueWVhcigpIC0gYmFzZS55ZWFyKCkpICogMTI7XG4gICAgICAgIGlmIChiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykuaXNBZnRlcihvdGhlcikpIHtcbiAgICAgICAgICAgIC0tcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSArb3RoZXIgLSArKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzO1xuICAgICAgICBpZiAoIShiYXNlLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyID0gY2xvbmVXaXRoT2Zmc2V0KG90aGVyLCBiYXNlKTtcbiAgICAgICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmVzLm1vbnRocyA9IC1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG4gICAgZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICAgICAgaWYgKHBlcmlvZCAhPT0gbnVsbCAmJiAhaXNOYU4oK3BlcmlvZCkpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUobmFtZSwgJ21vbWVudCgpLicgKyBuYW1lICArICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArIG5hbWUgKyAnKG51bWJlciwgcGVyaW9kKS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4nKTtcbiAgICAgICAgICAgICAgICB0bXAgPSB2YWw7IHZhbCA9IHBlcmlvZDsgcGVyaW9kID0gdG1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/ICt2YWwgOiB2YWw7XG4gICAgICAgICAgICBkdXIgPSBjcmVhdGVEdXJhdGlvbih2YWwsIHBlcmlvZCk7XG4gICAgICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBkdXIsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCAobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIHVwZGF0ZU9mZnNldCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSBhYnNSb3VuZChkdXJhdGlvbi5fZGF5cyksXG4gICAgICAgICAgICBtb250aHMgPSBhYnNSb3VuZChkdXJhdGlvbi5fbW9udGhzKTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG1vbnRocykge1xuICAgICAgICAgICAgc2V0TW9udGgobW9tLCBnZXQobW9tLCAnTW9udGgnKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgc2V0JDEobW9tLCAnRGF0ZScsIGdldChtb20sICdEYXRlJykgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIG1vbS5fZC5zZXRUaW1lKG1vbS5fZC52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KG1vbSwgZGF5cyB8fCBtb250aHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFkZCAgICAgID0gY3JlYXRlQWRkZXIoMSwgJ2FkZCcpO1xuICAgIHZhciBzdWJ0cmFjdCA9IGNyZWF0ZUFkZGVyKC0xLCAnc3VidHJhY3QnKTtcblxuICAgIGZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICAgICAgdmFyIGRpZmYgPSBteU1vbWVudC5kaWZmKG5vdywgJ2RheXMnLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGRpZmYgPCAtNiA/ICdzYW1lRWxzZScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAtMSA/ICdsYXN0V2VlaycgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAwID8gJ2xhc3REYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMSA/ICdzYW1lRGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDIgPyAnbmV4dERheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCA3ID8gJ25leHRXZWVrJyA6ICdzYW1lRWxzZSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIkMSAodGltZSwgZm9ybWF0cykge1xuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgICAgIHNvZCA9IGNsb25lV2l0aE9mZnNldChub3csIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnO1xuXG4gICAgICAgIHZhciBvdXRwdXQgPSBmb3JtYXRzICYmIChpc0Z1bmN0aW9uKGZvcm1hdHNbZm9ybWF0XSkgPyBmb3JtYXRzW2Zvcm1hdF0uY2FsbCh0aGlzLCBub3cpIDogZm9ybWF0c1tmb3JtYXRdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQob3V0cHV0IHx8IHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKGZvcm1hdCwgdGhpcywgY3JlYXRlTG9jYWwobm93KSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHMoIWlzVW5kZWZpbmVkKHVuaXRzKSA/IHVuaXRzIDogJ21pbGxpc2Vjb25kJyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID4gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JldHdlZW4gKGZyb20sIHRvLCB1bml0cywgaW5jbHVzaXZpdHkpIHtcbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKGluY2x1c2l2aXR5WzBdID09PSAnKCcgPyB0aGlzLmlzQWZ0ZXIoZnJvbSwgdW5pdHMpIDogIXRoaXMuaXNCZWZvcmUoZnJvbSwgdW5pdHMpKSAmJlxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzFdID09PSAnKScgPyB0aGlzLmlzQmVmb3JlKHRvLCB1bml0cykgOiAhdGhpcy5pc0FmdGVyKHRvLCB1bml0cykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCksXG4gICAgICAgICAgICBpbnB1dE1zO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzIHx8ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dE1zID0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckFmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZmYgKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCxcbiAgICAgICAgICAgIHpvbmVEZWx0YSxcbiAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhhdCA9IGNsb25lV2l0aE9mZnNldChpbnB1dCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKCF0aGF0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvbmVEZWx0YSA9ICh0aGF0LnV0Y09mZnNldCgpIC0gdGhpcy51dGNPZmZzZXQoKSkgKiA2ZTQ7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDEyOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAzOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAxZTM7IGJyZWFrOyAvLyAxMDAwXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gNmU0OyBicmVhazsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBjYXNlICdob3VyJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDM2ZTU7IGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnZGF5Jzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDg2NGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA2MDQ4ZTU7IGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVmYXVsdDogb3V0cHV0ID0gdGhpcyAtIHRoYXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmIChhLCBiKSB7XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgIHZhciB3aG9sZU1vbnRoRGlmZiA9ICgoYi55ZWFyKCkgLSBhLnllYXIoKSkgKiAxMikgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLCBhZGp1c3Q7XG5cbiAgICAgICAgaWYgKGIgLSBhbmNob3IgPCAwKSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiAtIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yIC0gYW5jaG9yMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiArIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yMiAtIGFuY2hvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGZvciBuZWdhdGl2ZSB6ZXJvLCByZXR1cm4gemVybyBpZiBuZWdhdGl2ZSB6ZXJvXG4gICAgICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KSB8fCAwO1xuICAgIH1cblxuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXQgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXRVdGMgPSAnWVlZWS1NTS1ERFRISDptbTpzc1taXSc7XG5cbiAgICBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyhrZWVwT2Zmc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1dGMgPSBrZWVwT2Zmc2V0ICE9PSB0cnVlO1xuICAgICAgICB2YXIgbSA9IHV0YyA/IHRoaXMuY2xvbmUoKS51dGMoKSA6IHRoaXM7XG4gICAgICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgICAgICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB+NTB4IGZhc3RlciwgdXNlIGl0IHdoZW4gd2UgY2FuXG4gICAgICAgICAgICBpZiAodXRjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpICsgdGhpcy51dGNPZmZzZXQoKSAqIDYwICogMTAwMCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKCdaJywgZm9ybWF0TW9tZW50KG0sICdaJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQobSwgdXRjID8gJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBtb21lbnQgdGhhdCBjYW5cbiAgICAgKiBhbHNvIGJlIGV2YWx1YXRlZCB0byBnZXQgYSBuZXcgbW9tZW50IHdoaWNoIGlzIHRoZSBzYW1lXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL25vZGVqcy5vcmcvZGlzdC9sYXRlc3QvZG9jcy9hcGkvdXRpbC5odG1sI3V0aWxfY3VzdG9tX2luc3BlY3RfZnVuY3Rpb25fb25fb2JqZWN0c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jID0gJ21vbWVudCc7XG4gICAgICAgIHZhciB6b25lID0gJyc7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2FsKCkpIHtcbiAgICAgICAgICAgIGZ1bmMgPSB0aGlzLnV0Y09mZnNldCgpID09PSAwID8gJ21vbWVudC51dGMnIDogJ21vbWVudC5wYXJzZVpvbmUnO1xuICAgICAgICAgICAgem9uZSA9ICdaJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJlZml4ID0gJ1snICsgZnVuYyArICcoXCJdJztcbiAgICAgICAgdmFyIHllYXIgPSAoMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5KSA/ICdZWVlZJyA6ICdZWVlZWVknO1xuICAgICAgICB2YXIgZGF0ZXRpbWUgPSAnLU1NLUREW1RdSEg6bW06c3MuU1NTJztcbiAgICAgICAgdmFyIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdCAoaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSB0aGlzLmlzVXRjKCkgPyBob29rcy5kZWZhdWx0Rm9ybWF0VXRjIDogaG9va3MuZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7dG86IHRoaXMsIGZyb206IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG8gKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHxcbiAgICAgICAgICAgICAgICAgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHtmcm9tOiB0aGlzLCB0bzogdGltZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIC8vIElmIHBhc3NlZCBhIGxvY2FsZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsb2NhbGUgZm9yIHRoaXNcbiAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxvY2FsZSBjb25maWd1cmF0aW9uXG4gICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGxvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBuZXdMb2NhbGVEYXRhO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGFydE9mICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggaW50ZW50aW9uYWxseSBvbWl0cyBicmVhayBrZXl3b3Jkc1xuICAgICAgICAvLyB0byB1dGlsaXplIGZhbGxpbmcgdGhyb3VnaCB0aGUgY2FzZXMuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRoaXMubW9udGgoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlKDEpO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlY29uZHMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlZWtzIGFyZSBhIHNwZWNpYWwgY2FzZVxuICAgICAgICBpZiAodW5pdHMgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgdGhpcy53ZWVrZGF5KDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ2lzb1dlZWsnKSB7XG4gICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWFydGVycyBhcmUgYWxzbyBzcGVjaWFsXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ3F1YXJ0ZXInKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoKE1hdGguZmxvb3IodGhpcy5tb250aCgpIC8gMykgKiAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJ2RhdGUnIGlzIGFuIGFsaWFzIGZvciAnZGF5Jywgc28gaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgc3VjaC5cbiAgICAgICAgaWYgKHVuaXRzID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHVuaXRzID0gJ2RheSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXRzKS5hZGQoMSwgKHVuaXRzID09PSAnaXNvV2VlaycgPyAnd2VlaycgOiB1bml0cykpLnN1YnRyYWN0KDEsICdtcycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlT2YgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZC52YWx1ZU9mKCkgLSAoKHRoaXMuX29mZnNldCB8fCAwKSAqIDYwMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bml4ICgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0RhdGUgKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvQXJyYXkgKCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbbS55ZWFyKCksIG0ubW9udGgoKSwgbS5kYXRlKCksIG0uaG91cigpLCBtLm1pbnV0ZSgpLCBtLnNlY29uZCgpLCBtLm1pbGxpc2Vjb25kKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvT2JqZWN0ICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMiAoKSB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNpbmdGbGFncyAoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIGdldFBhcnNpbmdGbGFncyh0aGlzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52YWxpZEF0ICgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNpbmdGbGFncyh0aGlzKS5vdmVyZmxvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3RcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ2dnJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnR0cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1llYXJGb3JtYXRUb2tlbiAodG9rZW4sIGdldHRlcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbigwLCBbdG9rZW4sIHRva2VuLmxlbmd0aF0sIDAsIGdldHRlcik7XG4gICAgfVxuXG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZycsICAgICAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnZycsICAgICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0cnLCAgJ2lzb1dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHR0cnLCAnaXNvV2Vla1llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2Vla1llYXInLCAnZ2cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtZZWFyJywgJ0dHJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrWWVhcicsIDEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla1llYXInLCAxKTtcblxuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRycsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2cnLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0cnLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2dnJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2dnZycsICdnZ2dnZycsICdHR0dHJywgJ0dHR0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMud2VlaygpLFxuICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheSgpLFxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLmlzb1dlZWsoKSwgdGhpcy5pc29XZWVrZGF5KCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5ZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luWWVhciAoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhckhlbHBlcihpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIodGhpcywgZG93LCBkb3kpLnllYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgICAgICBpZiAod2VlayA+IHdlZWtzVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNldFdlZWtBbGwuY2FsbCh0aGlzLCBpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0V2Vla0FsbCh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgICAgIHRoaXMueWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdRJywgMCwgJ1FvJywgJ3F1YXJ0ZXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygncXVhcnRlcicsICdRJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdxdWFydGVyJywgNyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMykgOiB0aGlzLm1vbnRoKChpbnB1dCAtIDEpICogMyArIHRoaXMubW9udGgoKSAlIDMpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXRlJywgJ0QnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXRlJywgOSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignREQnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/XG4gICAgICAgICAgKGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZSB8fCBsb2NhbGUuX29yZGluYWxQYXJzZSkgOlxuICAgICAgICAgIGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQ7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnRCcsICdERCddLCBEQVRFKTtcbiAgICBhZGRQYXJzZVRva2VuKCdEbycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbREFURV0gPSB0b0ludChpbnB1dC5tYXRjaChtYXRjaDF0bzIpWzBdKTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXREYXlPZk1vbnRoID0gbWFrZUdldFNldCgnRGF0ZScsIHRydWUpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0RERCcsIFsnRERERCcsIDNdLCAnREREbycsICdkYXlPZlllYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF5T2ZZZWFyJywgJ0RERCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheU9mWWVhcicsIDQpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgIG1hdGNoMXRvMyk7XG4gICAgYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mWWVhciAoaW5wdXQpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhciA9IE1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTUpICsgMTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZCgoaW5wdXQgLSBkYXlPZlllYXIpLCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdtJywgWydtbScsIDJdLCAwLCAnbWludXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbnV0ZScsICdtJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaW51dGUnLCAxNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdtJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignbW0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ20nLCAnbW0nXSwgTUlOVVRFKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaW51dGUgPSBtYWtlR2V0U2V0KCdNaW51dGVzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3MnLCBbJ3NzJywgMl0sIDAsICdzZWNvbmQnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnc2Vjb25kJywgJ3MnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3NlY29uZCcsIDE1KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3MnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTJywgM10sIDAsICdtaWxsaXNlY29uZCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xuICAgIH0pO1xuXG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbGxpc2Vjb25kJywgJ21zJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaWxsaXNlY29uZCcsIDE2KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1MnLCAgICBtYXRjaDF0bzMsIG1hdGNoMSk7XG4gICAgYWRkUmVnZXhUb2tlbignU1MnLCAgIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCAgbWF0Y2gxdG8zLCBtYXRjaDMpO1xuXG4gICAgdmFyIHRva2VuO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWlsbGlzZWNvbmQgPSBtYWtlR2V0U2V0KCdNaWxsaXNlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigneicsICAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRab25lTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZScgOiAnJztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8gPSBNb21lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8uYWRkICAgICAgICAgICAgICAgPSBhZGQ7XG4gICAgcHJvdG8uY2FsZW5kYXIgICAgICAgICAgPSBjYWxlbmRhciQxO1xuICAgIHByb3RvLmNsb25lICAgICAgICAgICAgID0gY2xvbmU7XG4gICAgcHJvdG8uZGlmZiAgICAgICAgICAgICAgPSBkaWZmO1xuICAgIHByb3RvLmVuZE9mICAgICAgICAgICAgID0gZW5kT2Y7XG4gICAgcHJvdG8uZm9ybWF0ICAgICAgICAgICAgPSBmb3JtYXQ7XG4gICAgcHJvdG8uZnJvbSAgICAgICAgICAgICAgPSBmcm9tO1xuICAgIHByb3RvLmZyb21Ob3cgICAgICAgICAgID0gZnJvbU5vdztcbiAgICBwcm90by50byAgICAgICAgICAgICAgICA9IHRvO1xuICAgIHByb3RvLnRvTm93ICAgICAgICAgICAgID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ICAgICAgICAgICAgICAgPSBzdHJpbmdHZXQ7XG4gICAgcHJvdG8uaW52YWxpZEF0ICAgICAgICAgPSBpbnZhbGlkQXQ7XG4gICAgcHJvdG8uaXNBZnRlciAgICAgICAgICAgPSBpc0FmdGVyO1xuICAgIHByb3RvLmlzQmVmb3JlICAgICAgICAgID0gaXNCZWZvcmU7XG4gICAgcHJvdG8uaXNCZXR3ZWVuICAgICAgICAgPSBpc0JldHdlZW47XG4gICAgcHJvdG8uaXNTYW1lICAgICAgICAgICAgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciAgICAgPSBpc1NhbWVPckFmdGVyO1xuICAgIHByb3RvLmlzU2FtZU9yQmVmb3JlICAgID0gaXNTYW1lT3JCZWZvcmU7XG4gICAgcHJvdG8uaXNWYWxpZCAgICAgICAgICAgPSBpc1ZhbGlkJDI7XG4gICAgcHJvdG8ubGFuZyAgICAgICAgICAgICAgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSAgICAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvLmxvY2FsZURhdGEgICAgICAgID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggICAgICAgICAgICAgICA9IHByb3RvdHlwZU1heDtcbiAgICBwcm90by5taW4gICAgICAgICAgICAgICA9IHByb3RvdHlwZU1pbjtcbiAgICBwcm90by5wYXJzaW5nRmxhZ3MgICAgICA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgICAgICAgICAgICAgICA9IHN0cmluZ1NldDtcbiAgICBwcm90by5zdGFydE9mICAgICAgICAgICA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgICAgICAgICAgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ICAgICAgICAgICA9IHRvQXJyYXk7XG4gICAgcHJvdG8udG9PYmplY3QgICAgICAgICAgPSB0b09iamVjdDtcbiAgICBwcm90by50b0RhdGUgICAgICAgICAgICA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyAgICAgICA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgICAgICAgICAgID0gaW5zcGVjdDtcbiAgICBwcm90by50b0pTT04gICAgICAgICAgICA9IHRvSlNPTjtcbiAgICBwcm90by50b1N0cmluZyAgICAgICAgICA9IHRvU3RyaW5nO1xuICAgIHByb3RvLnVuaXggICAgICAgICAgICAgID0gdW5peDtcbiAgICBwcm90by52YWx1ZU9mICAgICAgICAgICA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhICAgICAgPSBjcmVhdGlvbkRhdGE7XG4gICAgcHJvdG8ueWVhciAgICAgICA9IGdldFNldFllYXI7XG4gICAgcHJvdG8uaXNMZWFwWWVhciA9IGdldElzTGVhcFllYXI7XG4gICAgcHJvdG8ud2Vla1llYXIgICAgPSBnZXRTZXRXZWVrWWVhcjtcbiAgICBwcm90by5pc29XZWVrWWVhciA9IGdldFNldElTT1dlZWtZZWFyO1xuICAgIHByb3RvLnF1YXJ0ZXIgPSBwcm90by5xdWFydGVycyA9IGdldFNldFF1YXJ0ZXI7XG4gICAgcHJvdG8ubW9udGggICAgICAgPSBnZXRTZXRNb250aDtcbiAgICBwcm90by5kYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoO1xuICAgIHByb3RvLndlZWsgICAgICAgICAgID0gcHJvdG8ud2Vla3MgICAgICAgID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrICAgICAgICA9IHByb3RvLmlzb1dlZWtzICAgICA9IGdldFNldElTT1dlZWs7XG4gICAgcHJvdG8ud2Vla3NJblllYXIgICAgPSBnZXRXZWVrc0luWWVhcjtcbiAgICBwcm90by5pc29XZWVrc0luWWVhciA9IGdldElTT1dlZWtzSW5ZZWFyO1xuICAgIHByb3RvLmRhdGUgICAgICAgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSAgICAgICAgPSBwcm90by5kYXlzICAgICAgICAgICAgID0gZ2V0U2V0RGF5T2ZXZWVrO1xuICAgIHByb3RvLndlZWtkYXkgICAgPSBnZXRTZXRMb2NhbGVEYXlPZldlZWs7XG4gICAgcHJvdG8uaXNvV2Vla2RheSA9IGdldFNldElTT0RheU9mV2VlaztcbiAgICBwcm90by5kYXlPZlllYXIgID0gZ2V0U2V0RGF5T2ZZZWFyO1xuICAgIHByb3RvLmhvdXIgPSBwcm90by5ob3VycyA9IGdldFNldEhvdXI7XG4gICAgcHJvdG8ubWludXRlID0gcHJvdG8ubWludXRlcyA9IGdldFNldE1pbnV0ZTtcbiAgICBwcm90by5zZWNvbmQgPSBwcm90by5zZWNvbmRzID0gZ2V0U2V0U2Vjb25kO1xuICAgIHByb3RvLm1pbGxpc2Vjb25kID0gcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgcHJvdG8udXRjT2Zmc2V0ICAgICAgICAgICAgPSBnZXRTZXRPZmZzZXQ7XG4gICAgcHJvdG8udXRjICAgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldDtcbiAgICBwcm90by5oYXNBbGlnbmVkSG91ck9mZnNldCA9IGhhc0FsaWduZWRIb3VyT2Zmc2V0O1xuICAgIHByb3RvLmlzRFNUICAgICAgICAgICAgICAgID0gaXNEYXlsaWdodFNhdmluZ1RpbWU7XG4gICAgcHJvdG8uaXNMb2NhbCAgICAgICAgICAgICAgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ICAgICAgICAgID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgICAgICAgICAgICAgICAgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyAgPSBkZXByZWNhdGUoJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJywgZ2V0U2V0RGF5T2ZNb250aCk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKCdtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQnLCBnZXRTZXRNb250aCk7XG4gICAgcHJvdG8ueWVhcnMgID0gZGVwcmVjYXRlKCd5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkJywgZ2V0U2V0WWVhcik7XG4gICAgcHJvdG8uem9uZSAgID0gZGVwcmVjYXRlKCdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsIGdldFNldFpvbmUpO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZSgnaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVbml4IChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYXJzZVpvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVQYXJzZVBvc3RGb3JtYXQgKHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHZhciBwcm90byQxID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDEuY2FsZW5kYXIgICAgICAgID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCAgPSBsb25nRGF0ZUZvcm1hdDtcbiAgICBwcm90byQxLmludmFsaWREYXRlICAgICA9IGludmFsaWREYXRlO1xuICAgIHByb3RvJDEub3JkaW5hbCAgICAgICAgID0gb3JkaW5hbDtcbiAgICBwcm90byQxLnByZXBhcnNlICAgICAgICA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnBvc3Rmb3JtYXQgICAgICA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnJlbGF0aXZlVGltZSAgICA9IHJlbGF0aXZlVGltZTtcbiAgICBwcm90byQxLnBhc3RGdXR1cmUgICAgICA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgICAgICAgICAgICAgPSBzZXQ7XG5cbiAgICBwcm90byQxLm1vbnRocyAgICAgICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1Nob3J0O1xuICAgIHByb3RvJDEubW9udGhzUGFyc2UgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzUGFyc2U7XG4gICAgcHJvdG8kMS5tb250aHNSZWdleCAgICAgICA9IG1vbnRoc1JlZ2V4O1xuICAgIHByb3RvJDEubW9udGhzU2hvcnRSZWdleCAgPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgICAgICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXM7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pbiAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c01pbjtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnQgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzU2hvcnQ7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1BhcnNlICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ICAgICAgID0gICAgICAgIHdlZWtkYXlzUmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0UmVnZXggID0gICAgICAgIHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggICAgPSAgICAgICAgd2Vla2RheXNNaW5SZWdleDtcblxuICAgIHByb3RvJDEuaXNQTSA9IGxvY2FsZUlzUE07XG4gICAgcHJvdG8kMS5tZXJpZGllbSA9IGxvY2FsZU1lcmlkaWVtO1xuXG4gICAgZnVuY3Rpb24gZ2V0JDEgKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpO1xuICAgICAgICB2YXIgdXRjID0gY3JlYXRlVVRDKCkuc2V0KHNldHRlciwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbG9jYWxlW2ZpZWxkXSh1dGMsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc0ltcGwgKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlU29ydGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBsb2NhbGVTb3J0ZWQ7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGxvY2FsZVNvcnRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgc2hpZnQgPSBsb2NhbGVTb3J0ZWQgPyBsb2NhbGUuX3dlZWsuZG93IDogMDtcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgKGluZGV4ICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgKGkgKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRocyAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRocycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNTaG9ydCAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNTaG9ydCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNNaW4gKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSh0aHxzdHxuZHxyZCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodG9JbnQobnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgaG9va3MubGFuZyA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4nLCBnZXRTZXRHbG9iYWxMb2NhbGUpO1xuICAgIGhvb2tzLmxhbmdEYXRhID0gZGVwcmVjYXRlKCdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJywgZ2V0TG9jYWxlKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMgKCkge1xuICAgICAgICB2YXIgZGF0YSAgICAgICAgICAgPSB0aGlzLl9kYXRhO1xuXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9IG1hdGhBYnModGhpcy5fbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgdGhpcy5fZGF5cyAgICAgICAgID0gbWF0aEFicyh0aGlzLl9kYXlzKTtcbiAgICAgICAgdGhpcy5fbW9udGhzICAgICAgID0gbWF0aEFicyh0aGlzLl9tb250aHMpO1xuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzICA9IG1hdGhBYnMoZGF0YS5taWxsaXNlY29uZHMpO1xuICAgICAgICBkYXRhLnNlY29uZHMgICAgICAgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgICAgIGRhdGEubWludXRlcyAgICAgICA9IG1hdGhBYnMoZGF0YS5taW51dGVzKTtcbiAgICAgICAgZGF0YS5ob3VycyAgICAgICAgID0gbWF0aEFicyhkYXRhLmhvdXJzKTtcbiAgICAgICAgZGF0YS5tb250aHMgICAgICAgID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgICAgIGRhdGEueWVhcnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS55ZWFycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QkMSAoZHVyYXRpb24sIGlucHV0LCB2YWx1ZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUR1cmF0aW9uKGlucHV0LCB2YWx1ZSk7XG5cbiAgICAgICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5fZGF5cyAgICAgICAgICs9IGRpcmVjdGlvbiAqIG90aGVyLl9kYXlzO1xuICAgICAgICBkdXJhdGlvbi5fbW9udGhzICAgICAgICs9IGRpcmVjdGlvbiAqIG90aGVyLl9tb250aHM7XG5cbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBhZGQoMSwgJ3MnKSBvciBhZGQoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gYWRkJDEgKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIDEpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gc3VidHJhY3QkMSAoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1YmJsZSAoKSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSB0aGlzLl9kYXlzO1xuICAgICAgICB2YXIgbW9udGhzICAgICAgID0gdGhpcy5fbW9udGhzO1xuICAgICAgICB2YXIgZGF0YSAgICAgICAgID0gdGhpcy5fZGF0YTtcbiAgICAgICAgdmFyIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycywgbW9udGhzRnJvbURheXM7XG5cbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIG1peCBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdmFsdWVzLCBidWJibGUgZG93biBmaXJzdFxuICAgICAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICAgICAgaWYgKCEoKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKSkpIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyAgICAgICAgICAgPSBhYnNGbG9vcihtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzICAgICAgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgICAgICA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyAgICAgICAgICAgICA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgICAgICAgID0gaG91cnMgJSAyNDtcblxuICAgICAgICBkYXlzICs9IGFic0Zsb29yKGhvdXJzIC8gMjQpO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgZGF5cyB0byBtb250aHNcbiAgICAgICAgbW9udGhzRnJvbURheXMgPSBhYnNGbG9vcihkYXlzVG9Nb250aHMoZGF5cykpO1xuICAgICAgICBtb250aHMgKz0gbW9udGhzRnJvbURheXM7XG4gICAgICAgIGRheXMgLT0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzRnJvbURheXMpKTtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cbiAgICAgICAgZGF0YS5kYXlzICAgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyAgPSB5ZWFycztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzVG9Nb250aHMgKGRheXMpIHtcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxMiBtb250aHMgPT09IDQ4MDBcbiAgICAgICAgcmV0dXJuIGRheXMgKiA0ODAwIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyAobW9udGhzKSB7XG4gICAgICAgIC8vIHRoZSByZXZlcnNlIG9mIGRheXNUb01vbnRoc1xuICAgICAgICByZXR1cm4gbW9udGhzICogMTQ2MDk3IC8gNDgwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcyAodW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cztcbiAgICAgICAgdmFyIG1vbnRocztcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgZGF5cyAgID0gdGhpcy5fZGF5cyAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICByZXR1cm4gdW5pdHMgPT09ICdtb250aCcgPyBtb250aHMgOiBtb250aHMgLyAxMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2VlaycgICA6IHJldHVybiBkYXlzIC8gNyAgICAgKyBtaWxsaXNlY29uZHMgLyA2MDQ4ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF5JyAgICA6IHJldHVybiBkYXlzICAgICAgICAgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdob3VyJyAgIDogcmV0dXJuIGRheXMgKiAyNCAgICArIG1pbGxpc2Vjb25kcyAvIDM2ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWludXRlJyA6IHJldHVybiBkYXlzICogMTQ0MCAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJyA6IHJldHVybiBkYXlzICogODY0MDAgKyBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgICAgICAgICAgICAgIC8vIE1hdGguZmxvb3IgcHJldmVudHMgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgaGVyZVxuICAgICAgICAgICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzogcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAqIDg2NGU1KSArIG1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdW5pdCAnICsgdW5pdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIHRoaXMuYXMoJ21zJyk/XG4gICAgZnVuY3Rpb24gdmFsdWVPZiQxICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHRoaXMuX2RheXMgKiA4NjRlNSArXG4gICAgICAgICAgICAodGhpcy5fbW9udGhzICUgMTIpICogMjU5MmU2ICtcbiAgICAgICAgICAgIHRvSW50KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTZcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQXMgKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcyhhbGlhcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGFzTWlsbGlzZWNvbmRzID0gbWFrZUFzKCdtcycpO1xuICAgIHZhciBhc1NlY29uZHMgICAgICA9IG1ha2VBcygncycpO1xuICAgIHZhciBhc01pbnV0ZXMgICAgICA9IG1ha2VBcygnbScpO1xuICAgIHZhciBhc0hvdXJzICAgICAgICA9IG1ha2VBcygnaCcpO1xuICAgIHZhciBhc0RheXMgICAgICAgICA9IG1ha2VBcygnZCcpO1xuICAgIHZhciBhc1dlZWtzICAgICAgICA9IG1ha2VBcygndycpO1xuICAgIHZhciBhc01vbnRocyAgICAgICA9IG1ha2VBcygnTScpO1xuICAgIHZhciBhc1llYXJzICAgICAgICA9IG1ha2VBcygneScpO1xuXG4gICAgZnVuY3Rpb24gY2xvbmUkMSAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQkMiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKTtcbiAgICB2YXIgc2Vjb25kcyAgICAgID0gbWFrZUdldHRlcignc2Vjb25kcycpO1xuICAgIHZhciBtaW51dGVzICAgICAgPSBtYWtlR2V0dGVyKCdtaW51dGVzJyk7XG4gICAgdmFyIGhvdXJzICAgICAgICA9IG1ha2VHZXR0ZXIoJ2hvdXJzJyk7XG4gICAgdmFyIGRheXMgICAgICAgICA9IG1ha2VHZXR0ZXIoJ2RheXMnKTtcbiAgICB2YXIgbW9udGhzICAgICAgID0gbWFrZUdldHRlcignbW9udGhzJyk7XG4gICAgdmFyIHllYXJzICAgICAgICA9IG1ha2VHZXR0ZXIoJ3llYXJzJyk7XG5cbiAgICBmdW5jdGlvbiB3ZWVrcyAoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQ7XG4gICAgdmFyIHRocmVzaG9sZHMgPSB7XG4gICAgICAgIHNzOiA0NCwgICAgICAgICAvLyBhIGZldyBzZWNvbmRzIHRvIHNlY29uZHNcbiAgICAgICAgcyA6IDQ1LCAgICAgICAgIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgIG0gOiA0NSwgICAgICAgICAvLyBtaW51dGVzIHRvIGhvdXJcbiAgICAgICAgaCA6IDIyLCAgICAgICAgIC8vIGhvdXJzIHRvIGRheVxuICAgICAgICBkIDogMjYsICAgICAgICAgLy8gZGF5cyB0byBtb250aFxuICAgICAgICBNIDogMTEgICAgICAgICAgLy8gbW9udGhzIHRvIHllYXJcbiAgICB9O1xuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBtb21lbnQuZm4uZnJvbSwgbW9tZW50LmZuLmZyb21Ob3csIGFuZCBtb21lbnQuZHVyYXRpb24uZm4uaHVtYW5pemVcbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlVGltZUFnbyhzdHJpbmcsIG51bWJlciwgd2l0aG91dFN1ZmZpeCwgaXNGdXR1cmUsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLnJlbGF0aXZlVGltZShudW1iZXIgfHwgMSwgISF3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUkMSAocG9zTmVnRHVyYXRpb24sIHdpdGhvdXRTdWZmaXgsIGxvY2FsZSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCk7XG4gICAgICAgIHZhciBzZWNvbmRzICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpO1xuICAgICAgICB2YXIgbWludXRlcyAgPSByb3VuZChkdXJhdGlvbi5hcygnbScpKTtcbiAgICAgICAgdmFyIGhvdXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ2gnKSk7XG4gICAgICAgIHZhciBkYXlzICAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpO1xuICAgICAgICB2YXIgbW9udGhzICAgPSByb3VuZChkdXJhdGlvbi5hcygnTScpKTtcbiAgICAgICAgdmFyIHllYXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSk7XG5cbiAgICAgICAgdmFyIGEgPSBzZWNvbmRzIDw9IHRocmVzaG9sZHMuc3MgJiYgWydzJywgc2Vjb25kc10gIHx8XG4gICAgICAgICAgICAgICAgc2Vjb25kcyA8IHRocmVzaG9sZHMucyAgICYmIFsnc3MnLCBzZWNvbmRzXSB8fFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPD0gMSAgICAgICAgICAgICAmJiBbJ20nXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDwgdGhyZXNob2xkcy5tICAgJiYgWydtbScsIG1pbnV0ZXNdIHx8XG4gICAgICAgICAgICAgICAgaG91cnMgICA8PSAxICAgICAgICAgICAgICYmIFsnaCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPCB0aHJlc2hvbGRzLmggICAmJiBbJ2hoJywgaG91cnNdICAgfHxcbiAgICAgICAgICAgICAgICBkYXlzICAgIDw9IDEgICAgICAgICAgICAgJiYgWydkJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8IHRocmVzaG9sZHMuZCAgICYmIFsnZGQnLCBkYXlzXSAgICB8fFxuICAgICAgICAgICAgICAgIG1vbnRocyAgPD0gMSAgICAgICAgICAgICAmJiBbJ00nXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDwgdGhyZXNob2xkcy5NICAgJiYgWydNTScsIG1vbnRoc10gIHx8XG4gICAgICAgICAgICAgICAgeWVhcnMgICA8PSAxICAgICAgICAgICAgICYmIFsneSddICAgICAgICAgICB8fCBbJ3l5JywgeWVhcnNdO1xuXG4gICAgICAgIGFbMl0gPSB3aXRob3V0U3VmZml4O1xuICAgICAgICBhWzNdID0gK3Bvc05lZ0R1cmF0aW9uID4gMDtcbiAgICAgICAgYVs0XSA9IGxvY2FsZTtcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGVUaW1lQWdvLmFwcGx5KG51bGwsIGEpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgdGhlIHJvdW5kaW5nIGZ1bmN0aW9uIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVSb3VuZGluZyAocm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZihyb3VuZGluZ0Z1bmN0aW9uKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCAodGhyZXNob2xkLCBsaW1pdCkge1xuICAgICAgICBpZiAodGhyZXNob2xkc1t0aHJlc2hvbGRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZHNbdGhyZXNob2xkXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJlc2hvbGRzW3RocmVzaG9sZF0gPSBsaW1pdDtcbiAgICAgICAgaWYgKHRocmVzaG9sZCA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGRzLnNzID0gbGltaXQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGh1bWFuaXplICh3aXRoU3VmZml4KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICB2YXIgb3V0cHV0ID0gcmVsYXRpdmVUaW1lJDEodGhpcywgIXdpdGhTdWZmaXgsIGxvY2FsZSk7XG5cbiAgICAgICAgaWYgKHdpdGhTdWZmaXgpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGxvY2FsZS5wYXN0RnV0dXJlKCt0aGlzLCBvdXRwdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFicyQxID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBzaWduKHgpIHtcbiAgICAgICAgcmV0dXJuICgoeCA+IDApIC0gKHggPCAwKSkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMDtcbiAgICAgICAgdmFyIGRheXMgICAgICAgICA9IGFicyQxKHRoaXMuX2RheXMpO1xuICAgICAgICB2YXIgbW9udGhzICAgICAgID0gYWJzJDEodGhpcy5fbW9udGhzKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycztcblxuICAgICAgICAvLyAzNjAwIHNlY29uZHMgLT4gNjAgbWludXRlcyAtPiAxIGhvdXJcbiAgICAgICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyAgICAgICAgICAgICA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyAgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHZhciBZID0geWVhcnM7XG4gICAgICAgIHZhciBNID0gbW9udGhzO1xuICAgICAgICB2YXIgRCA9IGRheXM7XG4gICAgICAgIHZhciBoID0gaG91cnM7XG4gICAgICAgIHZhciBtID0gbWludXRlcztcbiAgICAgICAgdmFyIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcbiAgICAgICAgdmFyIHRvdGFsID0gdGhpcy5hc1NlY29uZHMoKTtcblxuICAgICAgICBpZiAoIXRvdGFsKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzYW1lIGFzIEMjJ3MgKE5vZGEpIGFuZCBweXRob24gKGlzb2RhdGUpLi4uXG4gICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgICAgICByZXR1cm4gJ1AwRCc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG90YWxTaWduID0gdG90YWwgPCAwID8gJy0nIDogJyc7XG4gICAgICAgIHZhciB5bVNpZ24gPSBzaWduKHRoaXMuX21vbnRocykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIHZhciBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIHZhciBobXNTaWduID0gc2lnbih0aGlzLl9taWxsaXNlY29uZHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuXG4gICAgICAgIHJldHVybiB0b3RhbFNpZ24gKyAnUCcgK1xuICAgICAgICAgICAgKFkgPyB5bVNpZ24gKyBZICsgJ1knIDogJycpICtcbiAgICAgICAgICAgIChNID8geW1TaWduICsgTSArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoRCA/IGRheXNTaWduICsgRCArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoKGggfHwgbSB8fCBzKSA/ICdUJyA6ICcnKSArXG4gICAgICAgICAgICAoaCA/IGhtc1NpZ24gKyBoICsgJ0gnIDogJycpICtcbiAgICAgICAgICAgIChtID8gaG1zU2lnbiArIG0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKHMgPyBobXNTaWduICsgcyArICdTJyA6ICcnKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCAgICAgICAgPSBpc1ZhbGlkJDE7XG4gICAgcHJvdG8kMi5hYnMgICAgICAgICAgICA9IGFicztcbiAgICBwcm90byQyLmFkZCAgICAgICAgICAgID0gYWRkJDE7XG4gICAgcHJvdG8kMi5zdWJ0cmFjdCAgICAgICA9IHN1YnRyYWN0JDE7XG4gICAgcHJvdG8kMi5hcyAgICAgICAgICAgICA9IGFzO1xuICAgIHByb3RvJDIuYXNNaWxsaXNlY29uZHMgPSBhc01pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLmFzU2Vjb25kcyAgICAgID0gYXNTZWNvbmRzO1xuICAgIHByb3RvJDIuYXNNaW51dGVzICAgICAgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzICAgICAgICA9IGFzSG91cnM7XG4gICAgcHJvdG8kMi5hc0RheXMgICAgICAgICA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgICAgICAgID0gYXNXZWVrcztcbiAgICBwcm90byQyLmFzTW9udGhzICAgICAgID0gYXNNb250aHM7XG4gICAgcHJvdG8kMi5hc1llYXJzICAgICAgICA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mICAgICAgICA9IHZhbHVlT2YkMTtcbiAgICBwcm90byQyLl9idWJibGUgICAgICAgID0gYnViYmxlO1xuICAgIHByb3RvJDIuY2xvbmUgICAgICAgICAgPSBjbG9uZSQxO1xuICAgIHByb3RvJDIuZ2V0ICAgICAgICAgICAgPSBnZXQkMjtcbiAgICBwcm90byQyLm1pbGxpc2Vjb25kcyAgID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyAgICAgICAgPSBzZWNvbmRzO1xuICAgIHByb3RvJDIubWludXRlcyAgICAgICAgPSBtaW51dGVzO1xuICAgIHByb3RvJDIuaG91cnMgICAgICAgICAgPSBob3VycztcbiAgICBwcm90byQyLmRheXMgICAgICAgICAgID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzICAgICAgICAgID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgICAgICAgICA9IG1vbnRocztcbiAgICBwcm90byQyLnllYXJzICAgICAgICAgID0geWVhcnM7XG4gICAgcHJvdG8kMi5odW1hbml6ZSAgICAgICA9IGh1bWFuaXplO1xuICAgIHByb3RvJDIudG9JU09TdHJpbmcgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9TdHJpbmcgICAgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9KU09OICAgICAgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIubG9jYWxlICAgICAgICAgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhICAgICA9IGxvY2FsZURhdGE7XG5cbiAgICBwcm90byQyLnRvSXNvU3RyaW5nID0gZGVwcmVjYXRlKCd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsIHRvSVNPU3RyaW5nJDEpO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCwgMTApICogMTAwMCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbigneCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSh0b0ludChpbnB1dCkpO1xuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMjIuMSc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gICAgICAgICAgICAgICAgICAgID0gcHJvdG87XG4gICAgaG9va3MubWluICAgICAgICAgICAgICAgICAgID0gbWluO1xuICAgIGhvb2tzLm1heCAgICAgICAgICAgICAgICAgICA9IG1heDtcbiAgICBob29rcy5ub3cgICAgICAgICAgICAgICAgICAgPSBub3c7XG4gICAgaG9va3MudXRjICAgICAgICAgICAgICAgICAgID0gY3JlYXRlVVRDO1xuICAgIGhvb2tzLnVuaXggICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzICAgICAgICAgICAgICAgID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgICAgICAgICAgICAgICAgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlICAgICAgICAgICAgICAgID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgICAgICAgICAgICAgICA9IGNyZWF0ZUludmFsaWQ7XG4gICAgaG9va3MuZHVyYXRpb24gICAgICAgICAgICAgID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgICAgICAgICAgICAgID0gaXNNb21lbnQ7XG4gICAgaG9va3Mud2Vla2RheXMgICAgICAgICAgICAgID0gbGlzdFdlZWtkYXlzO1xuICAgIGhvb2tzLnBhcnNlWm9uZSAgICAgICAgICAgICA9IGNyZWF0ZUluWm9uZTtcbiAgICBob29rcy5sb2NhbGVEYXRhICAgICAgICAgICAgPSBnZXRMb2NhbGU7XG4gICAgaG9va3MuaXNEdXJhdGlvbiAgICAgICAgICAgID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCAgICAgICAgICAgPSBsaXN0TW9udGhzU2hvcnQ7XG4gICAgaG9va3Mud2Vla2RheXNNaW4gICAgICAgICAgID0gbGlzdFdlZWtkYXlzTWluO1xuICAgIGhvb2tzLmRlZmluZUxvY2FsZSAgICAgICAgICA9IGRlZmluZUxvY2FsZTtcbiAgICBob29rcy51cGRhdGVMb2NhbGUgICAgICAgICAgPSB1cGRhdGVMb2NhbGU7XG4gICAgaG9va3MubG9jYWxlcyAgICAgICAgICAgICAgID0gbGlzdExvY2FsZXM7XG4gICAgaG9va3Mud2Vla2RheXNTaG9ydCAgICAgICAgID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgICAgICAgID0gbm9ybWFsaXplVW5pdHM7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lUm91bmRpbmcgID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lVGhyZXNob2xkID0gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkO1xuICAgIGhvb2tzLmNhbGVuZGFyRm9ybWF0ICAgICAgICA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSAgICAgICAgICAgICA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9NUzogJ1lZWVktTU0tRERUSEg6bW06c3MuU1NTJywgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJkYXRlXCIgLz5cbiAgICAgICAgVElNRTogJ0hIOm1tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgLz5cbiAgICAgICAgVElNRV9TRUNPTkRTOiAnSEg6bW06c3MnLCAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBUSU1FX01TOiAnSEg6bW06c3MuU1NTJywgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiBzdGVwPVwiMC4wMDFcIiAvPlxuICAgICAgICBXRUVLOiAnWVlZWS1bV11XVycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cIndlZWtcIiAvPlxuICAgICAgICBNT05USDogJ1lZWVktTU0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cIm1vbnRoXCIgLz5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGhvb2tzO1xuXG59KSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIE1haW4gZnVuY3Rpb24gYW5kIGVudHJ5IHBvaW50XG4gICAgQ2FuIGJlIHJlZ2lzdGVyZWQgdG8gYSB2aWRlb2pzIGluc3RhbmNlIGFzIGEgcGx1Z2luXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9ICh2aWRlb2pzKSA9PiB7XG4gICAgcmVxdWlyZSgnLi9saWIvcG9seWZpbGxzJyk7XG5cbiAgICBjb25zdCBQbHVnaW4gPSB2aWRlb2pzLmdldFBsdWdpbigncGx1Z2luJyksXG4gICAgICAgICAgVXRpbHMgPSByZXF1aXJlKCcuL2xpYi91dGlscycpLFxuICAgICAgICAgIENvbnRyb2xzID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9jb250cm9sc1wiKSxcbiAgICAgICAgICBBbm5vdGF0aW9uU3RhdGUgPSByZXF1aXJlKFwiLi9jb21wb25lbnRzL2Fubm90YXRpb25fc3RhdGVcIiksXG4gICAgICAgICAgRXZlbnREaXNwYXRjaGVyID0gcmVxdWlyZShcIi4vbGliL2V2ZW50X2Rpc3BhdGNoZXJcIik7XG5cbiAgICBjb25zdCBERUZBVUxUX09QVElPTlMgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYmluZEFycm93S2V5czogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIG1ldGE6ICAgICAgICAgICAgICAgICAgICAgICB7IHVzZXJfaWQ6IG51bGwsIHVzZXJfbmFtZTogbnVsbCB9LFxuICAgICAgICBhbm5vdGF0aW9uc09iamVjdHM6ICAgICAgICAgW10sXG4gICAgICAgIHNob3dDb250cm9sczogICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBzaG93Q29tbWVudExpc3Q6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc2hvd0Z1bGxTY3JlZW46ICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHNob3dNYXJrZXJTaGFwZUFuZFRvb2x0aXBzOiB0cnVlLFxuICAgICAgICBpbnRlcm5hbENvbW1lbnRpbmc6ICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc3RhcnRJbkFubm90YXRpb25Nb2RlOiAgICAgIGZhbHNlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2xhc3MgQW5ub3RhdGlvbkNvbW1lbnRzIGV4dGVuZHMgUGx1Z2luIHtcblxuICAgICAgICBjb25zdHJ1Y3RvciAocGxheWVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihVdGlscy5jbG9uZU9iamVjdChERUZBVUxUX09QVElPTlMpLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcih0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLnJlZ2lzdGVyTGlzdGVuZXJzRm9yKHRoaXMsICdBbm5vdGF0aW9uQ29tbWVudHMnKTtcblxuICAgICAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgICAgICAgICB0aGlzLm1ldGEgPSBvcHRpb25zLm1ldGE7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhbGxiYWNrcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBBc3NpZ24gcmVmZXJlbmNlIHRvIHRoaXMgY2xhc3MgdG8gcGxheWVyIGZvciBhY2Nlc3MgbGF0ZXIgYnkgY29tcG9uZW50cyB3aGVyZSBuZWVkZWRcbiAgICAgICAgICAgIHBsYXllci5hbm5vdGF0aW9uQ29tbWVudHMgPSAoKCkgPT4geyByZXR1cm4gdGhpcyB9KS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCBjb21wb25lbnRzIGFyZSBpbml0aWFsaXplZCBBRlRFUiBtZXRhZGF0YSArIHBsYXkgZGF0YSBpcyBsb2FkZWQgc28gd2UgbWV0YWRhdGEvZHVyYXRpb25cbiAgICAgICAgICAgIC8vIE5PVEUgLSB0aGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgcGxheWVyIGxvYWRlZGRhdGEgZG9lc24ndCBhbHdheXMgZmlyZSBpZiByZWFkeXN0YXRlIGlzID4gM1xuICAgICAgICAgICAgaWYocGxheWVyLnJlYWR5U3RhdGUoKSA+PSAzKXtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3RMb2FkRGF0YUNvbnN0cnVjdG9yKCk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBwbGF5ZXIub24oJ2xvYWRlZGRhdGEnLCB0aGlzLnBvc3RMb2FkRGF0YUNvbnN0cnVjdG9yLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBpbml0L3NldHVwIGFmdGVyIHZpZGVvIGRhdGEgKyBtZXRhZGF0YSBpcyBhdmFpbGFibGVcbiAgICAgICAgcG9zdExvYWREYXRhQ29uc3RydWN0b3IgKCkge1xuICAgICAgICAgICAgLy8gc2V0dXAgaW5pdGlhbCBzdGF0ZSBhbmQgcmVuZGVyIFVJXG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdGF0ZSA9IG5ldyBBbm5vdGF0aW9uU3RhdGUodGhpcy5wbGF5ZXIpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RhdGUuYW5ub3RhdGlvbnMgPSB0aGlzLm9wdGlvbnMuYW5ub3RhdGlvbnNPYmplY3RzO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0gbmV3IENvbnRyb2xzKHRoaXMucGxheWVyLCB0aGlzLm9wdGlvbnMuYmluZEFycm93S2V5cyk7XG4gICAgICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Qm91bmRzKGZhbHNlKTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdGFydEluQW5ub3RhdGlvbk1vZGUpIHRoaXMudG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcblxuICAgICAgICAgICAgdGhpcy5wbHVnaW5SZWFkeSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCBuZWVkZWQgZXZlbnRzIGZvciBpbnRlcmFjdGlvbiB3LyBjb21wb25lbnRzXG4gICAgICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICAgICAgLy8gU2V0IHBsYXllciBib3VuZGFyaWVzIG9uIHdpbmRvdyBzaXplIGNoYW5nZSBvciBmdWxsc2NyZWVuIGNoYW5nZVxuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUudmFjLXdpbmRvdy1yZXNpemUnLCBVdGlscy50aHJvdHRsZSh0aGlzLnNldEJvdW5kcy5iaW5kKHRoaXMpLCA1MDApKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgVXRpbHMudGhyb3R0bGUodGhpcy5zZXRCb3VuZHMuYmluZCh0aGlzKSwgNTAwKSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uIGZlYXR1cmVzIG9uIGZ1bGxzY3JlZW4gaWYgc2hvd0Z1bGxTY3JlZW46IGZhbHNlXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaG93RnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmlzRnVsbHNjcmVlbl8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlRnVsbHNjcmVlbkFubm90YXRpb25zRW5hYmxlZCA9IHRoaXMuYWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5hZGRDbGFzcygndmFjLWRpc2FibGUtZnVsbHNjcmVlbicpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5yZW1vdmVDbGFzcygndmFjLWRpc2FibGUtZnVsbHNjcmVlbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMucHJlRnVsbHNjcmVlbkFubm90YXRpb25zRW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZXZpb3VzbHkgaW4gYW5ub3RhdGlvbiBtb2RlIChwcmUtZnVsbHNjcmVlbikgb3IgZW50ZXJpbmcgZnVsbHNjcmVlZW4gYW5kIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYW5ub3RhdGlvbiBtb2RlLCB0b2dnbGUgdGhlIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSB3cmFwcGVyIGZ1bmMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdXNlIEV2ZW50RGlzcGF0Y2hlciBmcm9tIHRoZSBjbGllbnRcbiAgICAgICAgLy8gRXg6IHBsdWdpbi5maXJlKHR5cGUsIGRhdGEpO1xuICAgICAgICBmaXJlICh0eXBlLCBkYXRhPXt9KSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5maXJlKHR5cGUsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG9nZ2xlIGFubm90YXRpb25zIG1vZGUgb24vb2ZmXG4gICAgICAgIHRvZ2dsZUFubm90YXRpb25Nb2RlKCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG4gICAgICAgICAgICB0aGlzLnBsYXllci50b2dnbGVDbGFzcygndmFjLWFjdGl2ZScpOyAvLyBUb2dnbGUgZ2xvYmFsIGNsYXNzIHRvIHBsYXllciB0byB0b2dnbGUgZGlzcGxheSBvZiBlbGVtZW50c1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RhdGUuZW5hYmxlZCA9IHRoaXMuYWN0aXZlO1xuXG4gICAgICAgICAgICBpZih0aGlzLmFjdGl2ZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKFwiYW5ub3RhdGlvbk1vZGVFbmFibGVkXCIpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKFwiYW5ub3RhdGlvbk1vZGVEaXNhYmxlZFwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgY29udHJvbCBjb21wb25lbnQgVUkgaWYgc2hvd0NvbnRyb2xzOiB0cnVlXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuc2hvd0NvbnRyb2xzKXtcbiAgICAgICAgICAgICAgICBpZighdGhpcy5hY3RpdmUpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnJlbmRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBwbGF5ZXIgVUkgYm91bmRhcmllc1xuICAgICAgICBzZXRCb3VuZHMgKHRyaWdnZXJDaGFuZ2U9dHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSB7fTtcbiAgICAgICAgICAgIGxldCAkcGxheWVyID0gJCh0aGlzLnBsYXllci5lbCgpKSxcbiAgICAgICAgICAgICAgICAkY3RybHMgID0gJHBsYXllci5maW5kKCcudmpzLWNvbnRyb2wtYmFyJyk7XG5cbiAgICAgICAgICAgIHRoaXMuYm91bmRzLmxlZnQgPSAkcGxheWVyLm9mZnNldCgpLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy50b3AgPSAkcGxheWVyLm9mZnNldCgpLnRvcDtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzLnJpZ2h0ID0gdGhpcy5ib3VuZHMubGVmdCArICRwbGF5ZXIud2lkdGgoKTtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzLmJvdHRvbSA9IHRoaXMuYm91bmRzLnRvcCArICRwbGF5ZXIuaGVpZ2h0KCk7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5ib3R0b21XaXRob3V0Q29udHJvbHMgPSB0aGlzLmJvdW5kcy5ib3R0b20gLSAkY3RybHMuaGVpZ2h0KCk7XG5cbiAgICAgICAgICAgIC8vIGZpcmVzIGFuIGV2ZW50IHdoZW4gYm91bmRzIGhhdmUgY2hhbmdlZCBkdXJpbmcgcmVzaXppbmdcbiAgICAgICAgICAgIGlmKHRyaWdnZXJDaGFuZ2UpIHRoaXMuZmlyZSgncGxheWVyQm91bmRzQ2hhbmdlZCcsIHRoaXMuYm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFB1YmxpYyBmdW5jdGlvbiB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZvciB3aGVuIHBsdWdpbiBpcyByZWFkeVxuICAgICAgICBvblJlYWR5IChjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYodGhpcy5ldmVudERpc3BhdGNoZXIucGx1Z2luUmVhZHkpe1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVhZHlDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHBsdWdpbiBhcyByZWFkeSBhbmQgZmlyZSBhbnkgcGVuZGluZyBjYWxsYmFja3NcbiAgICAgICAgcGx1Z2luUmVhZHkgKCkge1xuICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIucGx1Z2luUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUodGhpcy5fcmVhZHlDYWxsYmFja3MubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkeUNhbGxiYWNrcy5wb3AoKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGVhcmRvd24gYWxsIGNvbXBvbmVudHMsIHJlbW92ZSBhbGwgbGlzdGVuZXJzLCBhbmQgcmVtb3ZlIGVsZW1lbnRzIGZyb20gRE9NXG4gICAgICAgIGRpc3Bvc2UgKCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scyA9IHRoaXMuY29udHJvbHMudGVhcmRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0YXRlID0gdGhpcy5hbm5vdGF0aW9uU3RhdGUudGVhcmRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gdGhpcy5ldmVudERpc3BhdGNoZXIudGVhcmRvd24oKTtcbiAgICAgICAgICAgIHRoaXMudGVhcmRvd24oKTtcbiAgICAgICAgICAgIGlmKHRoaXMucGxheWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIuYW5ub3RhdGlvbkNvbW1lbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAkKHRoaXMucGxheWVyLmVsKCkpLnJlbW92ZUNsYXNzKCd2YWMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5maW5kKFwiW2NsYXNzXj0ndmFjLSddXCIpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVhcmRvd24gKCkge1xuICAgICAgICAgICAgaWYodGhpcy5wbGF5ZXIpIHRoaXMucGxheWVyLm9mZignZnVsbHNjcmVlbmNoYW5nZScpO1xuICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigncmVzaXplLnZhYy13aW5kb3ctcmVzaXplJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJ2YXIgSGFuZGxlYmFycyA9IHJlcXVpcmUoXCJoYW5kbGViYXJzL3J1bnRpbWVcIik7XG4gZXhwb3J0c1tcImNvbW1lbnRcIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHtcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudFxcXCIgZGF0YS1pZD1cXFwiXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiaWRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50LWhlYWRlclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hdXRob3ItbmFtZVxcXCI+XCJcbiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1ldGEgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVzZXJfbmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpXG4gICAgKyBcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdGltZXN0YW1wXFxcIj5cIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGltZVNpbmNlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aW1lU2luY2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInRpbWVTaW5jZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwidmFjLWRlbGV0ZS1jb21tZW50XFxcIj4mbmJzcDsmbmJzcDtYPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnQtYm9keVxcXCI+XFxuICAgIFwiXG4gICAgKyBhbGlhczQoKGhlbHBlcnMuYnJlYWtsaW5lcyB8fCAoZGVwdGgwICYmIGRlcHRoMC5icmVha2xpbmVzKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5ib2R5IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJicmVha2xpbmVzXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKVxuICAgICsgXCJcXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wiY29tbWVudF9saXN0XCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoYmxvY2tQYXJhbXNbMF1bMF0sIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pO1xuXG4gIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50cy1jb250YWluZXJcXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnRzLXdyYXBcXFwiPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29tbWVudHNIVE1MIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlYWNoXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDEsIGJsb2NrUGFyYW1zKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhLFwiYmxvY2tQYXJhbXNcIjpibG9ja1BhcmFtc30pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgIDxkaXYgY2xhc3M9XFxcInZhYy1yZXBseS1idG4gdmFjLWJ1dHRvblxcXCI+QUREIFJFUExZPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hZGQtbmV3LXNoYXBlYm94XFxcIj48L2Rpdj5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnRzLWNvbnRyb2wtYmFyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLXJhbmdlXFxcIj48Yj5APC9iPiBcIlxuICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5yYW5nZVN0ciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTdHIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gXCJmdW5jdGlvblwiID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInJhbmdlU3RyXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YSxcImJsb2NrUGFyYW1zXCI6YmxvY2tQYXJhbXN9KSA6IGhlbHBlcikpKVxuICAgICsgXCI8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbnRyb2wtYnV0dG9uc1xcXCI+XFxuICAgICAgPGEgY2xhc3M9XFxcInZhYy1kZWxldGUtYW5ub3RhdGlvblxcXCI+REVMRVRFPC9hPiB8IDxhIGNsYXNzPVxcXCJ2YWMtY2xvc2UtY29tbWVudC1saXN0XFxcIj5DTE9TRTwvYT5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZSxcInVzZUJsb2NrUGFyYW1zXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcImNvbnRyb2xzXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dDb250cm9scyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIik7XG59LFwiMlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jb250cm9scyB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwidmFjLWJ1dHRvblxcXCI+KyBORVc8L2J1dHRvbj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93TmF2IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgICAgIDwvZGl2PlxcblwiO1xufSxcIjNcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYW5ub3RhdGlvbi1uYXZcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWEtcHJldlxcXCI+UHJldjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWEtbmV4dFxcXCI+TmV4dDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cIjtcbn0sXCI1XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KTtcblxuICByZXR1cm4gXCIgICAgPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLWNvdmVyIHZhYy1jb250cm9sXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby1jb3Zlci1jYW52YXNcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jdXJzb3ItdG9vbC10aXAgdmFjLWhpZGRlblxcXCI+Q2xpY2sgYW5kIGRyYWcgdG8gc2VsZWN0PC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93Q29udHJvbHMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud3JpdGluZ0NvbW1lbnQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjZcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYWRkLWNvbnRyb2xzIHZhYy1jb250cm9sXFxcIj5cXG4gICAgICAgICAgICA8aT5TZWxlY3Qgc2hhcGUgKyByYW5nZTwvaT5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnRlcm5hbENvbW1lbnRpbmcgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby1tb3ZlXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWEtcHJldlxcXCI+LTEgc2VjPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLW5leHRcXFwiPisxIHNlYzwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPkNPTlRJTlVFPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxhPmNhbmNlbDwvYT5cXG5cIjtcbn0sXCI5XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgaGVscGVyO1xuXG4gIHJldHVybiBcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLXdyaXRlLW5ldy13cmFwIHZhYy1jb250cm9sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8td3JpdGUtbmV3IHZhYy1pcy1hbm5vdGF0aW9uXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxoNT48Yj5OZXcgQW5ub3RhdGlvbjwvYj4gQCBcIlxuICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5yYW5nZVN0ciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTdHIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gXCJmdW5jdGlvblwiID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSx7XCJuYW1lXCI6XCJyYW5nZVN0clwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI8L2g1PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnQtc2hvd2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBjb21tZW50Li4uXFxcIj48L3RleHRhcmVhPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPlNBVkU8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+Q2FuY2VsPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSk7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy51bmxlc3MuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFkZGluZyA6IGRlcHRoMCkse1wibmFtZVwiOlwidW5sZXNzXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWRkaW5nIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcImRyYWdnYWJsZV9tYXJrZXJcIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHtcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBkYXRhLW1hcmtlci1pZD1cXFwiXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiaWRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIiBjbGFzcz1cXFwidmFjLW1hcmtlci1kcmFnZ2FibGUgdmFjLXJhbmdlZC1tYXJrZXJcXFwiIHN0eWxlPVxcXCJsZWZ0OiBcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGVmdCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGVmdCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwibGVmdFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI7IHdpZHRoOlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aWR0aCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2lkdGggOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcIndpZHRoXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIjtcXFwiPlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wibWFya2VyXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCJ2YWMtcmFuZ2VkLW1hcmtlclwiO1xufSxcIjNcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBoZWxwZXI7XG5cbiAgcmV0dXJuIFwid2lkdGg6XCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2lkdGggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpZHRoIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IFwiZnVuY3Rpb25cIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSkse1wibmFtZVwiOlwid2lkdGhcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiO1wiO1xufSxcIjVcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudG9vbHRpcEJvZHkgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjZcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCIgICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidmFjLXRvb2x0aXAgXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b29sdGlwUmlnaHQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8Yj5cIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudG9vbHRpcFRpbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2x0aXBUaW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ0b29sdGlwVGltZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI8L2I+IC0gXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRvb2x0aXBCb2R5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b29sdGlwQm9keSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwidG9vbHRpcEJvZHlcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cIjtcbn0sXCI3XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCJ2YWMtcmlnaHQtc2lkZVwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCI8ZGl2IGRhdGEtbWFya2VyLWlkPVxcXCJcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJpZFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJcXFwiIGNsYXNzPVxcXCJ2YWMtbWFya2VyIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTaG93IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiIHN0eWxlPVxcXCJsZWZ0OiBcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGVmdCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGVmdCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwibGVmdFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI7IFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTaG93IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgei1pbmRleDogXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnpJbmRleCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuekluZGV4IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ6SW5kZXhcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dUb29sdGlwIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcIm1hcmtlcl93cmFwXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtbWFya2VyLW93cmFwXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcInZhYy1tYXJrZXItd3JhcFxcXCI+PC9kaXY+XFxuPC9kaXY+XCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJuZXdfY29tbWVudFwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8td3JpdGUtbmV3LXdyYXAgdmFjLW5ldy1jb21tZW50XFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby13cml0ZS1uZXcgdmFjLWlzLWNvbW1lbnRcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudC1zaG93Ym94XFxcIiBzdHlsZT1cXFwid2lkdGg6XCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLndpZHRoIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC53aWR0aCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwid2lkdGhcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwicHg7dG9wOlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b3AgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvcCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwidG9wXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcInB4O3JpZ2h0OlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5yaWdodCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmlnaHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInJpZ2h0XCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcInB4XFxcIj5cXG4gICAgICA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGNvbW1lbnQuLi5cXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgPGRpdj5cXG4gICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPlNBVkU8L2J1dHRvbj5cXG4gICAgICAgIDxhPkNhbmNlbDwvYT5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJwbGF5ZXJfYnV0dG9uXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCI8Yj48L2I+XFxuPGkgY2xhc3M9XFxcInZhYy1wbGF5ZXItaWNvblxcXCI+XFxuXHQ8c3ZnIGhlaWdodD1cXFwiMjRcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCIgd2lkdGg9XFxcIjI0XFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiPlxcblx0ICAgIDxwYXRoIGQ9XFxcIk0yMS45OSA0YzAtMS4xLS44OS0yLTEuOTktMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNC0uMDEtMTh6TTE4IDE0SDZ2LTJoMTJ2MnptMC0zSDZWOWgxMnYyem0wLTNINlY2aDEydjJ6XFxcIi8+XFxuXHQgICAgPHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCIvPlxcblx0PC9zdmc+XFxuPC9pPlwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYW4gYW5ub3RhdGlvbiwgd2hpY2ggaW5jbHVkZXMgY29udHJvbGxpbmcgdGhlIG1hcmtlci9zaGFwZSwgcmVuZGVyaW5nIGEgY29tbWVudExpc3QsIGV0Y1xuKi9cblxuY29uc3QgICBQbGF5ZXJVSUNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfdWlfY29tcG9uZW50XCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoXCIuLy4uL2xpYi91dGlscy5qc1wiKSxcbiAgICAgICAgQ29tbWVudExpc3QgPSByZXF1aXJlKFwiLi9jb21tZW50X2xpc3RcIiksXG4gICAgICAgIE1hcmtlciA9IHJlcXVpcmUoXCIuL21hcmtlclwiKSxcbiAgICAgICAgQ29tbWVudCA9IHJlcXVpcmUoXCIuL2NvbW1lbnRcIiksXG4gICAgICAgIFNoYXBlID0gcmVxdWlyZShcIi4vc2hhcGVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQW5ub3RhdGlvbiBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWQgfHwgdGhpcy5jb21wb25lbnRJZDtcbiAgICAgICAgdGhpcy5yYW5nZSA9IGRhdGEucmFuZ2U7XG4gICAgICAgIHRoaXMuc2hhcGUgPSBkYXRhLnNoYXBlO1xuICAgICAgICB0aGlzLnNlY29uZHNBY3RpdmUgPSB0aGlzLmJ1aWxkU2Vjb25kc0FjdGl2ZUFycmF5KCk7XG4gICAgICAgIHRoaXMuYnVpbGRDb21tZW50cyhkYXRhKTtcbiAgICAgICAgdGhpcy5idWlsZE1hcmtlcigpO1xuICAgICAgICB0aGlzLmJ1aWxkU2hhcGUoKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBidWlsZENvbW1lbnRzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jb21tZW50TGlzdCA9IG5ldyBDb21tZW50TGlzdChcbiAgICAgICAgICAgIHtcImNvbW1lbnRzXCI6IGRhdGEuY29tbWVudHMsIFwiYW5ub3RhdGlvblwiOiB0aGlzfSxcbiAgICAgICAgICAgIHRoaXMucGxheWVyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYnVpbGRNYXJrZXIgKCkge1xuICAgICAgICB0aGlzLm1hcmtlciA9IG5ldyBNYXJrZXIodGhpcy5wbGF5ZXIsIHRoaXMucmFuZ2UsIHRoaXMuY29tbWVudExpc3QuY29tbWVudHNbMF0pO1xuICAgICAgICB0aGlzLm1hcmtlci5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBidWlsZFNoYXBlKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TaGFwZSA9IG5ldyBTaGFwZSh0aGlzLnBsYXllciwgdGhpcy5zaGFwZSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG9iamVjdFxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiAgICAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICByYW5nZTogICAgICB0aGlzLnJhbmdlLFxuICAgICAgICAgICAgc2hhcGU6ICAgICAgdGhpcy5zaGFwZSxcbiAgICAgICAgICAgIGNvbW1lbnRzOiAgIHRoaXMuY29tbWVudExpc3QuZGF0YVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICB0aGlzLm1hcmtlci4kZWwub24oJ2NsaWNrLnZhYy1tYXJrZXInLCAoZSkgPT4gdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLm9wZW5Bbm5vdGF0aW9uKHRoaXMsIHRydWUpKTtcbiAgICB9XG5cbiAgICAvLyBPcGVucyB0aGUgYW5ub3RhdGlvbi4gSGFuZGxlcyBtYXJrZXIsIGNvbW1lbnRMaXN0LCBzaGFwZSwgQW5ub3RhdGlvbiBzdGF0ZSwgYW5kIHBsYXllciBzdGF0ZVxuICAgIG9wZW4gKHdpdGhQYXVzZT10cnVlLCBwcmV2aWV3T25seT1mYWxzZSwgZm9yY2VTbmFwVG9TdGFydD1mYWxzZSkge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNuYXBUb1N0YXJ0ID0gZm9yY2VTbmFwVG9TdGFydCB8fCAhVXRpbHMuaXNXaXRoaW5SYW5nZShcbiAgICAgICAgICAgIHRoaXMucmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICB0aGlzLnJhbmdlLmVuZCxcbiAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGltZSlcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgc2hvd1Rvb2x0aXAgPSBwcmV2aWV3T25seSAmJiB0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dNYXJrZXJTaGFwZUFuZFRvb2x0aXBzO1xuICAgICAgICB0aGlzLm1hcmtlci5zZXRBY3RpdmUoc2hvd1Rvb2x0aXApO1xuICAgICAgICBpZighcHJldmlld09ubHkgJiYgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29tbWVudExpc3Qpe1xuICAgICAgICAgICAgdGhpcy5jb21tZW50TGlzdC5yZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFwcmV2aWV3T25seSB8fCAocHJldmlld09ubHkgJiYgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93TWFya2VyU2hhcGVBbmRUb29sdGlwcykpe1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUucmVuZGVyKCk7XG5cbiAgICAgICAgICAgIGlmKHRoaXMuc2hhcGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TaGFwZS4kZWwub24oXCJjbGljay52YWMtYW5ub3RhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5vcGVuQW5ub3RhdGlvbih0aGlzLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHdpdGhQYXVzZSkgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgaWYoc25hcFRvU3RhcnQpIHRoaXMuY3VycmVudFRpbWUgPSB0aGlzLnJhbmdlLnN0YXJ0O1xuXG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2Fubm90YXRpb25PcGVuZWQnLCB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uOiB0aGlzLmRhdGEsXG4gICAgICAgICAgICB0cmlnZ2VyZWRfYnlfdGltZWxpbmU6IHByZXZpZXdPbmx5XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsb3NlcyB0aGUgYW5ub3RhdGlvbi4gSGFuZGxlcyBtYXJrZXIsIGNvbW1lbmRMaXN0LCBzaGFwZSwgYW5kIEFubm90YXRpb25TdGF0ZVxuICAgIGNsb3NlIChjbGVhckFjdGl2ZT10cnVlKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcmtlci5kZWFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMuY29tbWVudExpc3QudGVhcmRvd24oZmFsc2UpO1xuICAgICAgICBpZih0aGlzLmFubm90YXRpb25TaGFwZS4kZWwpIHRoaXMuYW5ub3RhdGlvblNoYXBlLiRlbC5vZmYoXCJjbGljay52YWMtYW5ub3RhdGlvblwiKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUudGVhcmRvd24oKTtcbiAgICAgICAgaWYoY2xlYXJBY3RpdmUpIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5jbGVhckFjdGl2ZSgpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhbm5vdGF0aW9uQ2xvc2VkJywgdGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgcHJlbG9hZGluZyBhbiBhcnJheSBvZiBzZWNvbmRzIGFjdGl2ZSBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFZhbHVlcyB1c2VkIHRvIGJ1aWxkIHRpbWVNYXAgaW4gQW5ub3RhdGlvblN0YXRlXG4gICAgYnVpbGRTZWNvbmRzQWN0aXZlQXJyYXkgKCkge1xuICAgICAgICBsZXQgc2Vjb25kcyA9IFtdO1xuICAgICAgICBpZighIXRoaXMucmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5yYW5nZS5zdGFydDsgaSA8PSB0aGlzLnJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2Vjb25kcy5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIHNlY29uZHMucHVzaChzdGFydCk7XG4gICAgICAgICAgICBpZihzdGFydCA8IHRoaXMuZHVyYXRpb24pIHNlY29uZHMucHVzaChzdGFydCsxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2Vjb25kcztcbiAgICB9XG5cbiAgICAvLyBUZWFyc2Rvd24gYW5ub3RhdGlvbiBhbmQgbWFya2VyLCByZW1vdmVzIG9iamVjdCBmcm9tIEFubm90YXRpb25TdGF0ZVxuICAgIHRlYXJkb3duIChyZW1vdmVGcm9tQ29sbGVjdGlvbj10cnVlKSB7XG4gICAgICAgIHRoaXMuY2xvc2UodHJ1ZSk7XG4gICAgICAgIHRoaXMubWFya2VyLnRlYXJkb3duKCk7XG4gICAgICAgIGlmKHRoaXMuY29tbWVudExpc3QpIHRoaXMuY29tbWVudExpc3QudGVhcmRvd24ocmVtb3ZlRnJvbUNvbGxlY3Rpb24pO1xuICAgICAgICBpZihyZW1vdmVGcm9tQ29sbGVjdGlvbikgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLnJlbW92ZUFubm90YXRpb24odGhpcyk7XG4gICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvblNoYXBlKSB0aGlzLmFubm90YXRpb25TaGFwZS50ZWFyZG93bigpO1xuICAgICAgICBpZihyZW1vdmVGcm9tQ29sbGVjdGlvbikgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBhIG5ldyBhbm5vdGF0aW9uIGluc3RhbmNlIGJ5IHBhc3NpbmcgaW4gZGF0YSBmb3IgcmFuZ2UsIHNoYXBlLCBjb21tZW50LCAmIHBsdWdpbiByZWZcbiAgICBzdGF0aWMgbmV3RnJvbURhdGEgKHJhbmdlLCBzaGFwZSwgY29tbWVudFN0ciwgcGx1Z2luLCBpZD1udWxsKSB7XG4gICAgICAgIGxldCBjb21tZW50ID0gQ29tbWVudC5kYXRhT2JqKGNvbW1lbnRTdHIsIHBsdWdpbik7XG4gICAgICAgIGlmKHJhbmdlKSByYW5nZSA9IFV0aWxzLnBhcnNlSW50T2JqKHJhbmdlKTtcbiAgICAgICAgaWYoc2hhcGUpIHNoYXBlID0gVXRpbHMucGFyc2VJbnRPYmooc2hhcGUpO1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgIGNvbW1lbnRzOiBbY29tbWVudF1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uKGRhdGEsIHBsdWdpbi5wbGF5ZXIpO1xuICAgIH1cblxuICAgIGdldCBpc0FjdGl2ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuYWN0aXZlQW5ub3RhdGlvbiA9PT0gdGhpcztcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBtYW5hZ2luZyB0aGUgc3RhdGUgb2YgYW5ub3RhdGlvbnMsIGluY2x1ZGluZyBzaG93aW5nIGFjdGl2ZSBhbm5vdGF0aW9uIGR1cmluZyBwbGF5YmFjayxcbiAgICB0b2dnbGluZyBhY3RpdmUgc3RhdGVzIGZvciBhbm5vdGF0aW9ucywgbmF2aWdhdGluZyBhbm5vdGF0aW9ucyBmb3J3YXJkL2JhY2ssIGV0Y1xuKi9cblxuY29uc3QgICBVdGlscyA9IHJlcXVpcmUoJy4vLi4vbGliL3V0aWxzJyksXG4gICAgICAgIFBsYXllckNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfY29tcG9uZW50XCIpLFxuICAgICAgICBBbm5vdGF0aW9uID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBBbm5vdGF0aW9uU3RhdGUgZXh0ZW5kcyBQbGF5ZXJDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllcikge1xuICAgICAgICBzdXBlcihwbGF5ZXIpO1xuICAgICAgICB0aGlzLmluaXRBUEkodGhpcywgJ0Fubm90YXRpb25TdGF0ZScpO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICAvLyBzZXRzIF9lbmFibGVkIGFuZCBjbG9zZXMgb3Igb3BlbnMgYW5ub3RhdGlvbiBhcyBuZWVkZWRcbiAgICBzZXQgZW5hYmxlZCAoc2hvdWxkQmVFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBzaG91bGRCZUVuYWJsZWQ7XG4gICAgICAgIGlmKCFzaG91bGRCZUVuYWJsZWQpIHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5jbG9zZSgpO1xuICAgICAgICBpZihzaG91bGRCZUVuYWJsZWQpe1xuICAgICAgICAgICAgdGhpcy5za2lwTGl2ZUNoZWNrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldExpdmVBbm5vdGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZW5hYmxlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8vIFNldHMgX2Fubm90YXRpb25zIHcvQW5ub2F0aW9uIG9iamVjdHMgZnJvbSBpbnB1dCBhcnJheVxuICAgIHNldCBhbm5vdGF0aW9ucyAoYW5ub3RhdGlvbnNEYXRhKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnNEYXRhLm1hcCgoYSkgPT4gbmV3IEFubm90YXRpb24oYSwgdGhpcy5wbGF5ZXIpKTtcbiAgICAgICAgdGhpcy5zb3J0QW5ub3RhdGlvbnMoKTtcbiAgICAgICAgdGhpcy5yZWJ1aWxkQW5ub3RhdGlvblRpbWVNYXAoKTtcbiAgICB9XG5cbiAgICBnZXQgYW5ub3RhdGlvbnMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuXG4gICAgc2V0IGFjdGl2ZUFubm90YXRpb24gKGFubm90YXRpb249bnVsbCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBHZXQgY3VycmVudCBhY3RpdmUgYW5ub3RhdGlvbiBvciBhIG51bGwgb2JqZWN0IHdpdGggLmNsb3NlKClcbiAgICBnZXQgYWN0aXZlQW5ub3RhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVBbm5vdGF0aW9uIHx8IHsgY2xvc2U6ICgoKSA9PiB7fSkgfTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgZGF0YVxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zLm1hcCgoYSkgPT4gYS5kYXRhKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGV2ZW50cyBmb3Igc2V0dGluZyBsaXZlQW5ub3RhdGlvbiBvbiB2aWRlbyB0aW1lIGNoYW5nZVxuICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICB0aGlzLnBsYXllci5vbihcInRpbWV1cGRhdGVcIiwgVXRpbHMudGhyb3R0bGUodGhpcy5zZXRMaXZlQW5ub3RhdGlvbi5iaW5kKHRoaXMpLCAxMDApKTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGFubm90YXRpb25zIGJ5IHJhbmdlLnN0YXJ0XG4gICAgc29ydEFubm90YXRpb25zICgpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydCA8IGIucmFuZ2Uuc3RhcnQgPyAtMSA6IChhLnJhbmdlLnN0YXJ0ID4gYi5yYW5nZS5zdGFydCA/IDEgOiAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgbmV3IGFubm90YXRpb25cbiAgICBhZGROZXdBbm5vdGF0aW9uIChhbm5vdGF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7XG4gICAgICAgIHRoaXMub3BlbkFubm90YXRpb24oYW5ub3RhdGlvbiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbmQgYWRkIGEgYW5ub3RhdGlvblxuICAgIGNyZWF0ZUFuZEFkZEFubm90YXRpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4uY29udHJvbHMudWlTdGF0ZS5hZGRpbmcgJiYgdGhpcy5wbHVnaW4uY29udHJvbHMuY2FuY2VsQWRkTmV3KCk7XG5cbiAgICAgICAgbGV0IGFubm90YXRpb24gPSBBbm5vdGF0aW9uLm5ld0Zyb21EYXRhKFxuICAgICAgICAgICAgZGF0YS5yYW5nZSxcbiAgICAgICAgICAgIGRhdGEuc2hhcGUsXG4gICAgICAgICAgICBkYXRhLmNvbW1lbnRTdHIgfHwgXCJcIixcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLFxuICAgICAgICAgICAgZGF0YS5pZFxuICAgICAgICApXG4gICAgICAgIHRoaXMuYWRkTmV3QW5ub3RhdGlvbihhbm5vdGF0aW9uKVxuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYW4gZXhpc3RpbmcgYW5ub3RhdGlvblxuICAgIGRlc3Ryb3lBbm5vdGF0aW9uQnlJZCAoaWQpIHtcbiAgICAgICAgbGV0IGFubm90YXRpb24gPSB0aGlzLmZpbmRBbm5vdGF0aW9uKGlkKTtcbiAgICAgICAgaWYgKGFubm90YXRpb24pIGFubm90YXRpb24udGVhcmRvd24oKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW4gYW5ub3RhdGlvblxuICAgIHJlbW92ZUFubm90YXRpb24gKGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkID0gYW5ub3RhdGlvbi5pZCxcbiAgICAgICAgICAgIGkgPSB0aGlzLl9hbm5vdGF0aW9ucy5pbmRleE9mKGFubm90YXRpb24pO1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2Fubm90YXRpb25EZWxldGVkJywge2lkfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBsaXZlIGFubm90YXRpb24gYmFzZWQgb24gY3VycmVudCB2aWRlbyB0aW1lXG4gICAgc2V0TGl2ZUFubm90YXRpb24gKCkge1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XG4gICAgICAgIGxldCB0aW1lID0gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRUaW1lKTtcblxuICAgICAgICBpZih0aGlzLnNraXBMaXZlQ2hlY2spIHtcbiAgICAgICAgICAgIGlmKHRpbWUgIT09IHRoaXMubGFzdFZpZGVvVGltZSkgdGhpcy5za2lwTGl2ZUNoZWNrID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF0Y2hlcyA9IHRoaXMuYWN0aXZlQW5ub3RhdGlvbnNGb3JUaW1lKHRpbWUpO1xuICAgICAgICBpZighbWF0Y2hlcy5sZW5ndGgpIHJldHVybiB0aGlzLmFjdGl2ZUFubm90YXRpb24uY2xvc2UoKTtcblxuICAgICAgICAvLyBTZXQgbGl2ZSBhbm5vdGF0aW9uIGFzIHRoZSBsYXN0IG1hdGNoXG4gICAgICAgIGxldCBsaXZlQW5ub3RhdGlvbiA9IHRoaXMuYW5ub3RhdGlvbnNbbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aC0xXV07XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlcyBpZiB0aGlzIG9yIGFub3RoZXIgYW5ub3RhdGlvbiBpcyBhY3RpdmVcbiAgICAgICAgaWYodGhpcy5hY3RpdmVBbm5vdGF0aW9uLnJhbmdlKSB7XG4gICAgICAgICAgICBpZihsaXZlQW5ub3RhdGlvbiA9PT0gdGhpcy5hY3RpdmVBbm5vdGF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZlIGFubm90YXRpb24gYW5kIGxpdmUgYW5ub3RhdGlvbiBzaGFyZSBhIHN0YXJ0IHRpbWVcbiAgICAgICAgICAgIC8vIElzIHRoYXQgc3RhcnQgdGltZSBhdCB0aGUgY3VycmVudCBwbGF5aGVhZD9cbiAgICAgICAgICAgIC8vIElmIHNvLCBkb24ndCBzd2l0Y2ggd2hpY2ggaXMgYWN0aXZlLlxuICAgICAgICAgICAgbGV0IGxpdmVTdGFydCA9IGxpdmVBbm5vdGF0aW9uLnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGFjdGl2ZVN0YXJ0ID0gdGhpcy5hY3RpdmVBbm5vdGF0aW9uLnJhbmdlLnN0YXJ0O1xuICAgICAgICAgICAgaWYobGl2ZVN0YXJ0ID09PSBhY3RpdmVTdGFydCAmJiBsaXZlU3RhcnQgPT09IHRpbWUpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlbkFubm90YXRpb24obGl2ZUFubm90YXRpb24sIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCBhY3RpdmUgYW5ub3RhdGlvbnMgZm9yIGEgdGltZSAoaW4gc2Vjb25kcylcbiAgICBhY3RpdmVBbm5vdGF0aW9uc0ZvclRpbWUgKHRpbWUpIHtcbiAgICAgICAgaWYoIXRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoKSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25UaW1lTWFwW3RpbWVdIHx8IFtdO1xuICAgIH1cblxuICAgIC8qXG4gICAgICAgIFJlYnVpbGQgdGhlIGFubm90YXRpb24gdGltZSBtYXBcbiAgICAgICAgRXhhbXBsZTogdGhpcy5fYW5ub3RhdGlvbnNbMV0gYW5kIHRoaXMuX2Fubm90YXRpb25zWzNdIGFyZSBhY3RpdmUgZHVyaW5nIHNlY29uZCA0XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25UaW1lTWFwID0geyA0OiBbMSwgM10gfVxuICAgICovXG4gICAgcmVidWlsZEFubm90YXRpb25UaW1lTWFwICgpIHtcbiAgICAgICAgbGV0IHRpbWVNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uLnNlY29uZHNBY3RpdmUuZm9yRWFjaCgoc2Vjb25kKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9ICh0aW1lTWFwW3NlY29uZF0gfHwgW10pO1xuICAgICAgICAgICAgICAgIHZhbC5wdXNoKHRoaXMuYW5ub3RhdGlvbnMuaW5kZXhPZihhbm5vdGF0aW9uKSk7XG4gICAgICAgICAgICAgICAgdGltZU1hcFtzZWNvbmRdID0gdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFubm90YXRpb25UaW1lTWFwID0gdGltZU1hcDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBhY3RpdmUgYW5ub3RhdGlvbiBhbmQgcmVtb3ZlIHJlZmVyZW5jZSBpbiBzdGF0ZVxuICAgIGNsZWFyQWN0aXZlICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVBbm5vdGF0aW9uLmNsb3NlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlQW5ub3RhdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gT3BlbiBhbm5vdGF0aW9uIHdpdGggb3B0aW9ucyB0byBwYXVzZSBhbmQgc2hvdyBwcmV2aWV3XG4gICAgLy8gc2tpcExpdmVDaGVjayB3aWxsIHNob3J0IGNpcmN1aXQgc2V0TGl2ZUFubm90YXRpb24oKVxuICAgIG9wZW5Bbm5vdGF0aW9uIChhbm5vdGF0aW9uLCBza2lwTGl2ZUNoZWNrPWZhbHNlLCBwYXVzZT10cnVlLCBwcmV2aWV3T25seT1mYWxzZSwgZm9yY2VTbmFwVG9TdGFydD1mYWxzZSkge1xuICAgICAgICBpZighdGhpcy5wbHVnaW4uYWN0aXZlKSB0aGlzLnBsdWdpbi50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuICAgICAgICB0aGlzLnNraXBMaXZlQ2hlY2sgPSBza2lwTGl2ZUNoZWNrO1xuICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICAgIGFubm90YXRpb24ub3BlbihwYXVzZSwgcHJldmlld09ubHksIGZvcmNlU25hcFRvU3RhcnQpO1xuICAgICAgICB0aGlzLmFjdGl2ZUFubm90YXRpb24gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLmxhc3RWaWRlb1RpbWUgPSB0aGlzLmFjdGl2ZUFubm90YXRpb24ucmFuZ2Uuc3RhcnQ7XG4gICAgfVxuXG4gICAgLy8gT3BlbiBhbiBhbm5vdGF0aW9uIGJ5IElEIChpZiBpdCBleGlzdHMpXG4gICAgb3BlbkFubm90YXRpb25CeUlkIChpZCkge1xuICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IHRoaXMuZmluZEFubm90YXRpb24oaWQpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbikgdGhpcy5vcGVuQW5ub3RhdGlvbihhbm5vdGF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGFubm90YXRpb24gb2JqZWN0IGdpdmVuIElEXG4gICAgZmluZEFubm90YXRpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25zLmZpbmQoKGEpID0+IGEuaWQgPT0gaWQpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgY29tbWVudCBvYmplY3QgZ2l2ZW4gSURcbiAgICBmaW5kQ29tbWVudCAoaWQpIHtcbiAgICAgICAgbGV0IGNvbW1lbnRzID0gdGhpcy5hbm5vdGF0aW9ucy5tYXAoKGEpID0+IGEuY29tbWVudExpc3QuY29tbWVudHMpO1xuICAgICAgICBjb21tZW50cyA9IFtdLmNvbmNhdCguLi5jb21tZW50cyk7IC8vIGZsYXR0ZW4gMmQgYXJyYXlcbiAgICAgICAgcmV0dXJuIGNvbW1lbnRzLmZpbmQoKGMpID0+IGMuaWQgPT0gaWQpO1xuICAgIH1cblxuICAgIC8vIEZpbmRzIHRoZSBuZXh0IGFubm90YXRpb24gaW4gY29sbGVjdGlvbiBhbmQgb3BlbnMgaXRcbiAgICBuZXh0QW5ub3RhdGlvbiAoKSB7XG4gICAgICAgIGlmKHRoaXMuX2FjdGl2ZUFubm90YXRpb24pe1xuICAgICAgICAgICAgbGV0IGluZCA9IHRoaXMuYW5ub3RhdGlvbnMuaW5kZXhPZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKSxcbiAgICAgICAgICAgICAgICBuZXh0SW5kID0gKGluZCA9PT0gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMSA/IDAgOiBpbmQrMSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW25leHRJbmRdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGltZSA9IE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGltZSk7XG4gICAgICAgIGZvcihsZXQgaT0wOyBpPHRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgaWYodGhpcy5hbm5vdGF0aW9uc1tpXS5yYW5nZS5zdGFydCA+IHRpbWUpIHJldHVybiB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbaV0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1swXSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gRmluZHMgdGhlIHByZXZpb3VzIGFubm90YXRpb24gaW4gY29sbGVjdGlvbiBhbmQgb3BlbnMgaXRcbiAgICBwcmV2QW5ub3RhdGlvbiAoKSB7XG4gICAgICAgIGlmKHRoaXMuX2FjdGl2ZUFubm90YXRpb24pe1xuICAgICAgICAgICAgbGV0IGluZCA9IHRoaXMuYW5ub3RhdGlvbnMuaW5kZXhPZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgbmV4dEluZCA9IChpbmQgPT09IDAgPyB0aGlzLmFubm90YXRpb25zLmxlbmd0aC0xIDogaW5kLTEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1tuZXh0SW5kXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWUgPSBNYXRoLmZsb29yKHRoaXMuY3VycmVudFRpbWUpO1xuICAgICAgICBmb3IobGV0IGk9dGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMTsgaT49MDsgaS0tKXtcbiAgICAgICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvbnNbaV0ucmFuZ2Uuc3RhcnQgPCB0aW1lKSByZXR1cm4gdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW2ldLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMV0sIHRydWUpO1xuICAgIH1cblxuICAgIC8vIFVzZSBhbnl3aGVyZSB0aGUgYW5ub3RhdGlvbiBkYXRhIGNoYW5nZXNcbiAgICAvLyBDbGVhbnMgaW50ZXJuYWwgc3RhdGUgZGF0YSwgdXBkYXRlcyBwbGF5ZXIgYnV0dG9uLCB0cmlnZ2VycyBjb25maWd1cmFibGUgY2FsbGJhY2tcbiAgICBzdGF0ZUNoYW5nZWQgKCkge1xuICAgICAgICB0aGlzLnNvcnRBbm5vdGF0aW9ucygpO1xuICAgICAgICB0aGlzLnJlYnVpbGRBbm5vdGF0aW9uVGltZU1hcCgpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdvblN0YXRlQ2hhbmdlZCcsIHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgaW50ZXJuYWwgc3RhdGUgcHJvcGVydGllc1xuICAgIHJlc2V0RGF0YSAoKSB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uVGltZU1hcCA9IHt9O1xuICAgICAgICB0aGlzLmFjdGl2ZUFubm90YXRpb24gID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbmFibGVkICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNraXBOZXh0VGltZUNoZWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGFzdFZpZGVvVGltZSAgICAgPSAwO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBVSSBhbmQgdW5iaW5kIGV2ZW50cyBmb3IgdGhpcyBhbmQgY2hpbGQgY29tcG9uZW50c1xuICAgIHRlYXJkb3duKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb24pID0+IHsgYW5ub3RhdGlvbi50ZWFyZG93bihmYWxzZSk7IH0pO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgQ29tcG9uZW50IGZvciBhbiBpbnZpZHVhbCBjb21tZW50XG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpLFxuICAgICAgICB0ZW1wbGF0ZU5hbWUgPSAnY29tbWVudCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQ29tbWVudCBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5jb21tZW50TGlzdCA9IGRhdGEuY29tbWVudExpc3Q7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkIHx8IHRoaXMuY29tcG9uZW50SWQ7XG4gICAgICAgIHRoaXMubWV0YSA9IGRhdGEubWV0YTtcbiAgICAgICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG1vbWVudChkYXRhLm1ldGEuZGF0ZXRpbWUpLnVuaXgoKTtcbiAgICAgICAgdGhpcy50aW1lU2luY2UgPSB0aGlzLnRpbWVTaW5jZSgpO1xuXG4gICAgICAgIHRoaXMuJGVsID0gJCh0aGlzLnJlbmRlcigpKTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgZGF0YVxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgbWV0YTogdGhpcy5tZXRhLFxuICAgICAgICAgICAgYm9keTogdGhpcy5ib2R5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IEhUTUwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kZWxbMF0ub3V0ZXJIVE1MO1xuICAgIH1cblxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclRlbXBsYXRlKFxuICAgICAgICAgICAgdGVtcGxhdGVOYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAgICAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgYm9keTogICAgICAgdGhpcy5ib2R5LFxuICAgICAgICAgICAgICAgIG1ldGE6ICAgICAgIHRoaXMubWV0YSxcbiAgICAgICAgICAgICAgICB0aW1lU2luY2U6ICB0aGlzLnRpbWVTaW5jZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aW1lIHNpbmNlIGNvbW1lbnQgdGltZXN0YW1wXG4gICAgdGltZVNpbmNlICgpIHtcbiAgICAgICAgcmV0dXJuIG1vbWVudCh0aGlzLm1ldGEuZGF0ZXRpbWUpLmZyb21Ob3coKTtcbiAgICB9XG5cbiAgICB0ZWFyZG93biAoZGVzdHJveT1mYWxzZSkge1xuICAgICAgICBzdXBlci50ZWFyZG93bihkZXN0cm95KTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBDb21tZW50IG9iaiBnaXZlbiBib2R5IGNvbnRlbnQgYW5kIHBsdWdpbiByZWZlcmVuY2VcbiAgICBzdGF0aWMgbmV3RnJvbURhdGEgKGJvZHksIGNvbW1lbnRMaXN0LCBwbHVnaW4pIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGFPYmooYm9keSwgcGx1Z2luKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50KGRhdGEsIHBsdWdpbi5wbGF5ZXIpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBvYmplY3Qgd2l0aCBwbHVnaW4gZGF0YSwgdGltZXN0YW1wLCB1bmlxdWUgaWQsIGFuZCBib2R5IGNvbnRlbnRcbiAgICBzdGF0aWMgZGF0YU9iaiAoYm9keSwgcGx1Z2luKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXRhOiAgIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWU6IG1vbWVudCgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSwgcGx1Z2luLm1ldGEpLFxuICAgICAgICAgICAgaWQ6ICAgICBVdGlscy5ndWlkKCksXG4gICAgICAgICAgICBib2R5XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICBDb21wb25lbnQgZm9yIGEgbGlzdCBvZiBjb21tZW50cyBpbiBhIHZpc2libGUvYWN0aXZlIGFubm90YXRpb25cbiovXG5cbmNvbnN0ICAgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKFwiLi8uLi9saWIvdXRpbHNcIiksXG4gICAgICAgIENvbW1lbnQgPSByZXF1aXJlKFwiLi9jb21tZW50XCIpLFxuICAgICAgICBjb21tZW50TGlzdFRlbXBsYXRlTmFtZSA9ICdjb21tZW50X2xpc3QnLFxuICAgICAgICBuZXdDb21tZW50VGVtcGxhdGVOYW1lID0gJ25ld19jb21tZW50JztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBDb21tZW50TGlzdCBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcblxuICAgICAgICB0aGlzLmFubm90YXRpb24gPSBkYXRhLmFubm90YXRpb247XG4gICAgICAgIHRoaXMuY29tbWVudHMgPSBkYXRhLmNvbW1lbnRzLm1hcCgoY29tbWVudERhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbW1lbnREYXRhLmNvbW1lbnRMaXN0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbWVudChjb21tZW50RGF0YSwgcGxheWVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ydENvbW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG9iamVjdFxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudHMubWFwKChjKSA9PiBjLmRhdGEpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgYWxsIGV2ZW50cyBuZWVkZWQgZm9yIHRoZSBjb21tZW50IGxpc3RcbiAgICBiaW5kTGlzdEV2ZW50cyAoKSB7XG4gICAgICAgIHRoaXMuJGVsXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29tbWVudFwiLCBcIi52YWMtY2xvc2UtY29tbWVudC1saXN0XCIsICgoKSA9PiB0aGlzLmFubm90YXRpb24uY2xvc2UoKSkuYmluZCh0aGlzKSkgLy8gSGlkZSBDb21tZW50TGlzdCBVSSB3aXRoIGNsb3NlIGJ1dHRvblxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLXJlcGx5LWJ0blwiLCB0aGlzLmFkZE5ld0NvbW1lbnQuYmluZCh0aGlzKSkgLy8gT3BlbiBuZXcgcmVwbHkgVUkgd2l0aCByZXBseSBidXR0b25cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1kZWxldGUtYW5ub3RhdGlvblwiLCB0aGlzLmhhbmRsZURlbGV0ZUFubm90YXRpb25DbGljay5iaW5kKHRoaXMpKSAvLyBEZWxldGUgYW5ub3RhdGlvbiB3aXRoIG1haW4gZGVsZXRlIGJ1dHRvblxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLWRlbGV0ZS1jb21tZW50XCIsIHRoaXMuZGVzdHJveUNvbW1lbnQuYmluZCh0aGlzKSkgLy8gRGVsZXRlIGNvbW1lbnQgd2l0aCBkZWxldGUgY29tbWVudCBidXR0b25cbiAgICAgICAgICAgIC5vbihcIm1vdXNld2hlZWwudmFjLWNvbW1lbnQgRE9NTW91c2VTY3JvbGwudmFjLWNvbW1lbnRcIiwgXCIudmFjLWNvbW1lbnRzLXdyYXBcIiwgdGhpcy5kaXNhYmxlUGFnZVNjcm9sbC5iaW5kKHRoaXMpKTsgLy8gUHJldmVudCBvdXRlciBwYWdlIHNjcm9sbCB3aGVuIHNjcm9sbGluZyBpbnNpZGUgb2YgdGhlIENvbW1lbnRMaXN0IFVJXG4gICAgfVxuXG4gICAgLy8gQmluZCBldmVudCBsaXN0ZW5lcnMgZm9yIG5ldyBjb21tZW50cyBmb3JtXG4gICAgYmluZENvbW1lbnRGb3JtRXZlbnRzICgpIHtcbiAgICAgICAgdGhpcy4kbmV3Q29tbWVudEZvcm1cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1hZGQtY29udHJvbHMgYSwgLnZhYy12aWRlby13cml0ZS1uZXcudmFjLWlzLWNvbW1lbnQgYVwiLCB0aGlzLmNsb3NlTmV3Q29tbWVudC5iaW5kKHRoaXMpKSAvLyBDYW5jZWwgbmV3IGNvbW1lbnQgY3JlYXRpb24gd2l0aCBjYW5jZWwgbGlua1xuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLXZpZGVvLXdyaXRlLW5ldy52YWMtaXMtY29tbWVudCBidXR0b25cIiwgdGhpcy5zYXZlTmV3Q29tbWVudC5iaW5kKHRoaXMpKTsgLy8gU2F2ZSBuZXcgY29tbWVudCB3aXRoIHNhdmUgYnV0dG9uXG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIENvbW1lbnRMaXN0IFVJIHdpdGggYWxsIGNvbW1lbnRzIHVzaW5nIHRlbXBsYXRlXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgdGhpcy4kZWwgPSAkKHRoaXMucmVuZGVyVGVtcGxhdGUoXG4gICAgICAgICAgICBjb21tZW50TGlzdFRlbXBsYXRlTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tZW50c0hUTUw6IHRoaXMuY29tbWVudHMubWFwKChjKSA9PiBjLkhUTUwpLFxuICAgICAgICAgICAgICAgIHJhbmdlU3RyOiBVdGlscy5odW1hblRpbWUodGhpcy5hbm5vdGF0aW9uLnJhbmdlKVxuICAgICAgICAgICAgfVxuICAgICAgICApKTtcblxuICAgICAgICB0aGlzLiRwbGF5ZXIuYXBwZW5kKHRoaXMuJGVsKTtcbiAgICAgICAgdGhpcy4kd3JhcCA9IHRoaXMuJFVJLmNvbW1lbnRzQ29udGFpbmVyO1xuICAgICAgICB0aGlzLmJpbmRMaXN0RXZlbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gUmUtcmVuZGVyIFVJIG9uIHN0YXRlIGNoYW5nZVxuICAgIHJlUmVuZGVyICgpIHtcbiAgICAgICAgdGhpcy50ZWFyZG93bihmYWxzZSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIG5ldyBjb21tZW50IGZvcm1cbiAgICBhZGROZXdDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy4kd3JhcC5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKS5maW5kKFwiLnZhYy1jb21tZW50cy13cmFwXCIpLnNjcm9sbFRvcCg5OTk5OTkpO1xuICAgICAgICB2YXIgJHNoYXBlYm94ID0gdGhpcy4kd3JhcC5maW5kKFwiLnZhYy1hZGQtbmV3LXNoYXBlYm94XCIpLFxuICAgICAgICAgICAgd2lkdGggPSAkc2hhcGVib3gub3V0ZXJXaWR0aCgpLFxuICAgICAgICAgICAgdG9wID0gJHNoYXBlYm94LnBvc2l0aW9uKCkudG9wICsgMTAsXG4gICAgICAgICAgICByaWdodCA9IHRoaXMuJHdyYXAub3V0ZXJXaWR0aCgpIC0gKCRzaGFwZWJveC5wb3NpdGlvbigpLmxlZnQgKyB3aWR0aCk7XG5cbiAgICAgICAgdGhpcy4kbmV3Q29tbWVudEZvcm0gPSAkKHRoaXMucmVuZGVyVGVtcGxhdGUobmV3Q29tbWVudFRlbXBsYXRlTmFtZSwge3dpZHRoLCB0b3AsIHJpZ2h0fSkpO1xuICAgICAgICB0aGlzLmJpbmRDb21tZW50Rm9ybUV2ZW50cygpO1xuICAgICAgICB0aGlzLiRwbGF5ZXIuYXBwZW5kKHRoaXMuJG5ld0NvbW1lbnRGb3JtKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIGNvbW1lbnQgZnJvbSBuZXcgY29tbWVudCBmb3JtLCB1cGRhdGUgc3RhdGUgYW5kIHJlLXJlbmRlciBVSVxuICAgIHNhdmVOZXdDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy4kd3JhcC5yZW1vdmVDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKTtcblxuICAgICAgICBsZXQgdXNlcl9pZCA9IDEsXG4gICAgICAgICAgICBib2R5ID0gdGhpcy4kVUkubmV3Q29tbWVudFRleHRhcmVhLnZhbCgpO1xuXG4gICAgICAgIGlmKCFib2R5KSByZXR1cm47IC8vIGVtcHR5IGNvbW1lbnQgLSBUT0RPIGFkZCB2YWxpZGF0aW9uIC8gZXJyIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5jcmVhdGVDb21tZW50KGJvZHkpO1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbW1lbnQgKGJvZHkpIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBDb21tZW50Lm5ld0Zyb21EYXRhKGJvZHksIHRoaXMsIHRoaXMucGx1Z2luKTtcbiAgICAgICAgdGhpcy5jb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICB0aGlzLnNvcnRDb21tZW50cygpO1xuXG4gICAgICAgIC8vIERvbid0IG11dGF0ZSBVSSBpZiBjb21tZW50IGlzIGJlaW5nIGNyZWF0ZWQgZm9yIGFuIGluYWN0aXZlIGFubm90YXRpb24gKHZpYSBBUEkpXG4gICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvbi5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZVJlbmRlcihmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTmV3Q29tbWVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLnN0YXRlQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBjb21tZW50IGFkZGluZyBwcm9jZXNzXG4gICAgY2xvc2VOZXdDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy51bmJpbmRDb21tZW50Rm9ybUV2ZW50cygpO1xuICAgICAgICBpZih0aGlzLiR3cmFwKSB0aGlzLiR3cmFwLnJlbW92ZUNsYXNzKHRoaXMuVUlfQ0xBU1NFUy5hY3RpdmUpO1xuICAgICAgICBpZih0aGlzLiRuZXdDb21tZW50Rm9ybSkgdGhpcy4kbmV3Q29tbWVudEZvcm0ucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGEgY29tbWVudC4gSWYgaXQgaXMgdGhlIG9ubHkgY29tbWVudCwgZGVsZXRlIHRoZSBhbm5vdGF0aW9uXG4gICAgLy8gVXBkYXRlIHN0YXRlIGFuZCByZS1yZW5kZXIgVUlcbiAgICBkZXN0cm95Q29tbWVudCAoZXZlbnQpIHtcbiAgICAgICAgbGV0IGFubm90YXRpb25JZCA9IHRoaXMuYW5ub3RhdGlvbi5pZDtcbiAgICAgICAgaWYodGhpcy5jb21tZW50cy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLnRlYXJkb3duKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbWVudElkICA9IHRoaXMuZmluZENvbW1lbnRJZChldmVudCksXG4gICAgICAgICAgICAgICAgY29tbWVudCA9IHRoaXMuY29tbWVudHMuZmluZCgoYykgPT4gYy5pZCA9PSBjb21tZW50SWQpLFxuICAgICAgICAgICAgICAgIGkgPSB0aGlzLmNvbW1lbnRzLmluZGV4T2YoY29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHRoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5zdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICBmaW5kQ29tbWVudElkIChldmVudCkge1xuICAgICAgICBsZXQgaWQgPSB0eXBlb2YgZXZlbnQuZGV0YWlsLmlkID09PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLnZhYy1jb21tZW50JykuZGF0YSgnaWQnKSA6XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuaWQ7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50cyBvdXRlciBwYWdlIHNjcm9sbCB3aGVuIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIENvbW1lbnRMaXN0IFVJXG4gICAgLy8gVE9ETzogVGhpcyBtaWdodCBuZWVkIHRvIGJlIGZpbmUtdHVuZWQ/XG4gICAgZGlzYWJsZVBhZ2VTY3JvbGwgKGV2ZW50KSB7XG4gICAgICAgIGxldCAkdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgICAgIGhlaWdodCAgPSAkdGFyZ2V0LmhlaWdodCgpLFxuICAgICAgICAgICAgb2dFdmVudCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgICBkZWx0YSAgID0gb2dFdmVudC53aGVlbERlbHRhIHx8IC1vZ0V2ZW50LmRldGFpbCxcbiAgICAgICAgICAgIGRpciAgICAgPSBkZWx0YSA8IDAgPyBcImRvd25cIiA6IFwidXBcIixcbiAgICAgICAgICAgIHNjcm9sbERpZmYgPSBNYXRoLmFicyhldmVudC5jdXJyZW50VGFyZ2V0LnNjcm9sbEhlaWdodCAtIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xpZW50SGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiBzY3JvbGxpbmcgaW50byB0b3Agb2YgZGl2XG4gICAgICAgIGlmICgkdGFyZ2V0LnNjcm9sbFRvcCgpIDwgMjAgJiYgZGlyID09IFwidXBcIikge1xuICAgICAgICAgICAgJHRhcmdldC5zdG9wKCk7XG4gICAgICAgICAgICAkdGFyZ2V0LmFuaW1hdGUoe3Njcm9sbFRvcDogMH0sIDEwMCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2Nyb2xsaW5nIGludG8gYm90dG9tIG9mIGRpdlxuICAgICAgICBpZiAoJHRhcmdldC5zY3JvbGxUb3AoKSA+IChzY3JvbGxEaWZmIC0gMTApICYmIGRpciA9PSBcImRvd25cIikge1xuICAgICAgICAgICAgJHRhcmdldC5zdG9wKCk7XG4gICAgICAgICAgICAkdGFyZ2V0LmFuaW1hdGUoe3Njcm9sbFRvcDogaGVpZ2h0ICsgNDB9LCAxMDApO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgY29tbWVudHMgYnkgdGltZXN0YW1wXG4gICAgc29ydENvbW1lbnRzICgpIHtcbiAgICAgICAgdGhpcy5jb21tZW50cy5zb3J0KChhLGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLnRpbWVzdGFtcCA8IGIudGltZXN0YW1wID8gLTEgOiAoYS50aW1lc3RhbXAgPiBiLnRpbWVzdGFtcCA/IDEgOiAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIHRoZSBhbm5vdGF0aW9uXG4gICAgaGFuZGxlRGVsZXRlQW5ub3RhdGlvbkNsaWNrIChlKSB7XG4gICAgICAgIGxldCAkY29uZmlybUVsID0gJChcIjxhLz5cIikuYWRkQ2xhc3MoXCJ2YWMtZGVsZXRlLWNvbmZpcm1cIikudGV4dChcIkNPTkZJUk1cIik7XG4gICAgICAgICRjb25maXJtRWwub24oXCJjbGljay5jb21tZW50XCIsICgpID0+IHtcbiAgICAgICAgICAgICRjb25maXJtRWwub2ZmKFwiY2xpY2suY29tbWVudFwiKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbi50ZWFyZG93bigpO1xuICAgICAgICB9KTtcbiAgICAgICAgJChlLnRhcmdldCkucmVwbGFjZVdpdGgoJGNvbmZpcm1FbCk7XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGxpc3RlbmVycyBmb3IgbmV3IGNvbW1lbnRzIGZvcm1cbiAgICB1bmJpbmRDb21tZW50Rm9ybUV2ZW50cyAoKSB7XG4gICAgICAgIGlmKHRoaXMuJG5ld0NvbW1lbnRGb3JtKSB0aGlzLiRuZXdDb21tZW50Rm9ybS5vZmYoXCJjbGljay52YWMtY29tbWVudFwiKTtcbiAgICB9XG5cbiAgICAvLyBUZWFyZG93biBDb21tZW50TGlzdCBVSSwgdW5iaW5kIGV2ZW50c1xuICAgIHRlYXJkb3duIChkZXN0cm95Q29tbWVudHM9dHJ1ZSkge1xuICAgICAgICBpZih0aGlzLiRlbCkge1xuICAgICAgICAgICAgdGhpcy4kZWwub2ZmKFwiY2xpY2sudmFjLWNvbW1lbnQgbW91c2V3aGVlbC52YWMtY29tbWVudCBET01Nb3VzZVNjcm9sbC52YWMtY29tbWVudFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1lbnRzLmZvckVhY2goKGMpID0+IGMudGVhcmRvd24oZGVzdHJveUNvbW1lbnRzKSk7XG4gICAgICAgIGlmKGRlc3Ryb3lDb21tZW50cykgdGhpcy5jb21tZW50cyA9IFtdO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIG1hbmFnaW5nIGFubm90YXRpb24gXCJjb250cm9sIGJveFwiIGluIHVwcGVyIGxlZnQgb2YgdmlkZW8gd2hlbiBpbiBhbm5vdGF0aW9uIG1vZGUsXG4gICAgaW5jbHVkaW5nIGFsbCBmdW5jdGlvbmFsaXR5IHRvIGFkZCBuZXcgYW5ub3RhdGlvbnNcbiovXG5cbmNvbnN0ICAgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKFwiLi8uLi9saWIvdXRpbHNcIiksXG4gICAgICAgIERyYWdnYWJsZU1hcmtlciA9IHJlcXVpcmUoXCIuL2RyYWdnYWJsZV9tYXJrZXIuanNcIiksXG4gICAgICAgIFNlbGVjdGFibGVTaGFwZSA9IHJlcXVpcmUoXCIuL3NlbGVjdGFibGVfc2hhcGUuanNcIiksXG4gICAgICAgIFBsYXllckJ1dHRvbiA9IHJlcXVpcmUoXCIuL3BsYXllcl9idXR0b25cIiksXG4gICAgICAgIEFubm90YXRpb24gPSByZXF1aXJlKFwiLi9hbm5vdGF0aW9uXCIpLFxuICAgICAgICB0ZW1wbGF0ZU5hbWUgPSAnY29udHJvbHMnO1xuXG4vLyBDb250cm9sIHVzZXMgYSBcInVpIHN0YXRlXCIgdG8gZGV0ZXJtaW5lIGhvdyBVSSBpcyByZW5kZXJlZCAtIHRoaXMgb2JqZWN0IGlzIHRoZSBiYXNlIHN0YXRlLCBjb250YWluaW5nIGFcbi8vIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgc3RhdGVcbmNvbnN0IEJBU0VfVUlfU1RBVEUgPSBPYmplY3QuZnJlZXplKHtcbiAgICBhZGRpbmc6IGZhbHNlLCAgICAgICAgICAvLyBBcmUgd2UgY3VycmVudGx5IGFkZGluZyBhIG5ldyBhbm5vdGF0aW9uPyAoc3RlcCAxIG9mIGZsb3cpXG4gICAgd3JpdGluZ0NvbW1lbnQ6IGZhbHNlICAgLy8gQXJlIHdlIGN1cnJlbnRseSB3cml0aW5nIHRoZSBjb21tZW50IGZvciBhbm5vdGF0aW9uIChzdGVwIDIgb2YgZmxvdylcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIENvbnRyb2xzIGV4dGVuZHMgUGxheWVyVUlDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllciwgYmluZEFycm93S2V5cykge1xuICAgICAgICBzdXBlcihwbGF5ZXIpO1xuICAgICAgICB0aGlzLmluaXRBUEkodGhpcywgJ0NvbnRyb2xzJyk7XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbENvbW1lbnRpbmcgPSB0aGlzLnBsdWdpbi5vcHRpb25zLmludGVybmFsQ29tbWVudGluZztcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSB0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scztcbiAgICAgICAgdGhpcy51aVN0YXRlID0gVXRpbHMuY2xvbmVPYmplY3QoQkFTRV9VSV9TVEFURSk7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cyhiaW5kQXJyb3dLZXlzKTtcblxuICAgICAgICBpZih0aGlzLnNob3dDb250cm9scyl7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcGxheWVyIGJ1dHRvbiBpbiB0aGUgY29udHJvbCBiYXIgaWYgY29udHJvbHMgYXJlIHNob3duXG4gICAgICAgICAgICB0aGlzLnBsYXllckJ1dHRvbiA9IG5ldyBQbGF5ZXJCdXR0b24odGhpcy5wbGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGFsbCB0aGUgZXZlbnRzIHdlIG5lZWQgZm9yIFVJIGludGVyYWN0aW9uXG4gICAgYmluZEV2ZW50cyAoYmluZEFycm93S2V5cykge1xuICAgICAgICB0aGlzLiRwbGF5ZXIub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWNvbnRyb2xzIGJ1dHRvblwiLCB0aGlzLnN0YXJ0QWRkTmV3LmJpbmQodGhpcykpIC8vIEFkZCBuZXcgYnV0dG9uIGNsaWNrXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFubm90YXRpb24tbmF2IC52YWMtYS1uZXh0XCIsICgpID0+IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5uZXh0QW5ub3RhdGlvbigpICkgLy8gQ2xpY2sgJ25leHQnIG9uIGFubm90YXRpb24gbmF2XG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFubm90YXRpb24tbmF2IC52YWMtYS1wcmV2XCIsICgpID0+IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5wcmV2QW5ub3RhdGlvbigpICkgLy8gQ2xpY2sgJ3ByZXYnIG9uIGFubm90YXRpb24gbmF2XG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLXZpZGVvLW1vdmUgLnZhYy1hLW5leHRcIiwgKCkgPT4gdGhpcy5tYXJrZXIuc2NydWJTdGFydCgxKSApIC8vIENsaWNrICcrMSBzZWMnIG9uIG1hcmtlciBuYXZcbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb250cm9sc1wiLCBcIi52YWMtdmlkZW8tbW92ZSAudmFjLWEtcHJldlwiLCAoKSA9PiB0aGlzLm1hcmtlci5zY3J1YlN0YXJ0KC0xKSApOyAvLyBDbGljayAnLTEgc2VjJyBvbiBtYXJrZXIgbmF2XG5cbiAgICAgICAgaWYodGhpcy5pbnRlcm5hbENvbW1lbnRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuJHBsYXllci5vbihcImNsaWNrLnZhYy1jb250cm9sc1wiLCBcIi52YWMtYWRkLWNvbnRyb2xzIGJ1dHRvblwiLCB0aGlzLndyaXRlQ29tbWVudC5iaW5kKHRoaXMpKSAvLyAnTmV4dCcgYnV0dG9uIGNsaWNrIHdoaWxlIGFkZGluZ1xuICAgICAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb250cm9sc1wiLCBcIi52YWMtdmlkZW8td3JpdGUtbmV3LnZhYy1pcy1hbm5vdGF0aW9uIGJ1dHRvblwiLCB0aGlzLnNhdmVOZXcuYmluZCh0aGlzKSkgLy8gJ1NhdmUnIGJ1dHRvbiBjbGljayB3aGlsZSBhZGRpbmdcbiAgICAgICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFkZC1jb250cm9scyBhLCAudmFjLXZpZGVvLXdyaXRlLW5ldy52YWMtaXMtYW5ub3RhdGlvbiBhXCIsIHRoaXMuY2FuY2VsQWRkTmV3LmJpbmQodGhpcykpIC8vIENhbmNlbCBsaW5rIGNsaWNrXG4gICAgICAgIH1cbiAgICAgICAgaWYoYmluZEFycm93S2V5cyl7XG4gICAgICAgICAgICAkKGRvY3VtZW50KS5vbihga2V5dXAudmFjLW5hdi0ke3RoaXMucGxheWVySWR9YCwgKGUpID0+IHRoaXMuaGFuZGxlQXJyb3dLZXlzKGUpKTsgLy8gVXNlIGFycm93IGtleXMgdG8gbmF2aWdhdGUgYW5ub3RhdGlvbnNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBVSSBhbmQgdW5iaW5kIGV2ZW50cyBmb3IgdGhpcyBhbmQgY2hpbGQgY29tcG9uZW50c1xuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgdGhpcy5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy4kcGxheWVyLm9mZignY2xpY2sudmFjLWNvbnRyb2xzJyk7XG4gICAgICAgICQoZG9jdW1lbnQpLm9mZihga2V5dXAudmFjLW5hdi0ke3RoaXMucGxheWVySWR9IG1vdXNlbW92ZS52YWMtdG9vbHRpcC0ke3RoaXMucGxheWVySWR9YCk7XG4gICAgICAgIGlmKHRoaXMucGxheWVyQnV0dG9uKSB0aGlzLnBsYXllckJ1dHRvbi50ZWFyZG93bigpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGV4aXN0aW5nIFVJIChyZXNldHRpbmcgY29tcG9uZW50cyBpZiBuZWVkIGJlKVxuICAgIGNsZWFyIChyZXNldD1mYWxzZSkge1xuICAgICAgICBpZihyZXNldCl7XG4gICAgICAgICAgICBpZih0aGlzLnVpU3RhdGUuYWRkaW5nKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVOb3JtYWxVSSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFya2VyLnRlYXJkb3duKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlU2hhcGUudGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudWlTdGF0ZSA9IFV0aWxzLmNsb25lT2JqZWN0KEJBU0VfVUlfU1RBVEUpO1xuICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtdmlkZW8tY292ZXItY2FudmFzJylcbiAgICAgICAgICAgICAgICAub2ZmKCdtb3VzZWRvd24udmFjLWN1cnNvci10b29sdGlwJylcbiAgICAgICAgICAgICAgICAub2ZmKCdtb3VzZXVwLnZhYy1jdXJzb3ItdG9vbHRpcCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuJHRvb2x0aXBfID0gbnVsbDtcbiAgICAgICAgdGhpcy4kVUkuY29udHJvbEVsZW1lbnRzLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciB0aGUgVUkgZWxlbWVudHMgKGJhc2VkIG9uIHVpU3RhdGUpXG4gICAgcmVuZGVyIChyZXNldD1mYWxzZSkge1xuICAgICAgICB0aGlzLmNsZWFyKHJlc2V0KTtcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlU3RyOiB0aGlzLm1hcmtlciA/IFV0aWxzLmh1bWFuVGltZSh0aGlzLm1hcmtlci5yYW5nZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNob3dOYXY6IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5hbm5vdGF0aW9ucy5sZW5ndGggPiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy51aVN0YXRlLFxuICAgICAgICAgICAgeyBpbnRlcm5hbENvbW1lbnRpbmc6IHRoaXMuaW50ZXJuYWxDb21tZW50aW5nLCBzaG93Q29udHJvbHM6IHRoaXMuc2hvd0NvbnRyb2xzIH1cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgJGN0cmxzID0gdGhpcy5yZW5kZXJUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIGRhdGEpO1xuICAgICAgICB0aGlzLiRwbGF5ZXIuYXBwZW5kKCRjdHJscyk7XG5cbiAgICAgICAgaWYodGhpcy5wbGF5ZXJCdXR0b24pIHRoaXMucGxheWVyQnV0dG9uLnVwZGF0ZU51bUFubm90YXRpb25zKCk7XG4gICAgfVxuXG4gICAgLy8gVXNlciBjbGlja2VkIHRvIGNhbmNlbCBpbi1wcm9ncmVzcyBhZGQgLSByZXN0b3JlIHRvIG5vcm1hbCBzdGF0ZVxuICAgIGNhbmNlbEFkZE5ldyAoKSB7XG4gICAgICAgIGlmKCEodGhpcy51aVN0YXRlLmFkZGluZyB8fCB0aGlzLnVpU3RhdGUud3JpdGluZ0NvbW1lbnQpKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgICB0aGlzLm1hcmtlci50ZWFyZG93bigpO1xuICAgICAgICB0aGlzLm1hcmtlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlciBjbGlja2VkICdhZGQnIGJ1dHRvbiBpbiB0aGUgY29udHJvbHMgLSBzZXR1cCBVSSBhbmQgbWFya2VyXG4gICAgc3RhcnRBZGROZXcgKCkge1xuICAgICAgICBpZighdGhpcy5wbHVnaW4uYWN0aXZlKSB0aGlzLnBsdWdpbi50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuXG4gICAgICAgIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gICAgICAgIHRoaXMuc2V0QWRkaW5nVUkoKTtcbiAgICAgICAgdGhpcy51aVN0YXRlLmFkZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IG5ldyByYW5nZSBhbmQgY3JlYXRlIG1hcmtlclxuICAgICAgICBsZXQgcmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogcGFyc2VJbnQodGhpcy5jdXJyZW50VGltZSwxMCksXG4gICAgICAgICAgICBzdG9wOiBwYXJzZUludCh0aGlzLmN1cnJlbnRUaW1lLDEwKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcmtlciA9IG5ldyBEcmFnZ2FibGVNYXJrZXIodGhpcy5wbGF5ZXIsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlU2hhcGUgPSBuZXcgU2VsZWN0YWJsZVNoYXBlKHRoaXMucGxheWVyKTtcblxuICAgICAgICAvLyBzaG93IGN1cnNvciBoZWxwIHRleHQgaWYgY29udHJvbHMgYXJlIGhpZGRlblxuICAgICAgICBpZighdGhpcy5zaG93Q29udHJvbHMpIHRoaXMuYmluZEN1cnNvclRvb2x0aXAoKTtcblxuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdlbnRlcmVkQWRkaW5nQW5ub3RhdGlvbicsIHsgcmFuZ2U6IHJhbmdlIH0pO1xuICAgIH1cblxuICAgIC8vIFVzZXIgY2xpY2tlZCAnbmV4dCcgYWN0aW9uIC0gc2hvdyBVSSB0byB3cml0ZSBjb21tZW50XG4gICAgd3JpdGVDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy51aVN0YXRlLndyaXRpbmdDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvLyBVc2VyIGNsaWNrZWQgdG8gc2F2ZSBhIG5ldyBhbm5vdGF0aW9uL2NvbW1lbnQgZHVyaW5nIGFkZCBuZXcgZmxvd1xuICAgIHNhdmVOZXcgKCkge1xuICAgICAgICBsZXQgY29tbWVudCA9IHRoaXMuJFVJLm5ld0NvbW1lbnRUZXh0YXJlYS52YWwoKTtcbiAgICAgICAgaWYoIWNvbW1lbnQpIHJldHVybjsgLy8gZW1wdHkgY29tbWVudCAtIFRPRE8gYWRkIHZhbGlkYXRpb24gLyBlcnIgbWVzc2FnZVxuXG4gICAgICAgIGxldCBhID0gQW5ub3RhdGlvbi5uZXdGcm9tRGF0YSh0aGlzLm1hcmtlci5yYW5nZSwgdGhpcy5zZWxlY3RhYmxlU2hhcGUuc2hhcGUsIGNvbW1lbnQsIHRoaXMucGx1Z2luKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmFkZE5ld0Fubm90YXRpb24oYSk7XG5cbiAgICAgICAgdGhpcy5jYW5jZWxBZGROZXcoKTtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2Ugbm9ybWFsIFVJIChoaWRlIG1hcmtlcnMsIGhpZGUgcGxheWJhY2ssIGV0Yykgb24gaW5pdCBhZGQgc3RhdGVcbiAgICBzZXRBZGRpbmdVSSAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzYWJsZVBsYXlpbmdBbmRDb250cm9sKCk7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBub3JtYWwgVUkgYWZ0ZXIgYWRkIHN0YXRlXG4gICAgcmVzdG9yZU5vcm1hbFVJICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmVuYWJsZWQgPSB0aGlzLnBsdWdpbi5hY3RpdmU7XG4gICAgICAgIHRoaXMuZW5hYmxlUGxheWluZ0FuZENvbnRyb2woKTtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLXRvb2x0aXAtJHt0aGlzLnBsYXllcklkfWApO1xuICAgIH1cblxuICAgIC8vIE9uIGFycm93IGtleSBwcmVzcywgbmF2aWdhdGUgdG8gbmV4dCBvciBwcmV2IEFubm90YXRpb25cbiAgICBoYW5kbGVBcnJvd0tleXMgKGUpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLmFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBsZXQga2V5SWQgPSBlLndoaWNoO1xuXG4gICAgICAgIGlmKGtleUlkID09IDM3KSB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUucHJldkFubm90YXRpb24oKTtcbiAgICAgICAgaWYoa2V5SWQgPT0gMzkpIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5uZXh0QW5ub3RhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEFkZHMgaGVscCB0ZXh0IHRvIGN1cnNvciBkdXJpbmcgYW5ub3RhdGlvbiBtb2RlXG4gICAgYmluZEN1cnNvclRvb2x0aXAgKCkge1xuICAgICAgICB0aGlzLnRvb2x0aXBBcmVhID0gVXRpbHMuYXJlYU9mSGlkZGVuRWwodGhpcy4kdG9vbHRpcCwgdGhpcy4kVUkuY292ZXJDYW52YXMsIHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pO1xuXG4gICAgICAgIC8vIEFzc2VydCBib3VuZHMgYXJlIHVwZGF0ZWQgaW4gcGx1Z2luIGluIGNhc2UgcGFnZSB3YXMgbW9kaWZpZWQgc2luY2UgY3JlYXRpb24sIHNvIHRvb2x0aXAgbWF0aCBpcyBjb3JyZWN0XG4gICAgICAgIHRoaXMucGx1Z2luLnNldEJvdW5kcyhmYWxzZSk7XG4gICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZW1vdmUudmFjLXRvb2x0aXAtJHt0aGlzLnBsYXllcklkfWAsIFV0aWxzLnRocm90dGxlKCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5ib3VuZHMpIHJldHVybjtcblxuICAgICAgICAgICAgbGV0IHggPSBldmVudC5wYWdlWCxcbiAgICAgICAgICAgICAgICB5ID0gZXZlbnQucGFnZVksXG4gICAgICAgICAgICAgICAgb3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAgICAgICAoeCA8IHRoaXMucGx1Z2luLmJvdW5kcy5sZWZ0IHx8IHggPiB0aGlzLnBsdWdpbi5ib3VuZHMucmlnaHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh5IDwgdGhpcy5wbHVnaW4uYm91bmRzLnRvcCB8fCB5ID4gdGhpcy5wbHVnaW4uYm91bmRzLmJvdHRvbSksXG4gICAgICAgICAgICAgICAgd2l0aGluQ29udHJvbHMgPSAhb3V0T2ZCb3VuZHMgJiYgeSA+PSB0aGlzLnBsdWdpbi5ib3VuZHMuYm90dG9tV2l0aG91dENvbnRyb2xzLFxuICAgICAgICAgICAgICAgIG1hcmtlckhvdmVyZWQgPSB0aGlzLiR0b29sdGlwLmhhc0NsYXNzKCd2YWMtbWFya2VyLWhvdmVyJyk7XG5cbiAgICAgICAgICAgIGlmKG91dE9mQm91bmRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kdG9vbHRpcC5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKTtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGN1cnNvclggICAgICA9IHggLSB0aGlzLnBsdWdpbi5ib3VuZHMubGVmdCxcbiAgICAgICAgICAgICAgICBjdXJzb3JZICAgICAgPSB5IC0gdGhpcy5wbHVnaW4uYm91bmRzLnRvcCxcbiAgICAgICAgICAgICAgICBtYXJnaW4gICAgICAgPSAxMCxcbiAgICAgICAgICAgICAgICByaWdodEVkZ2UgICAgPSB0aGlzLiRwbGF5ZXIud2lkdGgoKSxcbiAgICAgICAgICAgICAgICBib3R0b21FZGdlICAgPSB0aGlzLiRwbGF5ZXIuaGVpZ2h0KCkgLSB0aGlzLiRVSS5jb250cm9sQmFyLmhlaWdodCgpLFxuICAgICAgICAgICAgICAgIGF0UmlnaHRFZGdlICA9IChjdXJzb3JYICsgdGhpcy50b29sdGlwQXJlYS53aWR0aCArIG1hcmdpbioyKSA+PSByaWdodEVkZ2UsXG4gICAgICAgICAgICAgICAgYXRCb3R0b21FZGdlID0gKGN1cnNvclkgKyB0aGlzLnRvb2x0aXBBcmVhLmhlaWdodCArIG1hcmdpbioyKSA+PSBib3R0b21FZGdlO1xuXG4gICAgICAgICAgICAvLyBpcyB0aGUgdG9vbHRpcCB0b28gY2xvc2UgdG8gdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlP1xuICAgICAgICAgICAgbGV0IHBvc1ggPSBhdFJpZ2h0RWRnZSA/IChyaWdodEVkZ2UgLSB0aGlzLnRvb2x0aXBBcmVhLndpZHRoIC0gbWFyZ2luKSA6IChjdXJzb3JYICsgbWFyZ2luKSxcbiAgICAgICAgICAgICAgICBwb3NZID0gYXRCb3R0b21FZGdlID8gKGJvdHRvbUVkZ2UgLSB0aGlzLnRvb2x0aXBBcmVhLmhlaWdodCAtIG1hcmdpbikgOiAoY3Vyc29yWSArIG1hcmdpbik7XG5cbiAgICAgICAgICAgIC8vIGhpZGUgaWYgdGhlIGN1cnNvciBpcyBvdmVyIHRoZSBjb250cm9sIGJhciBidXQgbm90IGhvdmVyaW5nIG92ZXIgdGhlIGRyYWdnYWJsZSBtYXJrZXJcbiAgICAgICAgICAgIC8vIGFsc28gaGlkZSBpZiBtb3VzZSBpcyBkb3duXG4gICAgICAgICAgICBpZigod2l0aGluQ29udHJvbHMgJiYgIW1hcmtlckhvdmVyZWQpIHx8IHRoaXMuJHRvb2x0aXAuaGFzQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAucmVtb3ZlQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAuY3NzKHtcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb3NYfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3Bvc1l9cHhgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuYmluZCh0aGlzKSwgNTApKTtcbiAgICB9XG5cbiAgICBnZXQgJHRvb2x0aXAgKCkge1xuICAgICAgICB0aGlzLiR0b29sdGlwXyA9IHRoaXMuJHRvb2x0aXBfIHx8IHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpO1xuICAgICAgICByZXR1cm4gdGhpcy4kdG9vbHRpcF87XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYSB0aW1lbGluZSBtYXJrZXIgdGhhdCBpcyBkcmFnZ2FibGUgd2hlbiB1c2VyIGNsaWNrcy9kcmFncyBvbiBpdCwgYW5kIHJlYnVpbGRzIHVuZGVybHlpbmcgcmFuZ2VcbiAgICBhcyBkcmFnIG9jY3Vyc1xuKi9cblxuY29uc3QgICBNYXJrZXIgPSByZXF1aXJlKFwiLi9tYXJrZXJcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi8uLi9saWIvdXRpbHMnKSxcbiAgICAgICAgbWFya2VyVGVtcGxhdGVOYW1lID0gJ2RyYWdnYWJsZV9tYXJrZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIERyYWdnYWJsZU1hcmtlciBleHRlbmRzIE1hcmtlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyLCByYW5nZSkge1xuICAgICAgICBzdXBlcihwbGF5ZXIsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URSAtIHRoaXMgc2hvdWxkbid0IGJlIHJlcXVpcmVkIGFuZCBpcyBhIEhBQ0sgZm9yIGhvdyB0cmFuc3BpbGF0aW9uIHdvcmtzIGluIElFMTBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU5hbWUgPSBtYXJrZXJUZW1wbGF0ZU5hbWU7ICAgLy8gQ2hhbmdlIHRlbXBsYXRlIGZyb20gYmFzZSBNYXJrZXIgdGVtcGxhdGVcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgLy8gSXMgYSBkcmFnIGFjdGlvbiBjdXJyZW50bHkgb2NjcmluZz9cbiAgICAgICAgdGhpcy5yYW5nZVBpbiA9IHJhbmdlLnN0YXJ0OyAgICAgICAgICAgICAgLy8gV2hhdCdzIHRoZSBvcmlnaW5hbCBwaW5uZWQgdGltZWxpbmUgcG9pbnQgd2hlbiBtYXJrZXIgd2FzIGFkZGVkXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJFVJLm1hcmtlcldyYXA7ICAgICAgIC8vIFNldCBwYXJlbnQgYXMgbWFya2VyIHdyYXBcbiAgICB9XG5cbiAgICAvLyBCaW5kIG5lZWRlZCBldm5ldHMgZm9yIFVJIGludGVyYWN0aW9uXG4gICAgYmluZE1hcmtlckV2ZW50cyAoKSB7XG4gICAgICAgIC8vIE9uIG1vdXNlIGRvd24gaW5pdCBkcmFnXG4gICAgICAgIHRoaXMuJGVsLm9uKCdtb3VzZWRvd24udmFjLW1hcmtlcicsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIFdoZW4gbW91c2UgbW92ZXMgKHdpdGggbW91c2UgZG93bikgY2FsbCBvbkRyYWcsIHRocm90dGxpbmcgdG8gb25jZSBlYWNoIDI1MCBtc1xuICAgICAgICAgICAgJChkb2N1bWVudCkub24oYG1vdXNlbW92ZS52YWMtZG1hcmtlci0ke3RoaXMucGxheWVySWR9YCwgVXRpbHMudGhyb3R0bGUodGhpcy5vbkRyYWcuYmluZCh0aGlzKSwgMjUwKSApO1xuXG4gICAgICAgICAgICAvLyBBZGQgZHJhZyBjbGFzcyB0byBjdXJzb3IgdG9vbHRpcCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndmFjLWN1cnNvci1kcmFnZ2luZycpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBPbiBtb3VzZSB1cCBlbmQgZHJhZyBhY3Rpb24gYW5kIHVuYmluZCBtb3VzZW1vdmUgZXZlbnRcbiAgICAgICAgJChkb2N1bWVudCkub24oYG1vdXNldXAudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWAsIChlKSA9PiB7XG4gICAgICAgICAgICAgaWYoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNlbW92ZS52YWMtZG1hcmtlci0ke3RoaXMucGxheWVySWR9YCk7XG4gICAgICAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgLy8gUmVtb3ZlIGRyYWcgY2xhc3MgYW5kIGhvdmVyIGNsYXNzIGZyb20gY3Vyc29yIHRvb2x0aXAgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgaWYoIXRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndmFjLWN1cnNvci1kcmFnZ2luZycpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT24gbW91c2UgbW91c2UgZW50ZXIsIHNob3cgY3Vyc29yIHRvb2x0aXAgaWYgY29udHJvbHMgYXJlIG5vdCBzaG93blxuICAgICAgICAvLyBUaGlzIGFkZHMgdGhlIGNsYXNzIHdoaWNoIGlzIHBpY2tlZCB1cCBpbiBDb250cm9sc1xuICAgICAgICBpZighdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHMpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIHNlbGYuJGVsXG4gICAgICAgICAgICAgICAgLm9uKCdtb3VzZWVudGVyLnZhYy1jdXJzb3ItdG9vbC10aXAnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLmFkZENsYXNzKCd2YWMtbWFya2VyLWhvdmVyJyk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlbGVhdmUudmFjLWN1cnNvci10b29sLXRpcCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi4kcGxheWVyLmZpbmQoJy52YWMtY3Vyc29yLXRvb2wtdGlwJykucmVtb3ZlQ2xhc3MoJ3ZhYy1tYXJrZXItaG92ZXInKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPbiBkcmFnIGFjdGlvbiwgY2FsY3VsYXRlIG5ldyByYW5nZSBhbmQgcmUtcmVuZGVyIG1hcmtlclxuICAgIG9uRHJhZyAoZSkge1xuICAgICAgICB2YXIgZHJhZ1BlcmNlbnQgPSB0aGlzLnBlcmNlbnRWYWxGcm9tWHBvcyhlLnBhZ2VYKSxcbiAgICAgICAgICAgIHNlY1ZhbCA9IHBhcnNlSW50KHRoaXMuZHVyYXRpb24gKiBkcmFnUGVyY2VudCk7XG5cbiAgICAgICAgaWYoc2VjVmFsID4gdGhpcy5yYW5nZVBpbil7XG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiAgdGhpcy5yYW5nZVBpbixcbiAgICAgICAgICAgICAgICBlbmQ6ICAgIHNlY1ZhbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiAgc2VjVmFsLFxuICAgICAgICAgICAgICAgIGVuZDogICAgdGhpcy5yYW5nZVBpblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhZGRpbmdBbm5vdGF0aW9uRGF0YUNoYW5nZWQnLCB7IHJhbmdlOiB0aGlzLnJhbmdlIH0pO1xuICAgIH1cblxuICAgIC8vIENhbCBwZXJjZW50YWdlIChvZiB2aWRlbykgcG9zaXRpb24gZm9yIGEgcGl4ZWwtYmFzZWQgWCBwb3NpdGlvbiBvbiB0aGUgZG9jdW1lbnRcbiAgICBwZXJjZW50VmFsRnJvbVhwb3MgKHhwb3MpIHtcbiAgICAgICAgdmFyIHggPSBNYXRoLm1heCgwLCB4cG9zIC0gdGhpcy4kcGFyZW50Lm9mZnNldCgpLmxlZnQpLCAvLyBweCB2YWxcbiAgICAgICAgICAgIG1heCA9IHRoaXMuJHBhcmVudC5pbm5lcldpZHRoKCksXG4gICAgICAgICAgICBwZXIgPSAoeCAvIG1heCk7XG4gICAgICAgIGlmKHBlciA+IDEpIHBlciA9IDE7XG4gICAgICAgIGlmKHBlciA8IDApIHBlciA9IDA7XG4gICAgICAgIHJldHVybiBwZXI7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGJvdW5kIGV2ZW50cyBvbiBkZXN0cnVjdG9uXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNlbW92ZS52YWMtZG1hcmtlci0ke3RoaXMucGxheWVySWR9IG1vdXNldXAudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWApO1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ21vdXNlZW50ZXIudmFjLWN1cnNvci10b29sLXRpcCcpO1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ21vdXNlbGVhdmUudmFjLWN1cnNvci10b29sLXRpcCcpO1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ21vdXNlZG93bi52YWMtbWFya2VyJyk7XG4gICAgICAgIHRoaXMuJGVsLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdGhlIHZpZGVvICYgbWFya2VyIHN0YXJ0IGJ5IHNvbWUgbnVtIHNlY29uZHMgKHBvcyBvciBuZWcpXG4gICAgc2NydWJTdGFydCAoc2Vjb25kc0NoYW5nZWQpIHtcbiAgICAgICAgbGV0IG5ld1N0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydCArIHNlY29uZHNDaGFuZ2VkO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lID0gbmV3U3RhcnQ7XG4gICAgICAgIHRoaXMucmFuZ2Uuc3RhcnQgPSBuZXdTdGFydDtcbiAgICAgICAgdGhpcy5yYW5nZVBpbiA9IG5ld1N0YXJ0O1xuICAgICAgICB0aGlzLnRlYXJkb3duKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYWRkaW5nQW5ub3RhdGlvbkRhdGFDaGFuZ2VkJywgeyByYW5nZTogdGhpcy5yYW5nZSB9KTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBhIHRpbWVsaW5lIG1hcmtlciB3aXRoIGNhcGFiaWxpdGllcyB0byByZW5kZXIgb24gdGltZWxpbmUsIGluY2x1ZGluZyB0b29sdGlwIGZvciBjb21tZW50XG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBtYXJrZXJUZW1wbGF0ZU5hbWUgPSAnbWFya2VyJyxcbiAgICAgICAgbWFya2VyV3JhcFRlbXBsYXRlTmFtZSA9ICdtYXJrZXJfd3JhcCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgTWFya2VyIGV4dGVuZHMgUGxheWVyVUlDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllciwgcmFuZ2UsIGNvbW1lbnQ9bnVsbCkge1xuICAgICAgICBzdXBlcihwbGF5ZXIpO1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIHRoaXMudGVtcGxhdGVOYW1lID0gbWFya2VyVGVtcGxhdGVOYW1lO1xuXG4gICAgICAgIGlmKCF0aGlzLiRVSS5tYXJrZXJXcmFwLmxlbmd0aCl7XG4gICAgICAgICAgICB0aGlzLiRVSS50aW1lbGluZS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUZW1wbGF0ZShtYXJrZXJXcmFwVGVtcGxhdGVOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0aGlzIG1hcmtlciBhcyBhY3RpdmUgKGhpZ2hsaWdodCkgYW5kIG9wdGlvbmFsbHkgc2hvdyB0b29sdGlwIGFsc29cbiAgICBzZXRBY3RpdmUgKHNob3dUb29sdGlwPWZhbHNlKSB7XG4gICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKHRoaXMuVUlfQ0xBU1NFUy5hY3RpdmUpO1xuICAgICAgICBpZihzaG93VG9vbHRpcCkgdGhpcy4kZWwuYWRkQ2xhc3MoJ3ZhYy1mb3JjZS10b29sdGlwJyk7XG4gICAgfVxuXG4gICAgLy8gRGVhY3RpdmF0ZSB0aGlzIG1hcmtlclxuICAgIGRlYWN0aXZhdGUgKCkge1xuICAgICAgICB0aGlzLiRlbC5yZW1vdmVDbGFzcyhgJHt0aGlzLlVJX0NMQVNTRVMuYWN0aXZlfSB2YWMtZm9yY2UtdG9vbHRpcGApO1xuICAgIH1cblxuICAgIC8vIERyYXcgbWFya2VyIG9uIHRpbWVsaW5lIGZvciB0aGlzLnJhbmdlO1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIC8vIGNsZWFyIGV4aXN0aW5nIG1hcmtlciBpZiB0aGlzIG9uZSB3YXMgYWxyZWFkeSByZW5kZXJlZFxuICAgICAgICB0aGlzLiRVSS50aW1lbGluZS5maW5kKGBbZGF0YS1tYXJrZXItaWQ9XCIke3RoaXMuY29tcG9uZW50SWR9XCJdYCkucmVtb3ZlKCk7XG5cbiAgICAgICAgLy8gQmluZCB0byBsb2NhbCBpbnN0YW5jZSB2YXIsIGFkZCB0byBET00sIGFuZCBzZXR1cCBldmVudHNcbiAgICAgICAgdGhpcy4kZWwgPSAkKHRoaXMucmVuZGVyVGVtcGxhdGUodGhpcy50ZW1wbGF0ZU5hbWUsIHRoaXMubWFya2VyVGVtcGxhdGVEYXRhKSk7XG4gICAgICAgIHRoaXMuJFVJLm1hcmtlcldyYXAuYXBwZW5kKHRoaXMuJGVsKTtcbiAgICAgICAgdGhpcy5iaW5kTWFya2VyRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gQmluZCBuZWVkZWQgZXZlbnRzIGZvciB0aGlzIG1hcmtlclxuICAgIGJpbmRNYXJrZXJFdmVudHMgKCkge1xuICAgICAgICAvLyBoYW5kbGUgZGltbWluZyBvdGhlciBtYXJrZXJzICsgaGlnaGxpZ2h0aW5nIHRoaXMgb25lIG9uIG1vdXNlZW50ZXIvbGVhdmVcbiAgICAgICAgdGhpcy4kZWwub24oXCJtb3VzZWVudGVyLnZhYy1tYXJrZXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kZWwuYWRkQ2xhc3MoJ3ZhYy1ob3ZlcmluZycpLmNsb3Nlc3QoXCIudmFjLW1hcmtlci13cmFwXCIpLmFkZENsYXNzKCd2YWMtZGltLWFsbCcpO1xuICAgICAgICB9KS5vbihcIm1vdXNlbGVhdmUudmFjLW1hcmtlclwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRlbC5yZW1vdmVDbGFzcygndmFjLWhvdmVyaW5nJykuY2xvc2VzdChcIi52YWMtbWFya2VyLXdyYXBcIikucmVtb3ZlQ2xhc3MoJ3ZhYy1kaW0tYWxsJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIG9iamVjdCBmb3IgdGVtcGxhdGVcbiAgICBnZXQgbWFya2VyVGVtcGxhdGVEYXRhICgpIHtcbiAgICAgICAgIC8vIHRoZSBzbWFsbGVyIHRoZSB3aWR0aCwgdGhlIGhpZ2hlciB0aGUgei1pbmRleCBzbyBvdmVybGFwcyBhcmUgY2xpY2thYmxlXG4gICAgICAgIGxldCBsZWZ0ID0gKHRoaXMucmFuZ2Uuc3RhcnQgLyB0aGlzLmR1cmF0aW9uKSAqIDEwMCxcbiAgICAgICAgICAgIHdpZHRoID0gKCh0aGlzLnJhbmdlLmVuZCAvIHRoaXMuZHVyYXRpb24pICogMTAwKSAtIGxlZnQsXG4gICAgICAgICAgICB6SW5kZXggPSAoMTAwIC0gTWF0aC5mbG9vcih3aWR0aCkpIHx8IDEwMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6ICAgICAgICAgbGVmdCArICclJyxcbiAgICAgICAgICAgIHdpZHRoOiAgICAgICAgd2lkdGggKyAnJScsXG4gICAgICAgICAgICB6SW5kZXg6ICAgICAgIHpJbmRleCxcbiAgICAgICAgICAgIHNob3dUb29sdGlwOiAgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93TWFya2VyU2hhcGVBbmRUb29sdGlwcyxcbiAgICAgICAgICAgIHRvb2x0aXBSaWdodDogbGVmdCA+IDUwLFxuICAgICAgICAgICAgdG9vbHRpcFRpbWU6ICBVdGlscy5odW1hblRpbWUodGhpcy5yYW5nZSksXG4gICAgICAgICAgICB0b29sdGlwQm9keTogICF0aGlzLmNvbW1lbnQgPyBudWxsIDogdGhpcy5jb21tZW50LmJvZHksXG4gICAgICAgICAgICByYW5nZVNob3c6ICAgICEhdGhpcy5yYW5nZS5lbmQsXG4gICAgICAgICAgICBpZDogICAgICAgICAgIHRoaXMuY29tcG9uZW50SWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgbGlzdGVuZXJzIG9uIHRlYXJkb3duIGFuZCByZW1vdmUgRE9NIG5vZGVzXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLiRlbFxuICAgICAgICAgICAgLm9mZignbW91c2VlbnRlci52YWMtbWFya2VyJylcbiAgICAgICAgICAgIC5vZmYoJ21vdXNlbGVhdmUudmFjLW1hcmtlcicpXG4gICAgICAgICAgICAub2ZmKCdjbGljay52YWMtbWFya2VyJyk7XG4gICAgICAgIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBtYWluICdhbm5vdGF0aW9uIHRvZ2dsZScgYnV0dG9uIGluIHRoZSBwbGF5ZXIgY29udHJvbHMsIGluY2x1ZGluZyBub3RpZmllciBmb3IgIyBhbm5vdGF0aW9uc1xuKi9cblxuY29uc3QgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgIHRlbXBsYXRlTmFtZSA9IFwicGxheWVyX2J1dHRvblwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFBsYXllckJ1dHRvbiBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgICAgICB0aGlzLmluaXRBUEkodGhpcywgJ1BsYXllckJ1dHRvbicpO1xuXG4gICAgICAgIHRoaXMuJGVsLm9uKCdjbGljay52YWMtcGxheWVyLWJ1dHRvbicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBidXR0b24gdG8gcGxheWVyXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgbGV0IGJ0biA9IHRoaXMucGxheWVyLmdldENoaWxkKCdjb250cm9sQmFyJykuYWRkQ2hpbGQoJ2J1dHRvbicsIHt9KTtcbiAgICAgICAgYnRuLmNvbnRyb2xUZXh0KFwiVG9nZ2xlIEFuaW1hdGlvbnNcIik7XG4gICAgICAgIHRoaXMuJGVsID0gJChidG4uZWwoKSk7XG4gICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKCd2YWMtcGxheWVyLWJ0bicpLmZpbmQoXCIudmpzLWljb24tcGxhY2Vob2xkZXJcIikuaHRtbCh0aGlzLnJlbmRlclRlbXBsYXRlKHRlbXBsYXRlTmFtZSkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zIGRpc3BsYXllZCBpbiB0aGUgYnViYmxlXG4gICAgdXBkYXRlTnVtQW5ub3RhdGlvbnMgKCkge1xuICAgICAgICBsZXQgbnVtID0gdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmFubm90YXRpb25zLmxlbmd0aCxcbiAgICAgICAgICAgICRidWJibGUgPSB0aGlzLiRlbC5maW5kKFwiYlwiKTtcbiAgICAgICAgJGJ1YmJsZS50ZXh0KG51bSk7XG4gICAgICAgIG51bSA+IDAgPyAkYnViYmxlLnJlbW92ZUNsYXNzKHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pIDogJGJ1YmJsZS5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKTtcbiAgICB9XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgbGlzdGVuZXJzIG9uIHRlYXJkb3duIGFuZCByZW1vdmUgRE9NIG5vZGVzXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ2NsaWNrLnZhYy1wbGF5ZXItYnV0dG9uJyk7XG4gICAgICAgIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYSBzaGFwZSB0aGF0IGNhbiBiZSBkcnVnL3NpemVkIG9uIHRvcCBvZiB0aGUgdmlkZW8gd2hpbGUgYWRkaW5nIGEgbmV3IGFubm90YXRpb25cbiovXG5cbmNvbnN0ICAgU2hhcGUgPSByZXF1aXJlKFwiLi9zaGFwZVwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKCcuLy4uL2xpYi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFNlbGVjdGFibGVTaGFwZSBleHRlbmRzIFNoYXBlIHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy4kcGFyZW50ID0gdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLXZpZGVvLWNvdmVyLWNhbnZhc1wiKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGFsbCBuZWVkZWQgZXZlbnRzIGZvciBkcmFnIGFjdGlvblxuICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICAvLyBPbiBtb3VzZWRvd24gaW5pdGlhbGl6ZSBkcmFnXG4gICAgICAgIHRoaXMuJHBhcmVudC5vbihcIm1vdXNlZG93bi52YWMtc2VsZWN0YWJsZS1zaGFwZVwiLCAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgYSBmZXcgY29uZGl0aW9ucyB0byBzZWUgaWYgd2Ugc2hvdWxkICpub3QqIHN0YXJ0IGRyYWdcbiAgICAgICAgICAgIGlmKCAhKCQoZS50YXJnZXQpLmhhc0NsYXNzKCd2YWMtdmlkZW8tY292ZXItY2FudmFzJykpICkgcmV0dXJuOyAvL2RpZG4ndCBjbGljayBvbiBvdmVybGF5XG4gICAgICAgICAgICBpZiggJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3ZhYy1zaGFwZScpICkgcmV0dXJuOyAvL3VzZXIgY2xpY2tlZCBvbiBhbm5vdGF0aW9uXG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBvbGQgc2hhcGUgaWYgb25lIGV4aXN0ZWRcbiAgICAgICAgICAgIGlmKHRoaXMuJGVsKSB0aGlzLiRlbC5yZW1vdmUoKTtcblxuICAgICAgICAgICAgLy8gRGVmaW5lIGRlZmF1bHQgc3RhcnRpbmcgc2hhcGUgKGp1c3QgeC95IGNvb3JkcyBvZiB3aGVyZSB1c2VyIGNsaWNrZWQgbm8gd2lkdGgvaGVpZ2h0IHlldClcbiAgICAgICAgICAgIGxldCBzaGFwZSA9IHtcbiAgICAgICAgICAgICAgICB4MTogdGhpcy54Q29vcmRUb1BlcmNlbnQoZS5wYWdlWCksXG4gICAgICAgICAgICAgICAgeTE6IHRoaXMuWUNvb3JkVG9QZXJjZW50KGUucGFnZVkpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2hhcGUueDIgPSBzaGFwZS54MTtcbiAgICAgICAgICAgIHNoYXBlLnkyID0gc2hhcGUueTI7XG4gICAgICAgICAgICB0aGlzLnNoYXBlID0gc2hhcGU7XG5cbiAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luIHBvaW50cyBmb3IgZnV0dXJlIHVzZVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5YID0gc2hhcGUueDE7XG4gICAgICAgICAgICB0aGlzLm9yaWdpblkgPSBzaGFwZS55MTtcblxuICAgICAgICAgICAgLy8gRHJhdyBzaGFwZSBhbmQgc3RhcnQgZHJhZyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kcmFnTW92ZWQgPSBmYWxzZTsgLy8gdXNlZCB0byBkZXRlcm1pbmUgaWYgdXNlciBhY3R1YWxseSBkcmFnZ2VkIG9yIGp1c3QgY2xpY2tlZFxuXG4gICAgICAgICAgICAvLyBCaW5kIGV2ZW50IG9uIGRvYyBtb3VzZW1vdmUgdG8gdHJhY2sgZHJhZywgdGhyb3R0bGVkIHRvIG9uY2UgZWFjaCAxMDBtc1xuICAgICAgICAgICAgJChkb2N1bWVudCkub24oYG1vdXNlbW92ZS52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gLCBVdGlscy50aHJvdHRsZSh0aGlzLm9uRHJhZy5iaW5kKHRoaXMpLCAxMDApICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBkcmFnIGNsYXNzIHRvIGN1cnNvciB0b29sdGlwIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgaWYoIXRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtY3Vyc29yLXRvb2wtdGlwJykuYWRkQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT24gbW91c2V1cCwgaWYgZHVyaW5nIGRyYWcgY2FuY2VsIGRyYWcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZXVwLnZhYy1zc2hhcGUtJHt0aGlzLnBsYXllcklkfWAsIChlKSA9PiB7XG4gICAgICAgICAgICBpZighdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNlbW92ZS52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gKTtcblxuICAgICAgICAgICAgaWYoIXRoaXMuZHJhZ01vdmVkKXtcbiAgICAgICAgICAgICAgICAvL2NsZWFyIHNoYXBlIGlmIGl0J3MganVzdCBhIGNsaWNrIChhbmQgbm90IGEgZHJhZylcbiAgICAgICAgICAgICAgICB0aGlzLnNoYXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLiRlbCkgdGhpcy4kZWwucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGRyYWcgY2xhc3MgZnJvbSBjdXJzb3IgdG9vbHRpcCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLnJlbW92ZUNsYXNzKCd2YWMtY3Vyc29yLWRyYWdnaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE9uIGVhY2ggaW50ZXJhdGlvbiBvZiBkcmFnIGFjdGlvbiAobW91c2UgbW92ZW1lbnQpLCByZWNhbGMgcG9zaXRpb24gYW5kIHJlZHJhdyBzaGFwZVxuICAgIG9uRHJhZyAoZSkge1xuICAgICAgICB0aGlzLmRyYWdNb3ZlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IHhQZXIgPSB0aGlzLnhDb29yZFRvUGVyY2VudChlLnBhZ2VYKSxcbiAgICAgICAgICAgIHlQZXIgPSB0aGlzLllDb29yZFRvUGVyY2VudChlLnBhZ2VZKTtcblxuICAgICAgICBpZih4UGVyIDwgdGhpcy5vcmlnaW5YKXtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueDIgPSB0aGlzLm9yaWdpblg7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLngxID0gTWF0aC5tYXgoMCwgeFBlcik7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zaGFwZS54MiA9IE1hdGgubWluKDEwMCwgeFBlcik7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLngxID0gdGhpcy5vcmlnaW5YO1xuICAgICAgICB9XG4gICAgICAgIGlmKHlQZXIgPCB0aGlzLm9yaWdpblkpe1xuICAgICAgICAgICAgdGhpcy5zaGFwZS55MiA9IHRoaXMub3JpZ2luWTtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueTEgPSBNYXRoLm1heCgwLCB5UGVyKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLnkyID0gTWF0aC5taW4oMTAwLCB5UGVyKTtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueTEgPSB0aGlzLm9yaWdpblk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREaW1zRnJvbVNoYXBlKCk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYWRkaW5nQW5ub3RhdGlvbkRhdGFDaGFuZ2VkJywgeyBzaGFwZTogdGhpcy5zaGFwZSB9KTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHBpeGVsLWJhc2VkIHggcG9zaXRpb24gKHJlbGF0aXZlIHRvIGRvY3VtZW50KSB0byBwZXJjZW50YWdlIGluIHZpZGVvXG4gICAgeENvb3JkVG9QZXJjZW50ICh4KSB7XG4gICAgICAgIHggPSB4IC0gdGhpcy4kcGFyZW50Lm9mZnNldCgpLmxlZnQ7IC8vcGl4ZWwgcG9zaXRpb25cbiAgICAgICAgbGV0IG1heCA9IHRoaXMuJHBhcmVudC5pbm5lcldpZHRoKCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIoKCh4IC8gbWF4KSAqIDEwMCkudG9GaXhlZCgyKSk7IC8vcm91bmQgdG8gMiBkZWNpbWFsIHBsYWNlc1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgcGl4ZWwtYmFzZWQgeSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gZG9jdW1lbnQpIHRvIHBlcmNlbnRhZ2UgaW4gdmlkZW9cbiAgICBZQ29vcmRUb1BlcmNlbnQgKHkpIHtcbiAgICAgICAgeSA9IHkgLSB0aGlzLiRwYXJlbnQub2Zmc2V0KCkudG9wOyAvL3BpeGVsIHBvc2l0aW9uXG4gICAgICAgIGxldCBtYXggPSB0aGlzLiRwYXJlbnQuaW5uZXJIZWlnaHQoKTtcbiAgICAgICAgcmV0dXJuIE51bWJlcigoKHkgLyBtYXgpICogMTAwKS50b0ZpeGVkKDIpKTsgLy9yb3VuZCB0byAyIGRlY2ltYWwgcGxhY2VzXG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGV2ZW50cyBhbmQgcmVtb3ZlIGVsZW1lbnRcbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIHRoaXMuJHBhcmVudC5vZmYoJ21vdXNlZG93bi52YWMtc2VsZWN0YWJsZS1zaGFwZScpO1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNldXAudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9IG1vdXNlbW92ZS52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBtYW5hZ2luZyBhIHNoYXBlIChpLmUuIGJveCBkcmF3biBvbiB0aGUgcGxheWVyKSBmb3IgYW4gYW5ub3RhdGlvblxuKi9cblxuY29uc3QgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBTaGFwZSBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIsIHNoYXBlPW51bGwpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlO1xuICAgICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLiRwbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aGUgc2hhcGUgZWxlbWVudCBvbiB0aGUgJHBhcmVudFxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGlmKCF0aGlzLnNoYXBlKSByZXR1cm47XG4gICAgICAgIGlmKHRoaXMuJGVsKSB0aGlzLiRlbC5yZW1vdmUoKTtcblxuICAgICAgICB0aGlzLiRlbCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3MoXCJ2YWMtc2hhcGVcIik7XG4gICAgICAgIHRoaXMuc2V0RGltc0Zyb21TaGFwZSgpO1xuICAgICAgICB0aGlzLiRwYXJlbnQuYXBwZW5kKHRoaXMuJGVsKTtcbiAgICB9XG5cbiAgICAvLyBTZXQvdXBkYXRlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBzaGFwZSBiYXNlZCAgb24gdGhpcy5zaGFwZVxuICAgIHNldERpbXNGcm9tU2hhcGUgKCkge1xuICAgICAgICB0aGlzLiRlbC5jc3Moe1xuICAgICAgICAgICAgbGVmdDogICB0aGlzLnNoYXBlLngxICsgXCIlXCIsXG4gICAgICAgICAgICB0b3A6ICAgIHRoaXMuc2hhcGUueTEgKyBcIiVcIixcbiAgICAgICAgICAgIHdpZHRoOiAgKHRoaXMuc2hhcGUueDItdGhpcy5zaGFwZS54MSkgKyBcIiVcIixcbiAgICAgICAgICAgIGhlaWdodDogKHRoaXMuc2hhcGUueTItdGhpcy5zaGFwZS55MSkgKyBcIiVcIlxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG4vKlxuICAgIENsYXNzZXMgZm9yIHJlZ2lzdGVyaW5nIGFuZCBoYW5kbGluZyBjdXN0b20gZXZlbnRzIGZvciBleHRlcm5hbCBpbnRlcmFjdGlvbiBzdXBwb3J0LlxuICAgIFdpbGwgYmUgYm91bmQgdG8gcGx1Z2luIG9iamVjdCBhcyBhIG1lc3NhZ2UgZ2F0ZXdheSBiZXR3ZWVuIGV4dGVybmFsIGVsZW1lbnRzIGFuZCB0aGUgcGx1Z2luLlxuKi9cblxuY29uc3QgTG9nZ2VyID0gcmVxdWlyZShcIi4vbG9nZ2VyXCIpO1xuXG4vKlxuICAgIEEgY2VudHJhbGl6ZWQgY29sbGVjdGlvbiBvZiBldmVudCBjYWxsYmFja3Mgb3JnYW5pemVkIGJ5IGNvbXBvbmVudCBhbmQgbmFtZVxuICAgIE1haW4gcmVmZXJlbmNlIGZvciBleHRlcm5hbCBldmVudCBhcGlcbiAgICBUaGVzZSBldmVudHMgd2lsbCBiZSBib3VuZCB0byB0aGUgcGx1Z2luIG9uIGluaXRpYWxpemF0aW9uIG9mIHRoZWlyIHJlc3BlY3RpdmUgY29tcG9uZW50c1xuICAgIE5PVEUgLSAnc2VsZicgYXMgc2Vjb25kIHBhcmFtIGluIGVhY2ggZnVuY3Rpb24gaXMgYSB3b3JrYXJvdW5kIGZvciB0cmFuc3BpbGVyIG5vdCBwcm9wZXJseVxuICAgIGtlZXBpbmcgdGhpcyAsIHNvIHdlIHBhc3MgaW4gaW5zdGFuY2UgdG8gdXNlIGFzIHRoaXMgZm9yIGVhY2ggZm4gLSBjYW4ndCByZWx5IG9uIGJpbmRcbiAgICBiZWNhdXNlIHRoaXMgaXMgcmV3cml0dGVuIGZyb20gc3ltYm9sIHJlZ2lzdHJ5IGluIHRyYW5zcGlsZXIgYW5kIGl0J3Mgbm90IHByZXNlbnRcbiovXG5cbmNvbnN0IEV2ZW50UmVnaXN0cnkgPSB7XG4gICAgQW5ub3RhdGlvblN0YXRlOiB7XG4gICAgICAgIG9wZW5Bbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5vcGVuQW5ub3RhdGlvbkJ5SWQoZXZlbnQuZGV0YWlsLmlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VBY3RpdmVBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBuZXdBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5jcmVhdGVBbmRBZGRBbm5vdGF0aW9uKGV2ZW50LmRldGFpbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3lBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5kZXN0cm95QW5ub3RhdGlvbkJ5SWQoZXZlbnQuZGV0YWlsLmlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgbmV3Q29tbWVudDogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgbGV0IGFubm90YXRpb24gPSBfdGhpcy5maW5kQW5ub3RhdGlvbihldmVudC5kZXRhaWwuYW5ub3RhdGlvbklkKTtcbiAgICAgICAgICAgIGlmKGFubm90YXRpb24pIGFubm90YXRpb24uY29tbWVudExpc3QuY3JlYXRlQ29tbWVudChldmVudC5kZXRhaWwuYm9keSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3lDb21tZW50OiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tbWVudCA9IF90aGlzLmZpbmRDb21tZW50KGV2ZW50LmRldGFpbC5pZCk7XG4gICAgICAgICAgICBpZihjb21tZW50KSBjb21tZW50LmNvbW1lbnRMaXN0LmRlc3Ryb3lDb21tZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgQ29udHJvbHM6IHtcbiAgICAgICAgYWRkaW5nQW5ub3RhdGlvbjogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgX3RoaXMuc3RhcnRBZGROZXcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FuY2VsQWRkaW5nQW5ub3RhdGlvbjogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgX3RoaXMuY2FuY2VsQWRkTmV3KCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFBsYXllckJ1dHRvbjoge1xuICAgICAgICBvblN0YXRlQ2hhbmdlZDogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgX3RoaXMudXBkYXRlTnVtQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgQW5ub3RhdGlvbkNvbW1lbnRzOiB7XG4gICAgICAgIHRvZ2dsZUFubm90YXRpb25Nb2RlOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBFdmVudERpc3BhdGNoZXIge1xuXG4gICAgY29uc3RydWN0b3IgKHBsdWdpbikge1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5wbHVnaW5SZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdFdnRzID0gW107XG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZExpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLmV2ZW50UmVnaXN0cnkgPSBFdmVudFJlZ2lzdHJ5O1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgRXZlbnRSZWdpc3RyeSB0byBtYXNzIHJlZ2lzdGVyIGV2ZW50cyBvbiBlYWNoIGNvbXBvbmVudCBpbml0aWFsaXphdGlvblxuICAgIHJlZ2lzdGVyTGlzdGVuZXJzRm9yIChvYmosIGNsYXNzTmFtZSkge1xuICAgICAgICBsZXQgbWF0Y2hpbmdFdmVudHMgPSB0aGlzLmV2ZW50UmVnaXN0cnlbY2xhc3NOYW1lXTtcbiAgICAgICAgaWYgKG1hdGNoaW5nRXZlbnRzKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGluZ0V2ZW50cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmVnaXN0ZXIgYWdhaW4gaWYgYWxyZWFkeSBpbiBjYWNoZWQgY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIGlmICghfnRoaXMucmVnaXN0ZXJlZExpc3RlbmVycy5pbmRleE9mKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gbWF0Y2hpbmdFdmVudHNba2V5XS5iaW5kKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcihrZXksICgoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5wbHVnaW5SZWFkeSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDYWxsYmFjayhrZXksIGNsYXNzTmFtZSwgZXZ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2dCwgb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCaW5kIGEgbGlzdGVuZXIgdG8gdGhlIHBsdWdpblxuICAgIHJlZ2lzdGVyTGlzdGVuZXIgKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLm9uKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzLnB1c2godHlwZSk7XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGEgbGlzdGVuZXIgZnJvbSB0aGUgcGx1Z2luXG4gICAgdW5yZWdpc3Rlckxpc3RlbmVyICh0eXBlKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLm9mZih0eXBlKTtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50IG9uIHRoZSBwbHVnaW5cbiAgICBmaXJlICh0eXBlLCBkYXRhKSB7XG4gICAgICAgIGlmKCF0aGlzLnBsdWdpblJlYWR5KSByZXR1cm47XG4gICAgICAgIExvZ2dlci5sb2coXCJldnQtZGlzcGF0Y2gtRklSRVwiLCB0eXBlLCBkYXRhKTtcbiAgICAgICAgbGV0IGV2dCA9IG5ldyBDdXN0b21FdmVudCh0eXBlLCB7ICdkZXRhaWwnOiBkYXRhIH0pO1xuICAgICAgICB0aGlzLnBsdWdpbi50cmlnZ2VyKGV2dCk7XG4gICAgfVxuXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMuZm9yRWFjaCgodHlwZSkgPT4geyB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcih0eXBlKSB9KTtcbiAgICB9XG5cbiAgICBsb2dDYWxsYmFjayAoZXZlbnROYW1lLCBjbGFzc05hbWUsIGV2ZW50KSB7XG4gICAgICAgIExvZ2dlci5sb2coXCJldnQtZGlzcGF0Y2gtUkVDRUlWRVwiLCBgJHtldmVudE5hbWV9ICgke2NsYXNzTmFtZX0pYCwgZXZlbnQpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8qXG5cdEdlbmVyYWwgbG9nZ2luZyBsaWJyYXJ5LCBjaGVja2luZyB0byBzZWUgaWYgd2luZG93LlZBQ19ERUJVRyBpcyBwcmVzZW50IGFuZCB0cnVlIHRvIGVuYWJsZSBkZWJ1Z2dpbmdcbiovXG5cbi8vIFByZWZpeCBmb3IgYXBwZW5kaW5nIHRvIGFsbCBsb2dnZXIgbWVzc2FnZXNcbmNvbnN0IExPR19QUkVGSVggPSBcIjo6VkFDOjpcIjtcblxuLy8gQXJlIHdlIGluIGRlYnVnIG1vZGU/XG5mdW5jdGlvbiBkZWJ1Zygpe1xuXHRyZXR1cm4gISF3aW5kb3cuVkFDX0RFQlVHO1xufVxuXG4vLyBCdWlsZCBhcmd1bWVudHMgZm9yIGNvbnNvbGUgZm4sIGFkZGluZyBwcmVmaXhcbmZ1bmN0aW9uIGJ1aWxkQXJncyhhcmdzKXtcblx0cmV0dXJuIFtMT0dfUFJFRklYXS5jb25jYXQoYXJncyk7XG59XG5cbi8vIExvZyBtZXNzYWdlL2RhdGFcbm1vZHVsZS5leHBvcnRzLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYoIWRlYnVnKCkpIHJldHVybjtcbiAgICBjb25zb2xlLmxvZy5hcHBseShudWxsLCBidWlsZEFyZ3MoYXJncykpO1xufVxuXG4vLyBFcnJvciBtZXNzYWdlL2RhdGFcbm1vZHVsZS5leHBvcnRzLmVycm9yID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZighZGVidWcoKSkgcmV0dXJuO1xuICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkobnVsbCwgYnVpbGRBcmdzKGFyZ3MpKTtcbn1cblxuLy8gSW5mbyBtZXNzYWdlL2RhdGFcbm1vZHVsZS5leHBvcnRzLmluZm8gPSAoLi4uYXJncykgPT4ge1xuICAgIGlmKCFkZWJ1ZygpKSByZXR1cm47XG4gICAgY29uc29sZS5pbmZvLmFwcGx5KG51bGwsIGJ1aWxkQXJncyhhcmdzKSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQmFzZSBjbGFzcyBhbGwgcGxheWVyIGNvbXBvbmVudHMgaW50ZXJpdCBmcm9tIC0gaXQgaW5jbHVkZXMgbG90cyBvZiBoZWxwZXIgZnVuY3Rpb25zICh0byBnZXQgcmVmZXJlbmNlIHRvXG4gICAgdGhlIHBsYXllciwgdGhlIHBsdWdpbiwgdmlkZW8gc3RhdGUsIGV0YylcbiovXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGxheWVyQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgdGhpcy5fcGxheWVyID0gcGxheWVyO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcmVmZXJlbmNlIHRvIHRoZSBtYWluIHBsdWdpbiBvYmplY3QgKG1haW4uanMgaW5zdGFuY2UpXG4gICAgZ2V0IHBsdWdpbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5hbm5vdGF0aW9uQ29tbWVudHMoKTtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBqYXZhc2NyaXB0IGluc3RhbmNlXG4gICAgZ2V0IHBsYXllciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gYXR0cmlidXRlIHRvIGdldCB2aWRlbyBkdXJhdGlvbiAoaW4gc2Vjb25kcylcbiAgICBnZXQgZHVyYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZHVyYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBjdXJyZW50IHRpbWVcbiAgICBnZXQgY3VycmVudFRpbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuY3VycmVudFRpbWUoKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgY3VycmVudCB0aW1lIG9mIHBsYXllclxuICAgIHNldCBjdXJyZW50VGltZSAodGltZSkge1xuICAgICAgICB0aGlzLnBsYXllci5jdXJyZW50VGltZSh0aW1lKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBhbGwgZXZlbnRzIGluIHRoZSBFdmVudFJlZ2lzdHJ5IG1hdGNoaW5nIHRoaXMgY2xhc3NOYW1lXG4gICAgaW5pdEFQSSAob2JqLCBjbGFzc05hbWUpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4uZXZlbnREaXNwYXRjaGVyLnJlZ2lzdGVyTGlzdGVuZXJzRm9yKG9iaiwgY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBOdWxsaWZ5IHBsYXllciByZWZlcmVuY2Ugc28gb2JqZWN0cyBjYW4gYmUgcmVtb3ZlZCBzYWZlbHlcbiAgICAvLyBBbGwgY29tcG9uZW50cyBzaG91bGQgY2FsbCBzdXBlci50ZWFyZG93bigpIHdpdGhpbiB0aGVpciB0ZWFyZG93biBmdW5jc1xuICAgIHRlYXJkb3duIChkZXN0cm95PWZhbHNlKSB7XG4gICAgICAgIGlmKGRlc3Ryb3kpIHRoaXMuX3BsYXllciA9IG51bGw7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIEJhc2UgY2xhc3MgYWxsIHBsYXllciBVSSBjb21wb25lbnRzIGludGVyaXQgZnJvbSAtIGl0IGluY2x1ZGVzIGxvdHMgb2YgaGVscGVyIGZ1bmN0aW9ucyAodG8gZ2V0IHJlZmVyZW5jZSB0b1xuICAgIHRoZSBwbGF5ZXIgJGVsLCB2YXJpb3VzIGNsYXNzZXMvaGVscGVycywgdGVtcGxhdGUgcmVuZGVyaW5nLCBldGMpXG4qL1xuXG5jb25zdCBQbGF5ZXJDb21wb25lbnQgPSByZXF1aXJlKFwiLi9wbGF5ZXJfY29tcG9uZW50XCIpLFxuICAgICAgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMvcnVudGltZScpLFxuICAgICAgVGVtcGxhdGVzID0gcmVxdWlyZSgnLi8uLi9jb21waWxlZC90ZW1wbGF0ZXMnKSxcbiAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi8uLi9saWIvdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQbGF5ZXJVSUNvbXBvbmVudCBleHRlbmRzIFBsYXllckNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgfVxuXG4gICAgLy8gaGVscGVycyB0byBnZXQgdmFyaW91cyBVSSBjb21wb25lbnRzIG9mIHRoZSBwbGF5ZXIgcXVpY2tseSwga2VlcGluZyBjb21tb25seSByZXVzZWQgY2xhc3MgbmFtZXNcbiAgICAvLyBjb25zb2xpZGF0ZWQgaW4gY2FzZSBvZiBuZWVkIHRvIGNoYW5nZSBpbiB0aGUgZnV0dXJlIChhbmQgZm9yIHF1aWNrIGFjY2VzcylcbiAgICBnZXQgJFVJICgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgY29tbWVudHNDb250YWluZXI6ICAgICAgdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLWNvbW1lbnRzLWNvbnRhaW5lclwiKSwgICAgICAgLy8gb3V0ZXIgY29udGFpbmVyIGZvciBhbGwgY29tbWVudHNcbiAgICAgICAgICAgIGNvbnRyb2xFbGVtZW50czogICAgICAgIHRoaXMuJHBsYXllci5maW5kKFwiLnZhYy1jb250cm9sXCIpLCAgICAgICAgICAgICAgICAgIC8vIEVhY2ggb2YgbXVsdGlwbGUgY29udHJvbCBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBiYXJcbiAgICAgICAgICAgIG5ld0NvbW1lbnRUZXh0YXJlYTogICAgIHRoaXMuJHBsYXllci5maW5kKFwiLnZhYy12aWRlby13cml0ZS1uZXcgdGV4dGFyZWFcIiksIC8vIFRleHRhcmVhIGZvciB3cml0aW5nIGEgbmV3IGNvbW1lbnRcbiAgICAgICAgICAgIHRpbWVsaW5lOiAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmpzLXByb2dyZXNzLWNvbnRyb2wnKSwgICAgICAgICAvLyBUaW1lbGluZSBlbGVtZW50XG4gICAgICAgICAgICBtYXJrZXJDdXJzb3JIZWxwVGV4dDogICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItaGVscC10ZXh0JyksICAgICAgICAgLy8gSGVscCB0ZXh0IHRoYXQgYXBwZWFycyB3aXRoICdjbGljay9kcmFnLi4nIG9uIHRpbWVsaW5lXG4gICAgICAgICAgICBjb250cm9sQmFyOiAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZqcy1jb250cm9sLWJhcicpLCAgICAgICAgICAgICAgLy8gQ29ucm9sIGJhciB3cmFwcGVyIGZvciB2anNcbiAgICAgICAgICAgIG1hcmtlcldyYXA6ICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLW1hcmtlci13cmFwJyksICAgICAgICAgICAgICAvLyB3cmFwcGVyIGVsZW1lbnQgdG8gcGxhY2UgbWFya2VycyBpbiBvbiB0aW1lbGluZVxuICAgICAgICAgICAgY292ZXJDYW52YXM6ICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtdmlkZW8tY292ZXItY2FudmFzJykgICAgICAgIC8vIFBsYXllciBjb3ZlciBkdXJpbmcgYWRkaW5nIGFubm90YXRpb24gc3RhdGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdXRpbGl0eSBjbGFzc2VzIHVzZWQgaW4gdmFyaW91cyBjb21wb25lbnRzXG4gICAgZ2V0IFVJX0NMQVNTRVMgKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBoaWRkZW46IFwidmFjLWhpZGRlblwiLFxuICAgICAgICAgICAgYWN0aXZlOiBcInZhYy1hY3RpdmVcIlxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBqcXVlcnkgZWxlbWVudFxuICAgIGdldCAkcGxheWVyICgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcy5wbGF5ZXIuZWwoKSk7XG4gICAgfVxuXG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBpZCBmcm9tIERPTVxuICAgIGdldCBwbGF5ZXJJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRwbGF5ZXIuYXR0cignaWQnKTtcbiAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYSBwc2V1ZG8tZ3VpZCBJRCBmb3IgdGhpcyBjb21wb25lbnQsIHRvIHVzZSBhcyBhbiBJRCBpbiB0aGUgRE9NXG4gICAgZ2V0IGNvbXBvbmVudElkICgpIHtcbiAgICAgICAgdGhpcy5jaWRfID0gdGhpcy5jaWRfIHx8IFV0aWxzLmd1aWQoKVxuICAgICAgICByZXR1cm4gdGhpcy5jaWRfO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgcGxheS9jb250cm9sIGFjdGlvbnMgb24gdGhlIGN1cnJlbnQgcGxheWVyXG4gICAgZGlzYWJsZVBsYXlpbmdBbmRDb250cm9sICgpIHtcbiAgICAgICAgdGhpcy4kcGxheWVyLmFkZENsYXNzKCd2YWMtZGlzYWJsZS1wbGF5Jyk7XG4gICAgICAgIC8vVE9ETyAtIGNhdGNoIHNwYWNlYmFyIGJlaW5nIGhpdFxuICAgICAgICAvL1RPRE8gLSBwcmV2ZW50IHNjcnViYmluZyBhbmQgdGltZWxpbmUgY2xpY2sgdG8gc2Vla1xuICAgIH1cblxuICAgIC8vIEVuYWJsZSBwbGF5L2NvbnRyb2wgYWN0aW9ucyBvbiB0aGUgY29udHJvbGxlclxuICAgIGVuYWJsZVBsYXlpbmdBbmRDb250cm9sICgpIHtcbiAgICAgICAgdGhpcy4kcGxheWVyLnJlbW92ZUNsYXNzKCd2YWMtZGlzYWJsZS1wbGF5Jyk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGEgaGFuZGxlYmFycyB0ZW1wbGF0ZSB3aXRoIGxvY2FsIGRhdGEgcGFzc2VkIGluIHZpYSBrZXkvdmFsIGluIG9iamVjdFxuICAgIHJlbmRlclRlbXBsYXRlICh0ZW1wbGF0ZU5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGFuZGxlYmFyc0hlbHBlcnMoKTtcbiAgICAgICAgcmV0dXJuIFRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlc2NhcGVkIGJyZWFrbGluZXMgaW4gSGFuZGxlYmFyc1xuICAgIHJlZ2lzdGVySGFuZGxlYmFyc0hlbHBlcnMgKCkge1xuICAgICAgICBpZignYnJlYWtsaW5lcycgaW4gSGFuZGxlYmFycy5oZWxwZXJzKSByZXR1cm47XG5cbiAgICAgICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYnJlYWtsaW5lcycsICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICB0ZXh0ID0gSGFuZGxlYmFycy5VdGlscy5lc2NhcGVFeHByZXNzaW9uKHRleHQpO1xuICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJzxicj4nKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHRleHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQcm92aWRlIGJhc2ljIHRlYXJkb3duIGZ1bmN0aW9uIHRvIGluaGVyaXRcbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIGlmKHRoaXMuJGVsKSB0aGlzLiRlbC5yZW1vdmUoKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCIvKlxuICAgIENvbGxlY3Rpb24gb2YgcG9seWZpbGxzIG5lZWRlZGYgb3IgSUUxMCsgc3VwcG9ydFxuKi9cblxuLy8gQXJyYXkucHJvdG90eXBlLmZpbmQoKSBmb3IgSUUxMCtcbnJlcXVpcmUoJ2llLWFycmF5LWZpbmQtcG9seWZpbGwnKTtcbi8vIE9iamVjdC5hc3NpZ24gZm9yIElFMTArXG5yZXF1aXJlKCdlczYtb2JqZWN0LWFzc2lnbicpLnBvbHlmaWxsKCk7XG5cbi8vIEFsbG93IHVzZSBvZiBvYmplY3QuY29uc3RydWN0b3Iuc3RhdGljRnVuYygpIGluIElFXG4vLyBOb3QgeWV0IHN1cHBvcnRlZCBieSBiYWJlbFxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZWRvYXJkb2NhdmF6emEvNDcyNDY4NTY3NTlmMjI3M2U0OGJcbihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgX2V4Y2x1ZGUgPSBbJ2xlbmd0aCcsICduYW1lJywgJ2FyZ3VtZW50cycsICdjYWxsZXInLCAncHJvdG90eXBlJ107XG5cbiAgICAgICAgZnVuY3Rpb24gYmluZEZ1bmN0aW9uKGN0eCwgZm4pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGJpbmRQcm9wZXJ0eShjdHgsIHByb3AsIHBhcmVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGlmICghcGFyZW50RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBjdHguX19wcm90b19fW3Byb3BdO1xuICAgICAgICAgICAgICAgIHBhcmVudERlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN0eFsnX18nICsgcHJvcF0gfHwgZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4WydfXycgKyBwcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIHByb3AsIHtcbiAgICAgICAgICAgICAgICBnZXQ6IHBhcmVudERlc2NyaXB0b3IuZ2V0ID8gcGFyZW50RGVzY3JpcHRvci5nZXQuYmluZChjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNldDogcGFyZW50RGVzY3JpcHRvci5zZXQgPyBwYXJlbnREZXNjcmlwdG9yLnNldC5iaW5kKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXRlcmF0ZVByb3BzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzdXBlckNsYXNzKSxcbiAgICAgICAgICAgICAgICBwcm90bztcblxuICAgICAgICAgICAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwcm9wcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvID0gc3VwZXJDbGFzc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9leGNsdWRlLmluZGV4T2YoaSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJDbGFzcywgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1cGVyRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3VwZXJDbGFzcywgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN1cGVyRGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHN1cGVyQ2xhc3NbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDbGFzc1twcm9wXSA9IGJpbmRGdW5jdGlvbihzdWJDbGFzcywgc3VwZXJDbGFzc1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdXBlckRlc2NyaXB0b3IuZ2V0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kUHJvcGVydHkoc3ViQ2xhc3MsIHByb3AsIHN1cGVyRGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRQcm9wZXJ0eShzdWJDbGFzcywgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRlUHJvcHMoc3ViQ2xhc3MsIHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZiA9IGl0ZXJhdGVQcm9wcztcbiAgICB9XG59KSgpO1xuXG4vLyBVc2UgQ3VzdG9tRXZlbnQgaW4gSUVcbihmdW5jdGlvbiAoKSB7XG4gIGlmICggdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiICkgcmV0dXJuIGZhbHNlO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICggZXZlbnQsIHBhcmFtcyApIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogZmFsc2UsIGRldGFpbDogdW5kZWZpbmVkIH07XG4gICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCAnQ3VzdG9tRXZlbnQnICk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudCggZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCApO1xuICAgIHJldHVybiBldnQ7XG4gICB9XG5cbiAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcblxuICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbn0pKCk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgR2VuZWFsIHV0aWxpdHkgZnVuY3Rpb25zLCBzb3VyY2VkIGZyb20gdW5kZXJzY29yZSAmIHNjcmF0Y2ggYnVpbHQgYXMgbmVlZGVkXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAgIC8vIENsb25lIGFuIG9iamVjdFxuICAgIGNsb25lT2JqZWN0OiAob2JqKSA9PiBPYmplY3QuYXNzaWduKHt9LCBvYmopLFxuXG4gICAgLy8gX3Rocm90dGxlIGZyb20gdW5kZXJzY29yZVxuICAgIHRocm90dGxlOiAoZnVuYywgd2FpdCwgb3B0aW9ucykgPT4ge1xuICAgICAgICB2YXIgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICAgICAgICB2YXIgdGltZW91dCA9IG51bGw7XG4gICAgICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgICAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogRGF0ZS5ub3coKTtcbiAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgaWYgKCFwcmV2aW91cyAmJiBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlKSBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzID0gbm93O1xuICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhbGwga2V5cyBvZiBhbiBvYmplY3QgdG8gaW50XG4gICAgcGFyc2VJbnRPYmo6IChvYmopID0+IHtcbiAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmKHBhcnNlSW50KG9ialtrZXldKSkge1xuICAgICAgICAgICAgICAgIG9ialtrZXldID0gcGFyc2VJbnQob2JqW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuXG4gICAgLy8gQ29udmVydCBhIHJhbmdlIHtzdGFydDogaW50LCAob3B0aW9uYWwpIGVuZDogaW50fSB0byBodW1hbiByZWFkYWJsZSB0aW1lXG4gICAgaHVtYW5UaW1lOiAocmFuZ2UpID0+IHtcbiAgICAgICAgZnVuY3Rpb24gcmVhZGFibGUoc2VjKXtcbiAgICAgICAgICAgIGxldCBtaW5zID0gTWF0aC5mbG9vcihzZWMvNjApLFxuICAgICAgICAgICAgc2VjcyA9IFN0cmluZyhzZWMgJSA2MCk7XG4gICAgICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgKHNlY3MubGVuZ3RoPT0xID8gXCIwXCIgOiBcIlwiKSArIHNlY3M7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWUgPSBbcmVhZGFibGUocmFuZ2Uuc3RhcnQpXTtcbiAgICAgICAgaWYocmFuZ2UuZW5kKSB0aW1lLnB1c2gocmVhZGFibGUocmFuZ2UuZW5kKSk7XG4gICAgICAgIHJldHVybiB0aW1lLmpvaW4oXCItXCIpO1xuICAgIH0sXG5cbiAgICAvLyBQc2VkdW8tcmFuZG9tIGd1aWQgZ2VuZXJhdG9yXG4gICAgZ3VpZDogKCkgPT4ge1xuICAgICAgICBmdW5jdGlvbiBzNCgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzNCgpICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgIHM0KCkgKyAnLScgKyBzNCgpICsgczQoKSArIHM0KCk7XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgdGhlIGhlaWdodCBhbmQgd2lkdGggb2YgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCB2aXNpYmxlXG4gICAgLy8gY2xvbmVzIGVsIGFuZCB0cmlja3MgRE9NIGludG8gcmVuZGVyaW5nIGl0IHcgdGhlIGNvcnJlY3Qgc2l6ZVxuICAgIC8vIGJld2FyZSB0aGUgY29udGFpbmVyIG1heSBiZSBpbXBvcnRhbnQgZm9yIHNjb3BlZCBzdHlsZXNcbiAgICBhcmVhT2ZIaWRkZW5FbDogKCRlbCwgJGNvbnRhaW5lciwgaGlkZUNsYXNzPScnKSA9PiB7XG4gICAgICAgIGxldCAkY2xvbmUgPSAkZWwuY2xvbmUoKSxcbiAgICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgJGNsb25lLmNzcyh7XG4gICAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICAgIH0pO1xuICAgICAgICAkY2xvbmUucmVtb3ZlQ2xhc3MoaGlkZUNsYXNzKTtcbiAgICAgICAgJGNvbnRhaW5lci5hcHBlbmQoJGNsb25lKTtcbiAgICAgICAgZGF0YS53aWR0aCA9ICRjbG9uZS5vdXRlcldpZHRoKCk7XG4gICAgICAgIGRhdGEuaGVpZ2h0ID0gJGNsb25lLm91dGVySGVpZ2h0KCk7XG4gICAgICAgICRjbG9uZS5yZW1vdmUoKTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgdmFsdWUgKG4pIGlzIHdpdGhpbiBhIHJhbmdlIChzdGFydCA8PSBuIDw9IGVuZClcbiAgICBpc1dpdGhpblJhbmdlOiAoc3RhcnQsIGVuZCwgbikgPT4ge1xuICAgICAgICBlbmQgPSBlbmQgfHwgc3RhcnQgKyAxOyAvLyBmb3IgcmFuZ2VzIHdpdGggTk8gZW5kIGRlZmluZWQsIGFzc3VtZSBhIDFzIHJhbmdlXG4gICAgICAgIHJldHVybiBuID49IHN0YXJ0ICYmIG4gPD0gZW5kO1xuICAgIH1cbn07XG4iXX0="} \ No newline at end of file diff --git a/build/videojs-annotation-comments.cjs.min.js b/build/videojs-annotation-comments.cjs.min.js new file mode 100644 index 0000000..6a6aa40 --- /dev/null +++ b/build/videojs-annotation-comments.cjs.min.js @@ -0,0 +1,5 @@ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.AnnotationComments=t()}}(function(){var t;return function(){function t(e,n,i){function r(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n||t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a= 2.0.0-beta.1",7:">= 4.0.0"};n.REVISION_CHANGES=p;var m="[object Object]";r.prototype={constructor:r,logger:d["default"],log:d["default"].log,registerHelper:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple helpers");o.extend(this.helpers,t)}else this.helpers[t]=e},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,e){if(o.toString.call(t)===m)o.extend(this.partials,t);else{if("undefined"==typeof e)throw new s["default"]('Attempting to register a partial called "'+t+'" as undefined');this.partials[t]=e}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple decorators");o.extend(this.decorators,t)}else this.decorators[t]=e},unregisterDecorator:function(t){delete this.decorators[t]}};var v=d["default"].log;n.log=v,n.createFrame=o.createFrame,n.logger=d["default"]},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t){a["default"](t)}n.__esModule=!0,n.registerDefaultDecorators=r;var o=t("./decorators/inline"),a=i(o)},{"./decorators/inline":5}],5:[function(t,e,n){"use strict";n.__esModule=!0;var i=t("../utils");n["default"]=function(t){t.registerDecorator("inline",function(t,e,n,r){var o=t;return e.partials||(e.partials={},o=function(r,o){var a=n.partials;n.partials=i.extend({},a,e.partials);var s=t(r,o);return n.partials=a,s}),e.partials[r.args[0]]=r.fn,o})},e.exports=n["default"]},{"../utils":19}],6:[function(t,e,n){"use strict";function i(t,e){var n=e&&e.loc,o=void 0,a=void 0;n&&(o=n.start.line,a=n.start.column,t+=" - "+o+":"+a);for(var s=Error.prototype.constructor.call(this,t),l=0;l0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var a=i.createFrame(n.data);a.contextPath=i.appendContextPath(n.data.contextPath,n.name),n={data:a}}return o(e,n)})},e.exports=n["default"]},{"../utils":19}],9:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}n.__esModule=!0;var r=t("../utils"),o=t("../exception"),a=i(o);n["default"]=function(t){t.registerHelper("each",function(t,e){function n(e,n,o){u&&(u.key=e,u.index=n,u.first=0===n,u.last=!!o,c&&(u.contextPath=c+e)),l+=i(t[e],{data:u,blockParams:r.blockParams([t[e],e],[c+e,null])})}if(!e)throw new a["default"]("Must pass iterator to #each");var i=e.fn,o=e.inverse,s=0,l="",u=void 0,c=void 0;if(e.data&&e.ids&&(c=r.appendContextPath(e.data.contextPath,e.ids[0])+"."),r.isFunction(t)&&(t=t.call(this)),e.data&&(u=r.createFrame(e.data)),t&&"object"==typeof t)if(r.isArray(t))for(var d=t.length;s=0?e:parseInt(t,10)}return t},log:function(t){if(t=r.lookupLevel(t),"undefined"!=typeof console&&r.lookupLevel(r.level)<=t){var e=r.methodMap[t];console[e]||(e="log");for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o":">",'"':""","'":"'","`":"`","=":"="},h=/[&<>"'`=]/g,f=/[&<>"'`=]/,p=Object.prototype.toString;n.toString=p;var m=function(t){return"function"==typeof t};m(/x/)&&(n.isFunction=m=function(t){return"function"==typeof t&&"[object Function]"===p.call(t)}),n.isFunction=m;var v=Array.isArray||function(t){return!(!t||"object"!=typeof t)&&"[object Array]"===p.call(t)};n.isArray=v},{}],20:[function(t,e,n){e.exports=t("./dist/cjs/handlebars.runtime")["default"]},{"./dist/cjs/handlebars.runtime":2}],21:[function(t,e,n){"use strict";Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError("this is null or not defined");var e=Object(this),n=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r0)for(n=0;n0?"future":"past"];return x(n)?n(e):n.replace(/%s/i,e)}function L(t,e){var n=t.toLowerCase();Ri[n]=Ri[n+"s"]=Ri[e]=t}function F(t){return"string"==typeof t?Ri[t]||Ri[t.toLowerCase()]:void 0}function H(t){var e,n,i={};for(n in t)d(t,n)&&(e=F(n),e&&(i[e]=t[n]));return i}function N(t,e){Wi[t]=e}function R(t){var e=[];for(var n in t)e.push({unit:n,priority:Wi[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function W(t,e,n){var i=""+Math.abs(t),r=e-i.length,o=t>=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+i}function U(t,e,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),t&&(zi[t]=r),e&&(zi[e[0]]=function(){return W(r.apply(this,arguments),e[1],e[2])}),n&&(zi[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function V(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,n,i=t.match(Ui);for(e=0,n=i.length;e=0&&Vi.test(t);)t=t.replace(Vi,n),Vi.lastIndex=0,i-=1;return t}function Z(t,e,n){cr[t]=x(e)?e:function(t,i){return t&&n?n:e}}function q(t,e){return d(cr,t)?cr[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return J(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,r){return e||n||i||r}))}function J(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function kt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function St(t,e,n){var i=7+e-n,r=(7+kt(t,0,i).getUTCDay()-e)%7;return-r+i-1}function Ot(t,e,n,i,r){var o,a,s=(7+n-i)%7,l=St(t,i,r),u=1+7*(e-1)+s+l;return u<=0?(o=t-1,a=et(o)+u):u>et(t)?(o=t+1,a=u-et(t)):(o=t,a=u),{year:o,dayOfYear:a}}function Mt(t,e,n){var i,r,o=St(t.year(),e,n),a=Math.floor((t.dayOfYear()-o-1)/7)+1;return a<1?(r=t.year()-1,i=a+Dt(r,e,n)):a>Dt(t.year(),e,n)?(i=a-Dt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function Dt(t,e,n){var i=St(t,e,n),r=St(t+1,e,n);return(et(t)-i+r)/7}function xt(t){return Mt(t,this._week.dow,this._week.doy).week}function Ct(){return this._week.dow}function Pt(){return this._week.doy}function Tt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Yt(t){var e=Mt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function At(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function jt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Et(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone}function $t(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function It(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Lt(t,e,n){var i,r,o,a=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)o=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:null):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null):"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null)))}function Ft(t,e,n){var i,r,o;if(this._weekdaysParseExact)return Lt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Ht(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=At(t,this.localeData()),this.add(t-e,"d")):e}function Nt(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Rt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=jt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Ar),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ut(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=jr),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Vt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Er),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Gt(){function t(t,e){return e.length-t.length}var e,n,i,r,o,a=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(i),s.push(r),l.push(o),u.push(i),u.push(r),u.push(o);for(a.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=J(s[e]),l[e]=J(l[e]),u[e]=J(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"), +this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function zt(){return this.hours()%12||12}function Bt(){return this.hours()||24}function Zt(t,e){U(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Jt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Qt(t){return t?t.toLowerCase().replace("_","-"):t}function Kt(t){for(var e,n,i,r,o=0;o0;){if(i=te(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&S(r,n,!0)>=e-1)break;e--}o++}return $r}function te(t){var i=null;if(!Hr[t]&&"undefined"!=typeof n&&n&&n.exports)try{i=$r._abbr;var r=e;r("./locale/"+t),ee(i)}catch(o){}return Hr[t]}function ee(t,e){var n;return t&&(n=s(e)?re(t):ne(t,e),n?$r=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),$r._abbr}function ne(t,e){if(null!==e){var n,i=Fr;if(e.abbr=t,null!=Hr[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=Hr[t]._config;else if(null!=e.parentLocale)if(null!=Hr[e.parentLocale])i=Hr[e.parentLocale]._config;else{if(n=te(e.parentLocale),null==n)return Nr[e.parentLocale]||(Nr[e.parentLocale]=[]),Nr[e.parentLocale].push({name:t,config:e}),null;i=n._config}return Hr[t]=new T(P(i,e)),Nr[t]&&Nr[t].forEach(function(t){ne(t.name,t.config)}),ee(t),Hr[t]}return delete Hr[t],null}function ie(t,e){if(null!=e){var n,i,r=Fr;i=te(t),null!=i&&(r=i._config),e=P(r,e),n=new T(e),n.parentLocale=Hr[t],Hr[t]=n,ee(t)}else null!=Hr[t]&&(null!=Hr[t].parentLocale?Hr[t]=Hr[t].parentLocale:null!=Hr[t]&&delete Hr[t]);return Hr[t]}function re(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return $r;if(!r(t)){if(e=te(t))return e;t=[t]}return Kt(t)}function oe(){return Ei(Hr)}function ae(t){var e,n=t._a;return n&&m(t).overflow===-2&&(e=n[fr]<0||n[fr]>11?fr:n[pr]<1||n[pr]>ct(n[hr],n[fr])?pr:n[mr]<0||n[mr]>24||24===n[mr]&&(0!==n[vr]||0!==n[yr]||0!==n[gr])?mr:n[vr]<0||n[vr]>59?vr:n[yr]<0||n[yr]>59?yr:n[gr]<0||n[gr]>999?gr:-1,m(t)._overflowDayOfYear&&(epr)&&(e=pr),m(t)._overflowWeeks&&e===-1&&(e=_r),m(t)._overflowWeekday&&e===-1&&(e=br),m(t).overflow=e),t}function se(t,e,n){return null!=t?t:null!=e?e:n}function le(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function ue(t){var e,n,i,r,o,a=[];if(!t._d){for(i=le(t),t._w&&null==t._a[pr]&&null==t._a[fr]&&ce(t),null!=t._dayOfYear&&(o=se(t._a[hr],i[hr]),(t._dayOfYear>et(o)||0===t._dayOfYear)&&(m(t)._overflowDayOfYear=!0),n=kt(o,0,t._dayOfYear),t._a[fr]=n.getUTCMonth(),t._a[pr]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=i[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[mr]&&0===t._a[vr]&&0===t._a[yr]&&0===t._a[gr]&&(t._nextDay=!0,t._a[mr]=0),t._d=(t._useUTC?kt:wt).apply(null,a),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[mr]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==r&&(m(t).weekdayMismatch=!0)}}function ce(t){var e,n,i,r,o,a,s,l;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)o=1,a=4,n=se(e.GG,t._a[hr],Mt(xe(),1,4).year),i=se(e.W,1),r=se(e.E,1),(r<1||r>7)&&(l=!0);else{o=t._locale._week.dow,a=t._locale._week.doy;var u=Mt(xe(),o,a);n=se(e.gg,t._a[hr],u.year),i=se(e.w,u.week),null!=e.d?(r=e.d,(r<0||r>6)&&(l=!0)):null!=e.e?(r=e.e+o,(e.e<0||e.e>6)&&(l=!0)):r=o}i<1||i>Dt(n,o,a)?m(t)._overflowWeeks=!0:null!=l?m(t)._overflowWeekday=!0:(s=Ot(n,i,r,o,a),t._a[hr]=s.year,t._dayOfYear=s.dayOfYear)}function de(t){var e,n,i,r,o,a,s=t._i,l=Rr.exec(s)||Wr.exec(s);if(l){for(m(t).iso=!0,e=0,n=Vr.length;e0&&m(e).unusedInput.push(a),s=s.slice(s.indexOf(i)+i.length),u+=i.length),zi[o]?(i?m(e).empty=!1:m(e).unusedTokens.push(o),tt(o,i,e)):e._strict&&!i&&m(e).unusedTokens.push(o);m(e).charsLeftOver=l-u,s.length>0&&m(e).unusedInput.push(s),e._a[mr]<=12&&m(e).bigHour===!0&&e._a[mr]>0&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[mr]=be(e._locale,e._a[mr],e._meridiem),ue(e),ae(e)}function be(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function we(t){var e,n,i,r,o;if(0===t._f.length)return m(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ze(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(g(t,this),t=Oe(t),t._a){var e=t._isUTC?f(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&S(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Je(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Qe(t,e){var n,i,r,o=t,a=null;return $e(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(o={},e?o[e]=t:o.milliseconds=t):(a=to.exec(t))?(n="-"===a[1]?-1:1,o={y:0,d:k(a[pr])*n,h:k(a[mr])*n,m:k(a[vr])*n,s:k(a[yr])*n,ms:k(Ie(1e3*a[gr]))*n}):(a=eo.exec(t))?(n="-"===a[1]?-1:("+"===a[1],1),o={y:Ke(a[2],n),M:Ke(a[3],n),w:Ke(a[4],n),d:Ke(a[5],n),h:Ke(a[6],n),m:Ke(a[7],n),s:Ke(a[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(r=en(xe(o.from),xe(o.to)),o={},o.ms=r.milliseconds,o.M=r.months),i=new Ee(o),$e(t)&&d(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function tn(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function en(t,e){var n;return t.isValid()&&e.isValid()?(e=He(e,t),t.isBefore(e)?n=tn(t,e):(n=tn(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(t,e){return function(n,i){var r,o;return null===i||isNaN(+i)||(D(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=i,i=o),n="string"==typeof n?+n:n,r=Qe(n,i),rn(this,r,t),this}}function rn(e,n,i,r){var o=n._milliseconds,a=Ie(n._days),s=Ie(n._months);e.isValid()&&(r=null==r||r,s&&mt(e,ot(e,"Month")+s*i),a&&at(e,"Date",ot(e,"Date")+a*i),o&&e._d.setTime(e._d.valueOf()+o*i),r&&t.updateOffset(e,a||s))}function on(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(e,n){var i=e||xe(),r=He(i,this).startOf("day"),o=t.calendarFormat(this,r)||"sameElse",a=n&&(x(n[o])?n[o].call(this,i):n[o]);return this.format(a||this.localeData().calendar(o,this,xe(i)))}function sn(){return new _(this)}function ln(t,e){var n=b(t)?t:xe(t);return!(!this.isValid()||!n.isValid())&&(e=F(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()9999?z(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",z(n,"Z")):z(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function gn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",r="-MM-DD[T]HH:mm:ss.SSS",o=e+'[")]';return this.format(n+i+r+o)}function _n(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=z(this,e);return this.localeData().postformat(n)}function bn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function wn(t){return this.from(xe(),t)}function kn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Sn(t){return this.to(xe(),t)}function On(t){var e;return void 0===t?this._locale._abbr:(e=re(t),null!=e&&(this._locale=e),this)}function Mn(){return this._locale}function Dn(t){switch(t=F(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function xn(t){return t=F(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Cn(){return this._d.valueOf()-6e4*(this._offset||0)}function Pn(){return Math.floor(this.valueOf()/1e3)}function Tn(){return new Date(this.valueOf())}function Yn(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function An(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function jn(){return this.isValid()?this.toISOString():null}function En(){return v(this)}function $n(){return h({},m(this))}function In(){return m(this).overflow}function Ln(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Fn(t,e){U(0,[t,t.length],0,e)}function Hn(t){return Un.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Nn(t){return Un.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Rn(){return Dt(this.year(),1,4)}function Wn(){var t=this.localeData()._week;return Dt(this.year(),t.dow,t.doy)}function Un(t,e,n,i,r){var o;return null==t?Mt(this,i,r).year:(o=Dt(t,i,r),e>o&&(e=o),Vn.call(this,t,e,n,i,r))}function Vn(t,e,n,i,r){var o=Ot(t,e,n,i,r),a=kt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Gn(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function zn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Bn(t,e){e[gr]=k(1e3*("0."+t))}function Zn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Xn(t){return xe(1e3*t)}function Jn(){return xe.apply(null,arguments).parseZone()}function Qn(t){return t}function Kn(t,e,n,i){var r=re(),o=f().set(i,e);return r[n](o,t)}function ti(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Kn(t,e,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=Kn(t,i,n,"month");return r}function ei(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var r=re(),o=t?r._week.dow:0;if(null!=n)return Kn(e,(n+o)%7,i,"day");var a,s=[];for(a=0;a<7;a++)s[a]=Kn(e,(a+o)%7,i,"day");return s}function ni(t,e){return ti(t,e,"months")}function ii(t,e){return ti(t,e,"monthsShort")}function ri(t,e,n){return ei(t,e,n,"weekdays")}function oi(t,e,n){return ei(t,e,n,"weekdaysShort")}function ai(t,e,n){return ei(t,e,n,"weekdaysMin")}function si(){var t=this._data;return this._milliseconds=fo(this._milliseconds),this._days=fo(this._days),this._months=fo(this._months),t.milliseconds=fo(t.milliseconds),t.seconds=fo(t.seconds),t.minutes=fo(t.minutes),t.hours=fo(t.hours),t.months=fo(t.months),t.years=fo(t.years),this}function li(t,e,n,i){var r=Qe(e,n);return t._milliseconds+=i*r._milliseconds,t._days+=i*r._days,t._months+=i*r._months,t._bubble()}function ui(t,e){return li(this,t,e,1)}function ci(t,e){return li(this,t,e,-1)}function di(t){return t<0?Math.floor(t):Math.ceil(t)}function hi(){var t,e,n,i,r,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*di(pi(s)+a),a=0,s=0),l.milliseconds=o%1e3,t=w(o/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,a+=w(n/24),r=w(fi(a)),s+=r,a-=di(pi(r)),i=w(s/12),s%=12,l.days=a,l.months=s,l.years=i,this}function fi(t){return 4800*t/146097}function pi(t){return 146097*t/4800}function mi(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(t=F(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+fi(e),"month"===t?n:n/12;switch(e=this._days+Math.round(pi(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function vi(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN}function yi(t){return function(){return this.as(t)}}function gi(){return Qe(this)}function _i(t){return t=F(t),this.isValid()?this[t+"s"]():NaN}function bi(t){return function(){return this.isValid()?this._data[t]:NaN}}function wi(){return w(this.days()/7)}function ki(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}function Si(t,e,n){var i=Qe(t).abs(),r=Po(i.as("s")),o=Po(i.as("m")),a=Po(i.as("h")),s=Po(i.as("d")),l=Po(i.as("M")),u=Po(i.as("y")),c=r<=To.ss&&["s",r]||r0,c[4]=n,ki.apply(null,c)}function Oi(t){return void 0===t?Po:"function"==typeof t&&(Po=t,!0)}function Mi(t,e){return void 0!==To[t]&&(void 0===e?To[t]:(To[t]=e,"s"===t&&(To.ss=e-1),!0))}function Di(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=Si(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function xi(t){return(t>0)-(t<0)||+t}function Ci(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=Yo(this._milliseconds)/1e3,r=Yo(this._days),o=Yo(this._months);t=w(i/60),e=w(t/60),i%=60,t%=60,n=w(o/12),o%=12;var a=n,s=o,l=r,u=e,c=t,d=i?i.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var f=h<0?"-":"",p=xi(this._months)!==xi(h)?"-":"",m=xi(this._days)!==xi(h)?"-":"",v=xi(this._milliseconds)!==xi(h)?"-":"";return f+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?m+l+"D":"")+(u||c||d?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(d?v+d+"S":"")}var Pi,Ti;Ti=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var wr,kr=rt("FullYear",!0);wr=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:y()}),Jr=function(){return Date.now?Date.now():+new Date},Qr=["year","quarter","month","week","day","hour","minute","second","millisecond"];Le("Z",":"),Le("ZZ",""),Z("Z",sr),Z("ZZ",sr),Q(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Fe(sr,t)});var Kr=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var to=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,eo=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Qe.fn=Ee.prototype,Qe.invalid=je;var no=nn(1,"add"),io=nn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ro=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Fn("gggg","weekYear"),Fn("ggggg","weekYear"),Fn("GGGG","isoWeekYear"),Fn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),Z("G",or),Z("g",or),Z("GG",Qi,Zi),Z("gg",Qi,Zi),Z("GGGG",nr,Xi),Z("gggg",nr,Xi),Z("GGGGG",ir,Ji),Z("ggggg",ir,Ji),K(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=k(t)}),K(["gg","GG"],function(e,n,i,r){n[r]=t.parseTwoDigitYear(e)}),U("Q",0,"Qo","quarter"),L("quarter","Q"),N("quarter",7),Z("Q",Bi),Q("Q",function(t,e){e[fr]=3*(k(t)-1)}),U("D",["DD",2],"Do","date"),L("date","D"),N("date",9),Z("D",Qi),Z("DD",Qi,Zi),Z("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),Q(["D","DD"],pr),Q("Do",function(t,e){e[pr]=k(t.match(Qi)[0])});var oo=rt("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),N("dayOfYear",4),Z("DDD",er),Z("DDDD",qi),Q(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),U("m",["mm",2],0,"minute"),L("minute","m"),N("minute",14),Z("m",Qi),Z("mm",Qi,Zi),Q(["m","mm"],vr);var ao=rt("Minutes",!1);U("s",["ss",2],0,"second"),L("second","s"),N("second",15),Z("s",Qi),Z("ss",Qi,Zi),Q(["s","ss"],yr);var so=rt("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100); +}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),N("millisecond",16),Z("S",er,Bi),Z("SS",er,Zi),Z("SSS",er,qi);var lo;for(lo="SSSS";lo.length<=9;lo+="S")Z(lo,rr);for(lo="S";lo.length<=9;lo+="S")Q(lo,Bn);var uo=rt("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var co=_.prototype;co.add=no,co.calendar=an,co.clone=sn,co.diff=pn,co.endOf=xn,co.format=_n,co.from=bn,co.fromNow=wn,co.to=kn,co.toNow=Sn,co.get=st,co.invalidAt=In,co.isAfter=ln,co.isBefore=un,co.isBetween=cn,co.isSame=dn,co.isSameOrAfter=hn,co.isSameOrBefore=fn,co.isValid=En,co.lang=ro,co.locale=On,co.localeData=Mn,co.max=Xr,co.min=qr,co.parsingFlags=$n,co.set=lt,co.startOf=Dn,co.subtract=io,co.toArray=Yn,co.toObject=An,co.toDate=Tn,co.toISOString=yn,co.inspect=gn,co.toJSON=jn,co.toString=vn,co.unix=Pn,co.valueOf=Cn,co.creationData=Ln,co.year=kr,co.isLeapYear=it,co.weekYear=Hn,co.isoWeekYear=Nn,co.quarter=co.quarters=Gn,co.month=vt,co.daysInMonth=yt,co.week=co.weeks=Tt,co.isoWeek=co.isoWeeks=Yt,co.weeksInYear=Wn,co.isoWeeksInYear=Rn,co.date=oo,co.day=co.days=Ht,co.weekday=Nt,co.isoWeekday=Rt,co.dayOfYear=zn,co.hour=co.hours=Lr,co.minute=co.minutes=ao,co.second=co.seconds=so,co.millisecond=co.milliseconds=uo,co.utcOffset=Re,co.utc=Ue,co.local=Ve,co.parseZone=Ge,co.hasAlignedHourOffset=ze,co.isDST=Be,co.isLocal=qe,co.isUtcOffset=Xe,co.isUtc=Je,co.isUTC=Je,co.zoneAbbr=Zn,co.zoneName=qn,co.dates=M("dates accessor is deprecated. Use date instead.",oo),co.months=M("months accessor is deprecated. Use month instead",vt),co.years=M("years accessor is deprecated. Use year instead",kr),co.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",We),co.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ze);var ho=T.prototype;ho.calendar=Y,ho.longDateFormat=A,ho.invalidDate=j,ho.ordinal=E,ho.preparse=Qn,ho.postformat=Qn,ho.relativeTime=$,ho.pastFuture=I,ho.set=C,ho.months=dt,ho.monthsShort=ht,ho.monthsParse=pt,ho.monthsRegex=_t,ho.monthsShortRegex=gt,ho.week=xt,ho.firstDayOfYear=Pt,ho.firstDayOfWeek=Ct,ho.weekdays=Et,ho.weekdaysMin=It,ho.weekdaysShort=$t,ho.weekdaysParse=Ft,ho.weekdaysRegex=Wt,ho.weekdaysShortRegex=Ut,ho.weekdaysMinRegex=Vt,ho.isPM=Xt,ho.meridiem=Jt,ee("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=M("moment.lang is deprecated. Use moment.locale instead.",ee),t.langData=M("moment.langData is deprecated. Use moment.localeData instead.",re);var fo=Math.abs,po=yi("ms"),mo=yi("s"),vo=yi("m"),yo=yi("h"),go=yi("d"),_o=yi("w"),bo=yi("M"),wo=yi("y"),ko=bi("milliseconds"),So=bi("seconds"),Oo=bi("minutes"),Mo=bi("hours"),Do=bi("days"),xo=bi("months"),Co=bi("years"),Po=Math.round,To={ss:44,s:45,m:45,h:22,d:26,M:11},Yo=Math.abs,Ao=Ee.prototype;return Ao.isValid=Ae,Ao.abs=si,Ao.add=ui,Ao.subtract=ci,Ao.as=mi,Ao.asMilliseconds=po,Ao.asSeconds=mo,Ao.asMinutes=vo,Ao.asHours=yo,Ao.asDays=go,Ao.asWeeks=_o,Ao.asMonths=bo,Ao.asYears=wo,Ao.valueOf=vi,Ao._bubble=hi,Ao.clone=gi,Ao.get=_i,Ao.milliseconds=ko,Ao.seconds=So,Ao.minutes=Oo,Ao.hours=Mo,Ao.days=Do,Ao.weeks=wi,Ao.months=xo,Ao.years=Co,Ao.humanize=Di,Ao.toISOString=Ci,Ao.toString=Ci,Ao.toJSON=Ci,Ao.locale=On,Ao.localeData=Mn,Ao.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ci),Ao.lang=ro,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",or),Z("X",lr),Q("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),Q("x",function(t,e,n){n._d=new Date(k(t))}),t.version="2.22.1",i(xe),t.fn=co,t.min=Pe,t.max=Te,t.now=Jr,t.utc=f,t.unix=Xn,t.months=ni,t.isDate=u,t.locale=ee,t.invalid=y,t.duration=Qe,t.isMoment=b,t.weekdays=ri,t.parseZone=Jn,t.localeData=re,t.isDuration=$e,t.monthsShort=ii,t.weekdaysMin=ai,t.defineLocale=ne,t.updateLocale=ie,t.locales=oe,t.weekdaysShort=oi,t.normalizeUnits=F,t.relativeTimeRounding=Oi,t.relativeTimeThreshold=Mi,t.calendarFormat=on,t.prototype=co,t.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},t})},{}],23:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n=3?o.postLoadDataConstructor():t.on("loadeddata",o.postLoadDataConstructor.bind(o)),o}return o(e,t),a(e,[{key:"postLoadDataConstructor",value:function(){this.annotationState=new c(this.player),this.annotationState.annotations=this.options.annotationsObjects,this.controls=new u(this.player,this.options.bindArrowKeys),this.bindEvents(),this.setBounds(!1),this.options.startInAnnotationMode&&this.toggleAnnotationMode(),this.pluginReady()}},{key:"bindEvents",value:function(){var t=this;$(window).on("resize.vac-window-resize",l.throttle(this.setBounds.bind(this),500)),this.player.on("fullscreenchange",l.throttle(this.setBounds.bind(this),500)),this.options.showFullScreen||this.player.on("fullscreenchange",function(){t.player.isFullscreen_?(t.preFullscreenAnnotationsEnabled=t.active,$(t.player.el()).addClass("vac-disable-fullscreen")):$(t.player.el()).removeClass("vac-disable-fullscreen"),t.preFullscreenAnnotationsEnabled&&t.toggleAnnotationMode()}.bind(this))}},{key:"fire",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.eventDispatcher.fire(t,e)}},{key:"toggleAnnotationMode",value:function(){this.active=!this.active,this.player.toggleClass("vac-active"),this.annotationState.enabled=this.active,this.active?this.fire("annotationModeEnabled"):this.fire("annotationModeDisabled"),this.options.showControls&&(this.active?this.controls.render():this.controls.clear(!0))}},{key:"setBounds",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.bounds={};var e=$(this.player.el()),n=e.find(".vjs-control-bar");this.bounds.left=e.offset().left,this.bounds.top=e.offset().top,this.bounds.right=this.bounds.left+e.width(),this.bounds.bottom=this.bounds.top+e.height(),this.bounds.bottomWithoutControls=this.bounds.bottom-n.height(),t&&this.fire("playerBoundsChanged",this.bounds)}},{key:"onReady",value:function(t){return this.eventDispatcher.pluginReady?t():void this._readyCallbacks.push(t)}},{key:"pluginReady",value:function(){for(this.eventDispatcher.pluginReady=!0;this._readyCallbacks.length;)this._readyCallbacks.pop()()}},{key:"dispose",value:function(){this.controls=this.controls.teardown(),this.annotationState=this.annotationState.teardown(),this.eventDispatcher=this.eventDispatcher.teardown(),this.teardown(),this.player&&(this.player.annotationComments=null,$(this.player.el()).removeClass("vac-active"),$(this.player.el()).find("[class^='vac-']").remove()),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"dispose",this).call(this)}},{key:"teardown",value:function(){this.player&&this.player.off("fullscreenchange"),$(window).off("resize.vac-window-resize")}}]),e}(n)}},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":35,"./lib/polyfills":39,"./lib/utils":40}],24:[function(t,e,n){"use strict";var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=t("handlebars/runtime");n.comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n
\n
'+d(t.lambda(null!=(a=null!=e?e.meta:e)?a.user_name:a,e))+'
\n
'+d((s=null!=(s=n.timeSince||(null!=e?e.timeSince:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"timeSince",hash:{},data:o}):s))+'\n   X\n
\n
\n
\n '+d((n.breaklines||e&&e.breaklines||u).call(l,null!=e?e.body:e,{name:"breaklines",hash:{},data:o}))+"\n
\n
\n"},useData:!0}),n.comment_list=r.template({1:function(t,e,n,i,r,o){var a;return" "+(null!=(a=t.lambda(o[0][0],e))?a:"")+"\n"},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r,o){var a,s,l=null!=e?e:t.nullContext||{};return'
\n'},useData:!0,useBlockParams:!0}),n.controls=r.template({1:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(2,r,0),inverse:t.noop,data:r}))?o:""},2:function(t,e,n,i,r){var o;return'
\n \n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showNav:e,{name:"if",hash:{},fn:t.program(3,r,0),inverse:t.noop,data:r}))?o:"")+"
\n"},3:function(t,e,n,i,r){return'
\n
Prev
\n
Next
\n
\n'},5:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return'
\n
\n
Click and drag to select
\n
\n
\n'+(null!=(o=n["if"].call(a,null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.writingComment:e,{name:"if",hash:{},fn:t.program(9,r,0),inverse:t.noop,data:r}))?o:"")},6:function(t,e,n,i,r){var o;return'
\n Select shape + range\n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.internalCommenting:e,{name:"if",hash:{},fn:t.program(7,r,0),inverse:t.noop,data:r}))?o:"")+'
\n
-1 sec
\n
+1 sec
\n
\n
\n'},7:function(t,e,n,i,r){return' \n cancel\n'},9:function(t,e,n,i,r){var o;return'
\n
\n
\n
New Annotation @ '+t.escapeExpression((o=null!=(o=n.rangeStr||(null!=e?e.rangeStr:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"rangeStr",hash:{},data:r}):o))+'
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n'},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return(null!=(o=n.unless.call(a,null!=e?e.adding:e,{name:"unless",hash:{},fn:t.program(1,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.adding:e,{name:"if",hash:{},fn:t.program(5,r,0),inverse:t.noop,data:r}))?o:"")},useData:!0}),n.draggable_marker=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n'},useData:!0}),n.marker=r.template({1:function(t,e,n,i,r){return"vac-ranged-marker"},3:function(t,e,n,i,r){var o;return"width:"+t.escapeExpression((o=null!=(o=n.width||(null!=e?e.width:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"width",hash:{},data:r}):o))+";"},5:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.tooltipBody:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:""},6:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n \n '+d((s=null!=(s=n.tooltipTime||(null!=e?e.tooltipTime:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipTime",hash:{},data:o}):s))+" - "+d((s=null!=(s=n.tooltipBody||(null!=e?e.tooltipBody:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipBody",hash:{},data:o}):s))+"\n \n
\n"},7:function(t,e,n,i,r){return"vac-right-side"},compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n'+(null!=(a=n["if"].call(l,null!=e?e.showTooltip:e,{name:"if",hash:{},fn:t.program(5,o,0),inverse:t.noop,data:o}))?a:"")+"
\n"},useData:!0}),n.marker_wrap=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'
\n\t
\n
'},useData:!0}),n.new_comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n'},useData:!0}),n.player_button=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'\n\n\t\n\t \n\t \n\t\n'},useData:!0})},{"handlebars/runtime":20}],25:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0],e=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.isOpen=!0;var r=i||!u.isWithinRange(this.range.start,this.range.end,Math.floor(this.currentTime)),o=n&&this.plugin.options.showMarkerShapeAndTooltips;this.marker.setActive(o),!n&&this.plugin.options.showCommentList&&this.commentList.render(),(!n||n&&this.plugin.options.showMarkerShapeAndTooltips)&&(this.annotationShape.render(),this.shape&&this.annotationShape.$el.on("click.vac-annotation",function(){e.plugin.annotationState.openAnnotation(e,!1,!1,!1)})),t&&this.player.pause(),r&&(this.currentTime=this.range.start),this.plugin.fire("annotationOpened",{annotation:this.data,triggered_by_timeline:n})}},{key:"close",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isOpen&&(this.isOpen=!1,this.marker.deactivate(),this.commentList.teardown(!1),this.annotationShape.$el&&this.annotationShape.$el.off("click.vac-annotation"),this.annotationShape.teardown(),t&&this.plugin.annotationState.clearActive(),this.plugin.fire("annotationClosed",this.data))}},{key:"buildSecondsActiveArray",value:function(){var t=[];if(this.range.end)for(var e=this.range.start;e<=this.range.end;e++)t.push(e);else{var n=this.range.start;t.push(n),n0&&void 0!==arguments[0])||arguments[0];this.close(!0),this.marker.teardown(),this.commentList&&this.commentList.teardown(t),t&&this.plugin.annotationState.removeAnnotation(this),this.annotationShape&&this.annotationShape.teardown(),t&&s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return{id:this.id,range:this.range,shape:this.shape,comments:this.commentList.data}}},{key:"isActive",get:function(){return this.plugin.annotationState.activeAnnotation===this}}],[{key:"newFromData",value:function(t,n,i,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,a=h.dataObj(i,r);t&&(t=u.parseIntObj(t)),n&&(n=u.parseIntObj(n));var s={id:o,range:t,shape:n,comments:[a]};return new e(s,r.player)}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils.js":40,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(t,e,n){"use strict";function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);ee.range.start?1:0})}},{key:"addNewAnnotation",value:function(t){this._annotations.push(t),this.openAnnotation(t,!0,!0,!1,!0),this.stateChanged()}},{key:"createAndAddAnnotation",value:function(t){this.plugin.controls.uiState.adding&&this.plugin.controls.cancelAddNew();var e=d.newFromData(t.range,t.shape,t.commentStr||"",this.plugin,t.id);this.addNewAnnotation(e)}},{key:"destroyAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&e.teardown()}},{key:"removeAnnotation",value:function(t){var e=t.id,n=this._annotations.indexOf(t);this._annotations.splice(n,1),this.stateChanged(),this.plugin.fire("annotationDeleted",{id:e})}},{key:"setLiveAnnotation",value:function(){if(this.enabled){var t=Math.floor(this.currentTime);if(this.skipLiveCheck)return void(t!==this.lastVideoTime&&(this.skipLiveCheck=!1));var e=this.activeAnnotationsForTime(t);if(!e.length)return this.activeAnnotation.close();var n=this.annotations[e[e.length-1]];if(this.activeAnnotation.range){if(n===this.activeAnnotation)return;var i=n.range.start,r=this.activeAnnotation.range.start;if(i===r&&i===t)return}this.openAnnotation(n,!1,!1,!0)}}},{key:"activeAnnotationsForTime",value:function(t){return this.annotations.length?this.annotationTimeMap[t]||[]:[]}},{key:"rebuildAnnotationTimeMap",value:function(){var t=this,e={};this.annotations.forEach(function(n){n.secondsActive.forEach(function(i){var r=e[i]||[];r.push(t.annotations.indexOf(n)),e[i]=r})}),this.annotationTimeMap=e}},{key:"clearActive",value:function(){this.activeAnnotation.close(!1),this._activeAnnotation=null}},{key:"openAnnotation",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.plugin.active||this.plugin.toggleAnnotationMode(),this.skipLiveCheck=e,this.clearActive(),t.open(n,i,r),this.activeAnnotation=t,this.lastVideoTime=this.activeAnnotation.range.start}},{key:"openAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&this.openAnnotation(e)}},{key:"findAnnotation",value:function(t){return this.annotations.find(function(e){return e.id==t})}},{key:"findComment",value:function(t){var e,n=this.annotations.map(function(t){return t.commentList.comments});return n=(e=[]).concat.apply(e,i(n)),n.find(function(e){return e.id==t})}},{key:"nextAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=t===this.annotations.length-1?0:t+1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=0;in)return this.openAnnotation(this.annotations[i],!0);this.openAnnotation(this.annotations[0],!0)}},{key:"prevAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=0===t?this.annotations.length-1:t-1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=this.annotations.length-1;i>=0;i--)if(this.annotations[i].range.start0&&void 0!==arguments[0]?arguments[0]:null;this._activeAnnotation=t},get:function(){return this._activeAnnotation||{close:function(){}}}},{key:"data",get:function(){return this._annotations.map(function(t){return t.data})}}]),e}(c)},{"./../lib/player_component":37,"./../lib/utils":40,"./annotation":25}],27:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this,t)}},{key:"data",get:function(){return{id:this.id,meta:this.meta,body:this.body}}},{key:"HTML",get:function(){return this.$el[0].outerHTML}}],[{key:"newFromData",value:function(t,n,i){var r=this.dataObj(t,i);return new e(r,i.player)}},{key:"dataObj",value:function(t,e){return{meta:Object.assign({ +datetime:c().toISOString()},e.meta),id:u.guid(),body:t}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,moment:22}],28:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;na-10&&"down"==o&&(e.stop(),e.animate({scrollTop:n+40},100),t.preventDefault())}},{key:"sortComments",value:function(){this.comments.sort(function(t,e){return t.timestampe.timestamp?1:0})}},{key:"handleDeleteAnnotationClick",value:function(t){var e=this,n=$("").addClass("vac-delete-confirm").text("CONFIRM");n.on("click.comment",function(){n.off("click.comment"),e.annotation.teardown()}),$(t.target).replaceWith(n)}},{key:"unbindCommentFormEvents",value:function(){this.$newCommentForm&&this.$newCommentForm.off("click.vac-comment")}},{key:"teardown",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.$el&&this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"),this.comments.forEach(function(e){return e.teardown(t)}),t&&(this.comments=[]),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return this.comments.map(function(t){return t.data})}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./comment":27}],29:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this.uiState.adding&&(this.restoreNormalUI(),this.marker.teardown(),this.selectableShape.teardown()),this.uiState=u.cloneObject(m),this.$player.find(".vac-video-cover-canvas").off("mousedown.vac-cursor-tooltip").off("mouseup.vac-cursor-tooltip")),this.$tooltip_=null,this.$UI.controlElements.remove()}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.clear(t);var e=Object.assign({rangeStr:this.marker?u.humanTime(this.marker.range):null,showNav:this.plugin.annotationState.annotations.length>1},this.uiState,{internalCommenting:this.internalCommenting,showControls:this.showControls}),n=this.renderTemplate(p,e);this.$player.append(n),this.playerButton&&this.playerButton.updateNumAnnotations()}},{key:"cancelAddNew",value:function(){(this.uiState.adding||this.uiState.writingComment)&&(this.render(!0),this.marker.teardown(),this.marker=null)}},{key:"startAddNew",value:function(){this.plugin.active||this.plugin.toggleAnnotationMode(),this.player.pause(),this.setAddingUI(),this.uiState.adding=!0,this.render();var t={start:parseInt(this.currentTime,10),stop:parseInt(this.currentTime,10)};this.marker=new c(this.player,t),this.selectableShape=new d(this.player),this.showControls||this.bindCursorTooltip(),this.plugin.fire("enteredAddingAnnotation",{range:t})}},{key:"writeComment",value:function(){this.uiState.writingComment=!0,this.render()}},{key:"saveNew",value:function(){var t=this.$UI.newCommentTextarea.val();if(t){var e=f.newFromData(this.marker.range,this.selectableShape.shape,t,this.plugin);this.plugin.annotationState.addNewAnnotation(e),this.cancelAddNew()}}},{key:"setAddingUI",value:function(){this.plugin.annotationState.enabled=!1,this.disablePlayingAndControl()}},{key:"restoreNormalUI",value:function(){this.plugin.annotationState.enabled=this.plugin.active,this.enablePlayingAndControl(),$(document).off("mousemove.vac-tooltip-"+this.playerId)}},{key:"handleArrowKeys",value:function(t){if(this.plugin.active){var e=t.which;37==e&&this.plugin.annotationState.prevAnnotation(),39==e&&this.plugin.annotationState.nextAnnotation()}}},{key:"bindCursorTooltip",value:function(){var t=this;this.tooltipArea=u.areaOfHiddenEl(this.$tooltip,this.$UI.coverCanvas,this.UI_CLASSES.hidden),this.plugin.setBounds(!1),$(document).on("mousemove.vac-tooltip-"+this.playerId,u.throttle(function(e){if(t.plugin.bounds){var n=e.pageX,i=e.pageY,r=nt.plugin.bounds.right||it.plugin.bounds.bottom,o=!r&&i>=t.plugin.bounds.bottomWithoutControls,a=t.$tooltip.hasClass("vac-marker-hover");if(r)return void t.$tooltip.addClass(t.UI_CLASSES.hidden);var s=n-t.plugin.bounds.left,l=i-t.plugin.bounds.top,u=10,c=t.$player.width(),d=t.$player.height()-t.$UI.controlBar.height(),h=s+t.tooltipArea.width+2*u>=c,f=l+t.tooltipArea.height+2*u>=d,p=h?c-t.tooltipArea.width-u:s+u,m=f?d-t.tooltipArea.height-u:l+u;o&&!a||t.$tooltip.hasClass("vac-cursor-dragging")?t.$tooltip.addClass(t.UI_CLASSES.hidden):t.$tooltip.removeClass(t.UI_CLASSES.hidden),t.$tooltip.css({left:p+"px",top:m+"px"})}}.bind(this),50))}},{key:"$tooltip",get:function(){return this.$tooltip_=this.$tooltip_||this.$player.find(".vac-cursor-tool-tip"),this.$tooltip_}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;nthis.rangePin?this.range={start:this.rangePin,end:n}:this.range={start:n,end:this.rangePin},this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}},{key:"percentValFromXpos",value:function(t){var e=Math.max(0,t-this.$parent.offset().left),n=this.$parent.innerWidth(),i=e/n;return i>1&&(i=1),i<0&&(i=0),i}},{key:"teardown",value:function(){$(document).off("mousemove.vac-dmarker-"+this.playerId+" mouseup.vac-dmarker-"+this.playerId),this.$el.off("mouseenter.vac-cursor-tool-tip"),this.$el.off("mouseleave.vac-cursor-tool-tip"),this.$el.off("mousedown.vac-marker"),this.$el.remove()}},{key:"scrubStart",value:function(t){var e=this.range.start+t;this.currentTime=e,this.range.start=e,this.rangePin=e,this.teardown(),this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}}]),e}(s)},{"./../lib/utils":40,"./marker":31}],31:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:null;i(this,e);var a=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return a.range=n,a.comment=o,a.templateName=c,a.$UI.markerWrap.length||a.$UI.timeline.append(a.renderTemplate(d)),a}return o(e,t),a(e,[{key:"setActive",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$el.addClass(this.UI_CLASSES.active),t&&this.$el.addClass("vac-force-tooltip")}},{key:"deactivate",value:function(){this.$el.removeClass(this.UI_CLASSES.active+" vac-force-tooltip")}},{key:"render",value:function(){this.$UI.timeline.find('[data-marker-id="'+this.componentId+'"]').remove(),this.$el=$(this.renderTemplate(this.templateName,this.markerTemplateData)),this.$UI.markerWrap.append(this.$el),this.bindMarkerEvents()}},{key:"bindMarkerEvents",value:function(){var t=this;this.$el.on("mouseenter.vac-marker",function(){t.$el.addClass("vac-hovering").closest(".vac-marker-wrap").addClass("vac-dim-all")}).on("mouseleave.vac-marker",function(){t.$el.removeClass("vac-hovering").closest(".vac-marker-wrap").removeClass("vac-dim-all")})}},{key:"teardown",value:function(){this.$el.off("mouseenter.vac-marker").off("mouseleave.vac-marker").off("click.vac-marker"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"markerTemplateData",get:function(){var t=this.range.start/this.duration*100,e=this.range.end/this.duration*100-t,n=100-Math.floor(e)||100;return{left:t+"%",width:e+"%",zIndex:n,showTooltip:this.plugin.options.showMarkerShapeAndTooltips,tooltipRight:t>50,tooltipTime:u.humanTime(this.range),tooltipBody:this.comment?this.comment.body:null,rangeShow:!!this.range.end,id:this.componentId}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40}],32:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0?e.removeClass(this.UI_CLASSES.hidden):e.addClass(this.UI_CLASSES.hidden)}},{key:"teardown",value:function(){this.$el.off("click.vac-player-button"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}}]),e}(l)},{"./../lib/player_ui_component":38}],33:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var o=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return o.shape=n,o.$parent=o.$player,o}return o(e,t),a(e,[{key:"render",value:function(){this.shape&&(this.$el&&this.$el.remove(),this.$el=$("
").addClass("vac-shape"),this.setDimsFromShape(),this.$parent.append(this.$el))}},{key:"setDimsFromShape",value:function(){this.$el.css({left:this.shape.x1+"%",top:this.shape.y1+"%",width:this.shape.x2-this.shape.x1+"%",height:this.shape.y2-this.shape.y1+"%"})}}]),e}(s)},{"./../lib/player_ui_component":38}],35:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this._player=null)}},{key:"plugin",get:function(){return this.player.annotationComments()}},{key:"player",get:function(){return this._player}},{key:"duration",get:function(){return this.player.duration()}},{key:"currentTime",get:function(){return this.player.currentTime()},set:function(t){this.player.currentTime(t)}}]),t}()},{}],38:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return this.registerHandlebarsHelpers(),c[t](e)}},{key:"registerHandlebarsHelpers",value:function(){"breaklines"in u.helpers||u.registerHelper("breaklines",function(t){return t=u.Utils.escapeExpression(t),t=t.replace(/(\r\n|\n|\r)/gm,"
"),new u.SafeString(t)})}},{key:"teardown",value:function(){this.$el&&this.$el.remove(),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"$UI",get:function(){return Object.freeze({commentsContainer:this.$player.find(".vac-comments-container"),controlElements:this.$player.find(".vac-control"),newCommentTextarea:this.$player.find(".vac-video-write-new textarea"),timeline:this.$player.find(".vjs-progress-control"),markerCursorHelpText:this.$player.find(".vac-cursor-help-text"),controlBar:this.$player.find(".vjs-control-bar"),markerWrap:this.$player.find(".vac-marker-wrap"),coverCanvas:this.$player.find(".vac-video-cover-canvas")})}},{key:"UI_CLASSES",get:function(){return Object.freeze({hidden:"vac-hidden",active:"vac-active"})}},{key:"$player",get:function(){return $(this.player.el())}},{key:"playerId",get:function(){return this.$player.attr("id")}},{key:"componentId",get:function(){return this.cid_=this.cid_||d.guid(),this.cid_}}]),e}(l)},{"./../compiled/templates":24,"./../lib/utils":40,"./player_component":37,"handlebars/runtime":20}],39:[function(t,e,n){"use strict";t("ie-array-find-polyfill"),t("es6-object-assign").polyfill(),function(){if("undefined"==typeof Object.setPrototypeOf&&"function"==typeof Object.getOwnPropertyNames){var t=function(t,e){return function(){return e.apply(this,arguments)}},e=function(t,e,n){if(!n){var i=t.__proto__[e]; +n={get:function(){return t["__"+e]||i},set:function(n){t["__"+e]=n}}}Object.defineProperty(t,e,{get:n.get?n.get.bind(t):void 0,set:n.set?n.set.bind(t):void 0,configurable:!0})},n=function r(n,o){var a,s=Object.getOwnPropertyNames(o);n.__proto__=o;for(var l=0,u=s.length;le?(a&&(clearTimeout(a),a=null),s=u,o=t.apply(i,r),a||(i=r=null)):a||n.trailing===!1||(a=setTimeout(l,c)),o}},parseIntObj:function(t){return Object.keys(t).forEach(function(e){parseInt(t[e])&&(t[e]=parseInt(t[e]))}),t},humanTime:function(t){function e(t){var e=Math.floor(t/60),n=String(t%60);return e+":"+(1==n.length?"0":"")+n}var n=[e(t.start)];return t.end&&n.push(e(t.end)),n.join("-")},guid:function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},areaOfHiddenEl:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=t.clone(),r={};return i.css({visibility:"hidden",display:"inline-block"}),i.removeClass(n),e.append(i),r.width=i.outerWidth(),r.height=i.outerHeight(),i.remove(),r},isWithinRange:function(t,e,n){return e=e||t+1,n>=t&&n<=e}}},{}]},{},[23])(23)}); \ No newline at end of file diff --git a/build/videojs-annotation-comments.js b/build/videojs-annotation-comments.js new file mode 100644 index 0000000..003d807 --- /dev/null +++ b/build/videojs-annotation-comments.js @@ -0,0 +1,8482 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 2.0.0-beta.1', + 7: '>= 4.0.0' +}; + +exports.REVISION_CHANGES = REVISION_CHANGES; +var objectType = '[object Object]'; + +function HandlebarsEnvironment(helpers, partials, decorators) { + this.helpers = helpers || {}; + this.partials = partials || {}; + this.decorators = decorators || {}; + + _helpers.registerDefaultHelpers(this); + _decorators.registerDefaultDecorators(this); +} + +HandlebarsEnvironment.prototype = { + constructor: HandlebarsEnvironment, + + logger: _logger2['default'], + log: _logger2['default'].log, + + registerHelper: function registerHelper(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple helpers'); + } + _utils.extend(this.helpers, name); + } else { + this.helpers[name] = fn; + } + }, + unregisterHelper: function unregisterHelper(name) { + delete this.helpers[name]; + }, + + registerPartial: function registerPartial(name, partial) { + if (_utils.toString.call(name) === objectType) { + _utils.extend(this.partials, name); + } else { + if (typeof partial === 'undefined') { + throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); + } + this.partials[name] = partial; + } + }, + unregisterPartial: function unregisterPartial(name) { + delete this.partials[name]; + }, + + registerDecorator: function registerDecorator(name, fn) { + if (_utils.toString.call(name) === objectType) { + if (fn) { + throw new _exception2['default']('Arg not supported with multiple decorators'); + } + _utils.extend(this.decorators, name); + } else { + this.decorators[name] = fn; + } + }, + unregisterDecorator: function unregisterDecorator(name) { + delete this.decorators[name]; + } +}; + +var log = _logger2['default'].log; + +exports.log = log; +exports.createFrame = _utils.createFrame; +exports.logger = _logger2['default']; + + +},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.registerDefaultDecorators = registerDefaultDecorators; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _decoratorsInline = require('./decorators/inline'); + +var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); + +function registerDefaultDecorators(instance) { + _decoratorsInline2['default'](instance); +} + + +},{"./decorators/inline":5}],5:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerDecorator('inline', function (fn, props, container, options) { + var ret = fn; + if (!props.partials) { + props.partials = {}; + ret = function (context, options) { + // Create a new partials stack frame prior to exec. + var original = container.partials; + container.partials = _utils.extend({}, original, props.partials); + var ret = fn(context, options); + container.partials = original; + return ret; + }; + } + + props.partials[options.args[0]] = options.fn; + + return ret; + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],6:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; + +function Exception(message, node) { + var loc = node && node.loc, + line = undefined, + column = undefined; + if (loc) { + line = loc.start.line; + column = loc.start.column; + + message += ' - ' + line + ':' + column; + } + + var tmp = Error.prototype.constructor.call(this, message); + + // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. + for (var idx = 0; idx < errorProps.length; idx++) { + this[errorProps[idx]] = tmp[errorProps[idx]]; + } + + /* istanbul ignore else */ + if (Error.captureStackTrace) { + Error.captureStackTrace(this, Exception); + } + + try { + if (loc) { + this.lineNumber = line; + + // Work around issue under safari where we can't directly set the column value + /* istanbul ignore next */ + if (Object.defineProperty) { + Object.defineProperty(this, 'column', { + value: column, + enumerable: true + }); + } else { + this.column = column; + } + } + } catch (nop) { + /* Ignore if the browser is very particular */ + } +} + +Exception.prototype = new Error(); + +exports['default'] = Exception; +module.exports = exports['default']; + + +},{}],7:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.registerDefaultHelpers = registerDefaultHelpers; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _helpersBlockHelperMissing = require('./helpers/block-helper-missing'); + +var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); + +var _helpersEach = require('./helpers/each'); + +var _helpersEach2 = _interopRequireDefault(_helpersEach); + +var _helpersHelperMissing = require('./helpers/helper-missing'); + +var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); + +var _helpersIf = require('./helpers/if'); + +var _helpersIf2 = _interopRequireDefault(_helpersIf); + +var _helpersLog = require('./helpers/log'); + +var _helpersLog2 = _interopRequireDefault(_helpersLog); + +var _helpersLookup = require('./helpers/lookup'); + +var _helpersLookup2 = _interopRequireDefault(_helpersLookup); + +var _helpersWith = require('./helpers/with'); + +var _helpersWith2 = _interopRequireDefault(_helpersWith); + +function registerDefaultHelpers(instance) { + _helpersBlockHelperMissing2['default'](instance); + _helpersEach2['default'](instance); + _helpersHelperMissing2['default'](instance); + _helpersIf2['default'](instance); + _helpersLog2['default'](instance); + _helpersLookup2['default'](instance); + _helpersWith2['default'](instance); +} + + +},{"./helpers/block-helper-missing":8,"./helpers/each":9,"./helpers/helper-missing":10,"./helpers/if":11,"./helpers/log":12,"./helpers/lookup":13,"./helpers/with":14}],8:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerHelper('blockHelperMissing', function (context, options) { + var inverse = options.inverse, + fn = options.fn; + + if (context === true) { + return fn(this); + } else if (context === false || context == null) { + return inverse(this); + } else if (_utils.isArray(context)) { + if (context.length > 0) { + if (options.ids) { + options.ids = [options.name]; + } + + return instance.helpers.each(context, options); + } else { + return inverse(this); + } + } else { + if (options.data && options.ids) { + var data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); + options = { data: data }; + } + + return fn(context, options); + } + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],9:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utils = require('../utils'); + +var _exception = require('../exception'); + +var _exception2 = _interopRequireDefault(_exception); + +exports['default'] = function (instance) { + instance.registerHelper('each', function (context, options) { + if (!options) { + throw new _exception2['default']('Must pass iterator to #each'); + } + + var fn = options.fn, + inverse = options.inverse, + i = 0, + ret = '', + data = undefined, + contextPath = undefined; + + if (options.data && options.ids) { + contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; + } + + if (_utils.isFunction(context)) { + context = context.call(this); + } + + if (options.data) { + data = _utils.createFrame(options.data); + } + + function execIteration(field, index, last) { + if (data) { + data.key = field; + data.index = index; + data.first = index === 0; + data.last = !!last; + + if (contextPath) { + data.contextPath = contextPath + field; + } + } + + ret = ret + fn(context[field], { + data: data, + blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) + }); + } + + if (context && typeof context === 'object') { + if (_utils.isArray(context)) { + for (var j = context.length; i < j; i++) { + if (i in context) { + execIteration(i, i, i === context.length - 1); + } + } + } else { + var priorKey = undefined; + + for (var key in context) { + if (context.hasOwnProperty(key)) { + // We're running the iterations one step out of sync so we can detect + // the last iteration without have to scan the object twice and create + // an itermediate keys array. + if (priorKey !== undefined) { + execIteration(priorKey, i - 1); + } + priorKey = key; + i++; + } + } + if (priorKey !== undefined) { + execIteration(priorKey, i - 1, true); + } + } + } + + if (i === 0) { + ret = inverse(this); + } + + return ret; + }); +}; + +module.exports = exports['default']; + + +},{"../exception":6,"../utils":19}],10:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _exception = require('../exception'); + +var _exception2 = _interopRequireDefault(_exception); + +exports['default'] = function (instance) { + instance.registerHelper('helperMissing', function () /* [args, ]options */{ + if (arguments.length === 1) { + // A missing field in a {{foo}} construct. + return undefined; + } else { + // Someone is actually trying to call something, blow up. + throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); + } + }); +}; + +module.exports = exports['default']; + + +},{"../exception":6}],11:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerHelper('if', function (conditional, options) { + if (_utils.isFunction(conditional)) { + conditional = conditional.call(this); + } + + // Default behavior is to render the positive path if the value is truthy and not empty. + // The `includeZero` option may be set to treat the condtional as purely not empty based on the + // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. + if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { + return options.inverse(this); + } else { + return options.fn(this); + } + }); + + instance.registerHelper('unless', function (conditional, options) { + return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],12:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +exports['default'] = function (instance) { + instance.registerHelper('log', function () /* message, options */{ + var args = [undefined], + options = arguments[arguments.length - 1]; + for (var i = 0; i < arguments.length - 1; i++) { + args.push(arguments[i]); + } + + var level = 1; + if (options.hash.level != null) { + level = options.hash.level; + } else if (options.data && options.data.level != null) { + level = options.data.level; + } + args[0] = level; + + instance.log.apply(instance, args); + }); +}; + +module.exports = exports['default']; + + +},{}],13:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +exports['default'] = function (instance) { + instance.registerHelper('lookup', function (obj, field) { + return obj && obj[field]; + }); +}; + +module.exports = exports['default']; + + +},{}],14:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('../utils'); + +exports['default'] = function (instance) { + instance.registerHelper('with', function (context, options) { + if (_utils.isFunction(context)) { + context = context.call(this); + } + + var fn = options.fn; + + if (!_utils.isEmpty(context)) { + var data = options.data; + if (options.data && options.ids) { + data = _utils.createFrame(options.data); + data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); + } + + return fn(context, { + data: data, + blockParams: _utils.blockParams([context], [data && data.contextPath]) + }); + } else { + return options.inverse(this); + } + }); +}; + +module.exports = exports['default']; + + +},{"../utils":19}],15:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _utils = require('./utils'); + +var logger = { + methodMap: ['debug', 'info', 'warn', 'error'], + level: 'info', + + // Maps a given level value to the `methodMap` indexes above. + lookupLevel: function lookupLevel(level) { + if (typeof level === 'string') { + var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); + if (levelMap >= 0) { + level = levelMap; + } else { + level = parseInt(level, 10); + } + } + + return level; + }, + + // Can be overridden in the host environment + log: function log(level) { + level = logger.lookupLevel(level); + + if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { + var method = logger.methodMap[level]; + if (!console[method]) { + // eslint-disable-line no-console + method = 'log'; + } + + for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + message[_key - 1] = arguments[_key]; + } + + console[method].apply(console, message); // eslint-disable-line no-console + } + } +}; + +exports['default'] = logger; +module.exports = exports['default']; + + +},{"./utils":19}],16:[function(require,module,exports){ +(function (global){ +/* global window */ +'use strict'; + +exports.__esModule = true; + +exports['default'] = function (Handlebars) { + /* istanbul ignore next */ + var root = typeof global !== 'undefined' ? global : window, + $Handlebars = root.Handlebars; + /* istanbul ignore next */ + Handlebars.noConflict = function () { + if (root.Handlebars === Handlebars) { + root.Handlebars = $Handlebars; + } + return Handlebars; + }; +}; + +module.exports = exports['default']; + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],17:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.checkRevision = checkRevision; +exports.template = template; +exports.wrapProgram = wrapProgram; +exports.resolvePartial = resolvePartial; +exports.invokePartial = invokePartial; +exports.noop = noop; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _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; } } + +var _utils = require('./utils'); + +var Utils = _interopRequireWildcard(_utils); + +var _exception = require('./exception'); + +var _exception2 = _interopRequireDefault(_exception); + +var _base = require('./base'); + +function checkRevision(compilerInfo) { + var compilerRevision = compilerInfo && compilerInfo[0] || 1, + currentRevision = _base.COMPILER_REVISION; + + if (compilerRevision !== currentRevision) { + if (compilerRevision < currentRevision) { + var runtimeVersions = _base.REVISION_CHANGES[currentRevision], + compilerVersions = _base.REVISION_CHANGES[compilerRevision]; + throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); + } else { + // Use the embedded version info since the runtime doesn't know about this revision yet + throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); + } + } +} + +function template(templateSpec, env) { + /* istanbul ignore next */ + if (!env) { + throw new _exception2['default']('No environment passed to template'); + } + if (!templateSpec || !templateSpec.main) { + throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); + } + + templateSpec.main.decorator = templateSpec.main_d; + + // Note: Using env.VM references rather than local var references throughout this section to allow + // for external users to override these as psuedo-supported APIs. + env.VM.checkRevision(templateSpec.compiler); + + function invokePartialWrapper(partial, context, options) { + if (options.hash) { + context = Utils.extend({}, context, options.hash); + if (options.ids) { + options.ids[0] = true; + } + } + + partial = env.VM.resolvePartial.call(this, partial, context, options); + var result = env.VM.invokePartial.call(this, partial, context, options); + + if (result == null && env.compile) { + options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); + result = options.partials[options.name](context, options); + } + if (result != null) { + if (options.indent) { + var lines = result.split('\n'); + for (var i = 0, l = lines.length; i < l; i++) { + if (!lines[i] && i + 1 === l) { + break; + } + + lines[i] = options.indent + lines[i]; + } + result = lines.join('\n'); + } + return result; + } else { + throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); + } + } + + // Just add water + var container = { + strict: function strict(obj, name) { + if (!(name in obj)) { + throw new _exception2['default']('"' + name + '" not defined in ' + obj); + } + return obj[name]; + }, + lookup: function lookup(depths, name) { + var len = depths.length; + for (var i = 0; i < len; i++) { + if (depths[i] && depths[i][name] != null) { + return depths[i][name]; + } + } + }, + lambda: function lambda(current, context) { + return typeof current === 'function' ? current.call(context) : current; + }, + + escapeExpression: Utils.escapeExpression, + invokePartial: invokePartialWrapper, + + fn: function fn(i) { + var ret = templateSpec[i]; + ret.decorator = templateSpec[i + '_d']; + return ret; + }, + + programs: [], + program: function program(i, data, declaredBlockParams, blockParams, depths) { + var programWrapper = this.programs[i], + fn = this.fn(i); + if (data || depths || blockParams || declaredBlockParams) { + programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); + } else if (!programWrapper) { + programWrapper = this.programs[i] = wrapProgram(this, i, fn); + } + return programWrapper; + }, + + data: function data(value, depth) { + while (value && depth--) { + value = value._parent; + } + return value; + }, + merge: function merge(param, common) { + var obj = param || common; + + if (param && common && param !== common) { + obj = Utils.extend({}, common, param); + } + + return obj; + }, + // An empty object to use as replacement for null-contexts + nullContext: Object.seal({}), + + noop: env.VM.noop, + compilerInfo: templateSpec.compiler + }; + + function ret(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var data = options.data; + + ret._setup(options); + if (!options.partial && templateSpec.useData) { + data = initData(context, data); + } + var depths = undefined, + blockParams = templateSpec.useBlockParams ? [] : undefined; + if (templateSpec.useDepths) { + if (options.depths) { + depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; + } else { + depths = [context]; + } + } + + function main(context /*, options*/) { + return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); + } + main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); + return main(context, options); + } + ret.isTop = true; + + ret._setup = function (options) { + if (!options.partial) { + container.helpers = container.merge(options.helpers, env.helpers); + + if (templateSpec.usePartial) { + container.partials = container.merge(options.partials, env.partials); + } + if (templateSpec.usePartial || templateSpec.useDecorators) { + container.decorators = container.merge(options.decorators, env.decorators); + } + } else { + container.helpers = options.helpers; + container.partials = options.partials; + container.decorators = options.decorators; + } + }; + + ret._child = function (i, data, blockParams, depths) { + if (templateSpec.useBlockParams && !blockParams) { + throw new _exception2['default']('must pass block params'); + } + if (templateSpec.useDepths && !depths) { + throw new _exception2['default']('must pass parent depths'); + } + + return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); + }; + return ret; +} + +function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { + function prog(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var currentDepths = depths; + if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { + currentDepths = [context].concat(depths); + } + + return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); + } + + prog = executeDecorators(fn, prog, container, depths, data, blockParams); + + prog.program = i; + prog.depth = depths ? depths.length : 0; + prog.blockParams = declaredBlockParams || 0; + return prog; +} + +function resolvePartial(partial, context, options) { + if (!partial) { + if (options.name === '@partial-block') { + partial = options.data['partial-block']; + } else { + partial = options.partials[options.name]; + } + } else if (!partial.call && !options.name) { + // This is a dynamic partial that returned a string + options.name = partial; + partial = options.partials[partial]; + } + return partial; +} + +function invokePartial(partial, context, options) { + // Use the current closure context to save the partial-block if this partial + var currentPartialBlock = options.data && options.data['partial-block']; + options.partial = true; + if (options.ids) { + options.data.contextPath = options.ids[0] || options.data.contextPath; + } + + var partialBlock = undefined; + if (options.fn && options.fn !== noop) { + (function () { + options.data = _base.createFrame(options.data); + // Wrapper function to get access to currentPartialBlock from the closure + var fn = options.fn; + partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + // Restore the partial-block from the closure for the execution of the block + // i.e. the part inside the block of the partial call. + options.data = _base.createFrame(options.data); + options.data['partial-block'] = currentPartialBlock; + return fn(context, options); + }; + if (fn.partials) { + options.partials = Utils.extend({}, options.partials, fn.partials); + } + })(); + } + + if (partial === undefined && partialBlock) { + partial = partialBlock; + } + + if (partial === undefined) { + throw new _exception2['default']('The partial ' + options.name + ' could not be found'); + } else if (partial instanceof Function) { + return partial(context, options); + } +} + +function noop() { + return ''; +} + +function initData(context, data) { + if (!data || !('root' in data)) { + data = data ? _base.createFrame(data) : {}; + data.root = context; + } + return data; +} + +function executeDecorators(fn, prog, container, depths, data, blockParams) { + if (fn.decorator) { + var props = {}; + prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); + Utils.extend(prog, props); + } + return prog; +} + + +},{"./base":3,"./exception":6,"./utils":19}],18:[function(require,module,exports){ +// Build out our basic SafeString type +'use strict'; + +exports.__esModule = true; +function SafeString(string) { + this.string = string; +} + +SafeString.prototype.toString = SafeString.prototype.toHTML = function () { + return '' + this.string; +}; + +exports['default'] = SafeString; +module.exports = exports['default']; + + +},{}],19:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.extend = extend; +exports.indexOf = indexOf; +exports.escapeExpression = escapeExpression; +exports.isEmpty = isEmpty; +exports.createFrame = createFrame; +exports.blockParams = blockParams; +exports.appendContextPath = appendContextPath; +var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`', + '=': '=' +}; + +var badChars = /[&<>"'`=]/g, + possible = /[&<>"'`=]/; + +function escapeChar(chr) { + return escape[chr]; +} + +function extend(obj /* , ...source */) { + for (var i = 1; i < arguments.length; i++) { + for (var key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + + return obj; +} + +var toString = Object.prototype.toString; + +exports.toString = toString; +// Sourced from lodash +// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt +/* eslint-disable func-style */ +var isFunction = function isFunction(value) { + return typeof value === 'function'; +}; +// fallback for older versions of Chrome and Safari +/* istanbul ignore next */ +if (isFunction(/x/)) { + exports.isFunction = isFunction = function (value) { + return typeof value === 'function' && toString.call(value) === '[object Function]'; + }; +} +exports.isFunction = isFunction; + +/* eslint-enable func-style */ + +/* istanbul ignore next */ +var isArray = Array.isArray || function (value) { + return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; +}; + +exports.isArray = isArray; +// Older IE versions do not directly support indexOf so we must implement our own, sadly. + +function indexOf(array, value) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + return -1; +} + +function escapeExpression(string) { + if (typeof string !== 'string') { + // don't escape SafeStrings, since they're already safe + if (string && string.toHTML) { + return string.toHTML(); + } else if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + } + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); +} + +function isEmpty(value) { + if (!value && value !== 0) { + return true; + } else if (isArray(value) && value.length === 0) { + return true; + } else { + return false; + } +} + +function createFrame(object) { + var frame = extend({}, object); + frame._parent = object; + return frame; +} + +function blockParams(params, ids) { + params.path = ids; + return params; +} + +function appendContextPath(contextPath, id) { + return (contextPath ? contextPath + '.' : '') + id; +} + + +},{}],20:[function(require,module,exports){ +// Create a simple path alias to allow browserify to resolve +// the runtime on a supported path. +module.exports = require('./dist/cjs/handlebars.runtime')['default']; + +},{"./dist/cjs/handlebars.runtime":2}],21:[function(require,module,exports){ +'use strict'; +if (!Array.prototype.find) { + Object.defineProperty(Array.prototype, 'find', { + value: function (predicate) { + + if (this == null) { + throw new TypeError('this is null or not defined'); + } + + var obj = Object(this); + var len = obj.length >>> 0; + + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + + var thisArg = arguments[1]; + + var index = 0; + + while (index < len) { + var iValue = obj[index]; + if (predicate.call(thisArg, iValue, index, obj)) { + return iValue; + } + index++; + } + + return undefined; + } + }); +} +},{}],22:[function(require,module,exports){ +//! moment.js + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, (function () { 'use strict'; + + var hookCallback; + + function hooks () { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } + + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } + + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } + + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; + } + } + return true; + } + } + + function isUndefined(input) { + return input === void 0; + } + + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null, + rfc2822 : false, + weekdayMismatch : false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } + else { + return isNowValid; + } + } + return m._isValid; + } + + function createInvalid (flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; + } + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); + } + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; + + function calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; + + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate () { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + + function ordinal (number) { + return this._ordinal.replace('%d', number); + } + + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + ss : '%d seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; + + function relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var aliases = {}; + + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + var priorities = {}; + + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } + + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + + var regexes = {}; + + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PRIORITIES + + addUnitPriority('year', 1); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', true); + + function getIsLeapYear () { + return isLeapYear(this.year()); + } + + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } + + function get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } + + function set$1 (mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } + else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } + + // MOMENTS + + function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } + + + function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + function mod(n, x) { + return ((n % x) + x) % x; + } + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } + + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PRIORITY + + addUnitPriority('month', 8); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } + + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } + + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } + + function createDate (y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date = new Date(y, m, d, h, M, s, ms); + + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; + } + + function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PRIORITIES + + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + + // LOCALES + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + if (!m) { + return isArray(this._weekdays) ? this._weekdays : + this._weekdays['standalone']; + } + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } + + function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + + + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PRIORITY + addUnitPriority('hour', 13); + + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse + }; + + // internal storage for locale config files + var locales = {}; + var localeFamilies = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return globalLocale; + } + + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = require; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) {} + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); + } + } + } + + return globalLocale._abbr; + } + + function defineLocale (name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; + } + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + + // returns locale data + function getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function listLocales() { + return keys(locales); + } + + function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; + + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; + + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } + + return result; + } + + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } + + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); + } + + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } + + var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } + } + + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } + + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); + + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } + + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); + } + + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // constant that refers to the ISO standard + hooks.ISO_8601 = function () {}; + + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); + } + + + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + + var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + + function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit + } + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; + } + } + } + + return true; + } + + function isValid$1() { + return this._isValid; + } + + function createInvalid$1() { + return createDuration(NaN); + } + + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); + } + + function isDuration (obj) { + return obj instanceof Duration; + } + + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // FORMATTING + + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } + } + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; + } + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset () { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } + else { + this.utcOffset(0, true); + } + } + return this; + } + + function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; + } + + function isLocal () { + return this.isValid() ? !this._isUTC : false; + } + + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; + } + + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + + // ASP.NET json date format regex + var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + + function createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; + + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; + } + + function addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } + } + + var add = createAdder(1, 'add'); + var subtract = createAdder(-1, 'subtract'); + + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + } + + function calendar$1 (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); + } + + function clone () { + return new Moment(this); + } + + function isAfter (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } + + function isBefore (input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } + } + + function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); + } + + function isSame (input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } + } + + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); + } + + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); + } + + function diff (input, units, asFloat) { + var that, + zoneDelta, + output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': output = monthDiff(this, that) / 12; break; + case 'month': output = monthDiff(this, that); break; + case 'quarter': output = monthDiff(this, that) / 3; break; + case 'second': output = (this - that) / 1e3; break; // 1000 + case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 + case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 + case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst + case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: output = this - that; + } + + return asFloat ? output : absFloor(output); + } + + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect () { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); + } + + function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function fromNow (withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } + + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow (withoutSuffix) { + return this.to(createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData () { + return this._locale; + } + + function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + } + + function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + } + + function valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } + + function unix () { + return Math.floor(this.valueOf() / 1000); + } + + function toDate () { + return new Date(this.valueOf()); + } + + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function isValid$2 () { + return isValid(this); + } + + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } + + function invalidAt () { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); + } + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); + } + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PRIORITY + + addUnitPriority('quarter', 7); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PRIORITY + addUnitPriority('date', 9); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PRIORITY + addUnitPriority('dayOfYear', 4); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PRIORITY + + addUnitPriority('minute', 14); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PRIORITY + + addUnitPriority('second', 15); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PRIORITY + + addUnitPriority('millisecond', 16); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var proto = Moment.prototype; + + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + function createUnix (input) { + return createLocal(input * 1000); + } + + function createInZone () { + return createLocal.apply(null, arguments).parseZone(); + } + + function preParsePostFormat (string) { + return string; + } + + var proto$1 = Locale.prototype; + + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; + + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1 (format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); + } + + function listMonthsImpl (format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; + } + + function listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); + } + + function listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); + } + + function listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); + } + + function listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); + } + + function listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); + } + + getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); + hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + + var mathAbs = Math.abs; + + function abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function addSubtract$1 (duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function add$1 (input, value) { + return addSubtract$1(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1 (input, value) { + return addSubtract$1(this, input, value, -1); + } + + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; + } + + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; + } + + function as (units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function valueOf$1 () { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asYears = makeAs('y'); + + function clone$1 () { + return createDuration(this); + } + + function get$2 (units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } + + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } + + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks () { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + ss: 44, // a few seconds to seconds + s : 45, // seconds to minute + m : 45, // minutes to hour + h : 22, // hours to day + d : 26, // days to month + M : 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime$1 (posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; + } + + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; + } + + function humanize (withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var abs$1 = Math.abs; + + function sign(x) { + return ((x > 0) - (x < 0)) || +x; + } + + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); + } + + var proto$2 = Duration.prototype; + + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; + + proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); + proto$2.lang = lang; + + // Side effect imports + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports + + + hooks.version = '2.22.1'; + + setHookCallback(createLocal); + + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; + + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // + DATE: 'YYYY-MM-DD', // + TIME: 'HH:mm', // + TIME_SECONDS: 'HH:mm:ss', // + TIME_MS: 'HH:mm:ss.SSS', // + WEEK: 'YYYY-[W]WW', // + MONTH: 'YYYY-MM' // + }; + + return hooks; + +}))); + +},{}],23:[function(require,module,exports){ +"use strict"; +/* + Main function and entry point + Can be registered to a videojs instance as a plugin +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +module.exports = function (videojs) { + require('./lib/polyfills'); + + var Plugin = videojs.getPlugin('plugin'), + Utils = require('./lib/utils'), + Controls = require("./components/controls"), + AnnotationState = require("./components/annotation_state"), + EventDispatcher = require("./lib/event_dispatcher"); + + var DEFAULT_OPTIONS = Object.freeze({ + bindArrowKeys: true, + meta: { user_id: null, user_name: null }, + annotationsObjects: [], + showControls: true, + showCommentList: true, + showFullScreen: true, + showMarkerShapeAndTooltips: true, + internalCommenting: true, + startInAnnotationMode: false + }); + + return function (_Plugin) { + _inherits(AnnotationComments, _Plugin); + + function AnnotationComments(player, options) { + _classCallCheck(this, AnnotationComments); + + options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options); + + var _this = _possibleConstructorReturn(this, (AnnotationComments.__proto__ || Object.getPrototypeOf(AnnotationComments)).call(this, player, options)); + + _this.eventDispatcher = new EventDispatcher(_this); + _this.eventDispatcher.registerListenersFor(_this, 'AnnotationComments'); + + _this.player = player; + _this.meta = options.meta; + _this.options = options; + + _this._readyCallbacks = []; + + // Assign reference to this class to player for access later by components where needed + player.annotationComments = function () { + return _this; + }.bind(_this); + + // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration + // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3 + if (player.readyState() >= 3) { + _this.postLoadDataConstructor(); + } else { + player.on('loadeddata', _this.postLoadDataConstructor.bind(_this)); + } + return _this; + } + + // Additional init/setup after video data + metadata is available + + + _createClass(AnnotationComments, [{ + key: 'postLoadDataConstructor', + value: function postLoadDataConstructor() { + // setup initial state and render UI + this.annotationState = new AnnotationState(this.player); + this.annotationState.annotations = this.options.annotationsObjects; + + this.controls = new Controls(this.player, this.options.bindArrowKeys); + this.bindEvents(); + this.setBounds(false); + if (this.options.startInAnnotationMode) this.toggleAnnotationMode(); + + this.pluginReady(); + } + + // Bind needed events for interaction w/ components + + }, { + key: 'bindEvents', + value: function bindEvents() { + var _this2 = this; + + // Set player boundaries on window size change or fullscreen change + $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500)); + this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500)); + + // Remove annotation features on fullscreen if showFullScreen: false + if (!this.options.showFullScreen) { + this.player.on('fullscreenchange', function () { + if (_this2.player.isFullscreen_) { + _this2.preFullscreenAnnotationsEnabled = _this2.active; + $(_this2.player.el()).addClass('vac-disable-fullscreen'); + } else { + $(_this2.player.el()).removeClass('vac-disable-fullscreen'); + } + if (_this2.preFullscreenAnnotationsEnabled) { + // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are + // in annotation mode, toggle the mode + _this2.toggleAnnotationMode(); + } + }.bind(this)); + } + } + + // A wrapper func to make it easier to use EventDispatcher from the client + // Ex: plugin.fire(type, data); + + }, { + key: 'fire', + value: function fire(type) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + this.eventDispatcher.fire(type, data); + } + + // Toggle annotations mode on/off + + }, { + key: 'toggleAnnotationMode', + value: function toggleAnnotationMode() { + this.active = !this.active; + this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements + this.annotationState.enabled = this.active; + + if (this.active) { + this.fire("annotationModeEnabled"); + } else { + this.fire("annotationModeDisabled"); + } + + // Handle control component UI if showControls: true + if (this.options.showControls) { + if (!this.active) { + this.controls.clear(true); + } else { + this.controls.render(); + } + } + } + + // Set player UI boundaries + + }, { + key: 'setBounds', + value: function setBounds() { + var triggerChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.bounds = {}; + var $player = $(this.player.el()), + $ctrls = $player.find('.vjs-control-bar'); + + this.bounds.left = $player.offset().left; + this.bounds.top = $player.offset().top; + this.bounds.right = this.bounds.left + $player.width(); + this.bounds.bottom = this.bounds.top + $player.height(); + this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height(); + + // fires an event when bounds have changed during resizing + if (triggerChange) this.fire('playerBoundsChanged', this.bounds); + } + + // Public function to register a callback for when plugin is ready + + }, { + key: 'onReady', + value: function onReady(callback) { + if (this.eventDispatcher.pluginReady) { + return callback(); + } + this._readyCallbacks.push(callback); + } + + // Mark plugin as ready and fire any pending callbacks + + }, { + key: 'pluginReady', + value: function pluginReady() { + this.eventDispatcher.pluginReady = true; + while (this._readyCallbacks.length) { + this._readyCallbacks.pop()(); + } + } + + // Teardown all components, remove all listeners, and remove elements from DOM + + }, { + key: 'dispose', + value: function dispose() { + this.controls = this.controls.teardown(); + this.annotationState = this.annotationState.teardown(); + this.eventDispatcher = this.eventDispatcher.teardown(); + this.teardown(); + if (this.player) { + this.player.annotationComments = null; + $(this.player.el()).removeClass('vac-active'); + $(this.player.el()).find("[class^='vac-']").remove(); + } + _get(AnnotationComments.prototype.__proto__ || Object.getPrototypeOf(AnnotationComments.prototype), 'dispose', this).call(this); + } + }, { + key: 'teardown', + value: function teardown() { + if (this.player) this.player.off('fullscreenchange'); + $(window).off('resize.vac-window-resize'); + } + }]); + + return AnnotationComments; + }(Plugin); +}; + +},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":36,"./lib/polyfills":40,"./lib/utils":41}],24:[function(require,module,exports){ +var _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; }; + +var Handlebars = require("handlebars/runtime"); +exports["comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n
\n
" + alias4(container.lambda((stack1 = depth0 != null ? depth0.meta : depth0) != null ? stack1.user_name : stack1, depth0)) + "
\n
" + alias4((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "timeSince", "hash": {}, "data": data }) : helper)) + "\n   X\n
\n
\n
\n " + alias4((helpers.breaklines || depth0 && depth0.breaklines || alias2).call(alias1, depth0 != null ? depth0.body : depth0, { "name": "breaklines", "hash": {}, "data": data })) + "\n
\n
\n"; + }, "useData": true }); +exports["comment_list"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data, blockParams) { + var stack1; + + return " " + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : "") + "\n"; + }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data, blockParams) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}; + + return "
\n"; + }, "useData": true, "useBlockParams": true }); +exports["controls"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { + var stack1; + + return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(2, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; + }, "2": function _(container, depth0, helpers, partials, data) { + var stack1; + + return "
\n \n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showNav : depth0, { "name": "if", "hash": {}, "fn": container.program(3, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; + }, "3": function _(container, depth0, helpers, partials, data) { + return "
\n
Prev
\n
Next
\n
\n"; + }, "5": function _(container, depth0, helpers, partials, data) { + var stack1, + alias1 = depth0 != null ? depth0 : container.nullContext || {}; + + return "
\n
\n
Click and drag to select
\n
\n
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.writingComment : depth0, { "name": "if", "hash": {}, "fn": container.program(9, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); + }, "6": function _(container, depth0, helpers, partials, data) { + var stack1; + + return "
\n Select shape + range\n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.internalCommenting : depth0, { "name": "if", "hash": {}, "fn": container.program(7, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n
-1 sec
\n
+1 sec
\n
\n
\n"; + }, "7": function _(container, depth0, helpers, partials, data) { + return " \n cancel\n"; + }, "9": function _(container, depth0, helpers, partials, data) { + var helper; + + return "
\n
\n
\n
New Annotation @ " + container.escapeExpression((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "rangeStr", "hash": {}, "data": data }) : helper)) + "
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n"; + }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var stack1, + alias1 = depth0 != null ? depth0 : container.nullContext || {}; + + return ((stack1 = helpers.unless.call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "unless", "hash": {}, "fn": container.program(1, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); + }, "useData": true }); +exports["draggable_marker"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n
\n"; + }, "useData": true }); +exports["marker"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { + return "vac-ranged-marker"; + }, "3": function _(container, depth0, helpers, partials, data) { + var helper; + + return "width:" + container.escapeExpression((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "width", "hash": {}, "data": data }) : helper)) + ";"; + }, "5": function _(container, depth0, helpers, partials, data) { + var stack1; + + return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.tooltipBody : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; + }, "6": function _(container, depth0, helpers, partials, data) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n \n " + alias4((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipTime", "hash": {}, "data": data }) : helper)) + " - " + alias4((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipBody", "hash": {}, "data": data }) : helper)) + "\n \n
\n"; + }, "7": function _(container, depth0, helpers, partials, data) { + return "vac-right-side"; + }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var stack1, + helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showTooltip : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; + }, "useData": true }); +exports["marker_wrap"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + return "
\n
\n
"; + }, "useData": true }); +exports["new_comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + var helper, + alias1 = depth0 != null ? depth0 : container.nullContext || {}, + alias2 = helpers.helperMissing, + alias3 = "function", + alias4 = container.escapeExpression; + + return "
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n"; + }, "useData": true }); +exports["player_button"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { + return "\n\n \n \n \n \n"; + }, "useData": true }); + +},{"handlebars/runtime":20}],25:[function(require,module,exports){ +"use strict"; +/* + Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils.js"), + CommentList = require("./comment_list"), + Marker = require("./marker"), + Comment = require("./comment"), + Shape = require("./shape"); + +module.exports = function (_PlayerUIComponent) { + _inherits(Annotation, _PlayerUIComponent); + + function Annotation(data, player) { + _classCallCheck(this, Annotation); + + var _this = _possibleConstructorReturn(this, (Annotation.__proto__ || Object.getPrototypeOf(Annotation)).call(this, player)); + + _this.id = data.id || _this.componentId; + _this.range = data.range; + _this.shape = data.shape; + _this.secondsActive = _this.buildSecondsActiveArray(); + _this.buildComments(data); + _this.buildMarker(); + _this.buildShape(); + _this.bindEvents(); + + _this.isOpen = false; + return _this; + } + + _createClass(Annotation, [{ + key: "buildComments", + value: function buildComments(data) { + this.commentList = new CommentList({ "comments": data.comments, "annotation": this }, this.player); + } + }, { + key: "buildMarker", + value: function buildMarker() { + this.marker = new Marker(this.player, this.range, this.commentList.comments[0]); + this.marker.render(); + } + }, { + key: "buildShape", + value: function buildShape() { + this.annotationShape = new Shape(this.player, this.shape); + } + + // Serialize object + + }, { + key: "bindEvents", + value: function bindEvents() { + var _this2 = this; + + this.marker.$el.on('click.vac-marker', function (e) { + return _this2.plugin.annotationState.openAnnotation(_this2, true); + }); + } + + // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state + + }, { + key: "open", + value: function open() { + var withPause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + var _this3 = this; + + var previewOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var forceSnapToStart = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + this.isOpen = true; + var snapToStart = forceSnapToStart || !Utils.isWithinRange(this.range.start, this.range.end, Math.floor(this.currentTime)); + + var showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips; + this.marker.setActive(showTooltip); + if (!previewOnly && this.plugin.options.showCommentList) { + this.commentList.render(); + } + + if (!previewOnly || previewOnly && this.plugin.options.showMarkerShapeAndTooltips) { + this.annotationShape.render(); + + if (this.shape) { + this.annotationShape.$el.on("click.vac-annotation", function () { + _this3.plugin.annotationState.openAnnotation(_this3, false, false, false); + }); + } + } + + if (withPause) this.player.pause(); + if (snapToStart) this.currentTime = this.range.start; + + this.plugin.fire('annotationOpened', { + annotation: this.data, + triggered_by_timeline: previewOnly + }); + } + + // Closes the annotation. Handles marker, commendList, shape, and AnnotationState + + }, { + key: "close", + value: function close() { + var clearActive = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (!this.isOpen) return; + this.isOpen = false; + this.marker.deactivate(); + this.commentList.teardown(false); + if (this.annotationShape.$el) this.annotationShape.$el.off("click.vac-annotation"); + this.annotationShape.teardown(); + if (clearActive) this.plugin.annotationState.clearActive(); + this.plugin.fire('annotationClosed', this.data); + } + + // For preloading an array of seconds active on initialization + // Values used to build timeMap in AnnotationState + + }, { + key: "buildSecondsActiveArray", + value: function buildSecondsActiveArray() { + var seconds = []; + if (!!this.range.end) { + for (var i = this.range.start; i <= this.range.end; i++) { + seconds.push(i); + } + } else { + var start = this.range.start; + seconds.push(start); + if (start < this.duration) seconds.push(start + 1); + } + return seconds; + } + + // Tearsdown annotation and marker, removes object from AnnotationState + + }, { + key: "teardown", + value: function teardown() { + var removeFromCollection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.close(true); + this.marker.teardown(); + if (this.commentList) this.commentList.teardown(removeFromCollection); + if (removeFromCollection) this.plugin.annotationState.removeAnnotation(this); + if (this.annotationShape) this.annotationShape.teardown(); + if (removeFromCollection) _get(Annotation.prototype.__proto__ || Object.getPrototypeOf(Annotation.prototype), "teardown", this).call(this); + } + + // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref + + }, { + key: "data", + get: function get() { + return { + id: this.id, + range: this.range, + shape: this.shape, + comments: this.commentList.data + }; + } + }, { + key: "isActive", + get: function get() { + return this.plugin.annotationState.activeAnnotation === this; + } + }], [{ + key: "newFromData", + value: function newFromData(range, shape, commentStr, plugin) { + var id = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; + + var comment = Comment.dataObj(commentStr, plugin); + if (range) range = Utils.parseIntObj(range); + if (shape) shape = Utils.parseIntObj(shape); + var data = { + id: id, + range: range, + shape: shape, + comments: [comment] + }; + return new Annotation(data, plugin.player); + } + }]); + + return Annotation; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":39,"./../lib/utils.js":41,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(require,module,exports){ +"use strict"; +/* + Component for managing the state of annotations, including showing active annotation during playback, + toggling active states for annotations, navigating annotations forward/back, etc +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Utils = require('./../lib/utils'), + PlayerComponent = require("./../lib/player_component"), + Annotation = require("./annotation"); + +module.exports = function (_PlayerComponent) { + _inherits(AnnotationState, _PlayerComponent); + + function AnnotationState(player) { + _classCallCheck(this, AnnotationState); + + var _this = _possibleConstructorReturn(this, (AnnotationState.__proto__ || Object.getPrototypeOf(AnnotationState)).call(this, player)); + + _this.initAPI(_this, 'AnnotationState'); + _this.resetData(); + _this.bindEvents(); + return _this; + } + + // sets _enabled and closes or opens annotation as needed + + + _createClass(AnnotationState, [{ + key: "bindEvents", + + + // Bind events for setting liveAnnotation on video time change + value: function bindEvents() { + this.player.on("timeupdate", Utils.throttle(this.setLiveAnnotation.bind(this), 100)); + } + + // Sort annotations by range.start + + }, { + key: "sortAnnotations", + value: function sortAnnotations() { + this._annotations.sort(function (a, b) { + return a.range.start < b.range.start ? -1 : a.range.start > b.range.start ? 1 : 0; + }); + } + + // Add a new annotation + + }, { + key: "addNewAnnotation", + value: function addNewAnnotation(annotation) { + this._annotations.push(annotation); + this.openAnnotation(annotation, true, true, false, true); + this.stateChanged(); + } + + // Create and add a annotation + + }, { + key: "createAndAddAnnotation", + value: function createAndAddAnnotation(data) { + this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew(); + + var annotation = Annotation.newFromData(data.range, data.shape, data.commentStr || "", this.plugin, data.id); + this.addNewAnnotation(annotation); + } + + // Destroy an existing annotation + + }, { + key: "destroyAnnotationById", + value: function destroyAnnotationById(id) { + var annotation = this.findAnnotation(id); + if (annotation) annotation.teardown(); + } + + // Remove an annotation + + }, { + key: "removeAnnotation", + value: function removeAnnotation(annotation) { + var id = annotation.id, + i = this._annotations.indexOf(annotation); + this._annotations.splice(i, 1); + this.stateChanged(); + this.plugin.fire('annotationDeleted', { id: id }); + } + + // Set the live annotation based on current video time + + }, { + key: "setLiveAnnotation", + value: function setLiveAnnotation() { + if (!this.enabled) return; + var time = Math.floor(this.currentTime); + + if (this.skipLiveCheck) { + if (time !== this.lastVideoTime) this.skipLiveCheck = false; + return; + } + + var matches = this.activeAnnotationsForTime(time); + if (!matches.length) return this.activeAnnotation.close(); + + // Set live annotation as the last match + var liveAnnotation = this.annotations[matches[matches.length - 1]]; + + // Special cases if this or another annotation is active + if (this.activeAnnotation.range) { + if (liveAnnotation === this.activeAnnotation) return; + // Check if the active annotation and live annotation share a start time + // Is that start time at the current playhead? + // If so, don't switch which is active. + var liveStart = liveAnnotation.range.start, + activeStart = this.activeAnnotation.range.start; + if (liveStart === activeStart && liveStart === time) return; + } + + this.openAnnotation(liveAnnotation, false, false, true); + } + + // Get all active annotations for a time (in seconds) + + }, { + key: "activeAnnotationsForTime", + value: function activeAnnotationsForTime(time) { + if (!this.annotations.length) return []; + return this.annotationTimeMap[time] || []; + } + + /* + Rebuild the annotation time map + Example: this._annotations[1] and this._annotations[3] are active during second 4 + this.annotationTimeMap = { 4: [1, 3] } + */ + + }, { + key: "rebuildAnnotationTimeMap", + value: function rebuildAnnotationTimeMap() { + var _this2 = this; + + var timeMap = {}; + this.annotations.forEach(function (annotation) { + annotation.secondsActive.forEach(function (second) { + var val = timeMap[second] || []; + val.push(_this2.annotations.indexOf(annotation)); + timeMap[second] = val; + }); + }); + this.annotationTimeMap = timeMap; + } + + // Close active annotation and remove reference in state + + }, { + key: "clearActive", + value: function clearActive() { + this.activeAnnotation.close(false); + this._activeAnnotation = null; + } + + // Open annotation with options to pause and show preview + // skipLiveCheck will short circuit setLiveAnnotation() + + }, { + key: "openAnnotation", + value: function openAnnotation(annotation) { + var skipLiveCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var pause = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + var previewOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + var forceSnapToStart = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + if (!this.plugin.active) this.plugin.toggleAnnotationMode(); + this.skipLiveCheck = skipLiveCheck; + this.clearActive(); + annotation.open(pause, previewOnly, forceSnapToStart); + this.activeAnnotation = annotation; + this.lastVideoTime = this.activeAnnotation.range.start; + } + + // Open an annotation by ID (if it exists) + + }, { + key: "openAnnotationById", + value: function openAnnotationById(id) { + var annotation = this.findAnnotation(id); + if (annotation) this.openAnnotation(annotation); + } + + // Returns annotation object given ID + + }, { + key: "findAnnotation", + value: function findAnnotation(id) { + return this.annotations.find(function (a) { + return a.id == id; + }); + } + + // Returns comment object given ID + + }, { + key: "findComment", + value: function findComment(id) { + var _ref; + + var comments = this.annotations.map(function (a) { + return a.commentList.comments; + }); + comments = (_ref = []).concat.apply(_ref, _toConsumableArray(comments)); // flatten 2d array + return comments.find(function (c) { + return c.id == id; + }); + } + + // Finds the next annotation in collection and opens it + + }, { + key: "nextAnnotation", + value: function nextAnnotation() { + if (this._activeAnnotation) { + var ind = this.annotations.indexOf(this._activeAnnotation), + nextInd = ind === this.annotations.length - 1 ? 0 : ind + 1; + return this.openAnnotation(this.annotations[nextInd], true); + } + var time = Math.floor(this.currentTime); + for (var i = 0; i < this.annotations.length; i++) { + if (this.annotations[i].range.start > time) return this.openAnnotation(this.annotations[i], true); + } + this.openAnnotation(this.annotations[0], true); + } + + // Finds the previous annotation in collection and opens it + + }, { + key: "prevAnnotation", + value: function prevAnnotation() { + if (this._activeAnnotation) { + var ind = this.annotations.indexOf(this._activeAnnotation), + nextInd = ind === 0 ? this.annotations.length - 1 : ind - 1; + return this.openAnnotation(this.annotations[nextInd], true); + } + var time = Math.floor(this.currentTime); + for (var i = this.annotations.length - 1; i >= 0; i--) { + if (this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true); + } + this.openAnnotation(this.annotations[this.annotations.length - 1], true); + } + + // Use anywhere the annotation data changes + // Cleans internal state data, updates player button, triggers configurable callback + + }, { + key: "stateChanged", + value: function stateChanged() { + this.sortAnnotations(); + this.rebuildAnnotationTimeMap(); + this.plugin.fire('onStateChanged', this.data); + } + + // Reset internal state properties + + }, { + key: "resetData", + value: function resetData() { + this.annotations = []; + this.annotationTimeMap = {}; + this.activeAnnotation = null; + this.enabled = false; + this.skipNextTimeCheck = false; + this.lastVideoTime = 0; + } + + // Remove UI and unbind events for this and child components + + }, { + key: "teardown", + value: function teardown() { + this.annotations.forEach(function (annotation) { + annotation.teardown(false); + }); + this.resetData(); + _get(AnnotationState.prototype.__proto__ || Object.getPrototypeOf(AnnotationState.prototype), "teardown", this).call(this); + } + }, { + key: "enabled", + set: function set(shouldBeEnabled) { + this._enabled = shouldBeEnabled; + if (!shouldBeEnabled) this.activeAnnotation.close(); + if (shouldBeEnabled) { + this.skipLiveCheck = false; + this.setLiveAnnotation(); + } + }, + get: function get() { + return this._enabled; + } + + // Sets _annotations w/Annoation objects from input array + + }, { + key: "annotations", + set: function set(annotationsData) { + var _this3 = this; + + this._annotations = annotationsData.map(function (a) { + return new Annotation(a, _this3.player); + }); + this.sortAnnotations(); + this.rebuildAnnotationTimeMap(); + }, + get: function get() { + return this._annotations; + } + }, { + key: "activeAnnotation", + set: function set() { + var annotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + + this._activeAnnotation = annotation; + } + + // Get current active annotation or a null object with .close() + , + get: function get() { + return this._activeAnnotation || { close: function close() {} }; + } + + // Serialize data + + }, { + key: "data", + get: function get() { + return this._annotations.map(function (a) { + return a.data; + }); + } + }]); + + return AnnotationState; +}(PlayerComponent); + +},{"./../lib/player_component":38,"./../lib/utils":41,"./annotation":25}],27:[function(require,module,exports){ +"use strict"; +/* + Component for an invidual comment +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + moment = require("moment"), + templateName = 'comment'; + +module.exports = function (_PlayerUIComponent) { + _inherits(Comment, _PlayerUIComponent); + + function Comment(data, player) { + _classCallCheck(this, Comment); + + var _this = _possibleConstructorReturn(this, (Comment.__proto__ || Object.getPrototypeOf(Comment)).call(this, player)); + + _this.commentList = data.commentList; + _this.id = data.id || _this.componentId; + _this.meta = data.meta; + _this.body = data.body; + _this.timestamp = moment(data.meta.datetime).unix(); + _this.timeSince = _this.timeSince(); + + _this.$el = $(_this.render()); + return _this; + } + + // Serialize data + + + _createClass(Comment, [{ + key: "render", + value: function render() { + return this.renderTemplate(templateName, { + id: this.id, + body: this.body, + meta: this.meta, + timeSince: this.timeSince + }); + } + + // Return time since comment timestamp + + }, { + key: "timeSince", + value: function timeSince() { + return moment(this.meta.datetime).fromNow(); + } + }, { + key: "teardown", + value: function teardown() { + var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + _get(Comment.prototype.__proto__ || Object.getPrototypeOf(Comment.prototype), "teardown", this).call(this, destroy); + } + + // Return a Comment obj given body content and plugin reference + + }, { + key: "data", + get: function get() { + return { + id: this.id, + meta: this.meta, + body: this.body + }; + } + }, { + key: "HTML", + get: function get() { + return this.$el[0].outerHTML; + } + }], [{ + key: "newFromData", + value: function newFromData(body, commentList, plugin) { + var data = this.dataObj(body, plugin); + return new Comment(data, plugin.player); + } + + // Return an object with plugin data, timestamp, unique id, and body content + + }, { + key: "dataObj", + value: function dataObj(body, plugin) { + return { + meta: Object.assign({ + datetime: moment().toISOString() + }, plugin.meta), + id: Utils.guid(), + body: body + }; + } + }]); + + return Comment; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":39,"./../lib/utils":41,"moment":22}],28:[function(require,module,exports){ +"use strict"; +/* + Component for a list of comments in a visible/active annotation +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + Comment = require("./comment"), + commentListTemplateName = 'comment_list', + newCommentTemplateName = 'new_comment'; + +module.exports = function (_PlayerUIComponent) { + _inherits(CommentList, _PlayerUIComponent); + + function CommentList(data, player) { + _classCallCheck(this, CommentList); + + var _this = _possibleConstructorReturn(this, (CommentList.__proto__ || Object.getPrototypeOf(CommentList)).call(this, player)); + + _this.annotation = data.annotation; + _this.comments = data.comments.map(function (commentData) { + commentData.commentList = _this; + return new Comment(commentData, player); + }); + _this.sortComments(); + return _this; + } + + // Serialize object + + + _createClass(CommentList, [{ + key: "bindListEvents", + + + // Bind all events needed for the comment list + value: function bindListEvents() { + var _this2 = this; + + this.$el.on("click.vac-comment", ".vac-close-comment-list", function () { + return _this2.annotation.close(); + }.bind(this)) // Hide CommentList UI with close button + .on("click.vac-comment", ".vac-reply-btn", this.addNewComment.bind(this)) // Open new reply UI with reply button + .on("click.vac-comment", ".vac-delete-annotation", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button + .on("click.vac-comment", ".vac-delete-comment", this.destroyComment.bind(this)) // Delete comment with delete comment button + .on("mousewheel.vac-comment DOMMouseScroll.vac-comment", ".vac-comments-wrap", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI + } + + // Bind event listeners for new comments form + + }, { + key: "bindCommentFormEvents", + value: function bindCommentFormEvents() { + this.$newCommentForm.on("click.vac-comment", ".vac-add-controls a, .vac-video-write-new.vac-is-comment a", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link + .on("click.vac-comment", ".vac-video-write-new.vac-is-comment button", this.saveNewComment.bind(this)); // Save new comment with save button + } + + // Render CommentList UI with all comments using template + + }, { + key: "render", + value: function render() { + this.$el = $(this.renderTemplate(commentListTemplateName, { + commentsHTML: this.comments.map(function (c) { + return c.HTML; + }), + rangeStr: Utils.humanTime(this.annotation.range) + })); + + this.$player.append(this.$el); + this.$wrap = this.$UI.commentsContainer; + this.bindListEvents(); + } + + // Re-render UI on state change + + }, { + key: "reRender", + value: function reRender() { + this.teardown(false); + this.render(); + } + + // Render new comment form + + }, { + key: "addNewComment", + value: function addNewComment() { + this.$wrap.addClass(this.UI_CLASSES.active).find(".vac-comments-wrap").scrollTop(999999); + var $shapebox = this.$wrap.find(".vac-add-new-shapebox"), + width = $shapebox.outerWidth(), + top = $shapebox.position().top + 10, + right = this.$wrap.outerWidth() - ($shapebox.position().left + width); + + this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, { width: width, top: top, right: right })); + this.bindCommentFormEvents(); + this.$player.append(this.$newCommentForm); + } + + // Save comment from new comment form, update state and re-render UI + + }, { + key: "saveNewComment", + value: function saveNewComment() { + this.$wrap.removeClass(this.UI_CLASSES.active); + + var user_id = 1, + body = this.$UI.newCommentTextarea.val(); + + if (!body) return; // empty comment - TODO add validation / err message + this.createComment(body); + } + }, { + key: "createComment", + value: function createComment(body) { + var comment = Comment.newFromData(body, this, this.plugin); + this.comments.push(comment); + this.sortComments(); + + // Don't mutate UI if comment is being created for an inactive annotation (via API) + if (this.annotation.isActive) { + this.reRender(false); + this.closeNewComment(); + } + + this.plugin.annotationState.stateChanged(); + } + + // Cancel comment adding process + + }, { + key: "closeNewComment", + value: function closeNewComment() { + this.unbindCommentFormEvents(); + if (this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active); + if (this.$newCommentForm) this.$newCommentForm.remove(); + } + + // Delete a comment. If it is the only comment, delete the annotation + // Update state and re-render UI + + }, { + key: "destroyComment", + value: function destroyComment(event) { + var annotationId = this.annotation.id; + if (this.comments.length == 1) { + this.annotation.teardown(); + } else { + var commentId = this.findCommentId(event), + comment = this.comments.find(function (c) { + return c.id == commentId; + }), + i = this.comments.indexOf(comment); + this.comments.splice(i, 1); + this.reRender(); + } + + this.plugin.annotationState.stateChanged(); + } + }, { + key: "findCommentId", + value: function findCommentId(event) { + var id = typeof event.detail.id === 'undefined' ? $(event.target).closest('.vac-comment').data('id') : event.detail.id; + return id; + } + + // Prevents outer page scroll when at the top or bottom of CommentList UI + // TODO: This might need to be fine-tuned? + + }, { + key: "disablePageScroll", + value: function disablePageScroll(event) { + var $target = $(event.currentTarget), + height = $target.height(), + ogEvent = event.originalEvent, + delta = ogEvent.wheelDelta || -ogEvent.detail, + dir = delta < 0 ? "down" : "up", + scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight); + + // if scrolling into top of div + if ($target.scrollTop() < 20 && dir == "up") { + $target.stop(); + $target.animate({ scrollTop: 0 }, 100); + event.preventDefault(); + } + + // if scrolling into bottom of div + if ($target.scrollTop() > scrollDiff - 10 && dir == "down") { + $target.stop(); + $target.animate({ scrollTop: height + 40 }, 100); + event.preventDefault(); + } + } + + // Sort comments by timestamp + + }, { + key: "sortComments", + value: function sortComments() { + this.comments.sort(function (a, b) { + return a.timestamp < b.timestamp ? -1 : a.timestamp > b.timestamp ? 1 : 0; + }); + } + + // Delete the annotation + + }, { + key: "handleDeleteAnnotationClick", + value: function handleDeleteAnnotationClick(e) { + var _this3 = this; + + var $confirmEl = $("").addClass("vac-delete-confirm").text("CONFIRM"); + $confirmEl.on("click.comment", function () { + $confirmEl.off("click.comment"); + _this3.annotation.teardown(); + }); + $(e.target).replaceWith($confirmEl); + } + + // Unbind listeners for new comments form + + }, { + key: "unbindCommentFormEvents", + value: function unbindCommentFormEvents() { + if (this.$newCommentForm) this.$newCommentForm.off("click.vac-comment"); + } + + // Teardown CommentList UI, unbind events + + }, { + key: "teardown", + value: function teardown() { + var destroyComments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + if (this.$el) { + this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"); + } + this.comments.forEach(function (c) { + return c.teardown(destroyComments); + }); + if (destroyComments) this.comments = []; + _get(CommentList.prototype.__proto__ || Object.getPrototypeOf(CommentList.prototype), "teardown", this).call(this); + } + }, { + key: "data", + get: function get() { + return this.comments.map(function (c) { + return c.data; + }); + } + }]); + + return CommentList; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./comment":27}],29:[function(require,module,exports){ +"use strict"; +/* + Component for managing annotation "control box" in upper left of video when in annotation mode, + including all functionality to add new annotations +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + DraggableMarker = require("./draggable_marker.js"), + SelectableShape = require("./selectable_shape.js"), + PlayerButton = require("./player_button"), + Annotation = require("./annotation"), + templateName = 'controls'; + +// Control uses a "ui state" to determine how UI is rendered - this object is the base state, containing a +// default value for each item in the state +var BASE_UI_STATE = Object.freeze({ + adding: false, // Are we currently adding a new annotation? (step 1 of flow) + writingComment: false // Are we currently writing the comment for annotation (step 2 of flow) +}); + +module.exports = function (_PlayerUIComponent) { + _inherits(Controls, _PlayerUIComponent); + + function Controls(player, bindArrowKeys) { + _classCallCheck(this, Controls); + + var _this = _possibleConstructorReturn(this, (Controls.__proto__ || Object.getPrototypeOf(Controls)).call(this, player)); + + _this.initAPI(_this, 'Controls'); + + _this.internalCommenting = _this.plugin.options.internalCommenting; + _this.showControls = _this.plugin.options.showControls; + _this.uiState = Utils.cloneObject(BASE_UI_STATE); + _this.bindEvents(bindArrowKeys); + + if (_this.showControls) { + // create player button in the control bar if controls are shown + _this.playerButton = new PlayerButton(_this.player); + } + + _this.render(); + return _this; + } + + // Bind all the events we need for UI interaction + + + _createClass(Controls, [{ + key: "bindEvents", + value: function bindEvents(bindArrowKeys) { + var _this2 = this; + + this.$player.on("click.vac-controls", ".vac-controls button", this.startAddNew.bind(this)) // Add new button click + .on("click.vac-controls", ".vac-annotation-nav .vac-a-next", function () { + return _this2.plugin.annotationState.nextAnnotation(); + }) // Click 'next' on annotation nav + .on("click.vac-controls", ".vac-annotation-nav .vac-a-prev", function () { + return _this2.plugin.annotationState.prevAnnotation(); + }) // Click 'prev' on annotation nav + .on("click.vac-controls", ".vac-video-move .vac-a-next", function () { + return _this2.marker.scrubStart(1); + }) // Click '+1 sec' on marker nav + .on("click.vac-controls", ".vac-video-move .vac-a-prev", function () { + return _this2.marker.scrubStart(-1); + }); // Click '-1 sec' on marker nav + + if (this.internalCommenting) { + this.$player.on("click.vac-controls", ".vac-add-controls button", this.writeComment.bind(this)) // 'Next' button click while adding + .on("click.vac-controls", ".vac-video-write-new.vac-is-annotation button", this.saveNew.bind(this)) // 'Save' button click while adding + .on("click.vac-controls", ".vac-add-controls a, .vac-video-write-new.vac-is-annotation a", this.cancelAddNew.bind(this)); // Cancel link click + } + if (bindArrowKeys) { + $(document).on("keyup.vac-nav-" + this.playerId, function (e) { + return _this2.handleArrowKeys(e); + }); // Use arrow keys to navigate annotations + } + } + + // Remove UI and unbind events for this and child components + + }, { + key: "teardown", + value: function teardown() { + this.clear(true); + this.$player.off('click.vac-controls'); + $(document).off("keyup.vac-nav-" + this.playerId + " mousemove.vac-tooltip-" + this.playerId); + if (this.playerButton) this.playerButton.teardown(); + _get(Controls.prototype.__proto__ || Object.getPrototypeOf(Controls.prototype), "teardown", this).call(this); + } + + // Clear existing UI (resetting components if need be) + + }, { + key: "clear", + value: function clear() { + var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (reset) { + if (this.uiState.adding) { + this.restoreNormalUI(); + this.marker.teardown(); + this.selectableShape.teardown(); + } + this.uiState = Utils.cloneObject(BASE_UI_STATE); + this.$player.find('.vac-video-cover-canvas').off('mousedown.vac-cursor-tooltip').off('mouseup.vac-cursor-tooltip'); + } + this.$tooltip_ = null; + this.$UI.controlElements.remove(); + } + + // Render the UI elements (based on uiState) + + }, { + key: "render", + value: function render() { + var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this.clear(reset); + var data = Object.assign({ + rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null, + showNav: this.plugin.annotationState.annotations.length > 1 + }, this.uiState, { internalCommenting: this.internalCommenting, showControls: this.showControls }); + + var $ctrls = this.renderTemplate(templateName, data); + this.$player.append($ctrls); + + if (this.playerButton) this.playerButton.updateNumAnnotations(); + } + + // User clicked to cancel in-progress add - restore to normal state + + }, { + key: "cancelAddNew", + value: function cancelAddNew() { + if (!(this.uiState.adding || this.uiState.writingComment)) return; + this.render(true); + this.marker.teardown(); + this.marker = null; + } + + // User clicked 'add' button in the controls - setup UI and marker + + }, { + key: "startAddNew", + value: function startAddNew() { + if (!this.plugin.active) this.plugin.toggleAnnotationMode(); + + this.player.pause(); + this.setAddingUI(); + this.uiState.adding = true; + this.render(); + + // construct new range and create marker + var range = { + start: parseInt(this.currentTime, 10), + stop: parseInt(this.currentTime, 10) + }; + this.marker = new DraggableMarker(this.player, range); + this.selectableShape = new SelectableShape(this.player); + + // show cursor help text if controls are hidden + if (!this.showControls) this.bindCursorTooltip(); + + this.plugin.fire('enteredAddingAnnotation', { range: range }); + } + + // User clicked 'next' action - show UI to write comment + + }, { + key: "writeComment", + value: function writeComment() { + this.uiState.writingComment = true; + this.render(); + } + + // User clicked to save a new annotation/comment during add new flow + + }, { + key: "saveNew", + value: function saveNew() { + var comment = this.$UI.newCommentTextarea.val(); + if (!comment) return; // empty comment - TODO add validation / err message + + var a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin); + this.plugin.annotationState.addNewAnnotation(a); + + this.cancelAddNew(); + } + + // Change normal UI (hide markers, hide playback, etc) on init add state + + }, { + key: "setAddingUI", + value: function setAddingUI() { + this.plugin.annotationState.enabled = false; + this.disablePlayingAndControl(); + } + + // Restore normal UI after add state + + }, { + key: "restoreNormalUI", + value: function restoreNormalUI() { + this.plugin.annotationState.enabled = this.plugin.active; + this.enablePlayingAndControl(); + $(document).off("mousemove.vac-tooltip-" + this.playerId); + } + + // On arrow key press, navigate to next or prev Annotation + + }, { + key: "handleArrowKeys", + value: function handleArrowKeys(e) { + if (!this.plugin.active) return; + var keyId = e.which; + + if (keyId == 37) this.plugin.annotationState.prevAnnotation(); + if (keyId == 39) this.plugin.annotationState.nextAnnotation(); + } + + // Adds help text to cursor during annotation mode + + }, { + key: "bindCursorTooltip", + value: function bindCursorTooltip() { + var _this3 = this; + + this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden); + + // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct + this.plugin.setBounds(false); + $(document).on("mousemove.vac-tooltip-" + this.playerId, Utils.throttle(function (event) { + if (!_this3.plugin.bounds) return; + + var x = event.pageX, + y = event.pageY, + outOfBounds = x < _this3.plugin.bounds.left || x > _this3.plugin.bounds.right || y < _this3.plugin.bounds.top || y > _this3.plugin.bounds.bottom, + withinControls = !outOfBounds && y >= _this3.plugin.bounds.bottomWithoutControls, + markerHovered = _this3.$tooltip.hasClass('vac-marker-hover'); + + if (outOfBounds) { + _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); + return; + } + + var cursorX = x - _this3.plugin.bounds.left, + cursorY = y - _this3.plugin.bounds.top, + margin = 10, + rightEdge = _this3.$player.width(), + bottomEdge = _this3.$player.height() - _this3.$UI.controlBar.height(), + atRightEdge = cursorX + _this3.tooltipArea.width + margin * 2 >= rightEdge, + atBottomEdge = cursorY + _this3.tooltipArea.height + margin * 2 >= bottomEdge; + + // is the tooltip too close to the right or bottom edge? + var posX = atRightEdge ? rightEdge - _this3.tooltipArea.width - margin : cursorX + margin, + posY = atBottomEdge ? bottomEdge - _this3.tooltipArea.height - margin : cursorY + margin; + + // hide if the cursor is over the control bar but not hovering over the draggable marker + // also hide if mouse is down + if (withinControls && !markerHovered || _this3.$tooltip.hasClass('vac-cursor-dragging')) { + _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); + } else { + _this3.$tooltip.removeClass(_this3.UI_CLASSES.hidden); + } + + _this3.$tooltip.css({ + left: posX + "px", + top: posY + "px" + }); + }.bind(this), 50)); + } + }, { + key: "$tooltip", + get: function get() { + this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip'); + return this.$tooltip_; + } + }]); + + return Controls; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(require,module,exports){ +"use strict"; +/* + Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range + as drag occurs +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Marker = require("./marker"), + Utils = require('./../lib/utils'), + markerTemplateName = 'draggable_marker'; + +module.exports = function (_Marker) { + _inherits(DraggableMarker, _Marker); + + function DraggableMarker(player, range) { + _classCallCheck(this, DraggableMarker); + + var _this = _possibleConstructorReturn(this, (DraggableMarker.__proto__ || Object.getPrototypeOf(DraggableMarker)).call(this, player, range)); + + _this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10 + _this.templateName = markerTemplateName; // Change template from base Marker template + _this.dragging = false; // Is a drag action currently occring? + _this.rangePin = range.start; // What's the original pinned timeline point when marker was added + _this.render(); + _this.$parent = _this.$UI.markerWrap; // Set parent as marker wrap + return _this; + } + + // Bind needed evnets for UI interaction + + + _createClass(DraggableMarker, [{ + key: "bindMarkerEvents", + value: function bindMarkerEvents() { + var _this2 = this; + + // On mouse down init drag + this.$el.on('mousedown.vac-marker', function (e) { + e.preventDefault(); + _this2.dragging = true; + // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms + $(document).on("mousemove.vac-dmarker-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 250)); + + // Add drag class to cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging').removeClass('vac-marker-hover'); + } + }); + + // On mouse up end drag action and unbind mousemove event + $(document).on("mouseup.vac-dmarker-" + this.playerId, function (e) { + if (!_this2.dragging) return; + $(document).off("mousemove.vac-dmarker-" + _this2.playerId); + _this2.dragging = false; + + // Remove drag class and hover class from cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging').removeClass('vac-marker-hover'); + } + }); + + // On mouse mouse enter, show cursor tooltip if controls are not shown + // This adds the class which is picked up in Controls + if (!this.plugin.options.showControls) { + var self = this; + self.$el.on('mouseenter.vac-cursor-tool-tip', function () { + self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover'); + }).on('mouseleave.vac-cursor-tool-tip', function () { + self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover'); + }); + }; + } + + // On drag action, calculate new range and re-render marker + + }, { + key: "onDrag", + value: function onDrag(e) { + var dragPercent = this.percentValFromXpos(e.pageX), + secVal = parseInt(this.duration * dragPercent); + + if (secVal > this.rangePin) { + this.range = { + start: this.rangePin, + end: secVal + }; + } else { + this.range = { + start: secVal, + end: this.rangePin + }; + } + this.render(); + this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); + } + + // Cal percentage (of video) position for a pixel-based X position on the document + + }, { + key: "percentValFromXpos", + value: function percentValFromXpos(xpos) { + var x = Math.max(0, xpos - this.$parent.offset().left), + // px val + max = this.$parent.innerWidth(), + per = x / max; + if (per > 1) per = 1; + if (per < 0) per = 0; + return per; + } + + // Remove bound events on destructon + + }, { + key: "teardown", + value: function teardown() { + $(document).off("mousemove.vac-dmarker-" + this.playerId + " mouseup.vac-dmarker-" + this.playerId); + this.$el.off('mouseenter.vac-cursor-tool-tip'); + this.$el.off('mouseleave.vac-cursor-tool-tip'); + this.$el.off('mousedown.vac-marker'); + this.$el.remove(); + } + + // Move the video & marker start by some num seconds (pos or neg) + + }, { + key: "scrubStart", + value: function scrubStart(secondsChanged) { + var newStart = this.range.start + secondsChanged; + this.currentTime = newStart; + this.range.start = newStart; + this.rangePin = newStart; + this.teardown(); + this.render(); + + this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); + } + }]); + + return DraggableMarker; +}(Marker); + +},{"./../lib/utils":41,"./marker":31}],31:[function(require,module,exports){ +"use strict"; +/* + Component for a timeline marker with capabilities to render on timeline, including tooltip for comment +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + Utils = require("./../lib/utils"), + markerTemplateName = 'marker', + markerWrapTemplateName = 'marker_wrap'; + +module.exports = function (_PlayerUIComponent) { + _inherits(Marker, _PlayerUIComponent); + + function Marker(player, range) { + var comment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + + _classCallCheck(this, Marker); + + var _this = _possibleConstructorReturn(this, (Marker.__proto__ || Object.getPrototypeOf(Marker)).call(this, player)); + + _this.range = range; + _this.comment = comment; + _this.templateName = markerTemplateName; + + if (!_this.$UI.markerWrap.length) { + _this.$UI.timeline.append(_this.renderTemplate(markerWrapTemplateName)); + } + return _this; + } + + // Set this marker as active (highlight) and optionally show tooltip also + + + _createClass(Marker, [{ + key: "setActive", + value: function setActive() { + var showTooltip = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this.$el.addClass(this.UI_CLASSES.active); + if (showTooltip) this.$el.addClass('vac-force-tooltip'); + } + + // Deactivate this marker + + }, { + key: "deactivate", + value: function deactivate() { + this.$el.removeClass(this.UI_CLASSES.active + " vac-force-tooltip"); + } + + // Draw marker on timeline for this.range; + + }, { + key: "render", + value: function render() { + // clear existing marker if this one was already rendered + this.$UI.timeline.find("[data-marker-id=\"" + this.componentId + "\"]").remove(); + + // Bind to local instance var, add to DOM, and setup events + this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData)); + this.$UI.markerWrap.append(this.$el); + this.bindMarkerEvents(); + } + + // Bind needed events for this marker + + }, { + key: "bindMarkerEvents", + value: function bindMarkerEvents() { + var _this2 = this; + + // handle dimming other markers + highlighting this one on mouseenter/leave + this.$el.on("mouseenter.vac-marker", function () { + _this2.$el.addClass('vac-hovering').closest(".vac-marker-wrap").addClass('vac-dim-all'); + }).on("mouseleave.vac-marker", function () { + _this2.$el.removeClass('vac-hovering').closest(".vac-marker-wrap").removeClass('vac-dim-all'); + }); + } + + // Build object for template + + }, { + key: "teardown", + + + // Unbind event listeners on teardown and remove DOM nodes + value: function teardown() { + this.$el.off('mouseenter.vac-marker').off('mouseleave.vac-marker').off('click.vac-marker'); + _get(Marker.prototype.__proto__ || Object.getPrototypeOf(Marker.prototype), "teardown", this).call(this); + } + }, { + key: "markerTemplateData", + get: function get() { + // the smaller the width, the higher the z-index so overlaps are clickable + var left = this.range.start / this.duration * 100, + width = this.range.end / this.duration * 100 - left, + zIndex = 100 - Math.floor(width) || 100; + return { + left: left + '%', + width: width + '%', + zIndex: zIndex, + showTooltip: this.plugin.options.showMarkerShapeAndTooltips, + tooltipRight: left > 50, + tooltipTime: Utils.humanTime(this.range), + tooltipBody: !this.comment ? null : this.comment.body, + rangeShow: !!this.range.end, + id: this.componentId + }; + } + }]); + + return Marker; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":39,"./../lib/utils":41}],32:[function(require,module,exports){ +"use strict"; +/* + Component main 'annotation toggle' button in the player controls, including notifier for # annotations +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"), + templateName = "player_button"; + +module.exports = function (_PlayerUIComponent) { + _inherits(PlayerButton, _PlayerUIComponent); + + function PlayerButton(player) { + _classCallCheck(this, PlayerButton); + + var _this = _possibleConstructorReturn(this, (PlayerButton.__proto__ || Object.getPrototypeOf(PlayerButton)).call(this, player)); + + _this.render(); + + _this.initAPI(_this, 'PlayerButton'); + + _this.$el.on('click.vac-player-button', function () { + _this.plugin.toggleAnnotationMode(); + }); + return _this; + } + + // Add button to player + + + _createClass(PlayerButton, [{ + key: "render", + value: function render() { + var btn = this.player.getChild('controlBar').addChild('button', {}); + btn.controlText("Toggle Animations"); + this.$el = $(btn.el()); + this.$el.addClass('vac-player-btn').find(".vjs-icon-placeholder").html(this.renderTemplate(templateName)); + } + + // Update the number of annotations displayed in the bubble + + }, { + key: "updateNumAnnotations", + value: function updateNumAnnotations() { + var num = this.plugin.annotationState.annotations.length, + $bubble = this.$el.find("b"); + $bubble.text(num); + num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden); + } + + // Unbind event listeners on teardown and remove DOM nodes + + }, { + key: "teardown", + value: function teardown() { + this.$el.off('click.vac-player-button'); + _get(PlayerButton.prototype.__proto__ || Object.getPrototypeOf(PlayerButton.prototype), "teardown", this).call(this); + } + }]); + + return PlayerButton; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":39}],33:[function(require,module,exports){ +"use strict"; +/* + Component for a shape that can be drug/sized on top of the video while adding a new annotation +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Shape = require("./shape"), + Utils = require('./../lib/utils'); + +module.exports = function (_Shape) { + _inherits(SelectableShape, _Shape); + + function SelectableShape(player) { + _classCallCheck(this, SelectableShape); + + var _this = _possibleConstructorReturn(this, (SelectableShape.__proto__ || Object.getPrototypeOf(SelectableShape)).call(this, player)); + + _this.$parent = _this.$player.find(".vac-video-cover-canvas"); + _this.bindEvents(); + _this.dragging = false; + return _this; + } + + // Bind all needed events for drag action + + + _createClass(SelectableShape, [{ + key: "bindEvents", + value: function bindEvents() { + var _this2 = this; + + // On mousedown initialize drag + this.$parent.on("mousedown.vac-selectable-shape", function (e) { + // Check a few conditions to see if we should *not* start drag + if (!$(e.target).hasClass('vac-video-cover-canvas')) return; //didn't click on overlay + if ($(e.target).hasClass('vac-shape')) return; //user clicked on annotation + + // Remove old shape if one existed + if (_this2.$el) _this2.$el.remove(); + + // Define default starting shape (just x/y coords of where user clicked no width/height yet) + var shape = { + x1: _this2.xCoordToPercent(e.pageX), + y1: _this2.YCoordToPercent(e.pageY) + }; + shape.x2 = shape.x1; + shape.y2 = shape.y2; + _this2.shape = shape; + + // Save origin points for future use + _this2.originX = shape.x1; + _this2.originY = shape.y1; + + // Draw shape and start drag state + _this2.render(); + _this2.dragging = true; + _this2.dragMoved = false; // used to determine if user actually dragged or just clicked + + // Bind event on doc mousemove to track drag, throttled to once each 100ms + $(document).on("mousemove.vac-sshape-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 100)); + + // Add drag class to cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging'); + } + }); + + // On mouseup, if during drag cancel drag event listeners + $(document).on("mouseup.vac-sshape-" + this.playerId, function (e) { + if (!_this2.dragging) return; + + $(document).off("mousemove.vac-sshape-" + _this2.playerId); + + if (!_this2.dragMoved) { + //clear shape if it's just a click (and not a drag) + _this2.shape = null; + if (_this2.$el) _this2.$el.remove(); + } + + _this2.dragging = false; + + // Remove drag class from cursor tooltip if available + if (!_this2.plugin.options.showControls) { + _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging'); + } + }); + } + + // On each interation of drag action (mouse movement), recalc position and redraw shape + + }, { + key: "onDrag", + value: function onDrag(e) { + this.dragMoved = true; + + var xPer = this.xCoordToPercent(e.pageX), + yPer = this.YCoordToPercent(e.pageY); + + if (xPer < this.originX) { + this.shape.x2 = this.originX; + this.shape.x1 = Math.max(0, xPer); + } else { + this.shape.x2 = Math.min(100, xPer); + this.shape.x1 = this.originX; + } + if (yPer < this.originY) { + this.shape.y2 = this.originY; + this.shape.y1 = Math.max(0, yPer); + } else { + this.shape.y2 = Math.min(100, yPer); + this.shape.y1 = this.originY; + } + this.setDimsFromShape(); + + this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape }); + } + + // Convert pixel-based x position (relative to document) to percentage in video + + }, { + key: "xCoordToPercent", + value: function xCoordToPercent(x) { + x = x - this.$parent.offset().left; //pixel position + var max = this.$parent.innerWidth(); + return Number((x / max * 100).toFixed(2)); //round to 2 decimal places + } + + // Convert pixel-based y position (relative to document) to percentage in video + + }, { + key: "YCoordToPercent", + value: function YCoordToPercent(y) { + y = y - this.$parent.offset().top; //pixel position + var max = this.$parent.innerHeight(); + return Number((y / max * 100).toFixed(2)); //round to 2 decimal places + } + + // Unbind events and remove element + + }, { + key: "teardown", + value: function teardown() { + this.$parent.off('mousedown.vac-selectable-shape'); + $(document).off("mouseup.vac-sshape-" + this.playerId + " mousemove.vac-sshape-" + this.playerId); + _get(SelectableShape.prototype.__proto__ || Object.getPrototypeOf(SelectableShape.prototype), "teardown", this).call(this); + } + }]); + + return SelectableShape; +}(Shape); + +},{"./../lib/utils":41,"./shape":34}],34:[function(require,module,exports){ +"use strict"; +/* + Component for managing a shape (i.e. box drawn on the player) for an annotation +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerUIComponent = require("./../lib/player_ui_component"); + +module.exports = function (_PlayerUIComponent) { + _inherits(Shape, _PlayerUIComponent); + + function Shape(player) { + var shape = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, Shape); + + var _this = _possibleConstructorReturn(this, (Shape.__proto__ || Object.getPrototypeOf(Shape)).call(this, player)); + + _this.shape = shape; + _this.$parent = _this.$player; + return _this; + } + + // Draw the shape element on the $parent + + + _createClass(Shape, [{ + key: "render", + value: function render() { + if (!this.shape) return; + if (this.$el) this.$el.remove(); + + this.$el = $("
").addClass("vac-shape"); + this.setDimsFromShape(); + this.$parent.append(this.$el); + } + + // Set/update the dimensions of the shape based on this.shape + + }, { + key: "setDimsFromShape", + value: function setDimsFromShape() { + this.$el.css({ + left: this.shape.x1 + "%", + top: this.shape.y1 + "%", + width: this.shape.x2 - this.shape.x1 + "%", + height: this.shape.y2 - this.shape.y1 + "%" + }); + } + }]); + + return Shape; +}(PlayerUIComponent); + +},{"./../lib/player_ui_component":39}],35:[function(require,module,exports){ +"use strict"; +/* + Load plugin and register to global videojs +*/ + +(function ($, videojs) { + var AnnotationComments = require('./annotation_comments.js'); + videojs.registerPlugin('annotationComments', AnnotationComments(videojs)); +})(jQuery, window.videojs); + +},{"./annotation_comments.js":23}],36:[function(require,module,exports){ +'use strict'; +/* + Classes for registering and handling custom events for external interaction support. + Will be bound to plugin object as a message gateway between external elements and the plugin. +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Logger = require("./logger"); + +/* + A centralized collection of event callbacks organized by component and name + Main reference for external event api + These events will be bound to the plugin on initialization of their respective components + NOTE - 'self' as second param in each function is a workaround for transpiler not properly + keeping this , so we pass in instance to use as this for each fn - can't rely on bind + because this is rewritten from symbol registry in transpiler and it's not present +*/ + +var EventRegistry = { + AnnotationState: { + openAnnotation: function openAnnotation(event, _this) { + _this.openAnnotationById(event.detail.id); + }, + closeActiveAnnotation: function closeActiveAnnotation(event, _this) { + _this.clearActive(); + }, + newAnnotation: function newAnnotation(event, _this) { + _this.createAndAddAnnotation(event.detail); + }, + destroyAnnotation: function destroyAnnotation(event, _this) { + _this.destroyAnnotationById(event.detail.id); + }, + newComment: function newComment(event, _this) { + var annotation = _this.findAnnotation(event.detail.annotationId); + if (annotation) annotation.commentList.createComment(event.detail.body); + }, + destroyComment: function destroyComment(event, _this) { + var comment = _this.findComment(event.detail.id); + if (comment) comment.commentList.destroyComment(event); + } + }, + Controls: { + addingAnnotation: function addingAnnotation(event, _this) { + _this.startAddNew(); + }, + cancelAddingAnnotation: function cancelAddingAnnotation(event, _this) { + _this.cancelAddNew(); + } + }, + PlayerButton: { + onStateChanged: function onStateChanged(event, _this) { + _this.updateNumAnnotations(); + } + }, + AnnotationComments: { + toggleAnnotationMode: function toggleAnnotationMode(event, _this) { + _this.toggleAnnotationMode(); + } + } +}; + +module.exports = function () { + function EventDispatcher(plugin) { + _classCallCheck(this, EventDispatcher); + + this.plugin = plugin; + this.pluginReady = false; + this.pendingEvts = []; + this.registeredListeners = []; + this.eventRegistry = EventRegistry; + } + + // Use the EventRegistry to mass register events on each component initialization + + + _createClass(EventDispatcher, [{ + key: "registerListenersFor", + value: function registerListenersFor(obj, className) { + var _this2 = this; + + var matchingEvents = this.eventRegistry[className]; + if (matchingEvents) { + Object.keys(matchingEvents).forEach(function (key) { + // Don't register again if already in cached collection + if (!~_this2.registeredListeners.indexOf(key)) { + var callback = matchingEvents[key].bind(obj); + _this2.registerListener(key, function (evt) { + if (!_this2.pluginReady) return; + _this2.logCallback(key, className, evt); + callback(evt, obj); + }.bind(_this2)); + } + }); + } + } + + // Bind a listener to the plugin + + }, { + key: "registerListener", + value: function registerListener(type, callback) { + this.plugin.on(type, callback); + this.registeredListeners.push(type); + } + + // Unbind a listener from the plugin + + }, { + key: "unregisterListener", + value: function unregisterListener(type) { + this.plugin.off(type); + var i = this.registeredListeners.indexOf(type); + this.registeredListeners.splice(i, 1); + } + + // Trigger an event on the plugin + + }, { + key: "fire", + value: function fire(type, data) { + if (!this.pluginReady) return; + Logger.log("evt-dispatch-FIRE", type, data); + var evt = new CustomEvent(type, { 'detail': data }); + this.plugin.trigger(evt); + } + }, { + key: "teardown", + value: function teardown() { + var _this3 = this; + + this.registeredListeners.forEach(function (type) { + _this3.unregisterListener(type); + }); + } + }, { + key: "logCallback", + value: function logCallback(eventName, className, event) { + Logger.log("evt-dispatch-RECEIVE", eventName + " (" + className + ")", event); + } + }]); + + return EventDispatcher; +}(); + +},{"./logger":37}],37:[function(require,module,exports){ +'use strict'; +/* + General logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging +*/ + +// Prefix for appending to all logger messages + +var LOG_PREFIX = "::VAC::"; + +// Are we in debug mode? +function debug() { + return !!window.VAC_DEBUG; +} + +// Build arguments for console fn, adding prefix +function buildArgs(args) { + return [LOG_PREFIX].concat(args); +} + +// Log message/data +module.exports.log = function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (!debug()) return; + console.log.apply(null, buildArgs(args)); +}; + +// Error message/data +module.exports.error = function () { + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + if (!debug()) return; + console.error.apply(null, buildArgs(args)); +}; + +// Info message/data +module.exports.info = function () { + for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + if (!debug()) return; + console.info.apply(null, buildArgs(args)); +}; + +},{}],38:[function(require,module,exports){ +"use strict"; +/* + Base class all player components interit from - it includes lots of helper functions (to get reference to + the player, the plugin, video state, etc) +*/ + +var _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; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +module.exports = function () { + function PlayerComponent(player) { + _classCallCheck(this, PlayerComponent); + + this._player = player; + } + + // attribute to get reference to the main plugin object (main.js instance) + + + _createClass(PlayerComponent, [{ + key: "initAPI", + + + // Register all events in the EventRegistry matching this className + value: function initAPI(obj, className) { + this.plugin.eventDispatcher.registerListenersFor(obj, className); + } + + // Nullify player reference so objects can be removed safely + // All components should call super.teardown() within their teardown funcs + + }, { + key: "teardown", + value: function teardown() { + var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (destroy) this._player = null; + } + }, { + key: "plugin", + get: function get() { + return this.player.annotationComments(); + } + + // attribute to get player javascript instance + + }, { + key: "player", + get: function get() { + return this._player; + } + + // attribute to get video duration (in seconds) + + }, { + key: "duration", + get: function get() { + return this.player.duration(); + } + + // attribute to get player current time + + }, { + key: "currentTime", + get: function get() { + return this.player.currentTime(); + } + + // set current time of player + , + set: function set(time) { + this.player.currentTime(time); + } + }]); + + return PlayerComponent; +}(); + +},{}],39:[function(require,module,exports){ +"use strict"; +/* + Base class all player UI components interit from - it includes lots of helper functions (to get reference to + the player $el, various classes/helpers, template rendering, etc) +*/ + +var _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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var PlayerComponent = require("./player_component"), + Handlebars = require('handlebars/runtime'), + Templates = require('./../compiled/templates'), + Utils = require('./../lib/utils'); + +module.exports = function (_PlayerComponent) { + _inherits(PlayerUIComponent, _PlayerComponent); + + function PlayerUIComponent(player) { + _classCallCheck(this, PlayerUIComponent); + + return _possibleConstructorReturn(this, (PlayerUIComponent.__proto__ || Object.getPrototypeOf(PlayerUIComponent)).call(this, player)); + } + + // helpers to get various UI components of the player quickly, keeping commonly reused class names + // consolidated in case of need to change in the future (and for quick access) + + + _createClass(PlayerUIComponent, [{ + key: "disablePlayingAndControl", + + + // Disable play/control actions on the current player + value: function disablePlayingAndControl() { + this.$player.addClass('vac-disable-play'); + //TODO - catch spacebar being hit + //TODO - prevent scrubbing and timeline click to seek + } + + // Enable play/control actions on the controller + + }, { + key: "enablePlayingAndControl", + value: function enablePlayingAndControl() { + this.$player.removeClass('vac-disable-play'); + } + + // Render a handlebars template with local data passed in via key/val in object + + }, { + key: "renderTemplate", + value: function renderTemplate(templateName) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + this.registerHandlebarsHelpers(); + return Templates[templateName](options); + } + + // Handle escaped breaklines in Handlebars + + }, { + key: "registerHandlebarsHelpers", + value: function registerHandlebarsHelpers() { + if ('breaklines' in Handlebars.helpers) return; + + Handlebars.registerHelper('breaklines', function (text) { + text = Handlebars.Utils.escapeExpression(text); + text = text.replace(/(\r\n|\n|\r)/gm, '
'); + return new Handlebars.SafeString(text); + }); + } + + // Provide basic teardown function to inherit + + }, { + key: "teardown", + value: function teardown() { + if (this.$el) this.$el.remove(); + _get(PlayerUIComponent.prototype.__proto__ || Object.getPrototypeOf(PlayerUIComponent.prototype), "teardown", this).call(this); + } + }, { + key: "$UI", + get: function get() { + return Object.freeze({ + commentsContainer: this.$player.find(".vac-comments-container"), // outer container for all comments + controlElements: this.$player.find(".vac-control"), // Each of multiple control elements in the control bar + newCommentTextarea: this.$player.find(".vac-video-write-new textarea"), // Textarea for writing a new comment + timeline: this.$player.find('.vjs-progress-control'), // Timeline element + markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline + controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs + markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline + coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state + }); + } + + // utility classes used in various components + + }, { + key: "UI_CLASSES", + get: function get() { + return Object.freeze({ + hidden: "vac-hidden", + active: "vac-active" + }); + } + + // attribute to get player jquery element + + }, { + key: "$player", + get: function get() { + return $(this.player.el()); + } + + // attribute to get player id from DOM + + }, { + key: "playerId", + get: function get() { + return this.$player.attr('id'); + } + + // Generate a pseudo-guid ID for this component, to use as an ID in the DOM + + }, { + key: "componentId", + get: function get() { + this.cid_ = this.cid_ || Utils.guid(); + return this.cid_; + } + }]); + + return PlayerUIComponent; +}(PlayerComponent); + +},{"./../compiled/templates":24,"./../lib/utils":41,"./player_component":38,"handlebars/runtime":20}],40:[function(require,module,exports){ +/* + Collection of polyfills neededf or IE10+ support +*/ + +// Array.prototype.find() for IE10+ +require('ie-array-find-polyfill'); +// Object.assign for IE10+ +require('es6-object-assign').polyfill(); + +// Allow use of object.constructor.staticFunc() in IE +// Not yet supported by babel +// https://gist.github.com/edoardocavazza/47246856759f2273e48b +(function () { + if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') { + var bindFunction = function bindFunction(ctx, fn) { + return function () { + return fn.apply(this, arguments); + }; + }; + + var bindProperty = function bindProperty(ctx, prop, parentDescriptor) { + if (!parentDescriptor) { + var defaultValue = ctx.__proto__[prop]; + parentDescriptor = { + get: function get() { + return ctx['__' + prop] || defaultValue; + }, + set: function set(val) { + ctx['__' + prop] = val; + } + }; + } + Object.defineProperty(ctx, prop, { + get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined, + set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined, + configurable: true + }); + }; + + var iterateProps = function iterateProps(subClass, superClass) { + var props = Object.getOwnPropertyNames(superClass), + proto; + + subClass.__proto__ = superClass; + for (var i = 0, len = props.length; i < len; i++) { + var prop = props[i]; + if (prop === '__proto__') { + proto = superClass[prop]; + } else if (_exclude.indexOf(i) === -1) { + var descriptor = Object.getOwnPropertyDescriptor(subClass, prop); + if (!descriptor) { + var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop); + if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') { + subClass[prop] = bindFunction(subClass, superClass[prop]); + } else if (typeof superDescriptor.get == 'function') { + bindProperty(subClass, prop, superDescriptor); + } else { + bindProperty(subClass, prop); + } + } + } + } + if (proto) { + iterateProps(subClass, proto); + } + }; + + var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype']; + + Object.setPrototypeOf = iterateProps; + } +})(); + +// Use CustomEvent in IE +(function () { + if (typeof window.CustomEvent === "function") return false; + + function CustomEvent(event, params) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } + + CustomEvent.prototype = window.Event.prototype; + + window.CustomEvent = CustomEvent; +})(); + +},{"es6-object-assign":1,"ie-array-find-polyfill":21}],41:[function(require,module,exports){ +"use strict"; +/* + Geneal utility functions, sourced from underscore & scratch built as needed +*/ + +module.exports = { + + // Clone an object + cloneObject: function cloneObject(obj) { + return Object.assign({}, obj); + }, + + // _throttle from underscore + throttle: function throttle(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function later() { + previous = options.leading === false ? 0 : Date.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function () { + var now = Date.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + + // Parse all keys of an object to int + parseIntObj: function parseIntObj(obj) { + Object.keys(obj).forEach(function (key) { + if (parseInt(obj[key])) { + obj[key] = parseInt(obj[key]); + } + }); + return obj; + }, + + // Convert a range {start: int, (optional) end: int} to human readable time + humanTime: function humanTime(range) { + function readable(sec) { + var mins = Math.floor(sec / 60), + secs = String(sec % 60); + return mins + ":" + (secs.length == 1 ? "0" : "") + secs; + } + var time = [readable(range.start)]; + if (range.end) time.push(readable(range.end)); + return time.join("-"); + }, + + // Pseduo-random guid generator + guid: function guid() { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); + } + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); + }, + + // Returns the height and width of an element that is not visible + // clones el and tricks DOM into rendering it w the correct size + // beware the container may be important for scoped styles + areaOfHiddenEl: function areaOfHiddenEl($el, $container) { + var hideClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + + var $clone = $el.clone(), + data = {}; + $clone.css({ + visibility: 'hidden', + display: 'inline-block' + }); + $clone.removeClass(hideClass); + $container.append($clone); + data.width = $clone.outerWidth(); + data.height = $clone.outerHeight(); + $clone.remove(); + + return data; + }, + + // Determine if a value (n) is within a range (start <= n <= end) + isWithinRange: function isWithinRange(start, end, n) { + end = end || start + 1; // for ranges with NO end defined, assume a 1s range + return n >= start && n <= end; + } +}; + +},{}]},{},[35]) + +//# sourceMappingURL=videojs-annotation-comments.js.map diff --git a/build/videojs-annotation-comments.js.map b/build/videojs-annotation-comments.js.map new file mode 100644 index 0000000..042fb7d --- /dev/null +++ b/build/videojs-annotation-comments.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/es6-object-assign/index.js","node_modules/handlebars/lib/handlebars.runtime.js","node_modules/handlebars/lib/handlebars/base.js","node_modules/handlebars/lib/handlebars/decorators.js","node_modules/handlebars/lib/handlebars/decorators/inline.js","node_modules/handlebars/lib/handlebars/exception.js","node_modules/handlebars/lib/handlebars/helpers.js","node_modules/handlebars/lib/handlebars/helpers/block-helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/each.js","node_modules/handlebars/lib/handlebars/helpers/helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/if.js","node_modules/handlebars/lib/handlebars/helpers/log.js","node_modules/handlebars/lib/handlebars/helpers/lookup.js","node_modules/handlebars/lib/handlebars/helpers/with.js","node_modules/handlebars/lib/handlebars/logger.js","node_modules/handlebars/dist/cjs/handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js","node_modules/handlebars/lib/handlebars/runtime.js","node_modules/handlebars/lib/handlebars/safe-string.js","node_modules/handlebars/lib/handlebars/utils.js","node_modules/handlebars/runtime.js","node_modules/ie-array-find-polyfill/index.js","node_modules/moment/moment.js","src/js/annotation_comments.js","src/js/compiled/templates.js","src/js/components/annotation.js","src/js/components/annotation_state.js","src/js/components/comment.js","src/js/components/comment_list.js","src/js/components/controls.js","src/js/components/draggable_marker.js","src/js/components/marker.js","src/js/components/player_button.js","src/js/components/selectable_shape.js","src/js/components/shape.js","src/js/index.js","src/js/lib/event_dispatcher.js","src/js/lib/logger.js","src/js/lib/player_component.js","src/js/lib/player_ui_component.js","src/js/lib/polyfills.js","src/js/lib/utils.js"],"names":[],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC15IA;AACA;;;;;;;;;;;;;;;AAKA,OAAO,OAAP,GAAiB,UAAC,OAAD,EAAa;AAC1B,YAAQ,iBAAR;;AAEA,QAAM,SAAS,QAAQ,SAAR,CAAkB,QAAlB,CAAf;AAAA,QACM,QAAQ,QAAQ,aAAR,CADd;AAAA,QAEM,WAAW,QAAQ,uBAAR,CAFjB;AAAA,QAGM,kBAAkB,QAAQ,+BAAR,CAHxB;AAAA,QAIM,kBAAkB,QAAQ,wBAAR,CAJxB;;AAMA,QAAM,kBAAkB,OAAO,MAAP,CAAc;AAClC,uBAA4B,IADM;AAElC,cAA4B,EAAE,SAAS,IAAX,EAAiB,WAAW,IAA5B,EAFM;AAGlC,4BAA4B,EAHM;AAIlC,sBAA4B,IAJM;AAKlC,yBAA4B,IALM;AAMlC,wBAA4B,IANM;AAOlC,oCAA4B,IAPM;AAQlC,4BAA4B,IARM;AASlC,+BAA4B;AATM,KAAd,CAAxB;;AAYA;AAAA;;AAEI,oCAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC1B,sBAAU,OAAO,MAAP,CAAc,MAAM,WAAN,CAA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","file":"videojs-annotation-comments.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i= 2.0.0-beta.1',\n 7: '>= 4.0.0'\n};\n\nconst objectType = '[object Object]';\n\nexport function HandlebarsEnvironment(helpers, partials, decorators) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n this.decorators = decorators || {};\n\n registerDefaultHelpers(this);\n registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: logger,\n log: logger.log,\n\n registerHelper: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple helpers'); }\n extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function(name, partial) {\n if (toString.call(name) === objectType) {\n extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new Exception(`Attempting to register a partial called \"${name}\" as undefined`);\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function(name) {\n delete this.partials[name];\n },\n\n registerDecorator: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple decorators'); }\n extend(this.decorators, name);\n } else {\n this.decorators[name] = fn;\n }\n },\n unregisterDecorator: function(name) {\n delete this.decorators[name];\n }\n};\n\nexport let log = logger.log;\n\nexport {createFrame, logger};\n","import registerInline from './decorators/inline';\n\nexport function registerDefaultDecorators(instance) {\n registerInline(instance);\n}\n\n","import {extend} from '../utils';\n\nexport default function(instance) {\n instance.registerDecorator('inline', function(fn, props, container, options) {\n let ret = fn;\n if (!props.partials) {\n props.partials = {};\n ret = function(context, options) {\n // Create a new partials stack frame prior to exec.\n let original = container.partials;\n container.partials = extend({}, original, props.partials);\n let ret = fn(context, options);\n container.partials = original;\n return ret;\n };\n }\n\n props.partials[options.args[0]] = options.fn;\n\n return ret;\n });\n}\n","\nconst errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n let loc = node && node.loc,\n line,\n column;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n let tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (let idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n try {\n if (loc) {\n this.lineNumber = line;\n\n // Work around issue under safari where we can't directly set the column value\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(this, 'column', {\n value: column,\n enumerable: true\n });\n } else {\n this.column = column;\n }\n }\n } catch (nop) {\n /* Ignore if the browser is very particular */\n }\n}\n\nException.prototype = new Error();\n\nexport default Exception;\n","import registerBlockHelperMissing from './helpers/block-helper-missing';\nimport registerEach from './helpers/each';\nimport registerHelperMissing from './helpers/helper-missing';\nimport registerIf from './helpers/if';\nimport registerLog from './helpers/log';\nimport registerLookup from './helpers/lookup';\nimport registerWith from './helpers/with';\n\nexport function registerDefaultHelpers(instance) {\n registerBlockHelperMissing(instance);\n registerEach(instance);\n registerHelperMissing(instance);\n registerIf(instance);\n registerLog(instance);\n registerLookup(instance);\n registerWith(instance);\n}\n","import {appendContextPath, createFrame, isArray} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('blockHelperMissing', function(context, options) {\n let inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n let data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.name);\n options = {data: data};\n }\n\n return fn(context, options);\n }\n });\n}\n","import {appendContextPath, blockParams, createFrame, isArray, isFunction} from '../utils';\nimport Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('each', function(context, options) {\n if (!options) {\n throw new Exception('Must pass iterator to #each');\n }\n\n let fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data,\n contextPath;\n\n if (options.data && options.ids) {\n contextPath = appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (isFunction(context)) { context = context.call(this); }\n\n if (options.data) {\n data = createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (isArray(context)) {\n for (let j = context.length; i < j; i++) {\n if (i in context) {\n execIteration(i, i, i === context.length - 1);\n }\n }\n } else {\n let priorKey;\n\n for (let key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n}\n","import Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('helperMissing', function(/* [args, ]options */) {\n if (arguments.length === 1) {\n // A missing field in a {{foo}} construct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new Exception('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n}\n","import {isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('if', function(conditional, options) {\n if (isFunction(conditional)) { conditional = conditional.call(this); }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if ((!options.hash.includeZero && !conditional) || isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function(conditional, options) {\n return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});\n });\n}\n","export default function(instance) {\n instance.registerHelper('log', function(/* message, options */) {\n let args = [undefined],\n options = arguments[arguments.length - 1];\n for (let i = 0; i < arguments.length - 1; i++) {\n args.push(arguments[i]);\n }\n\n let level = 1;\n if (options.hash.level != null) {\n level = options.hash.level;\n } else if (options.data && options.data.level != null) {\n level = options.data.level;\n }\n args[0] = level;\n\n instance.log(... args);\n });\n}\n","export default function(instance) {\n instance.registerHelper('lookup', function(obj, field) {\n return obj && obj[field];\n });\n}\n","import {appendContextPath, blockParams, createFrame, isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('with', function(context, options) {\n if (isFunction(context)) { context = context.call(this); }\n\n let fn = options.fn;\n\n if (!isEmpty(context)) {\n let data = options.data;\n if (options.data && options.ids) {\n data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.ids[0]);\n }\n\n return fn(context, {\n data: data,\n blockParams: blockParams([context], [data && data.contextPath])\n });\n } else {\n return options.inverse(this);\n }\n });\n}\n","import {indexOf} from './utils';\n\nlet logger = {\n methodMap: ['debug', 'info', 'warn', 'error'],\n level: 'info',\n\n // Maps a given level value to the `methodMap` indexes above.\n lookupLevel: function(level) {\n if (typeof level === 'string') {\n let levelMap = indexOf(logger.methodMap, level.toLowerCase());\n if (levelMap >= 0) {\n level = levelMap;\n } else {\n level = parseInt(level, 10);\n }\n }\n\n return level;\n },\n\n // Can be overridden in the host environment\n log: function(level, ...message) {\n level = logger.lookupLevel(level);\n\n if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n let method = logger.methodMap[level];\n if (!console[method]) { // eslint-disable-line no-console\n method = 'log';\n }\n console[method](...message); // eslint-disable-line no-console\n }\n }\n};\n\nexport default logger;\n","/* global window */\nexport default function(Handlebars) {\n /* istanbul ignore next */\n let root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function() {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n return Handlebars;\n };\n}\n","import * as Utils from './utils';\nimport Exception from './exception';\nimport { COMPILER_REVISION, REVISION_CHANGES, createFrame } from './base';\n\nexport function checkRevision(compilerInfo) {\n const compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n const runtimeVersions = REVISION_CHANGES[currentRevision],\n compilerVersions = REVISION_CHANGES[compilerRevision];\n throw new Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' +\n 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' +\n 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nexport function template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new Exception('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new Exception('Unknown template object: ' + typeof templateSpec);\n }\n\n templateSpec.main.decorator = templateSpec.main_d;\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n if (options.ids) {\n options.ids[0] = true;\n }\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n let result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n let lines = result.split('\\n');\n for (let i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n let container = {\n strict: function(obj, name) {\n if (!(name in obj)) {\n throw new Exception('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function(depths, name) {\n const len = depths.length;\n for (let i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function(i) {\n let ret = templateSpec[i];\n ret.decorator = templateSpec[i + '_d'];\n return ret;\n },\n\n programs: [],\n program: function(i, data, declaredBlockParams, blockParams, depths) {\n let programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function(param, common) {\n let obj = param || common;\n\n if (param && common && (param !== common)) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n // An empty object to use as replacement for null-contexts\n nullContext: Object.seal({}),\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context, options = {}) {\n let data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n let depths,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n if (options.depths) {\n depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;\n } else {\n depths = [context];\n }\n }\n\n function main(context/*, options*/) {\n return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n return main(context, options);\n }\n ret.isTop = true;\n\n ret._setup = function(options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n if (templateSpec.usePartial || templateSpec.useDecorators) {\n container.decorators = container.merge(options.decorators, env.decorators);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n container.decorators = options.decorators;\n }\n };\n\n ret._child = function(i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new Exception('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new Exception('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nexport function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context, options = {}) {\n let currentDepths = depths;\n if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {\n currentDepths = [context].concat(depths);\n }\n\n return fn(container,\n context,\n container.helpers, container.partials,\n options.data || data,\n blockParams && [options.blockParams].concat(blockParams),\n currentDepths);\n }\n\n prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nexport function resolvePartial(partial, context, options) {\n if (!partial) {\n if (options.name === '@partial-block') {\n partial = options.data['partial-block'];\n } else {\n partial = options.partials[options.name];\n }\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nexport function invokePartial(partial, context, options) {\n // Use the current closure context to save the partial-block if this partial\n const currentPartialBlock = options.data && options.data['partial-block'];\n options.partial = true;\n if (options.ids) {\n options.data.contextPath = options.ids[0] || options.data.contextPath;\n }\n\n let partialBlock;\n if (options.fn && options.fn !== noop) {\n options.data = createFrame(options.data);\n // Wrapper function to get access to currentPartialBlock from the closure\n let fn = options.fn;\n partialBlock = options.data['partial-block'] = function partialBlockWrapper(context, options = {}) {\n\n // Restore the partial-block from the closure for the execution of the block\n // i.e. the part inside the block of the partial call.\n options.data = createFrame(options.data);\n options.data['partial-block'] = currentPartialBlock;\n return fn(context, options);\n };\n if (fn.partials) {\n options.partials = Utils.extend({}, options.partials, fn.partials);\n }\n }\n\n if (partial === undefined && partialBlock) {\n partial = partialBlock;\n }\n\n if (partial === undefined) {\n throw new Exception('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nexport function noop() { return ''; }\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n if (fn.decorator) {\n let props = {};\n prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n Utils.extend(prog, props);\n }\n return prog;\n}\n","// Build out our basic SafeString type\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function() {\n return '' + this.string;\n};\n\nexport default SafeString;\n","const escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '=': '='\n};\n\nconst badChars = /[&<>\"'`=]/g,\n possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nexport function extend(obj/* , ...source */) {\n for (let i = 1; i < arguments.length; i++) {\n for (let key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nexport let toString = Object.prototype.toString;\n\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nlet isFunction = function(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n isFunction = function(value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nexport {isFunction};\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nexport const isArray = Array.isArray || function(value) {\n return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;\n};\n\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\nexport function indexOf(array, value) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\n\nexport function escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) { return string; }\n return string.replace(badChars, escapeChar);\n}\n\nexport function isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nexport function createFrame(object) {\n let frame = extend({}, object);\n frame._parent = object;\n return frame;\n}\n\nexport function blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nexport function appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n","// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = require('./dist/cjs/handlebars.runtime')['default'];\n","'use strict';\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function (predicate) {\n\n if (this == null) {\n throw new TypeError('this is null or not defined');\n }\n\n var obj = Object(this);\n var len = obj.length >>> 0;\n\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n var thisArg = arguments[1];\n\n var index = 0;\n\n while (index < len) {\n var iValue = obj[index];\n if (predicate.call(thisArg, iValue, index, obj)) {\n return iValue;\n }\n index++;\n }\n\n return undefined;\n }\n });\n}","//! moment.js\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n}(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return (Object.getOwnPropertyNames(obj).length === 0);\n } else {\n var k;\n for (k in obj) {\n if (obj.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n }\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.weekdayMismatch &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n // Plugins that add properties should also add the key here (null value),\n // so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n // Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n // compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n // token: 'M'\n // padded: ['MM', 2]\n // ordinal: 'Mo'\n // callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n // format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n // any word (or two) characters or numbers including two/three word month in arabic.\n // includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n // ALIASES\n\n addUnitAlias('year', 'y');\n\n // PRIORITIES\n\n addUnitPriority('year', 1);\n\n // PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n // HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n // HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n // MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid() && !isNaN(value)) {\n if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n }\n else {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n }\n\n // MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function mod(n, x) {\n return ((n % x) + x) % x;\n }\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n function daysInMonth(year, month) {\n if (isNaN(year) || isNaN(month)) {\n return NaN;\n }\n var modMonth = mod(month, 12);\n year += (month - modMonth) / 12;\n return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n }\n\n // FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n // ALIASES\n\n addUnitAlias('month', 'M');\n\n // PRIORITY\n\n addUnitPriority('month', 8);\n\n // PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n // LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n // FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n // ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n // PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n // PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n // HELPERS\n\n // LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n // MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n // ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n // PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n // PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n // HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n // LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n // FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n // ALIASES\n\n addUnitAlias('hour', 'h');\n\n // PRIORITY\n addUnitPriority('hour', 13);\n\n // PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n // LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n // MOMENTS\n\n // Setting the hour should keep the time, because the user explicitly\n // specified which hour they want. So trying to maintain the same hour (in\n // a new timezone) makes sense. Adding/subtracting hours does not follow\n // this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n // internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n // pick the locale from the array\n // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return globalLocale;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n var aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {}\n }\n return locales[name];\n }\n\n // This function will load locale and then set the global locale. If\n // no arguments are passed in, it will simply return the current global\n // locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n else {\n if ((typeof console !== 'undefined') && console.warn) {\n //warn user if arguments are passed but the locale could not be set\n console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n }\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var locale, parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n locale = loadLocale(config.parentLocale);\n if (locale != null) {\n parentConfig = locale._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, tmpLocale, parentConfig = baseConfig;\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n // returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n // Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n // convert an array to a date.\n // the array should mirror the parameters below\n // note: all values past the year are optional and will default to the lowest possible value.\n // [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n\n // check for mismatching day of week\n if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n // iso 8601 regex\n // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n // iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n // date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\n function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n var result = [\n untruncateYear(yearStr),\n defaultLocaleMonthsShort.indexOf(monthStr),\n parseInt(dayStr, 10),\n parseInt(hourStr, 10),\n parseInt(minuteStr, 10)\n ];\n\n if (secondStr) {\n result.push(parseInt(secondStr, 10));\n }\n\n return result;\n }\n\n function untruncateYear(yearStr) {\n var year = parseInt(yearStr, 10);\n if (year <= 49) {\n return 2000 + year;\n } else if (year <= 999) {\n return 1900 + year;\n }\n return year;\n }\n\n function preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n }\n\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n }\n\n var obsOffsets = {\n UT: 0,\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60\n };\n\n function calculateOffset(obsOffset, militaryOffset, numOffset) {\n if (obsOffset) {\n return obsOffsets[obsOffset];\n } else if (militaryOffset) {\n // the only allowed military tz is Z\n return 0;\n } else {\n var hm = parseInt(numOffset, 10);\n var m = hm % 100, h = (hm - m) / 100;\n return h * 60 + m;\n }\n }\n\n // date and time from ref 2822 format\n function configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i));\n if (match) {\n var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n if (!checkWeekday(match[1], parsedArray, config)) {\n return;\n }\n\n config._a = parsedArray;\n config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n config._d = createUTCDate.apply(null, config._a);\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n // date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n // constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n // constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n // date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n // date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n // Pick a moment m from moments so that m[fn](other) is true for all\n // other. This relies on the function fn to be transitive.\n //\n // moments should either be an array of moment objects or an array, whose\n // first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n // TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible to translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n // FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n // PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n // HELPERS\n\n // timezone chunker\n // '+10:00' > ['10', '00']\n // '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n // Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n // HOOKS\n\n // This function will be called whenever a moment is mutated.\n // It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n // MOMENTS\n\n // keepLocalTime = true means only change the timezone, without\n // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n // +0200, so we adjust the time as needed, to be valid.\n //\n // Keeping the time actually adds/subtracts (one hour)\n // from the actual represented time. That is why we call updateOffset\n // a second time. In case it wants us to change the offset again\n // _changeInProgress == true case, then we have to adjust, because\n // there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n // ASP.NET json date format regex\n var aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n // and further modified to allow for strings containing both week and day\n var isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n // TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units || 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n switch (units) {\n case 'year': output = monthDiff(this, that) / 12; break;\n case 'month': output = monthDiff(this, that); break;\n case 'quarter': output = monthDiff(this, that) / 3; break;\n case 'second': output = (this - that) / 1e3; break; // 1000\n case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default: output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true;\n var m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n if (utc) {\n return this.toDate().toISOString();\n } else {\n return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n // If passed a locale key, it will set the locale for this\n // instance. Otherwise, it will return the locale configuration\n // variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n /* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n /* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n /* falls through */\n case 'hour':\n this.minutes(0);\n /* falls through */\n case 'minute':\n this.seconds(0);\n /* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n // FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n // ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n // PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n // PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n // MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n // FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n // ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n // PRIORITY\n\n addUnitPriority('quarter', 7);\n\n // PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n // MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // ALIASES\n\n addUnitAlias('date', 'D');\n\n // PRIORITY\n addUnitPriority('date', 9);\n\n // PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n });\n\n // MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n // FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n // ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n // PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n // PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n // HELPERS\n\n // MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n // FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n // ALIASES\n\n addUnitAlias('minute', 'm');\n\n // PRIORITY\n\n addUnitPriority('minute', 14);\n\n // PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n // MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n // FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n // ALIASES\n\n addUnitAlias('second', 's');\n\n // PRIORITY\n\n addUnitPriority('second', 15);\n\n // PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n // MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n // FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n // ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n // PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n // MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n // FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n // MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n proto.quarter = proto.quarters = getSetQuarter;\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n proto.hour = proto.hours = getSetHour;\n proto.minute = proto.minutes = getSetMinute;\n proto.second = proto.seconds = getSetSecond;\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n // ()\n // (5)\n // (fmt, 5)\n // (fmt)\n // (true)\n // (true, 5)\n // (true, fmt, 5)\n // (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n // Side effect imports\n\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n // supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n // TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function clone$1 () {\n return createDuration(this);\n }\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n // This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n // This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n }\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n var totalSign = total < 0 ? '-' : '';\n var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return totalSign + 'P' +\n (Y ? ymSign + Y + 'Y' : '') +\n (M ? ymSign + M + 'M' : '') +\n (D ? daysSign + D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? hmsSign + h + 'H' : '') +\n (m ? hmsSign + m + 'M' : '') +\n (s ? hmsSign + s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.clone = clone$1;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n // Side effect imports\n\n // FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n // PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n // Side effect imports\n\n\n hooks.version = '2.22.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n // currently HTML5 input type only supports 24-hour formats\n hooks.HTML5_FMT = {\n DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // \n DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // \n DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // \n DATE: 'YYYY-MM-DD', // \n TIME: 'HH:mm', // \n TIME_SECONDS: 'HH:mm:ss', // \n TIME_MS: 'HH:mm:ss.SSS', // \n WEEK: 'YYYY-[W]WW', // \n MONTH: 'YYYY-MM' // \n };\n\n return hooks;\n\n})));\n","\"use strict\";\n/*\n Main function and entry point\n Can be registered to a videojs instance as a plugin\n*/\n\nmodule.exports = (videojs) => {\n require('./lib/polyfills');\n\n const Plugin = videojs.getPlugin('plugin'),\n Utils = require('./lib/utils'),\n Controls = require(\"./components/controls\"),\n AnnotationState = require(\"./components/annotation_state\"),\n EventDispatcher = require(\"./lib/event_dispatcher\");\n\n const DEFAULT_OPTIONS = Object.freeze({\n bindArrowKeys: true,\n meta: { user_id: null, user_name: null },\n annotationsObjects: [],\n showControls: true,\n showCommentList: true,\n showFullScreen: true,\n showMarkerShapeAndTooltips: true,\n internalCommenting: true,\n startInAnnotationMode: false\n });\n\n return class AnnotationComments extends Plugin {\n\n constructor (player, options) {\n options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options);\n super(player, options);\n\n this.eventDispatcher = new EventDispatcher(this);\n this.eventDispatcher.registerListenersFor(this, 'AnnotationComments');\n\n this.player = player;\n this.meta = options.meta;\n this.options = options;\n\n this._readyCallbacks = [];\n\n // Assign reference to this class to player for access later by components where needed\n player.annotationComments = (() => { return this }).bind(this);\n\n // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration\n // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3\n if(player.readyState() >= 3){\n this.postLoadDataConstructor();\n }else{\n player.on('loadeddata', this.postLoadDataConstructor.bind(this));\n }\n }\n\n // Additional init/setup after video data + metadata is available\n postLoadDataConstructor () {\n // setup initial state and render UI\n this.annotationState = new AnnotationState(this.player);\n this.annotationState.annotations = this.options.annotationsObjects;\n\n this.controls = new Controls(this.player, this.options.bindArrowKeys);\n this.bindEvents();\n this.setBounds(false);\n if(this.options.startInAnnotationMode) this.toggleAnnotationMode();\n\n this.pluginReady();\n }\n\n // Bind needed events for interaction w/ components\n bindEvents () {\n // Set player boundaries on window size change or fullscreen change\n $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500));\n this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500));\n\n // Remove annotation features on fullscreen if showFullScreen: false\n if (!this.options.showFullScreen) {\n this.player.on('fullscreenchange', (() => {\n if (this.player.isFullscreen_) {\n this.preFullscreenAnnotationsEnabled = this.active;\n $(this.player.el()).addClass('vac-disable-fullscreen');\n } else {\n $(this.player.el()).removeClass('vac-disable-fullscreen');\n }\n if(this.preFullscreenAnnotationsEnabled){\n // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are\n // in annotation mode, toggle the mode\n this.toggleAnnotationMode();\n }\n }).bind(this));\n }\n }\n\n // A wrapper func to make it easier to use EventDispatcher from the client\n // Ex: plugin.fire(type, data);\n fire (type, data={}) {\n this.eventDispatcher.fire(type, data);\n }\n\n // Toggle annotations mode on/off\n toggleAnnotationMode() {\n this.active = !this.active;\n this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements\n this.annotationState.enabled = this.active;\n\n if(this.active){\n this.fire(\"annotationModeEnabled\");\n }else{\n this.fire(\"annotationModeDisabled\")\n }\n\n // Handle control component UI if showControls: true\n if(this.options.showControls){\n if(!this.active){\n this.controls.clear(true);\n }else{\n this.controls.render();\n }\n }\n }\n\n // Set player UI boundaries\n setBounds (triggerChange=true) {\n this.bounds = {};\n let $player = $(this.player.el()),\n $ctrls = $player.find('.vjs-control-bar');\n\n this.bounds.left = $player.offset().left;\n this.bounds.top = $player.offset().top;\n this.bounds.right = this.bounds.left + $player.width();\n this.bounds.bottom = this.bounds.top + $player.height();\n this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height();\n\n // fires an event when bounds have changed during resizing\n if(triggerChange) this.fire('playerBoundsChanged', this.bounds);\n }\n\n // Public function to register a callback for when plugin is ready\n onReady (callback) {\n if(this.eventDispatcher.pluginReady){\n return callback();\n }\n this._readyCallbacks.push(callback);\n }\n\n // Mark plugin as ready and fire any pending callbacks\n pluginReady () {\n this.eventDispatcher.pluginReady = true;\n while(this._readyCallbacks.length){\n this._readyCallbacks.pop()();\n }\n }\n\n // Teardown all components, remove all listeners, and remove elements from DOM\n dispose () {\n this.controls = this.controls.teardown();\n this.annotationState = this.annotationState.teardown();\n this.eventDispatcher = this.eventDispatcher.teardown();\n this.teardown();\n if(this.player) {\n this.player.annotationComments = null;\n $(this.player.el()).removeClass('vac-active');\n $(this.player.el()).find(\"[class^='vac-']\").remove();\n }\n super.dispose();\n }\n\n teardown () {\n if(this.player) this.player.off('fullscreenchange');\n $(window).off('resize.vac-window-resize');\n }\n }\n}\n","var Handlebars = require(\"handlebars/runtime\");\n exports[\"comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\"\n + alias4(container.lambda(((stack1 = (depth0 != null ? depth0.meta : depth0)) != null ? stack1.user_name : stack1), depth0))\n + \"
\\n
\"\n + alias4(((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"timeSince\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n   X\\n
\\n
\\n
\\n \"\n + alias4((helpers.breaklines || (depth0 && depth0.breaklines) || alias2).call(alias1,(depth0 != null ? depth0.body : depth0),{\"name\":\"breaklines\",\"hash\":{},\"data\":data}))\n + \"\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"comment_list\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1;\n\n return \" \"\n + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : \"\")\n + \"\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n\";\n},\"useData\":true,\"useBlockParams\":true});\nexports[\"controls\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n \\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showNav : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \"
\\n
Prev
\\n
Next
\\n
\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n
\\n
Click and drag to select
\\n
\\n
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.writingComment : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n Select shape + range\\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.internalCommenting : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n
-1 sec
\\n
+1 sec
\\n
\\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \" \\n cancel\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"
\\n
\\n
\\n
New Annotation @ \"\n + container.escapeExpression(((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"rangeStr\",\"hash\":{},\"data\":data}) : helper)))\n + \"
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n
\\n
\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\nexports[\"draggable_marker\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n\";\n},\"useData\":true});\nexports[\"marker\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n return \"vac-ranged-marker\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"width:\"\n + container.escapeExpression(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"width\",\"hash\":{},\"data\":data}) : helper)))\n + \";\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.tooltipBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n \\n \"\n + alias4(((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipTime\",\"hash\":{},\"data\":data}) : helper)))\n + \" - \"\n + alias4(((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipBody\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n \\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \"vac-right-side\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showTooltip : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"useData\":true});\nexports[\"marker_wrap\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"
\\n\t
\\n
\";\n},\"useData\":true});\nexports[\"new_comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"player_button\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"\\n\\n\t\\n\t \\n\t \\n\t\\n\";\n},\"useData\":true});","\"use strict\";\n/*\n Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils.js\"),\n CommentList = require(\"./comment_list\"),\n Marker = require(\"./marker\"),\n Comment = require(\"./comment\"),\n Shape = require(\"./shape\");\n\nmodule.exports = class Annotation extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.id = data.id || this.componentId;\n this.range = data.range;\n this.shape = data.shape;\n this.secondsActive = this.buildSecondsActiveArray();\n this.buildComments(data);\n this.buildMarker();\n this.buildShape();\n this.bindEvents();\n\n this.isOpen = false;\n }\n\n buildComments(data) {\n this.commentList = new CommentList(\n {\"comments\": data.comments, \"annotation\": this},\n this.player\n );\n }\n\n buildMarker () {\n this.marker = new Marker(this.player, this.range, this.commentList.comments[0]);\n this.marker.render();\n }\n\n buildShape() {\n this.annotationShape = new Shape(this.player, this.shape);\n }\n\n // Serialize object\n get data () {\n return {\n id: this.id,\n range: this.range,\n shape: this.shape,\n comments: this.commentList.data\n };\n }\n\n bindEvents () {\n this.marker.$el.on('click.vac-marker', (e) => this.plugin.annotationState.openAnnotation(this, true));\n }\n\n // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state\n open (withPause=true, previewOnly=false, forceSnapToStart=false) {\n this.isOpen = true;\n const snapToStart = forceSnapToStart || !Utils.isWithinRange(\n this.range.start,\n this.range.end,\n Math.floor(this.currentTime)\n );\n\n let showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips;\n this.marker.setActive(showTooltip);\n if(!previewOnly && this.plugin.options.showCommentList){\n this.commentList.render();\n }\n\n if(!previewOnly || (previewOnly && this.plugin.options.showMarkerShapeAndTooltips)){\n this.annotationShape.render();\n\n if(this.shape) {\n this.annotationShape.$el.on(\"click.vac-annotation\", () => {\n this.plugin.annotationState.openAnnotation(this, false, false, false);\n });\n }\n }\n\n if(withPause) this.player.pause();\n if(snapToStart) this.currentTime = this.range.start;\n\n this.plugin.fire('annotationOpened', {\n annotation: this.data,\n triggered_by_timeline: previewOnly\n });\n }\n\n // Closes the annotation. Handles marker, commendList, shape, and AnnotationState\n close (clearActive=true) {\n if(!this.isOpen) return;\n this.isOpen = false;\n this.marker.deactivate();\n this.commentList.teardown(false);\n if(this.annotationShape.$el) this.annotationShape.$el.off(\"click.vac-annotation\");\n this.annotationShape.teardown();\n if(clearActive) this.plugin.annotationState.clearActive();\n this.plugin.fire('annotationClosed', this.data);\n }\n\n // For preloading an array of seconds active on initialization\n // Values used to build timeMap in AnnotationState\n buildSecondsActiveArray () {\n let seconds = [];\n if(!!this.range.end) {\n for (let i = this.range.start; i <= this.range.end; i++) {\n seconds.push(i);\n }\n } else {\n let start = this.range.start;\n seconds.push(start);\n if(start < this.duration) seconds.push(start+1);\n }\n return seconds;\n }\n\n // Tearsdown annotation and marker, removes object from AnnotationState\n teardown (removeFromCollection=true) {\n this.close(true);\n this.marker.teardown();\n if(this.commentList) this.commentList.teardown(removeFromCollection);\n if(removeFromCollection) this.plugin.annotationState.removeAnnotation(this);\n if(this.annotationShape) this.annotationShape.teardown();\n if(removeFromCollection) super.teardown();\n }\n\n // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref\n static newFromData (range, shape, commentStr, plugin, id=null) {\n let comment = Comment.dataObj(commentStr, plugin);\n if(range) range = Utils.parseIntObj(range);\n if(shape) shape = Utils.parseIntObj(shape);\n let data = {\n id,\n range,\n shape,\n comments: [comment]\n };\n return new Annotation(data, plugin.player);\n }\n\n get isActive () {\n return this.plugin.annotationState.activeAnnotation === this;\n }\n}\n","\"use strict\";\n/*\n Component for managing the state of annotations, including showing active annotation during playback,\n toggling active states for annotations, navigating annotations forward/back, etc\n*/\n\nconst Utils = require('./../lib/utils'),\n PlayerComponent = require(\"./../lib/player_component\"),\n Annotation = require(\"./annotation\");\n\nmodule.exports = class AnnotationState extends PlayerComponent {\n\n constructor (player) {\n super(player);\n this.initAPI(this, 'AnnotationState');\n this.resetData();\n this.bindEvents();\n }\n\n // sets _enabled and closes or opens annotation as needed\n set enabled (shouldBeEnabled) {\n this._enabled = shouldBeEnabled;\n if(!shouldBeEnabled) this.activeAnnotation.close();\n if(shouldBeEnabled){\n this.skipLiveCheck = false;\n this.setLiveAnnotation();\n }\n }\n\n get enabled () {\n return this._enabled;\n }\n\n // Sets _annotations w/Annoation objects from input array\n set annotations (annotationsData) {\n this._annotations = annotationsData.map((a) => new Annotation(a, this.player));\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n }\n\n get annotations () {\n return this._annotations;\n }\n\n set activeAnnotation (annotation=null) {\n this._activeAnnotation = annotation;\n }\n\n // Get current active annotation or a null object with .close()\n get activeAnnotation () {\n return this._activeAnnotation || { close: (() => {}) };\n }\n\n // Serialize data\n get data () {\n return this._annotations.map((a) => a.data);\n }\n\n // Bind events for setting liveAnnotation on video time change\n bindEvents () {\n this.player.on(\"timeupdate\", Utils.throttle(this.setLiveAnnotation.bind(this), 100));\n }\n\n // Sort annotations by range.start\n sortAnnotations () {\n this._annotations.sort((a,b) => {\n return a.range.start < b.range.start ? -1 : (a.range.start > b.range.start ? 1 : 0);\n });\n }\n\n // Add a new annotation\n addNewAnnotation (annotation) {\n this._annotations.push(annotation);\n this.openAnnotation(annotation, true, true, false, true);\n this.stateChanged();\n }\n\n // Create and add a annotation\n createAndAddAnnotation (data) {\n this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew();\n\n let annotation = Annotation.newFromData(\n data.range,\n data.shape,\n data.commentStr || \"\",\n this.plugin,\n data.id\n )\n this.addNewAnnotation(annotation)\n }\n\n // Destroy an existing annotation\n destroyAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) annotation.teardown();\n }\n\n // Remove an annotation\n removeAnnotation (annotation) {\n let id = annotation.id,\n i = this._annotations.indexOf(annotation);\n this._annotations.splice(i, 1);\n this.stateChanged();\n this.plugin.fire('annotationDeleted', {id});\n }\n\n // Set the live annotation based on current video time\n setLiveAnnotation () {\n if(!this.enabled) return;\n let time = Math.floor(this.currentTime);\n\n if(this.skipLiveCheck) {\n if(time !== this.lastVideoTime) this.skipLiveCheck = false;\n return;\n }\n\n let matches = this.activeAnnotationsForTime(time);\n if(!matches.length) return this.activeAnnotation.close();\n\n // Set live annotation as the last match\n let liveAnnotation = this.annotations[matches[matches.length-1]];\n\n // Special cases if this or another annotation is active\n if(this.activeAnnotation.range) {\n if(liveAnnotation === this.activeAnnotation) return;\n // Check if the active annotation and live annotation share a start time\n // Is that start time at the current playhead?\n // If so, don't switch which is active.\n let liveStart = liveAnnotation.range.start,\n activeStart = this.activeAnnotation.range.start;\n if(liveStart === activeStart && liveStart === time) return;\n }\n\n this.openAnnotation(liveAnnotation, false, false, true);\n }\n\n // Get all active annotations for a time (in seconds)\n activeAnnotationsForTime (time) {\n if(!this.annotations.length) return [];\n return this.annotationTimeMap[time] || [];\n }\n\n /*\n Rebuild the annotation time map\n Example: this._annotations[1] and this._annotations[3] are active during second 4\n this.annotationTimeMap = { 4: [1, 3] }\n */\n rebuildAnnotationTimeMap () {\n let timeMap = {};\n this.annotations.forEach((annotation) => {\n annotation.secondsActive.forEach((second) => {\n let val = (timeMap[second] || []);\n val.push(this.annotations.indexOf(annotation));\n timeMap[second] = val;\n });\n });\n this.annotationTimeMap = timeMap;\n }\n\n // Close active annotation and remove reference in state\n clearActive () {\n this.activeAnnotation.close(false);\n this._activeAnnotation = null;\n }\n\n // Open annotation with options to pause and show preview\n // skipLiveCheck will short circuit setLiveAnnotation()\n openAnnotation (annotation, skipLiveCheck=false, pause=true, previewOnly=false, forceSnapToStart=false) {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n this.skipLiveCheck = skipLiveCheck;\n this.clearActive();\n annotation.open(pause, previewOnly, forceSnapToStart);\n this.activeAnnotation = annotation;\n this.lastVideoTime = this.activeAnnotation.range.start;\n }\n\n // Open an annotation by ID (if it exists)\n openAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) this.openAnnotation(annotation);\n }\n\n // Returns annotation object given ID\n findAnnotation (id) {\n return this.annotations.find((a) => a.id == id);\n }\n\n // Returns comment object given ID\n findComment (id) {\n let comments = this.annotations.map((a) => a.commentList.comments);\n comments = [].concat(...comments); // flatten 2d array\n return comments.find((c) => c.id == id);\n }\n\n // Finds the next annotation in collection and opens it\n nextAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === this.annotations.length-1 ? 0 : ind+1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=0; i time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[0], true);\n }\n\n // Finds the previous annotation in collection and opens it\n prevAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === 0 ? this.annotations.length-1 : ind-1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=this.annotations.length-1; i>=0; i--){\n if(this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[this.annotations.length-1], true);\n }\n\n // Use anywhere the annotation data changes\n // Cleans internal state data, updates player button, triggers configurable callback\n stateChanged () {\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n this.plugin.fire('onStateChanged', this.data);\n }\n\n // Reset internal state properties\n resetData () {\n this.annotations = [];\n this.annotationTimeMap = {};\n this.activeAnnotation = null;\n this.enabled = false;\n this.skipNextTimeCheck = false;\n this.lastVideoTime = 0;\n }\n\n // Remove UI and unbind events for this and child components\n teardown() {\n this.annotations.forEach((annotation) => { annotation.teardown(false); });\n this.resetData();\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for an invidual comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n moment = require(\"moment\"),\n templateName = 'comment';\n\nmodule.exports = class Comment extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.commentList = data.commentList;\n this.id = data.id || this.componentId;\n this.meta = data.meta;\n this.body = data.body;\n this.timestamp = moment(data.meta.datetime).unix();\n this.timeSince = this.timeSince();\n\n this.$el = $(this.render());\n }\n\n // Serialize data\n get data () {\n return {\n id: this.id,\n meta: this.meta,\n body: this.body\n };\n }\n\n get HTML () {\n return this.$el[0].outerHTML;\n }\n\n render () {\n return this.renderTemplate(\n templateName,\n {\n id: this.id,\n body: this.body,\n meta: this.meta,\n timeSince: this.timeSince\n }\n );\n }\n\n // Return time since comment timestamp\n timeSince () {\n return moment(this.meta.datetime).fromNow();\n }\n\n teardown (destroy=false) {\n super.teardown(destroy);\n }\n\n // Return a Comment obj given body content and plugin reference\n static newFromData (body, commentList, plugin) {\n let data = this.dataObj(body, plugin);\n return new Comment(data, plugin.player);\n }\n\n // Return an object with plugin data, timestamp, unique id, and body content\n static dataObj (body, plugin) {\n return {\n meta: Object.assign({\n datetime: moment().toISOString()\n }, plugin.meta),\n id: Utils.guid(),\n body\n };\n }\n}\n","\"use strict\";\n/*\n Component for a list of comments in a visible/active annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n Comment = require(\"./comment\"),\n commentListTemplateName = 'comment_list',\n newCommentTemplateName = 'new_comment';\n\nmodule.exports = class CommentList extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n\n this.annotation = data.annotation;\n this.comments = data.comments.map((commentData) => {\n commentData.commentList = this;\n return new Comment(commentData, player);\n });\n this.sortComments();\n }\n\n // Serialize object\n get data () {\n return this.comments.map((c) => c.data);\n }\n\n // Bind all events needed for the comment list\n bindListEvents () {\n this.$el\n .on(\"click.vac-comment\", \".vac-close-comment-list\", (() => this.annotation.close()).bind(this)) // Hide CommentList UI with close button\n .on(\"click.vac-comment\", \".vac-reply-btn\", this.addNewComment.bind(this)) // Open new reply UI with reply button\n .on(\"click.vac-comment\", \".vac-delete-annotation\", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button\n .on(\"click.vac-comment\", \".vac-delete-comment\", this.destroyComment.bind(this)) // Delete comment with delete comment button\n .on(\"mousewheel.vac-comment DOMMouseScroll.vac-comment\", \".vac-comments-wrap\", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI\n }\n\n // Bind event listeners for new comments form\n bindCommentFormEvents () {\n this.$newCommentForm\n .on(\"click.vac-comment\", \".vac-add-controls a, .vac-video-write-new.vac-is-comment a\", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link\n .on(\"click.vac-comment\", \".vac-video-write-new.vac-is-comment button\", this.saveNewComment.bind(this)); // Save new comment with save button\n }\n\n // Render CommentList UI with all comments using template\n render () {\n this.$el = $(this.renderTemplate(\n commentListTemplateName,\n {\n commentsHTML: this.comments.map((c) => c.HTML),\n rangeStr: Utils.humanTime(this.annotation.range)\n }\n ));\n\n this.$player.append(this.$el);\n this.$wrap = this.$UI.commentsContainer;\n this.bindListEvents();\n }\n\n // Re-render UI on state change\n reRender () {\n this.teardown(false);\n this.render();\n }\n\n // Render new comment form\n addNewComment () {\n this.$wrap.addClass(this.UI_CLASSES.active).find(\".vac-comments-wrap\").scrollTop(999999);\n var $shapebox = this.$wrap.find(\".vac-add-new-shapebox\"),\n width = $shapebox.outerWidth(),\n top = $shapebox.position().top + 10,\n right = this.$wrap.outerWidth() - ($shapebox.position().left + width);\n\n this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, {width, top, right}));\n this.bindCommentFormEvents();\n this.$player.append(this.$newCommentForm);\n }\n\n // Save comment from new comment form, update state and re-render UI\n saveNewComment () {\n this.$wrap.removeClass(this.UI_CLASSES.active);\n\n let user_id = 1,\n body = this.$UI.newCommentTextarea.val();\n\n if(!body) return; // empty comment - TODO add validation / err message\n this.createComment(body);\n }\n\n createComment (body) {\n let comment = Comment.newFromData(body, this, this.plugin);\n this.comments.push(comment);\n this.sortComments();\n\n // Don't mutate UI if comment is being created for an inactive annotation (via API)\n if(this.annotation.isActive) {\n this.reRender(false);\n this.closeNewComment();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n // Cancel comment adding process\n closeNewComment () {\n this.unbindCommentFormEvents();\n if(this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active);\n if(this.$newCommentForm) this.$newCommentForm.remove();\n }\n\n // Delete a comment. If it is the only comment, delete the annotation\n // Update state and re-render UI\n destroyComment (event) {\n let annotationId = this.annotation.id;\n if(this.comments.length == 1) {\n this.annotation.teardown();\n } else {\n let commentId = this.findCommentId(event),\n comment = this.comments.find((c) => c.id == commentId),\n i = this.comments.indexOf(comment);\n this.comments.splice(i, 1);\n this.reRender();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n findCommentId (event) {\n let id = typeof event.detail.id === 'undefined' ?\n $(event.target).closest('.vac-comment').data('id') :\n event.detail.id;\n return id;\n }\n\n // Prevents outer page scroll when at the top or bottom of CommentList UI\n // TODO: This might need to be fine-tuned?\n disablePageScroll (event) {\n let $target = $(event.currentTarget),\n height = $target.height(),\n ogEvent = event.originalEvent,\n delta = ogEvent.wheelDelta || -ogEvent.detail,\n dir = delta < 0 ? \"down\" : \"up\",\n scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight);\n\n // if scrolling into top of div\n if ($target.scrollTop() < 20 && dir == \"up\") {\n $target.stop();\n $target.animate({scrollTop: 0}, 100);\n event.preventDefault();\n }\n\n // if scrolling into bottom of div\n if ($target.scrollTop() > (scrollDiff - 10) && dir == \"down\") {\n $target.stop();\n $target.animate({scrollTop: height + 40}, 100);\n event.preventDefault();\n }\n }\n\n // Sort comments by timestamp\n sortComments () {\n this.comments.sort((a,b) => {\n return a.timestamp < b.timestamp ? -1 : (a.timestamp > b.timestamp ? 1 : 0);\n });\n }\n\n // Delete the annotation\n handleDeleteAnnotationClick (e) {\n let $confirmEl = $(\"\").addClass(\"vac-delete-confirm\").text(\"CONFIRM\");\n $confirmEl.on(\"click.comment\", () => {\n $confirmEl.off(\"click.comment\");\n this.annotation.teardown();\n });\n $(e.target).replaceWith($confirmEl);\n }\n\n // Unbind listeners for new comments form\n unbindCommentFormEvents () {\n if(this.$newCommentForm) this.$newCommentForm.off(\"click.vac-comment\");\n }\n\n // Teardown CommentList UI, unbind events\n teardown (destroyComments=true) {\n if(this.$el) {\n this.$el.off(\"click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment\");\n }\n this.comments.forEach((c) => c.teardown(destroyComments));\n if(destroyComments) this.comments = [];\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing annotation \"control box\" in upper left of video when in annotation mode,\n including all functionality to add new annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n DraggableMarker = require(\"./draggable_marker.js\"),\n SelectableShape = require(\"./selectable_shape.js\"),\n PlayerButton = require(\"./player_button\"),\n Annotation = require(\"./annotation\"),\n templateName = 'controls';\n\n// Control uses a \"ui state\" to determine how UI is rendered - this object is the base state, containing a\n// default value for each item in the state\nconst BASE_UI_STATE = Object.freeze({\n adding: false, // Are we currently adding a new annotation? (step 1 of flow)\n writingComment: false // Are we currently writing the comment for annotation (step 2 of flow)\n});\n\nmodule.exports = class Controls extends PlayerUIComponent {\n\n constructor (player, bindArrowKeys) {\n super(player);\n this.initAPI(this, 'Controls');\n\n this.internalCommenting = this.plugin.options.internalCommenting;\n this.showControls = this.plugin.options.showControls;\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.bindEvents(bindArrowKeys);\n\n if(this.showControls){\n // create player button in the control bar if controls are shown\n this.playerButton = new PlayerButton(this.player);\n }\n\n this.render();\n }\n\n // Bind all the events we need for UI interaction\n bindEvents (bindArrowKeys) {\n this.$player.on(\"click.vac-controls\", \".vac-controls button\", this.startAddNew.bind(this)) // Add new button click\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-next\", () => this.plugin.annotationState.nextAnnotation() ) // Click 'next' on annotation nav\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-prev\", () => this.plugin.annotationState.prevAnnotation() ) // Click 'prev' on annotation nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-next\", () => this.marker.scrubStart(1) ) // Click '+1 sec' on marker nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-prev\", () => this.marker.scrubStart(-1) ); // Click '-1 sec' on marker nav\n\n if(this.internalCommenting) {\n this.$player.on(\"click.vac-controls\", \".vac-add-controls button\", this.writeComment.bind(this)) // 'Next' button click while adding\n .on(\"click.vac-controls\", \".vac-video-write-new.vac-is-annotation button\", this.saveNew.bind(this)) // 'Save' button click while adding\n .on(\"click.vac-controls\", \".vac-add-controls a, .vac-video-write-new.vac-is-annotation a\", this.cancelAddNew.bind(this)) // Cancel link click\n }\n if(bindArrowKeys){\n $(document).on(`keyup.vac-nav-${this.playerId}`, (e) => this.handleArrowKeys(e)); // Use arrow keys to navigate annotations\n }\n }\n\n // Remove UI and unbind events for this and child components\n teardown () {\n this.clear(true);\n this.$player.off('click.vac-controls');\n $(document).off(`keyup.vac-nav-${this.playerId} mousemove.vac-tooltip-${this.playerId}`);\n if(this.playerButton) this.playerButton.teardown();\n super.teardown();\n }\n\n // Clear existing UI (resetting components if need be)\n clear (reset=false) {\n if(reset){\n if(this.uiState.adding){\n this.restoreNormalUI();\n this.marker.teardown();\n this.selectableShape.teardown();\n }\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.$player.find('.vac-video-cover-canvas')\n .off('mousedown.vac-cursor-tooltip')\n .off('mouseup.vac-cursor-tooltip');\n }\n this.$tooltip_ = null;\n this.$UI.controlElements.remove();\n }\n\n // Render the UI elements (based on uiState)\n render (reset=false) {\n this.clear(reset);\n let data = Object.assign(\n {\n rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null,\n showNav: this.plugin.annotationState.annotations.length > 1\n },\n this.uiState,\n { internalCommenting: this.internalCommenting, showControls: this.showControls }\n );\n\n let $ctrls = this.renderTemplate(templateName, data);\n this.$player.append($ctrls);\n\n if(this.playerButton) this.playerButton.updateNumAnnotations();\n }\n\n // User clicked to cancel in-progress add - restore to normal state\n cancelAddNew () {\n if(!(this.uiState.adding || this.uiState.writingComment)) return;\n this.render(true);\n this.marker.teardown();\n this.marker = null;\n }\n\n // User clicked 'add' button in the controls - setup UI and marker\n startAddNew () {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n\n this.player.pause();\n this.setAddingUI();\n this.uiState.adding = true;\n this.render();\n\n // construct new range and create marker\n let range = {\n start: parseInt(this.currentTime,10),\n stop: parseInt(this.currentTime,10)\n };\n this.marker = new DraggableMarker(this.player, range);\n this.selectableShape = new SelectableShape(this.player);\n\n // show cursor help text if controls are hidden\n if(!this.showControls) this.bindCursorTooltip();\n\n this.plugin.fire('enteredAddingAnnotation', { range: range });\n }\n\n // User clicked 'next' action - show UI to write comment\n writeComment () {\n this.uiState.writingComment = true;\n this.render();\n }\n\n // User clicked to save a new annotation/comment during add new flow\n saveNew () {\n let comment = this.$UI.newCommentTextarea.val();\n if(!comment) return; // empty comment - TODO add validation / err message\n\n let a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin);\n this.plugin.annotationState.addNewAnnotation(a);\n\n this.cancelAddNew();\n }\n\n // Change normal UI (hide markers, hide playback, etc) on init add state\n setAddingUI () {\n this.plugin.annotationState.enabled = false;\n this.disablePlayingAndControl();\n }\n\n // Restore normal UI after add state\n restoreNormalUI () {\n this.plugin.annotationState.enabled = this.plugin.active;\n this.enablePlayingAndControl();\n $(document).off(`mousemove.vac-tooltip-${this.playerId}`);\n }\n\n // On arrow key press, navigate to next or prev Annotation\n handleArrowKeys (e) {\n if(!this.plugin.active) return;\n let keyId = e.which;\n\n if(keyId == 37) this.plugin.annotationState.prevAnnotation();\n if(keyId == 39) this.plugin.annotationState.nextAnnotation();\n }\n\n // Adds help text to cursor during annotation mode\n bindCursorTooltip () {\n this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden);\n\n // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct\n this.plugin.setBounds(false);\n $(document).on(`mousemove.vac-tooltip-${this.playerId}`, Utils.throttle(((event) => {\n if(!this.plugin.bounds) return;\n\n let x = event.pageX,\n y = event.pageY,\n outOfBounds =\n (x < this.plugin.bounds.left || x > this.plugin.bounds.right) ||\n (y < this.plugin.bounds.top || y > this.plugin.bounds.bottom),\n withinControls = !outOfBounds && y >= this.plugin.bounds.bottomWithoutControls,\n markerHovered = this.$tooltip.hasClass('vac-marker-hover');\n\n if(outOfBounds) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n return\n }\n\n let cursorX = x - this.plugin.bounds.left,\n cursorY = y - this.plugin.bounds.top,\n margin = 10,\n rightEdge = this.$player.width(),\n bottomEdge = this.$player.height() - this.$UI.controlBar.height(),\n atRightEdge = (cursorX + this.tooltipArea.width + margin*2) >= rightEdge,\n atBottomEdge = (cursorY + this.tooltipArea.height + margin*2) >= bottomEdge;\n\n // is the tooltip too close to the right or bottom edge?\n let posX = atRightEdge ? (rightEdge - this.tooltipArea.width - margin) : (cursorX + margin),\n posY = atBottomEdge ? (bottomEdge - this.tooltipArea.height - margin) : (cursorY + margin);\n\n // hide if the cursor is over the control bar but not hovering over the draggable marker\n // also hide if mouse is down\n if((withinControls && !markerHovered) || this.$tooltip.hasClass('vac-cursor-dragging')) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n } else {\n this.$tooltip.removeClass(this.UI_CLASSES.hidden);\n }\n\n this.$tooltip.css({\n left: `${posX}px`,\n top: `${posY}px`\n });\n }).bind(this), 50));\n }\n\n get $tooltip () {\n this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip');\n return this.$tooltip_;\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range\n as drag occurs\n*/\n\nconst Marker = require(\"./marker\"),\n Utils = require('./../lib/utils'),\n markerTemplateName = 'draggable_marker';\n\nmodule.exports = class DraggableMarker extends Marker {\n\n constructor (player, range) {\n super(player, range);\n this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10\n this.templateName = markerTemplateName; // Change template from base Marker template\n this.dragging = false; // Is a drag action currently occring?\n this.rangePin = range.start; // What's the original pinned timeline point when marker was added\n this.render();\n this.$parent = this.$UI.markerWrap; // Set parent as marker wrap\n }\n\n // Bind needed evnets for UI interaction\n bindMarkerEvents () {\n // On mouse down init drag\n this.$el.on('mousedown.vac-marker', (e) => {\n e.preventDefault();\n this.dragging = true;\n // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms\n $(document).on(`mousemove.vac-dmarker-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 250) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .addClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse up end drag action and unbind mousemove event\n $(document).on(`mouseup.vac-dmarker-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n $(document).off(`mousemove.vac-dmarker-${this.playerId}`);\n this.dragging = false;\n\n // Remove drag class and hover class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .removeClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse mouse enter, show cursor tooltip if controls are not shown\n // This adds the class which is picked up in Controls\n if(!this.plugin.options.showControls) {\n var self = this;\n self.$el\n .on('mouseenter.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover');\n })\n .on('mouseleave.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover');\n });\n };\n }\n\n // On drag action, calculate new range and re-render marker\n onDrag (e) {\n var dragPercent = this.percentValFromXpos(e.pageX),\n secVal = parseInt(this.duration * dragPercent);\n\n if(secVal > this.rangePin){\n this.range = {\n start: this.rangePin,\n end: secVal\n };\n }else{\n this.range = {\n start: secVal,\n end: this.rangePin\n };\n }\n this.render();\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n\n // Cal percentage (of video) position for a pixel-based X position on the document\n percentValFromXpos (xpos) {\n var x = Math.max(0, xpos - this.$parent.offset().left), // px val\n max = this.$parent.innerWidth(),\n per = (x / max);\n if(per > 1) per = 1;\n if(per < 0) per = 0;\n return per;\n }\n\n // Remove bound events on destructon\n teardown () {\n $(document).off(`mousemove.vac-dmarker-${this.playerId} mouseup.vac-dmarker-${this.playerId}`);\n this.$el.off('mouseenter.vac-cursor-tool-tip');\n this.$el.off('mouseleave.vac-cursor-tool-tip');\n this.$el.off('mousedown.vac-marker');\n this.$el.remove();\n }\n\n // Move the video & marker start by some num seconds (pos or neg)\n scrubStart (secondsChanged) {\n let newStart = this.range.start + secondsChanged;\n this.currentTime = newStart;\n this.range.start = newStart;\n this.rangePin = newStart;\n this.teardown();\n this.render();\n\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker with capabilities to render on timeline, including tooltip for comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n markerTemplateName = 'marker',\n markerWrapTemplateName = 'marker_wrap';\n\nmodule.exports = class Marker extends PlayerUIComponent {\n\n constructor (player, range, comment=null) {\n super(player);\n this.range = range;\n this.comment = comment;\n this.templateName = markerTemplateName;\n\n if(!this.$UI.markerWrap.length){\n this.$UI.timeline.append(\n this.renderTemplate(markerWrapTemplateName)\n );\n }\n }\n\n // Set this marker as active (highlight) and optionally show tooltip also\n setActive (showTooltip=false) {\n this.$el.addClass(this.UI_CLASSES.active);\n if(showTooltip) this.$el.addClass('vac-force-tooltip');\n }\n\n // Deactivate this marker\n deactivate () {\n this.$el.removeClass(`${this.UI_CLASSES.active} vac-force-tooltip`);\n }\n\n // Draw marker on timeline for this.range;\n render () {\n // clear existing marker if this one was already rendered\n this.$UI.timeline.find(`[data-marker-id=\"${this.componentId}\"]`).remove();\n\n // Bind to local instance var, add to DOM, and setup events\n this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData));\n this.$UI.markerWrap.append(this.$el);\n this.bindMarkerEvents();\n }\n\n // Bind needed events for this marker\n bindMarkerEvents () {\n // handle dimming other markers + highlighting this one on mouseenter/leave\n this.$el.on(\"mouseenter.vac-marker\", () => {\n this.$el.addClass('vac-hovering').closest(\".vac-marker-wrap\").addClass('vac-dim-all');\n }).on(\"mouseleave.vac-marker\", () => {\n this.$el.removeClass('vac-hovering').closest(\".vac-marker-wrap\").removeClass('vac-dim-all');\n });\n }\n\n // Build object for template\n get markerTemplateData () {\n // the smaller the width, the higher the z-index so overlaps are clickable\n let left = (this.range.start / this.duration) * 100,\n width = ((this.range.end / this.duration) * 100) - left,\n zIndex = (100 - Math.floor(width)) || 100;\n return {\n left: left + '%',\n width: width + '%',\n zIndex: zIndex,\n showTooltip: this.plugin.options.showMarkerShapeAndTooltips,\n tooltipRight: left > 50,\n tooltipTime: Utils.humanTime(this.range),\n tooltipBody: !this.comment ? null : this.comment.body,\n rangeShow: !!this.range.end,\n id: this.componentId\n };\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el\n .off('mouseenter.vac-marker')\n .off('mouseleave.vac-marker')\n .off('click.vac-marker');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component main 'annotation toggle' button in the player controls, including notifier for # annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n templateName = \"player_button\";\n\nmodule.exports = class PlayerButton extends PlayerUIComponent {\n\n constructor (player) {\n super(player);\n this.render();\n\n this.initAPI(this, 'PlayerButton');\n\n this.$el.on('click.vac-player-button', () => {\n this.plugin.toggleAnnotationMode();\n });\n }\n\n // Add button to player\n render () {\n let btn = this.player.getChild('controlBar').addChild('button', {});\n btn.controlText(\"Toggle Animations\");\n this.$el = $(btn.el());\n this.$el.addClass('vac-player-btn').find(\".vjs-icon-placeholder\").html(this.renderTemplate(templateName));\n }\n\n // Update the number of annotations displayed in the bubble\n updateNumAnnotations () {\n let num = this.plugin.annotationState.annotations.length,\n $bubble = this.$el.find(\"b\");\n $bubble.text(num);\n num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden);\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el.off('click.vac-player-button');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for a shape that can be drug/sized on top of the video while adding a new annotation\n*/\n\nconst Shape = require(\"./shape\"),\n Utils = require('./../lib/utils');\n\nmodule.exports = class SelectableShape extends Shape {\n\n constructor (player) {\n super(player);\n this.$parent = this.$player.find(\".vac-video-cover-canvas\");\n this.bindEvents();\n this.dragging = false;\n }\n\n // Bind all needed events for drag action\n bindEvents () {\n // On mousedown initialize drag\n this.$parent.on(\"mousedown.vac-selectable-shape\", (e) => {\n // Check a few conditions to see if we should *not* start drag\n if( !($(e.target).hasClass('vac-video-cover-canvas')) ) return; //didn't click on overlay\n if( $(e.target).hasClass('vac-shape') ) return; //user clicked on annotation\n\n // Remove old shape if one existed\n if(this.$el) this.$el.remove();\n\n // Define default starting shape (just x/y coords of where user clicked no width/height yet)\n let shape = {\n x1: this.xCoordToPercent(e.pageX),\n y1: this.YCoordToPercent(e.pageY)\n };\n shape.x2 = shape.x1;\n shape.y2 = shape.y2;\n this.shape = shape;\n\n // Save origin points for future use\n this.originX = shape.x1;\n this.originY = shape.y1;\n\n // Draw shape and start drag state\n this.render();\n this.dragging = true;\n this.dragMoved = false; // used to determine if user actually dragged or just clicked\n\n // Bind event on doc mousemove to track drag, throttled to once each 100ms\n $(document).on(`mousemove.vac-sshape-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 100) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging');\n }\n });\n\n // On mouseup, if during drag cancel drag event listeners\n $(document).on(`mouseup.vac-sshape-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n\n $(document).off(`mousemove.vac-sshape-${this.playerId}`);\n\n if(!this.dragMoved){\n //clear shape if it's just a click (and not a drag)\n this.shape = null;\n if(this.$el) this.$el.remove();\n }\n\n this.dragging = false;\n\n // Remove drag class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging');\n }\n });\n }\n\n // On each interation of drag action (mouse movement), recalc position and redraw shape\n onDrag (e) {\n this.dragMoved = true;\n\n let xPer = this.xCoordToPercent(e.pageX),\n yPer = this.YCoordToPercent(e.pageY);\n\n if(xPer < this.originX){\n this.shape.x2 = this.originX;\n this.shape.x1 = Math.max(0, xPer);\n }else{\n this.shape.x2 = Math.min(100, xPer);\n this.shape.x1 = this.originX;\n }\n if(yPer < this.originY){\n this.shape.y2 = this.originY;\n this.shape.y1 = Math.max(0, yPer);\n }else{\n this.shape.y2 = Math.min(100, yPer);\n this.shape.y1 = this.originY;\n }\n this.setDimsFromShape();\n\n this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape });\n }\n\n // Convert pixel-based x position (relative to document) to percentage in video\n xCoordToPercent (x) {\n x = x - this.$parent.offset().left; //pixel position\n let max = this.$parent.innerWidth();\n return Number(((x / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Convert pixel-based y position (relative to document) to percentage in video\n YCoordToPercent (y) {\n y = y - this.$parent.offset().top; //pixel position\n let max = this.$parent.innerHeight();\n return Number(((y / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Unbind events and remove element\n teardown () {\n this.$parent.off('mousedown.vac-selectable-shape');\n $(document).off(`mouseup.vac-sshape-${this.playerId} mousemove.vac-sshape-${this.playerId}`);\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing a shape (i.e. box drawn on the player) for an annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\");\n\nmodule.exports = class Shape extends PlayerUIComponent {\n\n constructor (player, shape=null) {\n super(player);\n this.shape = shape;\n this.$parent = this.$player;\n }\n\n // Draw the shape element on the $parent\n render () {\n if(!this.shape) return;\n if(this.$el) this.$el.remove();\n\n this.$el = $(\"
\").addClass(\"vac-shape\");\n this.setDimsFromShape();\n this.$parent.append(this.$el);\n }\n\n // Set/update the dimensions of the shape based on this.shape\n setDimsFromShape () {\n this.$el.css({\n left: this.shape.x1 + \"%\",\n top: this.shape.y1 + \"%\",\n width: (this.shape.x2-this.shape.x1) + \"%\",\n height: (this.shape.y2-this.shape.y1) + \"%\"\n });\n }\n}\n","\"use strict\";\n/*\n Load plugin and register to global videojs\n*/\n\n(($, videojs) => {\n const AnnotationComments = require('./annotation_comments.js');\n videojs.registerPlugin(\n 'annotationComments',\n AnnotationComments(videojs)\n );\n})(jQuery, window.videojs);\n","'use strict';\n/*\n Classes for registering and handling custom events for external interaction support.\n Will be bound to plugin object as a message gateway between external elements and the plugin.\n*/\n\nconst Logger = require(\"./logger\");\n\n/*\n A centralized collection of event callbacks organized by component and name\n Main reference for external event api\n These events will be bound to the plugin on initialization of their respective components\n NOTE - 'self' as second param in each function is a workaround for transpiler not properly\n keeping this , so we pass in instance to use as this for each fn - can't rely on bind\n because this is rewritten from symbol registry in transpiler and it's not present\n*/\n\nconst EventRegistry = {\n AnnotationState: {\n openAnnotation: (event, _this) => {\n _this.openAnnotationById(event.detail.id);\n },\n closeActiveAnnotation: (event, _this) => {\n _this.clearActive();\n },\n newAnnotation: (event, _this) => {\n _this.createAndAddAnnotation(event.detail);\n },\n destroyAnnotation: (event, _this) => {\n _this.destroyAnnotationById(event.detail.id);\n },\n newComment: (event, _this) => {\n let annotation = _this.findAnnotation(event.detail.annotationId);\n if(annotation) annotation.commentList.createComment(event.detail.body);\n },\n destroyComment: (event, _this) => {\n let comment = _this.findComment(event.detail.id);\n if(comment) comment.commentList.destroyComment(event);\n }\n },\n Controls: {\n addingAnnotation: (event, _this) => {\n _this.startAddNew();\n },\n cancelAddingAnnotation: (event, _this) => {\n _this.cancelAddNew();\n }\n },\n PlayerButton: {\n onStateChanged: (event, _this) => {\n _this.updateNumAnnotations();\n }\n },\n AnnotationComments: {\n toggleAnnotationMode: (event, _this) => {\n _this.toggleAnnotationMode();\n }\n }\n};\n\nmodule.exports = class EventDispatcher {\n\n constructor (plugin) {\n this.plugin = plugin;\n this.pluginReady = false;\n this.pendingEvts = [];\n this.registeredListeners = [];\n this.eventRegistry = EventRegistry;\n }\n\n // Use the EventRegistry to mass register events on each component initialization\n registerListenersFor (obj, className) {\n let matchingEvents = this.eventRegistry[className];\n if (matchingEvents) {\n Object.keys(matchingEvents).forEach((key) => {\n // Don't register again if already in cached collection\n if (!~this.registeredListeners.indexOf(key)) {\n let callback = matchingEvents[key].bind(obj);\n this.registerListener(key, ((evt) => {\n if(!this.pluginReady) return;\n this.logCallback(key, className, evt);\n callback(evt, obj);\n }).bind(this));\n }\n });\n }\n }\n\n // Bind a listener to the plugin\n registerListener (type, callback) {\n this.plugin.on(type, callback);\n this.registeredListeners.push(type);\n }\n\n // Unbind a listener from the plugin\n unregisterListener (type) {\n this.plugin.off(type);\n let i = this.registeredListeners.indexOf(type);\n this.registeredListeners.splice(i, 1);\n }\n\n // Trigger an event on the plugin\n fire (type, data) {\n if(!this.pluginReady) return;\n Logger.log(\"evt-dispatch-FIRE\", type, data);\n let evt = new CustomEvent(type, { 'detail': data });\n this.plugin.trigger(evt);\n }\n\n teardown () {\n this.registeredListeners.forEach((type) => { this.unregisterListener(type) });\n }\n\n logCallback (eventName, className, event) {\n Logger.log(\"evt-dispatch-RECEIVE\", `${eventName} (${className})`, event);\n }\n}\n","'use strict';\n/*\n\tGeneral logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging\n*/\n\n// Prefix for appending to all logger messages\nconst LOG_PREFIX = \"::VAC::\";\n\n// Are we in debug mode?\nfunction debug(){\n\treturn !!window.VAC_DEBUG;\n}\n\n// Build arguments for console fn, adding prefix\nfunction buildArgs(args){\n\treturn [LOG_PREFIX].concat(args);\n}\n\n// Log message/data\nmodule.exports.log = (...args) => {\n if(!debug()) return;\n console.log.apply(null, buildArgs(args));\n}\n\n// Error message/data\nmodule.exports.error = (...args) => {\n if(!debug()) return;\n console.error.apply(null, buildArgs(args));\n}\n\n// Info message/data\nmodule.exports.info = (...args) => {\n if(!debug()) return;\n console.info.apply(null, buildArgs(args));\n}\n","\"use strict\";\n/*\n Base class all player components interit from - it includes lots of helper functions (to get reference to\n the player, the plugin, video state, etc)\n*/\n\nmodule.exports = class PlayerComponent {\n\n constructor (player) {\n this._player = player;\n }\n\n // attribute to get reference to the main plugin object (main.js instance)\n get plugin () {\n return this.player.annotationComments();\n }\n\n // attribute to get player javascript instance\n get player () {\n return this._player;\n }\n\n // attribute to get video duration (in seconds)\n get duration () {\n return this.player.duration();\n }\n\n // attribute to get player current time\n get currentTime () {\n return this.player.currentTime();\n }\n\n // set current time of player\n set currentTime (time) {\n this.player.currentTime(time);\n }\n\n // Register all events in the EventRegistry matching this className\n initAPI (obj, className) {\n this.plugin.eventDispatcher.registerListenersFor(obj, className);\n }\n\n // Nullify player reference so objects can be removed safely\n // All components should call super.teardown() within their teardown funcs\n teardown (destroy=false) {\n if(destroy) this._player = null;\n }\n}\n","\"use strict\";\n/*\n Base class all player UI components interit from - it includes lots of helper functions (to get reference to\n the player $el, various classes/helpers, template rendering, etc)\n*/\n\nconst PlayerComponent = require(\"./player_component\"),\n Handlebars = require('handlebars/runtime'),\n Templates = require('./../compiled/templates'),\n Utils = require('./../lib/utils');\n\nmodule.exports = class PlayerUIComponent extends PlayerComponent {\n\n constructor (player) {\n super(player);\n }\n\n // helpers to get various UI components of the player quickly, keeping commonly reused class names\n // consolidated in case of need to change in the future (and for quick access)\n get $UI () {\n return Object.freeze({\n commentsContainer: this.$player.find(\".vac-comments-container\"), // outer container for all comments\n controlElements: this.$player.find(\".vac-control\"), // Each of multiple control elements in the control bar\n newCommentTextarea: this.$player.find(\".vac-video-write-new textarea\"), // Textarea for writing a new comment\n timeline: this.$player.find('.vjs-progress-control'), // Timeline element\n markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline\n controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs\n markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline\n coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state\n });\n }\n\n // utility classes used in various components\n get UI_CLASSES () {\n return Object.freeze({\n hidden: \"vac-hidden\",\n active: \"vac-active\"\n });\n }\n\n // attribute to get player jquery element\n get $player () {\n return $(this.player.el());\n }\n\n\n // attribute to get player id from DOM\n get playerId () {\n return this.$player.attr('id');\n }\n\n // Generate a pseudo-guid ID for this component, to use as an ID in the DOM\n get componentId () {\n this.cid_ = this.cid_ || Utils.guid()\n return this.cid_;\n }\n\n // Disable play/control actions on the current player\n disablePlayingAndControl () {\n this.$player.addClass('vac-disable-play');\n //TODO - catch spacebar being hit\n //TODO - prevent scrubbing and timeline click to seek\n }\n\n // Enable play/control actions on the controller\n enablePlayingAndControl () {\n this.$player.removeClass('vac-disable-play');\n }\n\n // Render a handlebars template with local data passed in via key/val in object\n renderTemplate (templateName, options = {}) {\n this.registerHandlebarsHelpers();\n return Templates[templateName](options);\n }\n\n // Handle escaped breaklines in Handlebars\n registerHandlebarsHelpers () {\n if('breaklines' in Handlebars.helpers) return;\n\n Handlebars.registerHelper('breaklines', (text) => {\n text = Handlebars.Utils.escapeExpression(text);\n text = text.replace(/(\\r\\n|\\n|\\r)/gm, '
');\n return new Handlebars.SafeString(text);\n });\n }\n\n // Provide basic teardown function to inherit\n teardown () {\n if(this.$el) this.$el.remove();\n super.teardown();\n }\n}\n","/*\n Collection of polyfills neededf or IE10+ support\n*/\n\n// Array.prototype.find() for IE10+\nrequire('ie-array-find-polyfill');\n// Object.assign for IE10+\nrequire('es6-object-assign').polyfill();\n\n// Allow use of object.constructor.staticFunc() in IE\n// Not yet supported by babel\n// https://gist.github.com/edoardocavazza/47246856759f2273e48b\n(function () {\n if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') {\n var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype'];\n\n function bindFunction(ctx, fn) {\n return function() {\n return fn.apply(this, arguments);\n }\n }\n\n function bindProperty(ctx, prop, parentDescriptor) {\n if (!parentDescriptor) {\n var defaultValue = ctx.__proto__[prop];\n parentDescriptor = {\n get: function () {\n return ctx['__' + prop] || defaultValue\n },\n set: function (val) {\n ctx['__' + prop] = val;\n }\n }\n }\n Object.defineProperty(ctx, prop, {\n get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined,\n set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined,\n configurable: true\n });\n\n }\n\n function iterateProps(subClass, superClass) {\n var props = Object.getOwnPropertyNames(superClass),\n proto;\n\n subClass.__proto__ = superClass;\n for (var i = 0, len = props.length; i < len; i++) {\n var prop = props[i];\n if (prop === '__proto__') {\n proto = superClass[prop];\n } else if (_exclude.indexOf(i) === -1) {\n var descriptor = Object.getOwnPropertyDescriptor(subClass, prop);\n if (!descriptor) {\n var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop);\n if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') {\n subClass[prop] = bindFunction(subClass, superClass[prop]);\n } else if (typeof superDescriptor.get == 'function') {\n bindProperty(subClass, prop, superDescriptor);\n } else {\n bindProperty(subClass, prop);\n }\n }\n }\n }\n if (proto) {\n iterateProps(subClass, proto);\n }\n }\n\n Object.setPrototypeOf = iterateProps;\n }\n})();\n\n// Use CustomEvent in IE\n(function () {\n if ( typeof window.CustomEvent === \"function\" ) return false;\n\n function CustomEvent ( event, params ) {\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n var evt = document.createEvent( 'CustomEvent' );\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\n return evt;\n }\n\n CustomEvent.prototype = window.Event.prototype;\n\n window.CustomEvent = CustomEvent;\n})();\n","\"use strict\";\n/*\n Geneal utility functions, sourced from underscore & scratch built as needed\n*/\n\nmodule.exports = {\n\n // Clone an object\n cloneObject: (obj) => Object.assign({}, obj),\n\n // _throttle from underscore\n throttle: (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function() {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function() {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n // Parse all keys of an object to int\n parseIntObj: (obj) => {\n Object.keys(obj).forEach((key) => {\n if(parseInt(obj[key])) {\n obj[key] = parseInt(obj[key]);\n }\n });\n return obj;\n },\n\n // Convert a range {start: int, (optional) end: int} to human readable time\n humanTime: (range) => {\n function readable(sec){\n let mins = Math.floor(sec/60),\n secs = String(sec % 60);\n return mins + \":\" + (secs.length==1 ? \"0\" : \"\") + secs;\n }\n let time = [readable(range.start)];\n if(range.end) time.push(readable(range.end));\n return time.join(\"-\");\n },\n\n // Pseduo-random guid generator\n guid: () => {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n },\n\n // Returns the height and width of an element that is not visible\n // clones el and tricks DOM into rendering it w the correct size\n // beware the container may be important for scoped styles\n areaOfHiddenEl: ($el, $container, hideClass='') => {\n let $clone = $el.clone(),\n data = {};\n $clone.css({\n visibility: 'hidden',\n display: 'inline-block'\n });\n $clone.removeClass(hideClass);\n $container.append($clone);\n data.width = $clone.outerWidth();\n data.height = $clone.outerHeight();\n $clone.remove();\n\n return data;\n },\n\n // Determine if a value (n) is within a range (start <= n <= end)\n isWithinRange: (start, end, n) => {\n end = end || start + 1; // for ranges with NO end defined, assume a 1s range\n return n >= start && n <= end;\n }\n};\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZXM2LW9iamVjdC1hc3NpZ24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy5ydW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9kZWNvcmF0b3JzL2lubGluZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2Jsb2NrLWhlbHBlci1taXNzaW5nLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9lYWNoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9oZWxwZXItbWlzc2luZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2xvZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy93aXRoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvbG9nZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9uby1jb25mbGljdC5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9zYWZlLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvcnVudGltZS5qcyIsIm5vZGVfbW9kdWxlcy9pZS1hcnJheS1maW5kLXBvbHlmaWxsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJzcmMvanMvYW5ub3RhdGlvbl9jb21tZW50cy5qcyIsInNyYy9qcy9jb21waWxlZC90ZW1wbGF0ZXMuanMiLCJzcmMvanMvY29tcG9uZW50cy9hbm5vdGF0aW9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYW5ub3RhdGlvbl9zdGF0ZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL2NvbW1lbnQuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb21tZW50X2xpc3QuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb250cm9scy5qcyIsInNyYy9qcy9jb21wb25lbnRzL2RyYWdnYWJsZV9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9wbGF5ZXJfYnV0dG9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvc2VsZWN0YWJsZV9zaGFwZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL3NoYXBlLmpzIiwic3JjL2pzL2luZGV4LmpzIiwic3JjL2pzL2xpYi9ldmVudF9kaXNwYXRjaGVyLmpzIiwic3JjL2pzL2xpYi9sb2dnZXIuanMiLCJzcmMvanMvbGliL3BsYXllcl9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BsYXllcl91aV9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BvbHlmaWxscy5qcyIsInNyYy9qcy9saWIvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OzhCQzlDc0IsbUJBQW1COztJQUE3QixJQUFJOzs7OztvQ0FJTywwQkFBMEI7Ozs7bUNBQzNCLHdCQUF3Qjs7OzsrQkFDdkIsb0JBQW9COztJQUEvQixLQUFLOztpQ0FDUSxzQkFBc0I7O0lBQW5DLE9BQU87O29DQUVJLDBCQUEwQjs7Ozs7QUFHakQsU0FBUyxNQUFNLEdBQUc7QUFDaEIsTUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7QUFFMUMsT0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkIsSUFBRSxDQUFDLFVBQVUsb0NBQWEsQ0FBQztBQUMzQixJQUFFLENBQUMsU0FBUyxtQ0FBWSxDQUFDO0FBQ3pCLElBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLElBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7O0FBRTdDLElBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ2hCLElBQUUsQ0FBQyxRQUFRLEdBQUcsVUFBUyxJQUFJLEVBQUU7QUFDM0IsV0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FB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TUFBTSxFQUFFLEdBQUcsRUFBRTtBQUN2QyxRQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNsQixTQUFPLE1BQU0sQ0FBQztDQUNmOztBQUVNLFNBQVMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRTtBQUNqRCxTQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFBLEdBQUksRUFBRSxDQUFDO0NBQ3BEOzs7O0FDM0dEO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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bnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuICogQ29kZSByZWZhY3RvcmVkIGZyb20gTW96aWxsYSBEZXZlbG9wZXIgTmV0d29yazpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIGZpcnN0U291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBmaXJzdCBhcmd1bWVudCB0byBvYmplY3QnKTtcbiAgfVxuXG4gIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGlmIChuZXh0U291cmNlID09PSB1bmRlZmluZWQgfHwgbmV4dFNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGtleXNBcnJheSA9IE9iamVjdC5rZXlzKE9iamVjdChuZXh0U291cmNlKSk7XG4gICAgZm9yICh2YXIgbmV4dEluZGV4ID0gMCwgbGVuID0ga2V5c0FycmF5Lmxlbmd0aDsgbmV4dEluZGV4IDwgbGVuOyBuZXh0SW5kZXgrKykge1xuICAgICAgdmFyIG5leHRLZXkgPSBrZXlzQXJyYXlbbmV4dEluZGV4XTtcbiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXh0U291cmNlLCBuZXh0S2V5KTtcbiAgICAgIGlmIChkZXNjICE9PSB1bmRlZmluZWQgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgaWYgKCFPYmplY3QuYXNzaWduKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdCwgJ2Fzc2lnbicsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogYXNzaWduXG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzc2lnbjogYXNzaWduLFxuICBwb2x5ZmlsbDogcG9seWZpbGxcbn07XG4iLCJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iLCJpbXBvcnQge2NyZWF0ZUZyYW1lLCBleHRlbmQsIHRvU3RyaW5nfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9leGNlcHRpb24nO1xuaW1wb3J0IHtyZWdpc3RlckRlZmF1bHRIZWxwZXJzfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtyZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMSc7XG5leHBvcnQgY29uc3QgQ09NUElMRVJfUkVWSVNJT04gPSA3O1xuXG5leHBvcnQgY29uc3QgUkVWSVNJT05fQ0hBTkdFUyA9IHtcbiAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXRcbiAgMjogJz09IDEuMC4wLXJjLjMnLFxuICAzOiAnPT0gMS4wLjAtcmMuNCcsXG4gIDQ6ICc9PSAxLngueCcsXG4gIDU6ICc9PSAyLjAuMC1hbHBoYS54JyxcbiAgNjogJz49IDIuMC4wLWJldGEuMScsXG4gIDc6ICc+PSA0LjAuMCdcbn07XG5cbmNvbnN0IG9iamVjdFR5cGUgPSAnW29iamVjdCBPYmplY3RdJztcblxuZXhwb3J0IGZ1bmN0aW9uIEhhbmRsZWJhcnNFbnZpcm9ubWVudChoZWxwZXJzLCBwYXJ0aWFscywgZGVjb3JhdG9ycykge1xuICB0aGlzLmhlbHBlcnMgPSBoZWxwZXJzIHx8IHt9O1xuICB0aGlzLnBhcnRpYWxzID0gcGFydGlhbHMgfHwge307XG4gIHRoaXMuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnMgfHwge307XG5cbiAgcmVnaXN0ZXJEZWZhdWx0SGVscGVycyh0aGlzKTtcbiAgcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyh0aGlzKTtcbn1cblxuSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCxcblxuICBsb2dnZXI6IGxvZ2dlcixcbiAgbG9nOiBsb2dnZXIubG9nLFxuXG4gIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lLCBmbikge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7XG4gICAgICBpZiAoZm4pIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbignQXJnIG5vdCBzdXBwb3J0ZWQgd2l0aCBtdWx0aXBsZSBoZWxwZXJzJyk7IH1cbiAgICAgIGV4dGVuZCh0aGlzLmhlbHBlcnMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlbHBlcnNbbmFtZV0gPSBmbjtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24obmFtZSwgcGFydGlhbCkge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7XG4gICAgICBleHRlbmQodGhpcy5wYXJ0aWFscywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydGlhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihgQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkIFwiJHtuYW1lfVwiIGFzIHVuZGVmaW5lZGApO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lLCBmbikge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7XG4gICAgICBpZiAoZm4pIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbignQXJnIG5vdCBzdXBwb3J0ZWQgd2l0aCBtdWx0aXBsZSBkZWNvcmF0b3JzJyk7IH1cbiAgICAgIGV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5kZWNvcmF0b3JzW25hbWVdO1xuICB9XG59O1xuXG5leHBvcnQgbGV0IGxvZyA9IGxvZ2dlci5sb2c7XG5cbmV4cG9ydCB7Y3JlYXRlRnJhbWUsIGxvZ2dlcn07XG4iLCJpbXBvcnQgcmVnaXN0ZXJJbmxpbmUgZnJvbSAnLi9kZWNvcmF0b3JzL2lubGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVySW5saW5lKGluc3RhbmNlKTtcbn1cblxuIiwiaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJEZWNvcmF0b3IoJ2lubGluZScsIGZ1bmN0aW9uKGZuLCBwcm9wcywgY29udGFpbmVyLCBvcHRpb25zKSB7XG4gICAgbGV0IHJldCA9IGZuO1xuICAgIGlmICghcHJvcHMucGFydGlhbHMpIHtcbiAgICAgIHByb3BzLnBhcnRpYWxzID0ge307XG4gICAgICByZXQgPSBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLlxuICAgICAgICBsZXQgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGV4dGVuZCh7fSwgb3JpZ2luYWwsIHByb3BzLnBhcnRpYWxzKTtcbiAgICAgICAgbGV0IHJldCA9IGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcmlnaW5hbDtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiIsIlxuY29uc3QgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107XG5cbmZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7XG4gIGxldCBsb2MgPSBub2RlICYmIG5vZGUubG9jLFxuICAgICAgbGluZSxcbiAgICAgIGNvbHVtbjtcbiAgaWYgKGxvYykge1xuICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTtcbiAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uO1xuXG4gICAgbWVzc2FnZSArPSAnIC0gJyArIGxpbmUgKyAnOicgKyBjb2x1bW47XG4gIH1cblxuICBsZXQgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG5cbiAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuXG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykge1xuICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXhjZXB0aW9uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvYykge1xuICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcblxuICAgICAgLy8gV29yayBhcm91bmQgaXNzdWUgdW5kZXIgc2FmYXJpIHdoZXJlIHdlIGNhbid0IGRpcmVjdGx5IHNldCB0aGUgY29sdW1uIHZhbHVlXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbHVtbicsIHtcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKG5vcCkge1xuICAgIC8qIElnbm9yZSBpZiB0aGUgYnJvd3NlciBpcyB2ZXJ5IHBhcnRpY3VsYXIgKi9cbiAgfVxufVxuXG5FeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydCBkZWZhdWx0IEV4Y2VwdGlvbjtcbiIsImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIiwiaW1wb3J0IHthcHBlbmRDb250ZXh0UGF0aCwgY3JlYXRlRnJhbWUsIGlzQXJyYXl9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2Jsb2NrSGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBsZXQgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgICAgZm4gPSBvcHRpb25zLmZuO1xuXG4gICAgaWYgKGNvbnRleHQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmbih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT09IGZhbHNlIHx8IGNvbnRleHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGNvbnRleHQpKSB7XG4gICAgICBpZiAoY29udGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmlkcykge1xuICAgICAgICAgIG9wdGlvbnMuaWRzID0gW29wdGlvbnMubmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVycy5lYWNoKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludmVyc2UodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpO1xuICAgICAgICBvcHRpb25zID0ge2RhdGE6IGRhdGF9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiIsImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtpc0VtcHR5LCBpc0Z1bmN0aW9ufSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7IGNvbmRpdGlvbmFsID0gY29uZGl0aW9uYWwuY2FsbCh0aGlzKTsgfVxuXG4gICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW5kZXIgdGhlIHBvc2l0aXZlIHBhdGggaWYgdGhlIHZhbHVlIGlzIHRydXRoeSBhbmQgbm90IGVtcHR5LlxuICAgIC8vIFRoZSBgaW5jbHVkZVplcm9gIG9wdGlvbiBtYXkgYmUgc2V0IHRvIHRyZWF0IHRoZSBjb25kdGlvbmFsIGFzIHB1cmVseSBub3QgZW1wdHkgYmFzZWQgb24gdGhlXG4gICAgLy8gYmVoYXZpb3Igb2YgaXNFbXB0eS4gRWZmZWN0aXZlbHkgdGhpcyBkZXRlcm1pbmVzIGlmIDAgaXMgaGFuZGxlZCBieSB0aGUgcG9zaXRpdmUgcGF0aCBvciBuZWdhdGl2ZS5cbiAgICBpZiAoKCFvcHRpb25zLmhhc2guaW5jbHVkZVplcm8gJiYgIWNvbmRpdGlvbmFsKSB8fCBpc0VtcHR5KGNvbmRpdGlvbmFsKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gICAgfVxuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24oY29uZGl0aW9uYWwsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVyc1snaWYnXS5jYWxsKHRoaXMsIGNvbmRpdGlvbmFsLCB7Zm46IG9wdGlvbnMuaW52ZXJzZSwgaW52ZXJzZTogb3B0aW9ucy5mbiwgaGFzaDogb3B0aW9ucy5oYXNofSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uKG9iaiwgZmllbGQpIHtcbiAgICByZXR1cm4gb2JqICYmIG9ialtmaWVsZF07XG4gIH0pO1xufVxuIiwiaW1wb3J0IHthcHBlbmRDb250ZXh0UGF0aCwgYmxvY2tQYXJhbXMsIGNyZWF0ZUZyYW1lLCBpc0VtcHR5LCBpc0Z1bmN0aW9ufSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAoIWlzRW1wdHkoY29udGV4dCkpIHtcbiAgICAgIGxldCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwge1xuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMoW2NvbnRleHRdLCBbZGF0YSAmJiBkYXRhLmNvbnRleHRQYXRoXSlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQge2luZGV4T2Z9IGZyb20gJy4vdXRpbHMnO1xuXG5sZXQgbG9nZ2VyID0ge1xuICBtZXRob2RNYXA6IFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ10sXG4gIGxldmVsOiAnaW5mbycsXG5cbiAgLy8gTWFwcyBhIGdpdmVuIGxldmVsIHZhbHVlIHRvIHRoZSBgbWV0aG9kTWFwYCBpbmRleGVzIGFib3ZlLlxuICBsb29rdXBMZXZlbDogZnVuY3Rpb24obGV2ZWwpIHtcbiAgICBpZiAodHlwZW9mIGxldmVsID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IGxldmVsTWFwID0gaW5kZXhPZihsb2dnZXIubWV0aG9kTWFwLCBsZXZlbC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChsZXZlbE1hcCA+PSAwKSB7XG4gICAgICAgIGxldmVsID0gbGV2ZWxNYXA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbCA9IHBhcnNlSW50KGxldmVsLCAxMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxldmVsO1xuICB9LFxuXG4gIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50XG4gIGxvZzogZnVuY3Rpb24obGV2ZWwsIC4uLm1lc3NhZ2UpIHtcbiAgICBsZXZlbCA9IGxvZ2dlci5sb29rdXBMZXZlbChsZXZlbCk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7XG4gICAgICBsZXQgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07XG4gICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgeyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICBtZXRob2QgPSAnbG9nJztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGVbbWV0aG9kXSguLi5tZXNzYWdlKTsgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXI7XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihIYW5kbGViYXJzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGxldCByb290ID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3csXG4gICAgICAkSGFuZGxlYmFycyA9IHJvb3QuSGFuZGxlYmFycztcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgSGFuZGxlYmFycy5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykge1xuICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7XG4gICAgfVxuICAgIHJldHVybiBIYW5kbGViYXJzO1xuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vZXhjZXB0aW9uJztcbmltcG9ydCB7IENPTVBJTEVSX1JFVklTSU9OLCBSRVZJU0lPTl9DSEFOR0VTLCBjcmVhdGVGcmFtZSB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICBjb25zdCBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgICBjdXJyZW50UmV2aXNpb24gPSBDT01QSUxFUl9SRVZJU0lPTjtcblxuICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7XG4gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSxcbiAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIHRlbXBsYXRlIG9iamVjdDogJyArIHR5cGVvZiB0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgdGVtcGxhdGVTcGVjLm1haW4uZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjLm1haW5fZDtcblxuICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvd1xuICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLlxuICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpO1xuXG4gIGZ1bmN0aW9uIGludm9rZVBhcnRpYWxXcmFwcGVyKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICBjb250ZXh0ID0gVXRpbHMuZXh0ZW5kKHt9LCBjb250ZXh0LCBvcHRpb25zLmhhc2gpO1xuICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIG9wdGlvbnMuaWRzWzBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJ0aWFsID0gZW52LlZNLnJlc29sdmVQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG4gICAgbGV0IHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7XG4gICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaW5lc1tpXSAmJiBpICsgMSA9PT0gbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGluZXNbaV0gPSBvcHRpb25zLmluZGVudCArIGxpbmVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1lLW9ubHkgbW9kZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEp1c3QgYWRkIHdhdGVyXG4gIGxldCBjb250YWluZXIgPSB7XG4gICAgc3RyaWN0OiBmdW5jdGlvbihvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdcIicgKyBuYW1lICsgJ1wiIG5vdCBkZWZpbmVkIGluICcgKyBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgICB9LFxuICAgIGxvb2t1cDogZnVuY3Rpb24oZGVwdGhzLCBuYW1lKSB7XG4gICAgICBjb25zdCBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbihjdXJyZW50LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50O1xuICAgIH0sXG5cbiAgICBlc2NhcGVFeHByZXNzaW9uOiBVdGlscy5lc2NhcGVFeHByZXNzaW9uLFxuICAgIGludm9rZVBhcnRpYWw6IGludm9rZVBhcnRpYWxXcmFwcGVyLFxuXG4gICAgZm46IGZ1bmN0aW9uKGkpIHtcbiAgICAgIGxldCByZXQgPSB0ZW1wbGF0ZVNwZWNbaV07XG4gICAgICByZXQuZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjW2kgKyAnX2QnXTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSxcblxuICAgIHByb2dyYW1zOiBbXSxcbiAgICBwcm9ncmFtOiBmdW5jdGlvbihpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICBsZXQgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZSwgZGVwdGgpIHtcbiAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbihwYXJhbSwgY29tbW9uKSB7XG4gICAgICBsZXQgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIChwYXJhbSAhPT0gY29tbW9uKSkge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgLy8gQW4gZW1wdHkgb2JqZWN0IHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgbnVsbC1jb250ZXh0c1xuICAgIG51bGxDb250ZXh0OiBPYmplY3Quc2VhbCh7fSksXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgbGV0IGRlcHRocyxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT0gb3B0aW9ucy5kZXB0aHNbMF0gPyBbY29udGV4dF0uY29uY2F0KG9wdGlvbnMuZGVwdGhzKSA6IG9wdGlvbnMuZGVwdGhzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVwdGhzID0gW2NvbnRleHRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dC8qLCBvcHRpb25zKi8pIHtcbiAgICAgIHJldHVybiAnJyArIHRlbXBsYXRlU3BlYy5tYWluKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgfVxuICAgIG1haW4gPSBleGVjdXRlRGVjb3JhdG9ycyh0ZW1wbGF0ZVNwZWMubWFpbiwgbWFpbiwgY29udGFpbmVyLCBvcHRpb25zLmRlcHRocyB8fCBbXSwgZGF0YSwgYmxvY2tQYXJhbXMpO1xuICAgIHJldHVybiBtYWluKGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG4gIHJldC5pc1RvcCA9IHRydWU7XG5cbiAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCkge1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5oZWxwZXJzLCBlbnYuaGVscGVycyk7XG5cbiAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkge1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykge1xuICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7XG4gICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzO1xuICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7XG4gICAgfVxuICB9O1xuXG4gIHJldC5fY2hpbGQgPSBmdW5jdGlvbihpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ211c3QgcGFzcyBibG9jayBwYXJhbXMnKTtcbiAgICB9XG4gICAgaWYgKHRlbXBsYXRlU3BlYy51c2VEZXB0aHMgJiYgIWRlcHRocykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignbXVzdCBwYXNzIHBhcmVudCBkZXB0aHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCB0ZW1wbGF0ZVNwZWNbaV0sIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICBmdW5jdGlvbiBwcm9nKGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBjdXJyZW50RGVwdGhzID0gZGVwdGhzO1xuICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPSBkZXB0aHNbMF0gJiYgIShjb250ZXh0ID09PSBjb250YWluZXIubnVsbENvbnRleHQgJiYgZGVwdGhzWzBdID09PSBudWxsKSkge1xuICAgICAgY3VycmVudERlcHRocyA9IFtjb250ZXh0XS5jb25jYXQoZGVwdGhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oY29udGFpbmVyLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLFxuICAgICAgICBvcHRpb25zLmRhdGEgfHwgZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXMgJiYgW29wdGlvbnMuYmxvY2tQYXJhbXNdLmNvbmNhdChibG9ja1BhcmFtcyksXG4gICAgICAgIGN1cnJlbnREZXB0aHMpO1xuICB9XG5cbiAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpO1xuXG4gIHByb2cucHJvZ3JhbSA9IGk7XG4gIHByb2cuZGVwdGggPSBkZXB0aHMgPyBkZXB0aHMubGVuZ3RoIDogMDtcbiAgcHJvZy5ibG9ja1BhcmFtcyA9IGRlY2xhcmVkQmxvY2tQYXJhbXMgfHwgMDtcbiAgcmV0dXJuIHByb2c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHtcbiAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAvLyBVc2UgdGhlIGN1cnJlbnQgY2xvc3VyZSBjb250ZXh0IHRvIHNhdmUgdGhlIHBhcnRpYWwtYmxvY2sgaWYgdGhpcyBwYXJ0aWFsXG4gIGNvbnN0IGN1cnJlbnRQYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ107XG4gIG9wdGlvbnMucGFydGlhbCA9IHRydWU7XG4gIGlmIChvcHRpb25zLmlkcykge1xuICAgIG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCA9IG9wdGlvbnMuaWRzWzBdIHx8IG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aDtcbiAgfVxuXG4gIGxldCBwYXJ0aWFsQmxvY2s7XG4gIGlmIChvcHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IG5vb3ApIHtcbiAgICBvcHRpb25zLmRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIC8vIFdyYXBwZXIgZnVuY3Rpb24gdG8gZ2V0IGFjY2VzcyB0byBjdXJyZW50UGFydGlhbEJsb2NrIGZyb20gdGhlIGNsb3N1cmVcbiAgICBsZXQgZm4gPSBvcHRpb25zLmZuO1xuICAgIHBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddID0gZnVuY3Rpb24gcGFydGlhbEJsb2NrV3JhcHBlcihjb250ZXh0LCBvcHRpb25zID0ge30pIHtcblxuICAgICAgLy8gUmVzdG9yZSB0aGUgcGFydGlhbC1ibG9jayBmcm9tIHRoZSBjbG9zdXJlIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9ja1xuICAgICAgLy8gaS5lLiB0aGUgcGFydCBpbnNpZGUgdGhlIGJsb2NrIG9mIHRoZSBwYXJ0aWFsIGNhbGwuXG4gICAgICBvcHRpb25zLmRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBjdXJyZW50UGFydGlhbEJsb2NrO1xuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgaWYgKGZuLnBhcnRpYWxzKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzID0gVXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zLnBhcnRpYWxzLCBmbi5wYXJ0aWFscyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFsQmxvY2spIHtcbiAgICBwYXJ0aWFsID0gcGFydGlhbEJsb2NrO1xuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBmb3VuZCcpO1xuICB9IGVsc2UgaWYgKHBhcnRpYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIHJldHVybiBwYXJ0aWFsKGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub29wKCkgeyByZXR1cm4gJyc7IH1cblxuZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHtcbiAgICBkYXRhID0gZGF0YSA/IGNyZWF0ZUZyYW1lKGRhdGEpIDoge307XG4gICAgZGF0YS5yb290ID0gY29udGV4dDtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZXhlY3V0ZURlY29yYXRvcnMoZm4sIHByb2csIGNvbnRhaW5lciwgZGVwdGhzLCBkYXRhLCBibG9ja1BhcmFtcykge1xuICBpZiAoZm4uZGVjb3JhdG9yKSB7XG4gICAgbGV0IHByb3BzID0ge307XG4gICAgcHJvZyA9IGZuLmRlY29yYXRvcihwcm9nLCBwcm9wcywgY29udGFpbmVyLCBkZXB0aHMgJiYgZGVwdGhzWzBdLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICBVdGlscy5leHRlbmQocHJvZywgcHJvcHMpO1xuICB9XG4gIHJldHVybiBwcm9nO1xufVxuIiwiLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGVcbmZ1bmN0aW9uIFNhZmVTdHJpbmcoc3RyaW5nKSB7XG4gIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xufVxuXG5TYWZlU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IFNhZmVTdHJpbmcucHJvdG90eXBlLnRvSFRNTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gJycgKyB0aGlzLnN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNhZmVTdHJpbmc7XG4iLCJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIiwiLy8gQ3JlYXRlIGEgc2ltcGxlIHBhdGggYWxpYXMgdG8gYWxsb3cgYnJvd3NlcmlmeSB0byByZXNvbHZlXG4vLyB0aGUgcnVudGltZSBvbiBhIHN1cHBvcnRlZCBwYXRoLlxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QvY2pzL2hhbmRsZWJhcnMucnVudGltZScpWydkZWZhdWx0J107XG4iLCIndXNlIHN0cmljdCc7XG5pZiAoIUFycmF5LnByb3RvdHlwZS5maW5kKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2ZpbmQnLCB7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG9iaiA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSBvYmoubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG5cbiAgICAgICAgICAgIHZhciBpbmRleCA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbikge1xuICAgICAgICAgICAgICAgIHZhciBpVmFsdWUgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCBpVmFsdWUsIGluZGV4LCBvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn0iLCIvLyEgbW9tZW50LmpzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzICgpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrIChjYWxsYmFjaykge1xuICAgICAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF5KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgICAgIC8vIGlucHV0ICE9IG51bGxcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eSAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VucyAgICA6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQgICAgIDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdyAgICAgICAgOiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXIgICA6IDAsXG4gICAgICAgICAgICBudWxsSW5wdXQgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRNb250aCAgICA6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICAgICAgaXNvICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZWREYXRlUGFydHMgOiBbXSxcbiAgICAgICAgICAgIG1lcmlkaWVtICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZmMyODIyICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHdlZWtkYXlNaXNtYXRjaCA6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2luZ0ZsYWdzKG0pIHtcbiAgICAgICAgaWYgKG0uX3BmID09IG51bGwpIHtcbiAgICAgICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9wZjtcbiAgICB9XG5cbiAgICB2YXIgc29tZTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgICAgICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvbWUgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgICAgICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIGlmIChtLl9pc1ZhbGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGlzTm93VmFsaWQgPSAhaXNOYU4obS5fZC5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkIChmbGFncykge1xuICAgICAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudCAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKChkb250Q29udmVydCAmJiBhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSAnXFxuWycgKyBpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0ga2V5ICsgJzogJyArIGFyZ3VtZW50c1swXVtrZXldICsgJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1snXycgKyBpXSA9IHByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArICgvXFxkezEsMn0vKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksIHByb3A7XG4gICAgICAgIGZvciAocHJvcCBpbiBjaGlsZENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkgJiYgaXNPYmplY3QoY2hpbGRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBjaGlsZENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZENvbmZpZ1twcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHBhcmVudENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2hhbmdlcyB0byBwcm9wZXJ0aWVzIGRvbid0IG1vZGlmeSBwYXJlbnQgY29uZmlnXG4gICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gZXh0ZW5kKHt9LCByZXNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9jYWxlKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cztcblxuICAgIGlmIChPYmplY3Qua2V5cykge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBpLCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFMgIDogJ2g6bW06c3MgQScsXG4gICAgICAgIExUICAgOiAnaDptbSBBJyxcbiAgICAgICAgTCAgICA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEwgICA6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zbGljZSgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbiAgICB2YXIgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbCAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgcGFzdCAgIDogJyVzIGFnbycsXG4gICAgICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbSAgOiAnYSBtaW51dGUnLFxuICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgaCAgOiAnYW4gaG91cicsXG4gICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgZCAgOiAnYSBkYXknLFxuICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgTSAgOiAnYSBtb250aCcsXG4gICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgIHkgIDogJ2EgeWVhcicsXG4gICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyAodW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGFsaWFzZXNbbG93ZXJDYXNlXSA9IGFsaWFzZXNbbG93ZXJDYXNlICsgJ3MnXSA9IGFsaWFzZXNbc2hvcnRoYW5kXSA9IHVuaXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZycgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSB7fSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICAgICAgcHJvcDtcblxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xuICAgIH1cblxuICAgIHZhciBwcmlvcml0aWVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0UHJpb3JpdHkodW5pdCwgcHJpb3JpdHkpIHtcbiAgICAgICAgcHJpb3JpdGllc1t1bml0XSA9IHByaW9yaXR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW107XG4gICAgICAgIGZvciAodmFyIHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIHVuaXRzLnB1c2goe3VuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdfSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIGFic051bWJlciA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgK1xuICAgICAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgKyBhYnNOdW1iZXI7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nO1xuXG4gICAgdmFyIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2c7XG5cbiAgICB2YXIgZm9ybWF0RnVuY3Rpb25zID0ge307XG5cbiAgICB2YXIgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbiAodG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdG9rZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJywgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKSA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2YXIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxICAgICAgICAgPSAvXFxkLzsgICAgICAgICAgICAvLyAgICAgICAwIC0gOVxuICAgIHZhciBtYXRjaDIgICAgICAgICA9IC9cXGRcXGQvOyAgICAgICAgICAvLyAgICAgIDAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzICAgICAgICAgPSAvXFxkezN9LzsgICAgICAgICAvLyAgICAgMDAwIC0gOTk5XG4gICAgdmFyIG1hdGNoNCAgICAgICAgID0gL1xcZHs0fS87ICAgICAgICAgLy8gICAgMDAwMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2g2ICAgICAgICAgPSAvWystXT9cXGR7Nn0vOyAgICAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMiAgICAgID0gL1xcZFxcZD8vOyAgICAgICAgIC8vICAgICAgIDAgLSA5OVxuICAgIHZhciBtYXRjaDN0bzQgICAgICA9IC9cXGRcXGRcXGRcXGQ/LzsgICAgIC8vICAgICA5OTkgLSA5OTk5XG4gICAgdmFyIG1hdGNoNXRvNiAgICAgID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vOyAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMyAgICAgID0gL1xcZHsxLDN9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OVxuICAgIHZhciBtYXRjaDF0bzQgICAgICA9IC9cXGR7MSw0fS87ICAgICAgIC8vICAgICAgIDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoMXRvNiAgICAgID0gL1srLV0/XFxkezEsNn0vOyAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuXG4gICAgdmFyIG1hdGNoVW5zaWduZWQgID0gL1xcZCsvOyAgICAgICAgICAgLy8gICAgICAgMCAtIGluZlxuICAgIHZhciBtYXRjaFNpZ25lZCAgICA9IC9bKy1dP1xcZCsvOyAgICAgIC8vICAgIC1pbmYgLSBpbmZcblxuICAgIHZhciBtYXRjaE9mZnNldCAgICA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naTsgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgdmFyIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naTsgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcblxuICAgIHZhciBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy87IC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbiAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgdmFyIG1hdGNoV29yZCA9IC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pO1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4KSA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuICh0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMDtcbiAgICB2YXIgTU9OVEggPSAxO1xuICAgIHZhciBEQVRFID0gMjtcbiAgICB2YXIgSE9VUiA9IDM7XG4gICAgdmFyIE1JTlVURSA9IDQ7XG4gICAgdmFyIFNFQ09ORCA9IDU7XG4gICAgdmFyIE1JTExJU0VDT05EID0gNjtcbiAgICB2YXIgV0VFSyA9IDc7XG4gICAgdmFyIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsICAgNF0sICAgICAgIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgneWVhcicsIDEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICBob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQgKHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKCkgP1xuICAgICAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEgKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdGdWxsWWVhcicgJiYgaXNMZWFwWWVhcihtb20ueWVhcigpKSAmJiBtb20ubW9udGgoKSA9PT0gMSAmJiBtb20uZGF0ZSgpID09PSAyOSkge1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSwgbW9tLm1vbnRoKCksIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQgKHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMSA/IChpc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCkgOiAoMzEgLSBtb2RNb250aCAlIDcgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbW9udGgnLCAnTScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbW9udGgnLCA4KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy87XG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPSAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydCA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0W01PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgaWksIG1vbSwgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU1NJyAmJiB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aCAobW9tLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoICgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcblxuICAgICAgICAvLyB0aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSAoeSkge1xuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuXG4gICAgICAgIC8vIHRoZSBEYXRlLlVUQyBmdW5jdGlvbiByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQtb2YtZmlyc3Qtd2VlayAtIHN0YXJ0LW9mLXllYXJcbiAgICBmdW5jdGlvbiBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIC8vIGZpcnN0LXdlZWsgZGF5IC0tIHdoaWNoIGphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrICg0IGZvciBpc28sIDEgZm9yIG90aGVyKVxuICAgICAgICAgICAgZndkID0gNyArIGRvdyAtIGRveSxcbiAgICAgICAgICAgIC8vIGZpcnN0LXdlZWsgZGF5IGxvY2FsIHdlZWtkYXkgLS0gd2hpY2ggbG9jYWwgd2Vla2RheSBpcyBmd2RcbiAgICAgICAgICAgIGZ3ZGx3ID0gKDcgKyBjcmVhdGVVVENEYXRlKHllYXIsIDAsIGZ3ZCkuZ2V0VVRDRGF5KCkgLSBkb3cpICUgNztcblxuICAgICAgICByZXR1cm4gLWZ3ZGx3ICsgZndkIC0gMTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrcyh5ZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgbG9jYWxXZWVrZGF5ID0gKDcgKyB3ZWVrZGF5IC0gZG93KSAlIDcsXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRheU9mWWVhciA9IDEgKyA3ICogKHdlZWsgLSAxKSArIGxvY2FsV2Vla2RheSArIHdlZWtPZmZzZXQsXG4gICAgICAgICAgICByZXNZZWFyLCByZXNEYXlPZlllYXI7XG5cbiAgICAgICAgaWYgKGRheU9mWWVhciA8PSAwKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciAtIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlzSW5ZZWFyKHJlc1llYXIpICsgZGF5T2ZZZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRheU9mWWVhciA+IGRheXNJblllYXIoeWVhcikpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyICsgMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhciAtIGRheXNJblllYXIoeWVhcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhcjtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICAgICAgZGF5T2ZZZWFyOiByZXNEYXlPZlllYXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssIHJlc1llYXI7XG5cbiAgICAgICAgaWYgKHdlZWsgPCAxKSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSAtIDE7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayArIHdlZWtzSW5ZZWFyKHJlc1llYXIsIGRvdywgZG95KTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrID4gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayAtIHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KTtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2VlazogcmVzV2VlayxcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0TmV4dCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyICsgMSwgZG93LCBkb3kpO1xuICAgICAgICByZXR1cm4gKGRheXNJblllYXIoeWVhcikgLSB3ZWVrT2Zmc2V0ICsgd2Vla09mZnNldE5leHQpIC8gNztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigndycsIFsnd3cnLCAyXSwgJ3dvJywgJ3dlZWsnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignVycsIFsnV1cnLCAyXSwgJ1dvJywgJ2lzb1dlZWsnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2VlaycsICd3Jyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrJywgJ1cnKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2VlaycsIDUpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2VlaycsIDUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigndycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3d3JywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1cnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsndycsICd3dycsICdXJywgJ1dXJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAxKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrIChtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mV2VlayAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRveTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrIChpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrIChpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXknLCAnZCcpO1xuICAgIGFkZFVuaXRBbGlhcygnd2Vla2RheScsICdlJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrZGF5JywgJ0UnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrZGF5JywgMTEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla2RheScsIDExKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2QnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2UnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0UnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2RkJywgJ2RkZCcsICdkZGRkJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGNvbmZpZy5fbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYSB3ZWVrZGF5IG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZFxuICAgICAgICBpZiAod2Vla2RheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWVrLmQgPSB3ZWVrZGF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkJywgJ2UnLCAnRSddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KSAlIDcgfHwgNztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4oaW5wdXQpID8gbnVsbCA6IGlucHV0O1xuICAgIH1cblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzIDpcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzW20uZGF5KCldIDpcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzW3RoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLmRheSgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQgPSAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQgKG0pIHtcbiAgICAgICAgcmV0dXJuIChtKSA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV0gOiB0aGlzLl93ZWVrZGF5c1Nob3J0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4gPSAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4gKG0pIHtcbiAgICAgICAgcmV0dXJuIChtKSA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSAod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXC4/JykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXC4/JykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkZCcgJiYgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZCcgJiYgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZCcgJiYgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXkgPSB0aGlzLl9pc1VUQyA/IHRoaXMuX2QuZ2V0VVRDRGF5KCkgOiB0aGlzLl9kLmdldERheSgpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLCBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb20sIG1pbnAsIHNob3J0cCwgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICBzaG9ydHAgPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICBsb25ncCA9IHRoaXMud2Vla2RheXMobW9tLCAnJyk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgbG93ZXJjYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTSAoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAvLyB0aGlzIHJ1bGUuXG4gICAgdmFyIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZVxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fTtcbiAgICB2YXIgbG9jYWxlRmFtaWxpZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGw7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmICghbG9jYWxlc1tuYW1lXSAmJiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICB2YXIgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUgKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTG9jYWxlICcgKyBrZXkgKyAgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZSgnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCB0bXBMb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93IChtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdztcbiAgICAgICAgdmFyIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW01PTlRIXSAgICAgICA8IDAgfHwgYVtNT05USF0gICAgICAgPiAxMSAgPyBNT05USCA6XG4gICAgICAgICAgICAgICAgYVtEQVRFXSAgICAgICAgPCAxIHx8IGFbREFURV0gICAgICAgID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgYVtIT1VSXSAgICAgICAgPCAwIHx8IGFbSE9VUl0gICAgICAgID4gMjQgfHwgKGFbSE9VUl0gPT09IDI0ICYmIChhW01JTlVURV0gIT09IDAgfHwgYVtTRUNPTkRdICE9PSAwIHx8IGFbTUlMTElTRUNPTkRdICE9PSAwKSkgPyBIT1VSIDpcbiAgICAgICAgICAgICAgICBhW01JTlVURV0gICAgICA8IDAgfHwgYVtNSU5VVEVdICAgICAgPiA1OSAgPyBNSU5VVEUgOlxuICAgICAgICAgICAgICAgIGFbU0VDT05EXSAgICAgIDwgMCB8fCBhW1NFQ09ORF0gICAgICA+IDU5ICA/IFNFQ09ORCA6XG4gICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxuICAgICAgICAgICAgICAgIC0xO1xuXG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSwgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkgKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIGV4cGVjdGVkV2Vla2RheSwgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8IGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KG51bGwsIGlucHV0KTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVEMgPyBjb25maWcuX2QuZ2V0VVRDRGF5KCkgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJiBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5KSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgICAgICBpZiAody5lIDwgMCB8fCB3LmUgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGJlZ2luaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gZG93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3ZWVrIDwgMSB8fCB3ZWVrID4gd2Vla3NJblllYXIod2Vla1llYXIsIGRvdywgZG95KSkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla3MgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWtkYXlPdmVyZmxvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrZGF5ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRlbXAgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdGVtcC5kYXlPZlllYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpc28gODYwMSByZWdleFxuICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgIHZhciBleHRlbmRlZElzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuICAgIHZhciBiYXNpY0lzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFtcXCtcXC1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLztcblxuICAgIHZhciB0elJlZ2V4ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vO1xuXG4gICAgdmFyIGlzb0RhdGVzID0gW1xuICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVy1FJywgL1xcZHs0fS1XXFxkXFxkLVxcZC9dLFxuICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dLFxuICAgICAgICBbJ1lZWVktTU0nLCAvXFxkezR9LVxcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgICAgIFsnWVlZWU1NREQnLCAvXFxkezh9L10sXG4gICAgICAgIC8vIFlZWVlNTSBpcyBOT1QgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmRcbiAgICAgICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICAgICAgWydHR0dHW1ddV1cnLCAvXFxkezR9V1xcZHsyfS8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZREREJywgL1xcZHs3fS9dXG4gICAgXTtcblxuICAgIC8vIGlzbyB0aW1lIGZvcm1hdHMgYW5kIHJlZ2V4ZXNcbiAgICB2YXIgaXNvVGltZXMgPSBbXG4gICAgICAgIFsnSEg6bW06c3MuU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISDptbTpzcyxTU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkLFxcZCsvXSxcbiAgICAgICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIOm1tJywgL1xcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgWydISG1tc3MuU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICAgICAgWydISG1tc3MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkL10sXG4gICAgICAgIFsnSEhtbScsIC9cXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISCcsIC9cXGRcXGQvXVxuICAgIF07XG5cbiAgICB2YXIgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKChcXC0/XFxkKykvaTtcblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlTTyhjb25maWcpIHtcbiAgICAgICAgdmFyIGksIGwsXG4gICAgICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaCA9IGV4dGVuZGVkSXNvUmVnZXguZXhlYyhzdHJpbmcpIHx8IGJhc2ljSXNvUmVnZXguZXhlYyhzdHJpbmcpLFxuICAgICAgICAgICAgYWxsb3dUaW1lLCBkYXRlRm9ybWF0LCB0aW1lRm9ybWF0LCB0ekZvcm1hdDtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmlzbyA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29EYXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvRGF0ZXNbaV1bMV0uZXhlYyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9IGlzb0RhdGVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1RpbWUgPSBpc29EYXRlc1tpXVsyXSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvVGltZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlICdUJyBvciBzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZUZvcm1hdCA9IChtYXRjaFsyXSB8fCAnICcpICsgaXNvVGltZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGltZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhbGxvd1RpbWUgJiYgdGltZUZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR6UmVnZXguZXhlYyhtYXRjaFs0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHpGb3JtYXQgPSAnWic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuX2YgPSBkYXRlRm9ybWF0ICsgKHRpbWVGb3JtYXQgfHwgJycpICsgKHR6Rm9ybWF0IHx8ICcnKTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUkZDIDI4MjIgcmVnZXg6IEZvciBkZXRhaWxzIHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjgyMiNzZWN0aW9uLTMuM1xuICAgIHZhciByZmMyODIyID0gL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfChbKy1dXFxkezR9KSkkLztcblxuICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpLFxuICAgICAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpLFxuICAgICAgICAgICAgcGFyc2VJbnQoZGF5U3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChob3VyU3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChtaW51dGVTdHIsIDEwKVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChzZWNvbmRTdHIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlSW50KHNlY29uZFN0ciwgMTApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhclN0cikge1xuICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KHllYXJTdHIsIDEwKTtcbiAgICAgICAgaWYgKHllYXIgPD0gNDkpIHtcbiAgICAgICAgICAgIHJldHVybiAyMDAwICsgeWVhcjtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyIDw9IDk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIDE5MDAgKyB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5ZWFyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgJyAnKS5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKS50cmltKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVudGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShwYXJzZWRJbnB1dFswXSwgcGFyc2VkSW5wdXRbMV0sIHBhcnNlZElucHV0WzJdKS5nZXREYXkoKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5UHJvdmlkZWQgIT09IHdlZWtkYXlBY3R1YWwpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgb2JzT2Zmc2V0cyA9IHtcbiAgICAgICAgVVQ6IDAsXG4gICAgICAgIEdNVDogMCxcbiAgICAgICAgRURUOiAtNCAqIDYwLFxuICAgICAgICBFU1Q6IC01ICogNjAsXG4gICAgICAgIENEVDogLTUgKiA2MCxcbiAgICAgICAgQ1NUOiAtNiAqIDYwLFxuICAgICAgICBNRFQ6IC02ICogNjAsXG4gICAgICAgIE1TVDogLTcgKiA2MCxcbiAgICAgICAgUERUOiAtNyAqIDYwLFxuICAgICAgICBQU1Q6IC04ICogNjBcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCk7XG4gICAgICAgICAgICB2YXIgbSA9IGhtICUgMTAwLCBoID0gKGhtIC0gbSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaCAqIDYwICsgbTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgYW5kIHRpbWUgZnJvbSByZWYgMjgyMiBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tUkZDMjgyMihjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcmZjMjgyMi5leGVjKHByZXByb2Nlc3NSRkMyODIyKGNvbmZpZy5faSkpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MobWF0Y2hbNF0sIG1hdGNoWzNdLCBtYXRjaFsyXSwgbWF0Y2hbNV0sIG1hdGNoWzZdLCBtYXRjaFs3XSk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXQgb3IgZmFsbGJhY2tcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG5cbiAgICAgICAgaWYgKG1hdGNoZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCttYXRjaGVkWzFdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmFsIGF0dGVtcHQsIHVzZSBJbnB1dCBGYWxsYmFja1xuICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgIH1cblxuICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrID0gZGVwcmVjYXRlKFxuICAgICAgICAndmFsdWUgcHJvdmlkZWQgaXMgbm90IGluIGEgcmVjb2duaXplZCBSRkMyODIyIG9yIElTTyBmb3JtYXQuIG1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlKCksICcgK1xuICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgJ2Rpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvICcgK1xuICAgICAgICAnaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9qcy1kYXRlLyBmb3IgbW9yZSBpbmZvLicsXG4gICAgICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIGhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgUkZDIDI4MjIgZm9ybVxuICAgIGhvb2tzLlJGQ18yODIyID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5SRkNfMjgyMikge1xuICAgICAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksIHBhcnNlZElucHV0LCB0b2tlbnMsIHRva2VuLCBza2lwcGVkLFxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggPSAwO1xuXG4gICAgICAgIHRva2VucyA9IGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8IFtdKVswXTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0b2tlbicsIHRva2VuLCAncGFyc2VkSW5wdXQnLCBwYXJzZWRJbnB1dCxcbiAgICAgICAgICAgIC8vICAgICAgICAgJ3JlZ2V4JywgZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHNraXBwZWQgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHNraXBwZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2Uoc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIHBhcnNlZElucHV0LCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlnLl9zdHJpY3QgJiYgIXBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB1bnBhcnNlZCBpbnB1dCBsZW5ndGggdG8gdGhlIHN0cmluZ1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5jaGFyc0xlZnRPdmVyID0gc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgICAgICBpZiAoY29uZmlnLl9hW0hPVVJdIDw9IDEyICYmXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID09PSB0cnVlICYmXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoY29uZmlnLl9sb2NhbGUsIGNvbmZpZy5fYVtIT1VSXSwgY29uZmlnLl9tZXJpZGllbSk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtRml4V3JhcCAobG9jYWxlLCBob3VyLCBtZXJpZGllbSkge1xuICAgICAgICB2YXIgaXNQbTtcblxuICAgICAgICBpZiAobWVyaWRpZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5tZXJpZGllbUhvdXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5tZXJpZGllbUhvdXIoaG91ciwgbWVyaWRpZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZS5pc1BNICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrXG4gICAgICAgICAgICBpc1BtID0gbG9jYWxlLmlzUE0obWVyaWRpZW0pO1xuICAgICAgICAgICAgaWYgKGlzUG0gJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbSAmJiBob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW5cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciB0ZW1wQ29uZmlnLFxuICAgICAgICAgICAgYmVzdE1vbWVudCxcblxuICAgICAgICAgICAgc2NvcmVUb0JlYXQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgY3VycmVudFNjb3JlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2YubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLl9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXBDb25maWcuX3VzZVVUQyA9IGNvbmZpZy5fdXNlVVRDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQodGVtcENvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZCh0ZW1wQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgdGhhdCB3YXMgbm90IHBhcnNlZCBhZGQgYSBwZW5hbHR5IGZvciB0aGF0IGZvcm1hdFxuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5jaGFyc0xlZnRPdmVyO1xuXG4gICAgICAgICAgICAvL29yIHRva2Vuc1xuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5zY29yZSA9IGN1cnJlbnRTY29yZTtcblxuICAgICAgICAgICAgaWYgKHNjb3JlVG9CZWF0ID09IG51bGwgfHwgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcbiAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbU9iamVjdChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpO1xuICAgICAgICBjb25maWcuX2EgPSBtYXAoW2kueWVhciwgaS5tb250aCwgaS5kYXkgfHwgaS5kYXRlLCBpLmhvdXIsIGkubWludXRlLCBpLnNlY29uZCwgaS5taWxsaXNlY29uZF0sIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db25maWcgKGNvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gbmV3IE1vbWVudChjaGVja092ZXJmbG93KHByZXBhcmVDb25maWcoY29uZmlnKSkpO1xuICAgICAgICBpZiAocmVzLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgaXMgc21hcnQgZW5vdWdoIGFyb3VuZCBEU1RcbiAgICAgICAgICAgIHJlcy5hZGQoMSwgJ2QnKTtcbiAgICAgICAgICAgIHJlcy5fbmV4dERheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcGFyZUNvbmZpZyAoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoe251bGxJbnB1dDogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTW9tZW50KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGlucHV0O1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gIGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlucHV0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQoY29uZmlnKSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2k7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dC52YWx1ZU9mKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9hID0gbWFwKGlucHV0LnNsaWNlKDApLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWxPclVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgaWYgKGxvY2FsZSA9PT0gdHJ1ZSB8fCBsb2NhbGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGlzT2JqZWN0KGlucHV0KSAmJiBpc09iamVjdEVtcHR5KGlucHV0KSkgfHxcbiAgICAgICAgICAgICAgICAoaXNBcnJheShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX3VzZVVUQyA9IGMuX2lzVVRDID0gaXNVVEM7XG4gICAgICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVGcm9tQ29uZmlnKGMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5taW4gaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5tYXggaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICB2YXIgcHJvdG90eXBlTWF4ID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heCAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQWZ0ZXInLCBhcmdzKTtcbiAgICB9XG5cbiAgICB2YXIgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3cgPyBEYXRlLm5vdygpIDogKyhuZXcgRGF0ZSgpKTtcbiAgICB9O1xuXG4gICAgdmFyIG9yZGVyaW5nID0gWyd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ107XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uVmFsaWQobSkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbSkge1xuICAgICAgICAgICAgaWYgKCEoaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJiAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bml0SGFzRGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobVtvcmRlcmluZ1tpXV0pIHtcbiAgICAgICAgICAgICAgICBpZiAodW5pdEhhc0RlY2ltYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvbmx5IGFsbG93IG5vbi1pbnRlZ2VycyBmb3Igc21hbGxlc3QgdW5pdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtW29yZGVyaW5nW2ldXSkgIT09IHRvSW50KG1bb3JkZXJpbmdbaV1dKSkge1xuICAgICAgICAgICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihOYU4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIER1cmF0aW9uIChkdXJhdGlvbikge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxuICAgICAgICAgICAgeWVhcnMgPSBub3JtYWxpemVkSW5wdXQueWVhciB8fCAwLFxuICAgICAgICAgICAgcXVhcnRlcnMgPSBub3JtYWxpemVkSW5wdXQucXVhcnRlciB8fCAwLFxuICAgICAgICAgICAgbW9udGhzID0gbm9ybWFsaXplZElucHV0Lm1vbnRoIHx8IDAsXG4gICAgICAgICAgICB3ZWVrcyA9IG5vcm1hbGl6ZWRJbnB1dC53ZWVrIHx8IDAsXG4gICAgICAgICAgICBkYXlzID0gbm9ybWFsaXplZElucHV0LmRheSB8fCAwLFxuICAgICAgICAgICAgaG91cnMgPSBub3JtYWxpemVkSW5wdXQuaG91ciB8fCAwLFxuICAgICAgICAgICAgbWludXRlcyA9IG5vcm1hbGl6ZWRJbnB1dC5taW51dGUgfHwgMCxcbiAgICAgICAgICAgIHNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQuc2Vjb25kIHx8IDAsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmQgfHwgMDtcblxuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gaXNEdXJhdGlvblZhbGlkKG5vcm1hbGl6ZWRJbnB1dCk7XG5cbiAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGRhdGVBZGRSZW1vdmVcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gK21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICBzZWNvbmRzICogMWUzICsgLy8gMTAwMFxuICAgICAgICAgICAgbWludXRlcyAqIDZlNCArIC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxuICAgICAgICAvLyBkYXkgd2hlbiB3b3JraW5nIGFyb3VuZCBEU1QsIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuX2RheXMgPSArZGF5cyArXG4gICAgICAgICAgICB3ZWVrcyAqIDc7XG4gICAgICAgIC8vIEl0IGlzIGltcG9zc2libGUgdG8gdHJhbnNsYXRlIG1vbnRocyBpbnRvIGRheXMgd2l0aG91dCBrbm93aW5nXG4gICAgICAgIC8vIHdoaWNoIG1vbnRocyB5b3UgYXJlIGFyZSB0YWxraW5nIGFib3V0LCBzbyB3ZSBoYXZlIHRvIHN0b3JlXG4gICAgICAgIC8vIGl0IHNlcGFyYXRlbHkuXG4gICAgICAgIHRoaXMuX21vbnRocyA9ICttb250aHMgK1xuICAgICAgICAgICAgcXVhcnRlcnMgKiAzICtcbiAgICAgICAgICAgIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRHVyYXRpb247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzUm91bmQgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoLTEgKiBudW1iZXIpICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0ICh0b2tlbiwgc2VwYXJhdG9yKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgICAgIHZhciBzaWduID0gJysnO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2lnbiArIHplcm9GaWxsKH5+KG9mZnNldCAvIDYwKSwgMikgKyBzZXBhcmF0b3IgKyB6ZXJvRmlsbCh+fihvZmZzZXQpICUgNjAsIDIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvZmZzZXQoJ1onLCAnOicpO1xuICAgIG9mZnNldCgnWlonLCAnJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdaJywgIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1paJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ1onLCAnWlonXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fdXNlVVRDID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl90em0gPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIHRpbWV6b25lIGNodW5rZXJcbiAgICAvLyAnKzEwOjAwJyA+IFsnMTAnLCAgJzAwJ11cbiAgICAvLyAnLTE1MzAnICA+IFsnLTE1JywgJzMwJ11cbiAgICB2YXIgY2h1bmtPZmZzZXQgPSAvKFtcXCtcXC1dfFxcZFxcZCkvZ2k7XG5cbiAgICBmdW5jdGlvbiBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoZXIsIHN0cmluZykge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IChzdHJpbmcgfHwgJycpLm1hdGNoKG1hdGNoZXIpO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaHVuayAgID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdO1xuICAgICAgICB2YXIgcGFydHMgICA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgICAgIHZhciBtaW51dGVzID0gKyhwYXJ0c1sxXSAqIDYwKSArIHRvSW50KHBhcnRzWzJdKTtcblxuICAgICAgICByZXR1cm4gbWludXRlcyA9PT0gMCA/XG4gICAgICAgICAgMCA6XG4gICAgICAgICAgcGFydHNbMF0gPT09ICcrJyA/IG1pbnV0ZXMgOiAtbWludXRlcztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxuICAgIGZ1bmN0aW9uIGNsb25lV2l0aE9mZnNldChpbnB1dCwgbW9kZWwpIHtcbiAgICAgICAgdmFyIHJlcywgZGlmZjtcbiAgICAgICAgaWYgKG1vZGVsLl9pc1VUQykge1xuICAgICAgICAgICAgcmVzID0gbW9kZWwuY2xvbmUoKTtcbiAgICAgICAgICAgIGRpZmYgPSAoaXNNb21lbnQoaW5wdXQpIHx8IGlzRGF0ZShpbnB1dCkgPyBpbnB1dC52YWx1ZU9mKCkgOiBjcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0KS5sb2NhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0ZU9mZnNldCAobSkge1xuICAgICAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9wdWxsLzE4NzFcbiAgICAgICAgcmV0dXJuIC1NYXRoLnJvdW5kKG0uX2QuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDE1KSAqIDE1O1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9tZW50IGlzIG11dGF0ZWQuXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG4gICAgaG9va3MudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbiAgICAvLyBhZmZlY3RpbmcgdGhlIGxvY2FsIGhvdXIuIFNvIDU6MzE6MjYgKzAzMDAgLS1bdXRjT2Zmc2V0KDIsIHRydWUpXS0tPlxuICAgIC8vIDU6MzE6MjYgKzAyMDAgSXQgaXMgcG9zc2libGUgdGhhdCA1OjMxOjI2IGRvZXNuJ3QgZXhpc3Qgd2l0aCBvZmZzZXRcbiAgICAvLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4gICAgLy9cbiAgICAvLyBLZWVwaW5nIHRoZSB0aW1lIGFjdHVhbGx5IGFkZHMvc3VidHJhY3RzIChvbmUgaG91cilcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbiAgICAvLyBhIHNlY29uZCB0aW1lLiBJbiBjYXNlIGl0IHdhbnRzIHVzIHRvIGNoYW5nZSB0aGUgb2Zmc2V0IGFnYWluXG4gICAgLy8gX2NoYW5nZUluUHJvZ3Jlc3MgPT0gdHJ1ZSBjYXNlLCB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0LCBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbiAgICBmdW5jdGlvbiBnZXRTZXRPZmZzZXQgKGlucHV0LCBrZWVwTG9jYWxUaW1lLCBrZWVwTWludXRlcykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICBsb2NhbEFkanVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYgJiYgIWtlZXBNaW51dGVzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3QgPSBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XG4gICAgICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBjcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSwgMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0Wm9uZSAoaW5wdXQsIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSAtaW5wdXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLXRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1VUQyAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9Mb2NhbCAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQgKCkge1xuICAgICAgICBpZiAodGhpcy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9pID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgICAgICBpZiAodFpvbmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRab25lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc0FsaWduZWRIb3VyT2Zmc2V0IChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBpbnB1dCA/IGNyZWF0ZUxvY2FsKGlucHV0KS51dGNPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWUgKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKSB8fFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCAoKSB7XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5faXNEU1RTaGlmdGVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgY29weUNvbmZpZyhjLCB0aGlzKTtcbiAgICAgICAgYyA9IHByZXBhcmVDb25maWcoYyk7XG5cbiAgICAgICAgaWYgKGMuX2EpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGMuX2lzVVRDID8gY3JlYXRlVVRDKGMuX2EpIDogY3JlYXRlTG9jYWwoYy5fYSk7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/ICF0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjT2Zmc2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgIHZhciBhc3BOZXRSZWdleCA9IC9eKFxcLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKVxcOihcXGQrKSg/OlxcOihcXGQrKShcXC5cXGQqKT8pPyQvO1xuXG4gICAgLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbiAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgIHZhciBpc29SZWdleCA9IC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEdXJhdGlvbiAoaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zIDogaW5wdXQuX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICBkICA6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE0gIDogaW5wdXQuX21vbnRoc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb25ba2V5XSA9IGlucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGFzcE5ldFJlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHkgIDogMCxcbiAgICAgICAgICAgICAgICBkICA6IHRvSW50KG1hdGNoW0RBVEVdKSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgaCAgOiB0b0ludChtYXRjaFtIT1VSXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIG0gIDogdG9JbnQobWF0Y2hbTUlOVVRFXSkgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBzICA6IHRvSW50KG1hdGNoW1NFQ09ORF0pICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXMgOiB0b0ludChhYnNSb3VuZChtYXRjaFtNSUxMSVNFQ09ORF0gKiAxMDAwKSkgKiBzaWduIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogKG1hdGNoWzFdID09PSAnKycpID8gMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE0gOiBwYXJzZUlzbyhtYXRjaFszXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgdyA6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGggOiBwYXJzZUlzbyhtYXRjaFs2XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgbSA6IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHsvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ29iamVjdCcgJiYgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLCBjcmVhdGVMb2NhbChkdXJhdGlvbi50bykpO1xuXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgZHVyYXRpb24ubXMgPSBkaWZmUmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGR1cmF0aW9uLk0gPSBkaWZmUmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvIChpbnAsIHNpZ24pIHtcbiAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cbiAgICAgICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcyA9IHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG5cbiAgICAgICAgcmVzLm1vbnRocyA9IG90aGVyLm1vbnRoKCkgLSBiYXNlLm1vbnRoKCkgK1xuICAgICAgICAgICAgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gKyhiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgaWYgKCEoYmFzZS5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKG5hbWUsICdtb21lbnQoKS4nICsgbmFtZSAgKyAnKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLicgKyBuYW1lICsgJyhudW1iZXIsIHBlcmlvZCkuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJyk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsOyB2YWwgPSBwZXJpb2Q7IHBlcmlvZCA9IHRtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyArdmFsIDogdmFsO1xuICAgICAgICAgICAgZHVyID0gY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgZHVyLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QgKG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgICAgICA9IGNyZWF0ZUFkZGVyKDEsICdhZGQnKTtcbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVBZGRlcigtMSwgJ3N1YnRyYWN0Jyk7XG5cbiAgICBmdW5jdGlvbiBnZXRDYWxlbmRhckZvcm1hdChteU1vbWVudCwgbm93KSB7XG4gICAgICAgIHZhciBkaWZmID0gbXlNb21lbnQuZGlmZihub3csICdkYXlzJywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBkaWZmIDwgLTYgPyAnc2FtZUVsc2UnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgLTEgPyAnbGFzdFdlZWsnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMCA/ICdsYXN0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDEgPyAnc2FtZURheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAyID8gJ25leHREYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgNyA/ICduZXh0V2VlaycgOiAnc2FtZUVsc2UnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyJDEgKHRpbWUsIGZvcm1hdHMpIHtcbiAgICAgICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cbiAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYWwvdXRjL29mZnNldCBvciBub3QuXG4gICAgICAgIHZhciBub3cgPSB0aW1lIHx8IGNyZWF0ZUxvY2FsKCksXG4gICAgICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGhvb2tzLmNhbGVuZGFyRm9ybWF0KHRoaXMsIHNvZCkgfHwgJ3NhbWVFbHNlJztcblxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0cyAmJiAoaXNGdW5jdGlvbihmb3JtYXRzW2Zvcm1hdF0pID8gZm9ybWF0c1tmb3JtYXRdLmNhbGwodGhpcywgbm93KSA6IGZvcm1hdHNbZm9ybWF0XSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWZ0ZXIgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQudmFsdWVPZigpIDwgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmVmb3JlIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyghaXNVbmRlZmluZWQodW5pdHMpID8gdW5pdHMgOiAnbWlsbGlzZWNvbmQnKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZXR3ZWVuIChmcm9tLCB0bywgdW5pdHMsIGluY2x1c2l2aXR5KSB7XG4gICAgICAgIGluY2x1c2l2aXR5ID0gaW5jbHVzaXZpdHkgfHwgJygpJztcbiAgICAgICAgcmV0dXJuIChpbmNsdXNpdml0eVswXSA9PT0gJygnID8gdGhpcy5pc0FmdGVyKGZyb20sIHVuaXRzKSA6ICF0aGlzLmlzQmVmb3JlKGZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknID8gdGhpcy5pc0JlZm9yZSh0bywgdW5pdHMpIDogIXRoaXMuaXNBZnRlcih0bywgdW5pdHMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWUgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpLFxuICAgICAgICAgICAgaW5wdXRNcztcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyB8fCAnbWlsbGlzZWNvbmQnKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRNcyA9IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCkgPD0gaW5wdXRNcyAmJiBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNBZnRlcihpbnB1dCx1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQmVmb3JlKGlucHV0LHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsXG4gICAgICAgICAgICB6b25lRGVsdGEsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzOyBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDsgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTsgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6IG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZiAoYSwgYikge1xuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIpICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMiwgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmcoa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZTtcbiAgICAgICAgdmFyIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCB1dGMgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuYyA9ICdtb21lbnQnO1xuICAgICAgICB2YXIgem9uZSA9ICcnO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHZhciB5ZWFyID0gKDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgdmFyIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHZhciBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQgKGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fFxuICAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe3RvOiB0aGlzLCBmcm9tOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7ZnJvbTogdGhpcywgdG86IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUgKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnRPZiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgc3dpdGNoIGludGVudGlvbmFsbHkgb21pdHMgYnJlYWsga2V5d29yZHNcbiAgICAgICAgLy8gdG8gdXRpbGl6ZSBmYWxsaW5nIHRocm91Z2ggdGhlIGNhc2VzLlxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgxKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWNvbmRzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZHMoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZWVrcyBhcmUgYSBzcGVjaWFsIGNhc2VcbiAgICAgICAgaWYgKHVuaXRzID09PSAnd2VlaycpIHtcbiAgICAgICAgICAgIHRoaXMud2Vla2RheSgwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdHMgPT09ICdpc29XZWVrJykge1xuICAgICAgICAgICAgdGhpcy5pc29XZWVrZGF5KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVhcnRlcnMgYXJlIGFsc28gc3BlY2lhbFxuICAgICAgICBpZiAodW5pdHMgPT09ICdxdWFydGVyJykge1xuICAgICAgICAgICAgdGhpcy5tb250aChNYXRoLmZsb29yKHRoaXMubW9udGgoKSAvIDMpICogMyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRPZiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICdkYXRlJyBpcyBhbiBhbGlhcyBmb3IgJ2RheScsIHNvIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHN1Y2guXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB1bml0cyA9ICdkYXknO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0cykuYWRkKDEsICh1bml0cyA9PT0gJ2lzb1dlZWsnID8gJ3dlZWsnIDogdW5pdHMpKS5zdWJ0cmFjdCgxLCAnbXMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZU9mICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2QudmFsdWVPZigpIC0gKCh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5peCAoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9EYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0FycmF5ICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW20ueWVhcigpLCBtLm1vbnRoKCksIG0uZGF0ZSgpLCBtLmhvdXIoKSwgbS5taW51dGUoKSwgbS5zZWNvbmQoKSwgbS5taWxsaXNlY29uZCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b09iamVjdCAoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXJzOiBtLnllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoczogbS5tb250aCgpLFxuICAgICAgICAgICAgZGF0ZTogbS5kYXRlKCksXG4gICAgICAgICAgICBob3VyczogbS5ob3VycygpLFxuICAgICAgICAgICAgbWludXRlczogbS5taW51dGVzKCksXG4gICAgICAgICAgICBzZWNvbmRzOiBtLnNlY29uZHMoKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogbS5taWxsaXNlY29uZHMoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgICAgIC8vIG5ldyBEYXRlKE5hTikudG9KU09OKCkgPT09IG51bGxcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy50b0lTT1N0cmluZygpIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDIgKCkge1xuICAgICAgICByZXR1cm4gaXNWYWxpZCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzaW5nRmxhZ3MgKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCAoKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRpb25EYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuX2YsXG4gICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgICAgIHN0cmljdDogdGhpcy5fc3RyaWN0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4gKHRva2VuLCBnZXR0ZXIpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4oMCwgW3Rva2VuLCB0b2tlbi5sZW5ndGhdLCAwLCBnZXR0ZXIpO1xuICAgIH1cblxuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2cnLCAgICAgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAgICAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgICdpc29XZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtZZWFyJywgJ2dnJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrWWVhcicsICdHRycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2Vla1llYXInLCAxKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtZZWFyJywgMSk7XG5cblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0cnLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdnJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0dHJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnZycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnZ2cnLCAnZ2dnZ2cnLCAnR0dHRycsICdHR0dHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMildID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZycsICdHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWsoKSxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXkoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy5pc29XZWVrKCksIHRoaXMuaXNvV2Vla2RheSgpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJblllYXIgKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2Vla3NUYXJnZXQgPSB3ZWVrc0luWWVhcihpbnB1dCwgZG93LCBkb3kpO1xuICAgICAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZShkYXlPZlllYXJEYXRhLnllYXIsIDAsIGRheU9mWWVhckRhdGEuZGF5T2ZZZWFyKTtcblxuICAgICAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgICAgICB0aGlzLmRhdGUoZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3F1YXJ0ZXInLCAnUScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgncXVhcnRlcicsIDcpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUScsIG1hdGNoMSk7XG4gICAgYWRkUGFyc2VUb2tlbignUScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gKHRvSW50KGlucHV0KSAtIDEpICogMztcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFF1YXJ0ZXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gTWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkgKyAxKSAvIDMpIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyB0aGlzLm1vbnRoKCkgJSAzKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignRCcsIFsnREQnLCAyXSwgJ0RvJywgJ2RhdGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF0ZScsICdEJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF0ZScsIDkpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgP1xuICAgICAgICAgIChsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2UgfHwgbG9jYWxlLl9vcmRpbmFsUGFyc2UpIDpcbiAgICAgICAgICBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50O1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG4gICAgYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQubWF0Y2gobWF0Y2gxdG8yKVswXSk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheU9mWWVhcicsICdEREQnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXlPZlllYXInLCA0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0RERCcsICBtYXRjaDF0bzMpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REREQnLCBtYXRjaDMpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydEREQnLCAnRERERCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZlllYXIgKGlucHV0KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXIgPSBNYXRoLnJvdW5kKCh0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykgLSB0aGlzLmNsb25lKCkuc3RhcnRPZigneWVhcicpKSAvIDg2NGU1KSArIDE7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoKGlucHV0IC0gZGF5T2ZZZWFyKSwgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignbScsIFsnbW0nLCAyXSwgMCwgJ21pbnV0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaW51dGUnLCAnbScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbWludXRlJywgMTQpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignbScsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3NlY29uZCcsICdzJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdzZWNvbmQnLCAxNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3MnLCAnc3MnXSwgU0VDT05EKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwMDtcbiAgICB9KTtcblxuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaWxsaXNlY29uZCcsICdtcycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbWlsbGlzZWNvbmQnLCAxNik7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdTJywgICAgbWF0Y2gxdG8zLCBtYXRjaDEpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTJywgICBtYXRjaDF0bzMsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignU1NTJywgIG1hdGNoMXRvMywgbWF0Y2gzKTtcblxuICAgIHZhciB0b2tlbjtcbiAgICBmb3IgKHRva2VuID0gJ1NTU1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFJlZ2V4VG9rZW4odG9rZW4sIG1hdGNoVW5zaWduZWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlTXMoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01JTExJU0VDT05EXSA9IHRvSW50KCgnMC4nICsgaW5wdXQpICogMTAwMCk7XG4gICAgfVxuXG4gICAgZm9yICh0b2tlbiA9ICdTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBwYXJzZU1zKTtcbiAgICB9XG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAgMCwgMCwgJ3pvbmVBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3p6JywgMCwgMCwgJ3pvbmVOYW1lJyk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRab25lQWJiciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCAgICAgICAgICAgICAgID0gYWRkO1xuICAgIHByb3RvLmNhbGVuZGFyICAgICAgICAgID0gY2FsZW5kYXIkMTtcbiAgICBwcm90by5jbG9uZSAgICAgICAgICAgICA9IGNsb25lO1xuICAgIHByb3RvLmRpZmYgICAgICAgICAgICAgID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiAgICAgICAgICAgICA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCAgICAgICAgICAgID0gZm9ybWF0O1xuICAgIHByb3RvLmZyb20gICAgICAgICAgICAgID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ICAgICAgICAgICA9IGZyb21Ob3c7XG4gICAgcHJvdG8udG8gICAgICAgICAgICAgICAgPSB0bztcbiAgICBwcm90by50b05vdyAgICAgICAgICAgICA9IHRvTm93O1xuICAgIHByb3RvLmdldCAgICAgICAgICAgICAgID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCAgICAgICAgID0gaW52YWxpZEF0O1xuICAgIHByb3RvLmlzQWZ0ZXIgICAgICAgICAgID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSAgICAgICAgICA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiAgICAgICAgID0gaXNCZXR3ZWVuO1xuICAgIHByb3RvLmlzU2FtZSAgICAgICAgICAgID0gaXNTYW1lO1xuICAgIHByb3RvLmlzU2FtZU9yQWZ0ZXIgICAgID0gaXNTYW1lT3JBZnRlcjtcbiAgICBwcm90by5pc1NhbWVPckJlZm9yZSAgICA9IGlzU2FtZU9yQmVmb3JlO1xuICAgIHByb3RvLmlzVmFsaWQgICAgICAgICAgID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgICAgICAgICAgICAgID0gbGFuZztcbiAgICBwcm90by5sb2NhbGUgICAgICAgICAgICA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhICAgICAgICA9IGxvY2FsZURhdGE7XG4gICAgcHJvdG8ubWF4ICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNaW47XG4gICAgcHJvdG8ucGFyc2luZ0ZsYWdzICAgICAgPSBwYXJzaW5nRmxhZ3M7XG4gICAgcHJvdG8uc2V0ICAgICAgICAgICAgICAgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiAgICAgICAgICAgPSBzdGFydE9mO1xuICAgIHByb3RvLnN1YnRyYWN0ICAgICAgICAgID0gc3VidHJhY3Q7XG4gICAgcHJvdG8udG9BcnJheSAgICAgICAgICAgPSB0b0FycmF5O1xuICAgIHByb3RvLnRvT2JqZWN0ICAgICAgICAgID0gdG9PYmplY3Q7XG4gICAgcHJvdG8udG9EYXRlICAgICAgICAgICAgPSB0b0RhdGU7XG4gICAgcHJvdG8udG9JU09TdHJpbmcgICAgICAgPSB0b0lTT1N0cmluZztcbiAgICBwcm90by5pbnNwZWN0ICAgICAgICAgICA9IGluc3BlY3Q7XG4gICAgcHJvdG8udG9KU09OICAgICAgICAgICAgPSB0b0pTT047XG4gICAgcHJvdG8udG9TdHJpbmcgICAgICAgICAgPSB0b1N0cmluZztcbiAgICBwcm90by51bml4ICAgICAgICAgICAgICA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiAgICAgICAgICAgPSB2YWx1ZU9mO1xuICAgIHByb3RvLmNyZWF0aW9uRGF0YSAgICAgID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLnllYXIgICAgICAgPSBnZXRTZXRZZWFyO1xuICAgIHByb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuICAgIHByb3RvLndlZWtZZWFyICAgID0gZ2V0U2V0V2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcbiAgICBwcm90by5xdWFydGVyID0gcHJvdG8ucXVhcnRlcnMgPSBnZXRTZXRRdWFydGVyO1xuICAgIHByb3RvLm1vbnRoICAgICAgID0gZ2V0U2V0TW9udGg7XG4gICAgcHJvdG8uZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbiAgICBwcm90by53ZWVrICAgICAgICAgICA9IHByb3RvLndlZWtzICAgICAgICA9IGdldFNldFdlZWs7XG4gICAgcHJvdG8uaXNvV2VlayAgICAgICAgPSBwcm90by5pc29XZWVrcyAgICAgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyICAgID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcbiAgICBwcm90by5kYXRlICAgICAgID0gZ2V0U2V0RGF5T2ZNb250aDtcbiAgICBwcm90by5kYXkgICAgICAgID0gcHJvdG8uZGF5cyAgICAgICAgICAgICA9IGdldFNldERheU9mV2VlaztcbiAgICBwcm90by53ZWVrZGF5ICAgID0gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrO1xuICAgIHByb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG4gICAgcHJvdG8uZGF5T2ZZZWFyICA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCAgICAgICAgICAgID0gZ2V0U2V0T2Zmc2V0O1xuICAgIHByb3RvLnV0YyAgICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9VVEM7XG4gICAgcHJvdG8ubG9jYWwgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb0xvY2FsO1xuICAgIHByb3RvLnBhcnNlWm9uZSAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCAgICAgICAgICAgICAgICA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgICAgICAgICAgICAgID0gaXNMb2NhbDtcbiAgICBwcm90by5pc1V0Y09mZnNldCAgICAgICAgICA9IGlzVXRjT2Zmc2V0O1xuICAgIHByb3RvLmlzVXRjICAgICAgICAgICAgICAgID0gaXNVdGM7XG4gICAgcHJvdG8uaXNVVEMgICAgICAgICAgICAgICAgPSBpc1V0YztcbiAgICBwcm90by56b25lQWJiciA9IGdldFpvbmVBYmJyO1xuICAgIHByb3RvLnpvbmVOYW1lID0gZ2V0Wm9uZU5hbWU7XG4gICAgcHJvdG8uZGF0ZXMgID0gZGVwcmVjYXRlKCdkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLicsIGdldFNldERheU9mTW9udGgpO1xuICAgIHByb3RvLm1vbnRocyA9IGRlcHJlY2F0ZSgnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJywgZ2V0U2V0TW9udGgpO1xuICAgIHByb3RvLnllYXJzICA9IGRlcHJlY2F0ZSgneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsIGdldFNldFllYXIpO1xuICAgIHByb3RvLnpvbmUgICA9IGRlcHJlY2F0ZSgnbW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3Mvem9uZS8nLCBnZXRTZXRab25lKTtcbiAgICBwcm90by5pc0RTVFNoaWZ0ZWQgPSBkZXByZWNhdGUoJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLCBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQpO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peCAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0ICogMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5ab25lICgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0IChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyICAgICAgICA9IGNhbGVuZGFyO1xuICAgIHByb3RvJDEubG9uZ0RhdGVGb3JtYXQgID0gbG9uZ0RhdGVGb3JtYXQ7XG4gICAgcHJvdG8kMS5pbnZhbGlkRGF0ZSAgICAgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgICAgICAgICA9IG9yZGluYWw7XG4gICAgcHJvdG8kMS5wcmVwYXJzZSAgICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5yZWxhdGl2ZVRpbWUgICAgPSByZWxhdGl2ZVRpbWU7XG4gICAgcHJvdG8kMS5wYXN0RnV0dXJlICAgICAgPSBwYXN0RnV0dXJlO1xuICAgIHByb3RvJDEuc2V0ICAgICAgICAgICAgID0gc2V0O1xuXG4gICAgcHJvdG8kMS5tb250aHMgICAgICAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHM7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydCAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNTaG9ydDtcbiAgICBwcm90byQxLm1vbnRoc1BhcnNlICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggICAgICAgPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggID0gbW9udGhzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWsgPSBsb2NhbGVXZWVrO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZlllYXIgPSBsb2NhbGVGaXJzdERheU9mWWVhcjtcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZXZWVrID0gbG9jYWxlRmlyc3REYXlPZldlZWs7XG5cbiAgICBwcm90byQxLndlZWtkYXlzICAgICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzO1xuICAgIHByb3RvJDEud2Vla2RheXNNaW4gICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1Nob3J0O1xuICAgIHByb3RvJDEud2Vla2RheXNQYXJzZSAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNQYXJzZTtcblxuICAgIHByb3RvJDEud2Vla2RheXNSZWdleCAgICAgICA9ICAgICAgICB3ZWVrZGF5c1JlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydFJlZ2V4ICA9ICAgICAgICB3ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pblJlZ2V4ICAgID0gICAgICAgIHdlZWtkYXlzTWluUmVnZXg7XG5cbiAgICBwcm90byQxLmlzUE0gPSBsb2NhbGVJc1BNO1xuICAgIHByb3RvJDEubWVyaWRpZW0gPSBsb2NhbGVNZXJpZGllbTtcblxuICAgIGZ1bmN0aW9uIGdldCQxIChmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKTtcbiAgICAgICAgdmFyIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsIChmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCBpLCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICAvLyAoKVxuICAgIC8vICg1KVxuICAgIC8vIChmbXQsIDUpXG4gICAgLy8gKGZtdClcbiAgICAvLyAodHJ1ZSlcbiAgICAvLyAodHJ1ZSwgNSlcbiAgICAvLyAodHJ1ZSwgZm10LCA1KVxuICAgIC8vICh0cnVlLCBmbXQpXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzSW1wbCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gbG9jYWxlU29ydGVkO1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBsb2NhbGVTb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDA7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIChpbmRleCArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIChpICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHMgKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQgKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5cyAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzU2hvcnQgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNNaW4nKTtcbiAgICB9XG5cbiAgICBnZXRTZXRHbG9iYWxMb2NhbGUoJ2VuJywge1xuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRvSW50KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuJywgZ2V0U2V0R2xvYmFsTG9jYWxlKTtcbiAgICBob29rcy5sYW5nRGF0YSA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLicsIGdldExvY2FsZSk7XG5cbiAgICB2YXIgbWF0aEFicyA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gYWJzICgpIHtcbiAgICAgICAgdmFyIGRhdGEgICAgICAgICAgID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgICAgICAgICA9IG1hdGhBYnModGhpcy5fZGF5cyk7XG4gICAgICAgIHRoaXMuX21vbnRocyAgICAgICA9IG1hdGhBYnModGhpcy5fbW9udGhzKTtcblxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyAgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzICAgICAgID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgICAgICAgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgICAgIGRhdGEubW9udGhzICAgICAgICA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzICAgICAgICAgPSBtYXRoQWJzKGRhdGEueWVhcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0JDEgKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgICAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fZGF5cztcbiAgICAgICAgZHVyYXRpb24uX21vbnRocyAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgICAgIHJldHVybiBkdXJhdGlvbi5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGFkZCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEgKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIC0xKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNDZWlsIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWJibGUgKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuICAgICAgICB2YXIgZGF5cyAgICAgICAgID0gdGhpcy5fZGF5cztcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IHRoaXMuX21vbnRocztcbiAgICAgICAgdmFyIGRhdGEgICAgICAgICA9IHRoaXMuX2RhdGE7XG4gICAgICAgIHZhciBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgeWVhcnMsIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmICghKChtaWxsaXNlY29uZHMgPj0gMCAmJiBkYXlzID49IDAgJiYgbW9udGhzID49IDApIHx8XG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA8PSAwICYmIGRheXMgPD0gMCAmJiBtb250aHMgPD0gMCkpKSB7XG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgKz0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzKSArIGRheXMpICogODY0ZTU7XG4gICAgICAgICAgICBkYXlzID0gMDtcbiAgICAgICAgICAgIG1vbnRocyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgYnViYmxlcyB1cCB2YWx1ZXMsIHNlZSB0aGUgdGVzdHMgZm9yXG4gICAgICAgIC8vIGV4YW1wbGVzIG9mIHdoYXQgdGhhdCBtZWFucy5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgIHNlY29uZHMgICAgICAgICAgID0gYWJzRmxvb3IobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgID0gc2Vjb25kcyAlIDYwO1xuXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgPSBtaW51dGVzICUgNjA7XG5cbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICA9IGhvdXJzICUgMjQ7XG5cbiAgICAgICAgZGF5cyArPSBhYnNGbG9vcihob3VycyAvIDI0KTtcblxuICAgICAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgICAgIG1vbnRoc0Zyb21EYXlzID0gYWJzRmxvb3IoZGF5c1RvTW9udGhzKGRheXMpKTtcbiAgICAgICAgbW9udGhzICs9IG1vbnRoc0Zyb21EYXlzO1xuICAgICAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIGRhdGEuZGF5cyAgID0gZGF5cztcbiAgICAgICAgZGF0YS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIGRhdGEueWVhcnMgID0geWVhcnM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c1RvTW9udGhzIChkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiBkYXlzICogNDgwMCAvIDE0NjA5NztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNUb0RheXMgKG1vbnRocykge1xuICAgICAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICAgICAgcmV0dXJuIG1vbnRocyAqIDE0NjA5NyAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXMgKHVuaXRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheXM7XG4gICAgICAgIHZhciBtb250aHM7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSAnbW9udGgnIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgICA9IHRoaXMuX2RheXMgICArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXRzID09PSAnbW9udGgnID8gbW9udGhzIDogbW9udGhzIC8gMTI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIE1hdGgucm91bmQobW9udGhzVG9EYXlzKHRoaXMuX21vbnRocykpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnICAgOiByZXR1cm4gZGF5cyAvIDcgICAgICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheScgICAgOiByZXR1cm4gZGF5cyAgICAgICAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cicgICA6IHJldHVybiBkYXlzICogMjQgICAgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZScgOiByZXR1cm4gZGF5cyAqIDE0NDAgICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCcgOiByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6IHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuICAgIGZ1bmN0aW9uIHZhbHVlT2YkMSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzIChhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKTtcbiAgICB2YXIgYXNTZWNvbmRzICAgICAgPSBtYWtlQXMoJ3MnKTtcbiAgICB2YXIgYXNNaW51dGVzICAgICAgPSBtYWtlQXMoJ20nKTtcbiAgICB2YXIgYXNIb3VycyAgICAgICAgPSBtYWtlQXMoJ2gnKTtcbiAgICB2YXIgYXNEYXlzICAgICAgICAgPSBtYWtlQXMoJ2QnKTtcbiAgICB2YXIgYXNXZWVrcyAgICAgICAgPSBtYWtlQXMoJ3cnKTtcbiAgICB2YXIgYXNNb250aHMgICAgICAgPSBtYWtlQXMoJ00nKTtcbiAgICB2YXIgYXNZZWFycyAgICAgICAgPSBtYWtlQXMoJ3knKTtcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzW3VuaXRzICsgJ3MnXSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyk7XG4gICAgdmFyIHNlY29uZHMgICAgICA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKTtcbiAgICB2YXIgbWludXRlcyAgICAgID0gbWFrZUdldHRlcignbWludXRlcycpO1xuICAgIHZhciBob3VycyAgICAgICAgPSBtYWtlR2V0dGVyKCdob3VycycpO1xuICAgIHZhciBkYXlzICAgICAgICAgPSBtYWtlR2V0dGVyKCdkYXlzJyk7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IG1ha2VHZXR0ZXIoJ21vbnRocycpO1xuICAgIHZhciB5ZWFycyAgICAgICAgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MgKCkge1xuICAgICAgICByZXR1cm4gYWJzRmxvb3IodGhpcy5kYXlzKCkgLyA3KTtcbiAgICB9XG5cbiAgICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xuICAgIHZhciB0aHJlc2hvbGRzID0ge1xuICAgICAgICBzczogNDQsICAgICAgICAgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgIHMgOiA0NSwgICAgICAgICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtIDogNDUsICAgICAgICAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgIGggOiAyMiwgICAgICAgICAvLyBob3VycyB0byBkYXlcbiAgICAgICAgZCA6IDI2LCAgICAgICAgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgTSA6IDExICAgICAgICAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpO1xuICAgICAgICB2YXIgc2Vjb25kcyAgPSByb3VuZChkdXJhdGlvbi5hcygncycpKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSk7XG4gICAgICAgIHZhciBob3VycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpO1xuICAgICAgICB2YXIgZGF5cyAgICAgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKTtcbiAgICAgICAgdmFyIG1vbnRocyAgID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSk7XG4gICAgICAgIHZhciB5ZWFycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpO1xuXG4gICAgICAgIHZhciBhID0gc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdICB8fFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgICAmJiBbJ3NzJywgc2Vjb25kc10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAgICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ2gnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICAgJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAgICYmIFsnZCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGRheXMgICAgPCB0aHJlc2hvbGRzLmQgICAmJiBbJ2RkJywgZGF5c10gICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAgICYmIFsnTU0nLCBtb250aHNdICB8fFxuICAgICAgICAgICAgICAgIHllYXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ3knXSAgICAgICAgICAgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yocm91bmRpbmdGdW5jdGlvbikgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJvdW5kID0gcm91bmRpbmdGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQgKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZSAod2l0aFN1ZmZpeCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoKHggPiAwKSAtICh4IDwgMCkpIHx8ICt4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nJDEoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDA7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSBhYnMkMSh0aGlzLl9kYXlzKTtcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IGFicyQxKHRoaXMuX21vbnRocyk7XG4gICAgICAgIHZhciBtaW51dGVzLCBob3VycywgeWVhcnM7XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBzZWNvbmRzICU9IDYwO1xuICAgICAgICBtaW51dGVzICU9IDYwO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cblxuICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICB2YXIgWSA9IHllYXJzO1xuICAgICAgICB2YXIgTSA9IG1vbnRocztcbiAgICAgICAgdmFyIEQgPSBkYXlzO1xuICAgICAgICB2YXIgaCA9IGhvdXJzO1xuICAgICAgICB2YXIgbSA9IG1pbnV0ZXM7XG4gICAgICAgIHZhciBzID0gc2Vjb25kcyA/IHNlY29uZHMudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgJycpIDogJyc7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgZGF5c1NpZ24gPSBzaWduKHRoaXMuX2RheXMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gdG90YWxTaWduICsgJ1AnICtcbiAgICAgICAgICAgIChZID8geW1TaWduICsgWSArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAoTSA/IHltU2lnbiArIE0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKEQgPyBkYXlzU2lnbiArIEQgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgKChoIHx8IG0gfHwgcykgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGggPyBobXNTaWduICsgaCArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobSA/IGhtc1NpZ24gKyBtICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJyk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDIgPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBwcm90byQyLmlzVmFsaWQgICAgICAgID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzICAgICAgICAgICAgPSBhYnM7XG4gICAgcHJvdG8kMi5hZGQgICAgICAgICAgICA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgICAgICAgICAgICAgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyAgICAgID0gYXNNaW51dGVzO1xuICAgIHByb3RvJDIuYXNIb3VycyAgICAgICAgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG4gICAgcHJvdG8kMi5hc1dlZWtzICAgICAgICA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyAgICAgICA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xuICAgIHByb3RvJDIudmFsdWVPZiAgICAgICAgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlICAgICAgICA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lICAgICAgICAgID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgICA9IG1pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLnNlY29uZHMgICAgICAgID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzICAgICAgICAgID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzICAgICAgICAgICA9IGRheXM7XG4gICAgcHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xuICAgIHByb3RvJDIubW9udGhzICAgICAgICAgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyAgICAgICAgICA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvJDIubG9jYWxlRGF0YSAgICAgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZSgndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLCB0b0lTT1N0cmluZyQxKTtcbiAgICBwcm90byQyLmxhbmcgPSBsYW5nO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1gnLCAwLCAwLCAndW5peCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3gnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbiAgICBhZGRQYXJzZVRva2VuKCdYJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQsIDEwKSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuXG4gICAgaG9va3MudmVyc2lvbiA9ICcyLjIyLjEnO1xuXG4gICAgc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuICAgIGhvb2tzLmZuICAgICAgICAgICAgICAgICAgICA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiAgICAgICAgICAgICAgICAgICA9IG1pbjtcbiAgICBob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG4gICAgaG9va3Mubm93ICAgICAgICAgICAgICAgICAgID0gbm93O1xuICAgIGhvb2tzLnV0YyAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuICAgIGhvb2tzLm1vbnRocyAgICAgICAgICAgICAgICA9IGxpc3RNb250aHM7XG4gICAgaG9va3MuaXNEYXRlICAgICAgICAgICAgICAgID0gaXNEYXRlO1xuICAgIGhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbiAgICBob29rcy5pbnZhbGlkICAgICAgICAgICAgICAgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uICAgICAgICAgICAgICA9IGNyZWF0ZUR1cmF0aW9uO1xuICAgIGhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzICAgICAgICAgICAgICA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgICAgICAgICAgICAgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gICAgICAgICAgICA9IGlzRHVyYXRpb247XG4gICAgaG9va3MubW9udGhzU2hvcnQgICAgICAgICAgID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgICAgICAgICAgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlICAgICAgICAgID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgICAgICAgICA9IGxpc3RXZWVrZGF5c1Nob3J0O1xuICAgIGhvb2tzLm5vcm1hbGl6ZVVuaXRzICAgICAgICA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nICA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbiAgICBob29rcy5wcm90b3R5cGUgICAgICAgICAgICAgPSBwcm90bztcblxuICAgIC8vIGN1cnJlbnRseSBIVE1MNSBpbnB1dCB0eXBlIG9ubHkgc3VwcG9ydHMgMjQtaG91ciBmb3JtYXRzXG4gICAgaG9va3MuSFRNTDVfRk1UID0ge1xuICAgICAgICBEQVRFVElNRV9MT0NBTDogJ1lZWVktTU0tRERUSEg6bW0nLCAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfU0VDT05EUzogJ1lZWVktTU0tRERUSEg6bW06c3MnLCAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsICAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIERBVEU6ICdZWVlZLU1NLUREJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ1lZWVktW1ddV1cnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBNYWluIGZ1bmN0aW9uIGFuZCBlbnRyeSBwb2ludFxuICAgIENhbiBiZSByZWdpc3RlcmVkIHRvIGEgdmlkZW9qcyBpbnN0YW5jZSBhcyBhIHBsdWdpblxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSAodmlkZW9qcykgPT4ge1xuICAgIHJlcXVpcmUoJy4vbGliL3BvbHlmaWxscycpO1xuXG4gICAgY29uc3QgUGx1Z2luID0gdmlkZW9qcy5nZXRQbHVnaW4oJ3BsdWdpbicpLFxuICAgICAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi9saWIvdXRpbHMnKSxcbiAgICAgICAgICBDb250cm9scyA9IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvY29udHJvbHNcIiksXG4gICAgICAgICAgQW5ub3RhdGlvblN0YXRlID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9hbm5vdGF0aW9uX3N0YXRlXCIpLFxuICAgICAgICAgIEV2ZW50RGlzcGF0Y2hlciA9IHJlcXVpcmUoXCIuL2xpYi9ldmVudF9kaXNwYXRjaGVyXCIpO1xuXG4gICAgY29uc3QgREVGQVVMVF9PUFRJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGJpbmRBcnJvd0tleXM6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBtZXRhOiAgICAgICAgICAgICAgICAgICAgICAgeyB1c2VyX2lkOiBudWxsLCB1c2VyX25hbWU6IG51bGwgfSxcbiAgICAgICAgYW5ub3RhdGlvbnNPYmplY3RzOiAgICAgICAgIFtdLFxuICAgICAgICBzaG93Q29udHJvbHM6ICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc2hvd0NvbW1lbnRMaXN0OiAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHNob3dGdWxsU2NyZWVuOiAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBzaG93TWFya2VyU2hhcGVBbmRUb29sdGlwczogdHJ1ZSxcbiAgICAgICAgaW50ZXJuYWxDb21tZW50aW5nOiAgICAgICAgIHRydWUsXG4gICAgICAgIHN0YXJ0SW5Bbm5vdGF0aW9uTW9kZTogICAgICBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNsYXNzIEFubm90YXRpb25Db21tZW50cyBleHRlbmRzIFBsdWdpbiB7XG5cbiAgICAgICAgY29uc3RydWN0b3IgKHBsYXllciwgb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oVXRpbHMuY2xvbmVPYmplY3QoREVGQVVMVF9PUFRJT05TKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5yZWdpc3Rlckxpc3RlbmVyc0Zvcih0aGlzLCAnQW5ub3RhdGlvbkNvbW1lbnRzJyk7XG5cbiAgICAgICAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgICAgICAgICAgdGhpcy5tZXRhID0gb3B0aW9ucy5tZXRhO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICAgICAgdGhpcy5fcmVhZHlDYWxsYmFja3MgPSBbXTtcblxuICAgICAgICAgICAgLy8gQXNzaWduIHJlZmVyZW5jZSB0byB0aGlzIGNsYXNzIHRvIHBsYXllciBmb3IgYWNjZXNzIGxhdGVyIGJ5IGNvbXBvbmVudHMgd2hlcmUgbmVlZGVkXG4gICAgICAgICAgICBwbGF5ZXIuYW5ub3RhdGlvbkNvbW1lbnRzID0gKCgpID0+IHsgcmV0dXJuIHRoaXMgfSkuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgY29tcG9uZW50cyBhcmUgaW5pdGlhbGl6ZWQgQUZURVIgbWV0YWRhdGEgKyBwbGF5IGRhdGEgaXMgbG9hZGVkIHNvIHdlIG1ldGFkYXRhL2R1cmF0aW9uXG4gICAgICAgICAgICAvLyBOT1RFIC0gdGhpcyBjaGVjayBpcyByZXF1aXJlZCBiZWNhdXNlIHBsYXllciBsb2FkZWRkYXRhIGRvZXNuJ3QgYWx3YXlzIGZpcmUgaWYgcmVhZHlzdGF0ZSBpcyA+IDNcbiAgICAgICAgICAgIGlmKHBsYXllci5yZWFkeVN0YXRlKCkgPj0gMyl7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3N0TG9hZERhdGFDb25zdHJ1Y3RvcigpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcGxheWVyLm9uKCdsb2FkZWRkYXRhJywgdGhpcy5wb3N0TG9hZERhdGFDb25zdHJ1Y3Rvci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgaW5pdC9zZXR1cCBhZnRlciB2aWRlbyBkYXRhICsgbWV0YWRhdGEgaXMgYXZhaWxhYmxlXG4gICAgICAgIHBvc3RMb2FkRGF0YUNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgICAgIC8vIHNldHVwIGluaXRpYWwgc3RhdGUgYW5kIHJlbmRlciBVSVxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RhdGUgPSBuZXcgQW5ub3RhdGlvblN0YXRlKHRoaXMucGxheWVyKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0YXRlLmFubm90YXRpb25zID0gdGhpcy5vcHRpb25zLmFubm90YXRpb25zT2JqZWN0cztcblxuICAgICAgICAgICAgdGhpcy5jb250cm9scyA9IG5ldyBDb250cm9scyh0aGlzLnBsYXllciwgdGhpcy5vcHRpb25zLmJpbmRBcnJvd0tleXMpO1xuICAgICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLnNldEJvdW5kcyhmYWxzZSk7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuc3RhcnRJbkFubm90YXRpb25Nb2RlKSB0aGlzLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2luUmVhZHkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJpbmQgbmVlZGVkIGV2ZW50cyBmb3IgaW50ZXJhY3Rpb24gdy8gY29tcG9uZW50c1xuICAgICAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgICAgIC8vIFNldCBwbGF5ZXIgYm91bmRhcmllcyBvbiB3aW5kb3cgc2l6ZSBjaGFuZ2Ugb3IgZnVsbHNjcmVlbiBjaGFuZ2VcbiAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplLnZhYy13aW5kb3ctcmVzaXplJywgVXRpbHMudGhyb3R0bGUodGhpcy5zZXRCb3VuZHMuYmluZCh0aGlzKSwgNTAwKSk7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5vbignZnVsbHNjcmVlbmNoYW5nZScsIFV0aWxzLnRocm90dGxlKHRoaXMuc2V0Qm91bmRzLmJpbmQodGhpcyksIDUwMCkpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgYW5ub3RhdGlvbiBmZWF0dXJlcyBvbiBmdWxsc2NyZWVuIGlmIHNob3dGdWxsU2NyZWVuOiBmYWxzZVxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2hvd0Z1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5vbignZnVsbHNjcmVlbmNoYW5nZScsICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5pc0Z1bGxzY3JlZW5fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZUZ1bGxzY3JlZW5Bbm5vdGF0aW9uc0VuYWJsZWQgPSB0aGlzLmFjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5wbGF5ZXIuZWwoKSkuYWRkQ2xhc3MoJ3ZhYy1kaXNhYmxlLWZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5wbGF5ZXIuZWwoKSkucmVtb3ZlQ2xhc3MoJ3ZhYy1kaXNhYmxlLWZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnByZUZ1bGxzY3JlZW5Bbm5vdGF0aW9uc0VuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSBwcmV2aW91c2x5IGluIGFubm90YXRpb24gbW9kZSAocHJlLWZ1bGxzY3JlZW4pIG9yIGVudGVyaW5nIGZ1bGxzY3JlZWVuIGFuZCBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFubm90YXRpb24gbW9kZSwgdG9nZ2xlIHRoZSBtb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgd3JhcHBlciBmdW5jIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHVzZSBFdmVudERpc3BhdGNoZXIgZnJvbSB0aGUgY2xpZW50XG4gICAgICAgIC8vIEV4OiBwbHVnaW4uZmlyZSh0eXBlLCBkYXRhKTtcbiAgICAgICAgZmlyZSAodHlwZSwgZGF0YT17fSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZmlyZSh0eXBlLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRvZ2dsZSBhbm5vdGF0aW9ucyBtb2RlIG9uL29mZlxuICAgICAgICB0b2dnbGVBbm5vdGF0aW9uTW9kZSgpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gIXRoaXMuYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIudG9nZ2xlQ2xhc3MoJ3ZhYy1hY3RpdmUnKTsgLy8gVG9nZ2xlIGdsb2JhbCBjbGFzcyB0byBwbGF5ZXIgdG8gdG9nZ2xlIGRpc3BsYXkgb2YgZWxlbWVudHNcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0YXRlLmVuYWJsZWQgPSB0aGlzLmFjdGl2ZTtcblxuICAgICAgICAgICAgaWYodGhpcy5hY3RpdmUpe1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShcImFubm90YXRpb25Nb2RlRW5hYmxlZFwiKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShcImFubm90YXRpb25Nb2RlRGlzYWJsZWRcIilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIGNvbnRyb2wgY29tcG9uZW50IFVJIGlmIHNob3dDb250cm9sczogdHJ1ZVxuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLnNob3dDb250cm9scyl7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuYWN0aXZlKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5jbGVhcih0cnVlKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgcGxheWVyIFVJIGJvdW5kYXJpZXNcbiAgICAgICAgc2V0Qm91bmRzICh0cmlnZ2VyQ2hhbmdlPXRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0ge307XG4gICAgICAgICAgICBsZXQgJHBsYXllciA9ICQodGhpcy5wbGF5ZXIuZWwoKSksXG4gICAgICAgICAgICAgICAgJGN0cmxzICA9ICRwbGF5ZXIuZmluZCgnLnZqcy1jb250cm9sLWJhcicpO1xuXG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5sZWZ0ID0gJHBsYXllci5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMudG9wID0gJHBsYXllci5vZmZzZXQoKS50b3A7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5yaWdodCA9IHRoaXMuYm91bmRzLmxlZnQgKyAkcGxheWVyLndpZHRoKCk7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5ib3R0b20gPSB0aGlzLmJvdW5kcy50b3AgKyAkcGxheWVyLmhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMuYm90dG9tV2l0aG91dENvbnRyb2xzID0gdGhpcy5ib3VuZHMuYm90dG9tIC0gJGN0cmxzLmhlaWdodCgpO1xuXG4gICAgICAgICAgICAvLyBmaXJlcyBhbiBldmVudCB3aGVuIGJvdW5kcyBoYXZlIGNoYW5nZWQgZHVyaW5nIHJlc2l6aW5nXG4gICAgICAgICAgICBpZih0cmlnZ2VyQ2hhbmdlKSB0aGlzLmZpcmUoJ3BsYXllckJvdW5kc0NoYW5nZWQnLCB0aGlzLmJvdW5kcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQdWJsaWMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmb3Igd2hlbiBwbHVnaW4gaXMgcmVhZHlcbiAgICAgICAgb25SZWFkeSAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZXZlbnREaXNwYXRjaGVyLnBsdWdpblJlYWR5KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBwbHVnaW4gYXMgcmVhZHkgYW5kIGZpcmUgYW55IHBlbmRpbmcgY2FsbGJhY2tzXG4gICAgICAgIHBsdWdpblJlYWR5ICgpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLnBsdWdpblJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlKHRoaXMuX3JlYWR5Q2FsbGJhY2tzLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZHlDYWxsYmFja3MucG9wKCkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlYXJkb3duIGFsbCBjb21wb25lbnRzLCByZW1vdmUgYWxsIGxpc3RlbmVycywgYW5kIHJlbW92ZSBlbGVtZW50cyBmcm9tIERPTVxuICAgICAgICBkaXNwb3NlICgpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSB0aGlzLmNvbnRyb2xzLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdGF0ZSA9IHRoaXMuYW5ub3RhdGlvblN0YXRlLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlciA9IHRoaXMuZXZlbnREaXNwYXRjaGVyLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB0aGlzLnRlYXJkb3duKCk7XG4gICAgICAgICAgICBpZih0aGlzLnBsYXllcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmFubm90YXRpb25Db21tZW50cyA9IG51bGw7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5yZW1vdmVDbGFzcygndmFjLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICQodGhpcy5wbGF5ZXIuZWwoKSkuZmluZChcIltjbGFzc149J3ZhYy0nXVwiKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMucGxheWVyKSB0aGlzLnBsYXllci5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICAgICAgICAgICQod2luZG93KS5vZmYoJ3Jlc2l6ZS52YWMtd2luZG93LXJlc2l6ZScpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIEhhbmRsZWJhcnMgPSByZXF1aXJlKFwiaGFuZGxlYmFycy9ydW50aW1lXCIpO1xuIGV4cG9ydHNbXCJjb21tZW50XCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnRcXFwiIGRhdGEtaWQ9XFxcIlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImlkXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudC1oZWFkZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYXV0aG9yLW5hbWVcXFwiPlwiXG4gICAgKyBhbGlhczQoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51c2VyX25hbWUgOiBzdGFjazEpLCBkZXB0aDApKVxuICAgICsgXCI8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLXRpbWVzdGFtcFxcXCI+XCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRpbWVTaW5jZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGltZVNpbmNlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ0aW1lU2luY2VcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcInZhYy1kZWxldGUtY29tbWVudFxcXCI+Jm5ic3A7Jm5ic3A7WDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50LWJvZHlcXFwiPlxcbiAgICBcIlxuICAgICsgYWxpYXM0KChoZWxwZXJzLmJyZWFrbGluZXMgfHwgKGRlcHRoMCAmJiBkZXB0aDAuYnJlYWtsaW5lcykgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYm9keSA6IGRlcHRoMCkse1wibmFtZVwiOlwiYnJlYWtsaW5lc1wiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSlcbiAgICArIFwiXFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcImNvbW1lbnRfbGlzdFwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgICBcIlxuICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGJsb2NrUGFyYW1zWzBdWzBdLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zKSB7XG4gICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KTtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudHMtY29udGFpbmVyXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50cy13cmFwXFxcIj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbW1lbnRzSFRNTCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZWFjaFwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAxLCBibG9ja1BhcmFtcyksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YSxcImJsb2NrUGFyYW1zXCI6YmxvY2tQYXJhbXN9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtcmVwbHktYnRuIHZhYy1idXR0b25cXFwiPkFERCBSRVBMWTwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYWRkLW5ldy1zaGFwZWJveFxcXCI+PC9kaXY+XFxuICA8L2Rpdj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50cy1jb250cm9sLWJhclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1yYW5nZVxcXCI+PGI+QDwvYj4gXCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucmFuZ2VTdHIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU3RyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IFwiZnVuY3Rpb25cIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJyYW5nZVN0clwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGEsXCJibG9ja1BhcmFtc1wiOmJsb2NrUGFyYW1zfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jb250cm9sLWJ1dHRvbnNcXFwiPlxcbiAgICAgIDxhIGNsYXNzPVxcXCJ2YWMtZGVsZXRlLWFubm90YXRpb25cXFwiPkRFTEVURTwvYT4gfCA8YSBjbGFzcz1cXFwidmFjLWNsb3NlLWNvbW1lbnQtbGlzdFxcXCI+Q0xPU0U8L2E+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWUsXCJ1c2VCbG9ja1BhcmFtc1wiOnRydWV9KTtcbmV4cG9ydHNbXCJjb250cm9sc1wiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93Q29udHJvbHMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjJcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY29udHJvbHMgdmFjLWNvbnRyb2xcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPisgTkVXPC9idXR0b24+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2hvd05hdiA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgICAgICA8L2Rpdj5cXG5cIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWFubm90YXRpb24tbmF2XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLXByZXZcXFwiPlByZXY8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLW5leHRcXFwiPk5leHQ8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiNVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSk7XG5cbiAgcmV0dXJuIFwiICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby1jb3ZlciB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8tY292ZXItY2FudmFzXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY3Vyc29yLXRvb2wtdGlwIHZhYy1oaWRkZW5cXFwiPkNsaWNrIGFuZCBkcmFnIHRvIHNlbGVjdDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2hvd0NvbnRyb2xzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndyaXRpbmdDb21tZW50IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCI2XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWFkZC1jb250cm9scyB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICAgICAgPGk+U2VsZWN0IHNoYXBlICsgcmFuZ2U8L2k+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW50ZXJuYWxDb21tZW50aW5nIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8tbW92ZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLXByZXZcXFwiPi0xIHNlYzwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYS1uZXh0XFxcIj4rMSBzZWM8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblwiO1xufSxcIjdcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJ2YWMtYnV0dG9uXFxcIj5DT05USU5VRTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YT5jYW5jZWw8L2E+XFxuXCI7XG59LFwiOVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIGhlbHBlcjtcblxuICByZXR1cm4gXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby13cml0ZS1uZXctd3JhcCB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLXdyaXRlLW5ldyB2YWMtaXMtYW5ub3RhdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICA8aDU+PGI+TmV3IEFubm90YXRpb248L2I+IEAgXCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucmFuZ2VTdHIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU3RyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IFwiZnVuY3Rpb25cIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSkse1wibmFtZVwiOlwicmFuZ2VTdHJcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiPC9oNT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50LXNob3dib3hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj1cXFwiRW50ZXIgY29tbWVudC4uLlxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJ2YWMtYnV0dG9uXFxcIj5TQVZFPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhPkNhbmNlbDwvYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMudW5sZXNzLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hZGRpbmcgOiBkZXB0aDApLHtcIm5hbWVcIjpcInVubGVzc1wiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFkZGluZyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIik7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJkcmFnZ2FibGVfbWFya2VyXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPVwiZnVuY3Rpb25cIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uO1xuXG4gIHJldHVybiBcIjxkaXYgZGF0YS1tYXJrZXItaWQ9XFxcIlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImlkXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcXCIgY2xhc3M9XFxcInZhYy1tYXJrZXItZHJhZ2dhYmxlIHZhYy1yYW5nZWQtbWFya2VyXFxcIiBzdHlsZT1cXFwibGVmdDogXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxlZnQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxlZnQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImxlZnRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiOyB3aWR0aDpcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2lkdGggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpZHRoIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ3aWR0aFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI7XFxcIj5cXG48L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcIm1hcmtlclwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwidmFjLXJhbmdlZC1tYXJrZXJcIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgaGVscGVyO1xuXG4gIHJldHVybiBcIndpZHRoOlwiXG4gICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLndpZHRoIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC53aWR0aCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBcImZ1bmN0aW9uXCIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLHtcIm5hbWVcIjpcIndpZHRoXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIjtcIjtcbn0sXCI1XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2x0aXBCb2R5IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCI2XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInZhYy10b29sdGlwIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudG9vbHRpcFJpZ2h0IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGI+XCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRvb2x0aXBUaW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b29sdGlwVGltZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwidG9vbHRpcFRpbWVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiPC9iPiAtIFwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sdGlwQm9keSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudG9vbHRpcEJvZHkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInRvb2x0aXBCb2R5XCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwidmFjLXJpZ2h0LXNpZGVcIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBkYXRhLW1hcmtlci1pZD1cXFwiXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiaWRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIiBjbGFzcz1cXFwidmFjLW1hcmtlciBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU2hvdyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIiBzdHlsZT1cXFwibGVmdDogXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxlZnQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxlZnQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImxlZnRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiOyBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU2hvdyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiIHotaW5kZXg6IFwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy56SW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnpJbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiekluZGV4XCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcXCI+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93VG9vbHRpcCA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9kaXY+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJtYXJrZXJfd3JhcFwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwidmFjLW1hcmtlci1vd3JhcFxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJ2YWMtbWFya2VyLXdyYXBcXFwiPjwvZGl2PlxcbjwvZGl2PlwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wibmV3X2NvbW1lbnRcIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHtcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLXdyaXRlLW5ldy13cmFwIHZhYy1uZXctY29tbWVudFxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8td3JpdGUtbmV3IHZhYy1pcy1jb21tZW50XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnQtc2hvd2JveFxcXCIgc3R5bGU9XFxcIndpZHRoOlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aWR0aCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2lkdGggOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcIndpZHRoXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcInB4O3RvcDpcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudG9wIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b3AgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInRvcFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJweDtyaWdodDpcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucmlnaHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJpZ2h0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJyaWdodFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJweFxcXCI+XFxuICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBjb21tZW50Li4uXFxcIj48L3RleHRhcmVhPlxcbiAgICAgIDxkaXY+XFxuICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJ2YWMtYnV0dG9uXFxcIj5TQVZFPC9idXR0b24+XFxuICAgICAgICA8YT5DYW5jZWw8L2E+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wicGxheWVyX2J1dHRvblwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiPGI+PC9iPlxcbjxpIGNsYXNzPVxcXCJ2YWMtcGxheWVyLWljb25cXFwiPlxcblx0PHN2ZyBoZWlnaHQ9XFxcIjI0XFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiIHdpZHRoPVxcXCIyNFxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIj5cXG5cdCAgICA8cGF0aCBkPVxcXCJNMjEuOTkgNGMwLTEuMS0uODktMi0xLjk5LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNGw0IDQtLjAxLTE4ek0xOCAxNEg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyelxcXCIvPlxcblx0ICAgIDxwYXRoIGQ9XFxcIk0wIDBoMjR2MjRIMHpcXFwiIGZpbGw9XFxcIm5vbmVcXFwiLz5cXG5cdDwvc3ZnPlxcbjwvaT5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pOyIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIGFuIGFubm90YXRpb24sIHdoaWNoIGluY2x1ZGVzIGNvbnRyb2xsaW5nIHRoZSBtYXJrZXIvc2hhcGUsIHJlbmRlcmluZyBhIGNvbW1lbnRMaXN0LCBldGNcbiovXG5cbmNvbnN0ICAgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKFwiLi8uLi9saWIvdXRpbHMuanNcIiksXG4gICAgICAgIENvbW1lbnRMaXN0ID0gcmVxdWlyZShcIi4vY29tbWVudF9saXN0XCIpLFxuICAgICAgICBNYXJrZXIgPSByZXF1aXJlKFwiLi9tYXJrZXJcIiksXG4gICAgICAgIENvbW1lbnQgPSByZXF1aXJlKFwiLi9jb21tZW50XCIpLFxuICAgICAgICBTaGFwZSA9IHJlcXVpcmUoXCIuL3NoYXBlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZGF0YSwgcGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkIHx8IHRoaXMuY29tcG9uZW50SWQ7XG4gICAgICAgIHRoaXMucmFuZ2UgPSBkYXRhLnJhbmdlO1xuICAgICAgICB0aGlzLnNoYXBlID0gZGF0YS5zaGFwZTtcbiAgICAgICAgdGhpcy5zZWNvbmRzQWN0aXZlID0gdGhpcy5idWlsZFNlY29uZHNBY3RpdmVBcnJheSgpO1xuICAgICAgICB0aGlzLmJ1aWxkQ29tbWVudHMoZGF0YSk7XG4gICAgICAgIHRoaXMuYnVpbGRNYXJrZXIoKTtcbiAgICAgICAgdGhpcy5idWlsZFNoYXBlKCk7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuXG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYnVpbGRDb21tZW50cyhkYXRhKSB7XG4gICAgICAgIHRoaXMuY29tbWVudExpc3QgPSBuZXcgQ29tbWVudExpc3QoXG4gICAgICAgICAgICB7XCJjb21tZW50c1wiOiBkYXRhLmNvbW1lbnRzLCBcImFubm90YXRpb25cIjogdGhpc30sXG4gICAgICAgICAgICB0aGlzLnBsYXllclxuICAgICAgICApO1xuICAgIH1cblxuICAgIGJ1aWxkTWFya2VyICgpIHtcbiAgICAgICAgdGhpcy5tYXJrZXIgPSBuZXcgTWFya2VyKHRoaXMucGxheWVyLCB0aGlzLnJhbmdlLCB0aGlzLmNvbW1lbnRMaXN0LmNvbW1lbnRzWzBdKTtcbiAgICAgICAgdGhpcy5tYXJrZXIucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgYnVpbGRTaGFwZSgpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUgPSBuZXcgU2hhcGUodGhpcy5wbGF5ZXIsIHRoaXMuc2hhcGUpO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBvYmplY3RcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgICAgcmFuZ2U6ICAgICAgdGhpcy5yYW5nZSxcbiAgICAgICAgICAgIHNoYXBlOiAgICAgIHRoaXMuc2hhcGUsXG4gICAgICAgICAgICBjb21tZW50czogICB0aGlzLmNvbW1lbnRMaXN0LmRhdGFcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgdGhpcy5tYXJrZXIuJGVsLm9uKCdjbGljay52YWMtbWFya2VyJywgKGUpID0+IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5vcGVuQW5ub3RhdGlvbih0aGlzLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLy8gT3BlbnMgdGhlIGFubm90YXRpb24uIEhhbmRsZXMgbWFya2VyLCBjb21tZW50TGlzdCwgc2hhcGUsIEFubm90YXRpb24gc3RhdGUsIGFuZCBwbGF5ZXIgc3RhdGVcbiAgICBvcGVuICh3aXRoUGF1c2U9dHJ1ZSwgcHJldmlld09ubHk9ZmFsc2UsIGZvcmNlU25hcFRvU3RhcnQ9ZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICBjb25zdCBzbmFwVG9TdGFydCA9IGZvcmNlU25hcFRvU3RhcnQgfHwgIVV0aWxzLmlzV2l0aGluUmFuZ2UoXG4gICAgICAgICAgICB0aGlzLnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgdGhpcy5yYW5nZS5lbmQsXG4gICAgICAgICAgICBNYXRoLmZsb29yKHRoaXMuY3VycmVudFRpbWUpXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHNob3dUb29sdGlwID0gcHJldmlld09ubHkgJiYgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93TWFya2VyU2hhcGVBbmRUb29sdGlwcztcbiAgICAgICAgdGhpcy5tYXJrZXIuc2V0QWN0aXZlKHNob3dUb29sdGlwKTtcbiAgICAgICAgaWYoIXByZXZpZXdPbmx5ICYmIHRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbW1lbnRMaXN0KXtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudExpc3QucmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighcHJldmlld09ubHkgfHwgKHByZXZpZXdPbmx5ICYmIHRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd01hcmtlclNoYXBlQW5kVG9vbHRpcHMpKXtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblNoYXBlLnJlbmRlcigpO1xuXG4gICAgICAgICAgICBpZih0aGlzLnNoYXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUuJGVsLm9uKFwiY2xpY2sudmFjLWFubm90YXRpb25cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUub3BlbkFubm90YXRpb24odGhpcywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih3aXRoUGF1c2UpIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gICAgICAgIGlmKHNuYXBUb1N0YXJ0KSB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5yYW5nZS5zdGFydDtcblxuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhbm5vdGF0aW9uT3BlbmVkJywge1xuICAgICAgICAgICAgYW5ub3RhdGlvbjogdGhpcy5kYXRhLFxuICAgICAgICAgICAgdHJpZ2dlcmVkX2J5X3RpbWVsaW5lOiBwcmV2aWV3T25seVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDbG9zZXMgdGhlIGFubm90YXRpb24uIEhhbmRsZXMgbWFya2VyLCBjb21tZW5kTGlzdCwgc2hhcGUsIGFuZCBBbm5vdGF0aW9uU3RhdGVcbiAgICBjbG9zZSAoY2xlYXJBY3RpdmU9dHJ1ZSkge1xuICAgICAgICBpZighdGhpcy5pc09wZW4pIHJldHVybjtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrZXIuZGVhY3RpdmF0ZSgpO1xuICAgICAgICB0aGlzLmNvbW1lbnRMaXN0LnRlYXJkb3duKGZhbHNlKTtcbiAgICAgICAgaWYodGhpcy5hbm5vdGF0aW9uU2hhcGUuJGVsKSB0aGlzLmFubm90YXRpb25TaGFwZS4kZWwub2ZmKFwiY2xpY2sudmFjLWFubm90YXRpb25cIik7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblNoYXBlLnRlYXJkb3duKCk7XG4gICAgICAgIGlmKGNsZWFyQWN0aXZlKSB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuY2xlYXJBY3RpdmUoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYW5ub3RhdGlvbkNsb3NlZCcsIHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHByZWxvYWRpbmcgYW4gYXJyYXkgb2Ygc2Vjb25kcyBhY3RpdmUgb24gaW5pdGlhbGl6YXRpb25cbiAgICAvLyBWYWx1ZXMgdXNlZCB0byBidWlsZCB0aW1lTWFwIGluIEFubm90YXRpb25TdGF0ZVxuICAgIGJ1aWxkU2Vjb25kc0FjdGl2ZUFycmF5ICgpIHtcbiAgICAgICAgbGV0IHNlY29uZHMgPSBbXTtcbiAgICAgICAgaWYoISF0aGlzLnJhbmdlLmVuZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucmFuZ2Uuc3RhcnQ7IGkgPD0gdGhpcy5yYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHNlY29uZHMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgICBzZWNvbmRzLnB1c2goc3RhcnQpO1xuICAgICAgICAgICAgaWYoc3RhcnQgPCB0aGlzLmR1cmF0aW9uKSBzZWNvbmRzLnB1c2goc3RhcnQrMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlY29uZHM7XG4gICAgfVxuXG4gICAgLy8gVGVhcnNkb3duIGFubm90YXRpb24gYW5kIG1hcmtlciwgcmVtb3ZlcyBvYmplY3QgZnJvbSBBbm5vdGF0aW9uU3RhdGVcbiAgICB0ZWFyZG93biAocmVtb3ZlRnJvbUNvbGxlY3Rpb249dHJ1ZSkge1xuICAgICAgICB0aGlzLmNsb3NlKHRydWUpO1xuICAgICAgICB0aGlzLm1hcmtlci50ZWFyZG93bigpO1xuICAgICAgICBpZih0aGlzLmNvbW1lbnRMaXN0KSB0aGlzLmNvbW1lbnRMaXN0LnRlYXJkb3duKHJlbW92ZUZyb21Db2xsZWN0aW9uKTtcbiAgICAgICAgaWYocmVtb3ZlRnJvbUNvbGxlY3Rpb24pIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5yZW1vdmVBbm5vdGF0aW9uKHRoaXMpO1xuICAgICAgICBpZih0aGlzLmFubm90YXRpb25TaGFwZSkgdGhpcy5hbm5vdGF0aW9uU2hhcGUudGVhcmRvd24oKTtcbiAgICAgICAgaWYocmVtb3ZlRnJvbUNvbGxlY3Rpb24pIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYSBuZXcgYW5ub3RhdGlvbiBpbnN0YW5jZSBieSBwYXNzaW5nIGluIGRhdGEgZm9yIHJhbmdlLCBzaGFwZSwgY29tbWVudCwgJiBwbHVnaW4gcmVmXG4gICAgc3RhdGljIG5ld0Zyb21EYXRhIChyYW5nZSwgc2hhcGUsIGNvbW1lbnRTdHIsIHBsdWdpbiwgaWQ9bnVsbCkge1xuICAgICAgICBsZXQgY29tbWVudCA9IENvbW1lbnQuZGF0YU9iaihjb21tZW50U3RyLCBwbHVnaW4pO1xuICAgICAgICBpZihyYW5nZSkgcmFuZ2UgPSBVdGlscy5wYXJzZUludE9iaihyYW5nZSk7XG4gICAgICAgIGlmKHNoYXBlKSBzaGFwZSA9IFV0aWxzLnBhcnNlSW50T2JqKHNoYXBlKTtcbiAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICBjb21tZW50czogW2NvbW1lbnRdXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbihkYXRhLCBwbHVnaW4ucGxheWVyKTtcbiAgICB9XG5cbiAgICBnZXQgaXNBY3RpdmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmFjdGl2ZUFubm90YXRpb24gPT09IHRoaXM7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgbWFuYWdpbmcgdGhlIHN0YXRlIG9mIGFubm90YXRpb25zLCBpbmNsdWRpbmcgc2hvd2luZyBhY3RpdmUgYW5ub3RhdGlvbiBkdXJpbmcgcGxheWJhY2ssXG4gICAgdG9nZ2xpbmcgYWN0aXZlIHN0YXRlcyBmb3IgYW5ub3RhdGlvbnMsIG5hdmlnYXRpbmcgYW5ub3RhdGlvbnMgZm9yd2FyZC9iYWNrLCBldGNcbiovXG5cbmNvbnN0ICAgVXRpbHMgPSByZXF1aXJlKCcuLy4uL2xpYi91dGlscycpLFxuICAgICAgICBQbGF5ZXJDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX2NvbXBvbmVudFwiKSxcbiAgICAgICAgQW5ub3RhdGlvbiA9IHJlcXVpcmUoXCIuL2Fubm90YXRpb25cIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQW5ub3RhdGlvblN0YXRlIGV4dGVuZHMgUGxheWVyQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5pbml0QVBJKHRoaXMsICdBbm5vdGF0aW9uU3RhdGUnKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gc2V0cyBfZW5hYmxlZCBhbmQgY2xvc2VzIG9yIG9wZW5zIGFubm90YXRpb24gYXMgbmVlZGVkXG4gICAgc2V0IGVuYWJsZWQgKHNob3VsZEJlRW5hYmxlZCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gc2hvdWxkQmVFbmFibGVkO1xuICAgICAgICBpZighc2hvdWxkQmVFbmFibGVkKSB0aGlzLmFjdGl2ZUFubm90YXRpb24uY2xvc2UoKTtcbiAgICAgICAgaWYoc2hvdWxkQmVFbmFibGVkKXtcbiAgICAgICAgICAgIHRoaXMuc2tpcExpdmVDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRMaXZlQW5ub3RhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGVuYWJsZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvLyBTZXRzIF9hbm5vdGF0aW9ucyB3L0Fubm9hdGlvbiBvYmplY3RzIGZyb20gaW5wdXQgYXJyYXlcbiAgICBzZXQgYW5ub3RhdGlvbnMgKGFubm90YXRpb25zRGF0YSkge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zRGF0YS5tYXAoKGEpID0+IG5ldyBBbm5vdGF0aW9uKGEsIHRoaXMucGxheWVyKSk7XG4gICAgICAgIHRoaXMuc29ydEFubm90YXRpb25zKCk7XG4gICAgICAgIHRoaXMucmVidWlsZEFubm90YXRpb25UaW1lTWFwKCk7XG4gICAgfVxuXG4gICAgZ2V0IGFubm90YXRpb25zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cblxuICAgIHNldCBhY3RpdmVBbm5vdGF0aW9uIChhbm5vdGF0aW9uPW51bGwpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlQW5ub3RhdGlvbiA9IGFubm90YXRpb247XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgYWN0aXZlIGFubm90YXRpb24gb3IgYSBudWxsIG9iamVjdCB3aXRoIC5jbG9zZSgpXG4gICAgZ2V0IGFjdGl2ZUFubm90YXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlQW5ub3RhdGlvbiB8fCB7IGNsb3NlOiAoKCkgPT4ge30pIH07XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIGRhdGFcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucy5tYXAoKGEpID0+IGEuZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gQmluZCBldmVudHMgZm9yIHNldHRpbmcgbGl2ZUFubm90YXRpb24gb24gdmlkZW8gdGltZSBjaGFuZ2VcbiAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIub24oXCJ0aW1ldXBkYXRlXCIsIFV0aWxzLnRocm90dGxlKHRoaXMuc2V0TGl2ZUFubm90YXRpb24uYmluZCh0aGlzKSwgMTAwKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBhbm5vdGF0aW9ucyBieSByYW5nZS5zdGFydFxuICAgIHNvcnRBbm5vdGF0aW9ucyAoKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zLnNvcnQoKGEsYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQgPCBiLnJhbmdlLnN0YXJ0ID8gLTEgOiAoYS5yYW5nZS5zdGFydCA+IGIucmFuZ2Uuc3RhcnQgPyAxIDogMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBhIG5ldyBhbm5vdGF0aW9uXG4gICAgYWRkTmV3QW5ub3RhdGlvbiAoYW5ub3RhdGlvbikge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKGFubm90YXRpb24sIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYW5kIGFkZCBhIGFubm90YXRpb25cbiAgICBjcmVhdGVBbmRBZGRBbm5vdGF0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLmNvbnRyb2xzLnVpU3RhdGUuYWRkaW5nICYmIHRoaXMucGx1Z2luLmNvbnRyb2xzLmNhbmNlbEFkZE5ldygpO1xuXG4gICAgICAgIGxldCBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbi5uZXdGcm9tRGF0YShcbiAgICAgICAgICAgIGRhdGEucmFuZ2UsXG4gICAgICAgICAgICBkYXRhLnNoYXBlLFxuICAgICAgICAgICAgZGF0YS5jb21tZW50U3RyIHx8IFwiXCIsXG4gICAgICAgICAgICB0aGlzLnBsdWdpbixcbiAgICAgICAgICAgIGRhdGEuaWRcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmFkZE5ld0Fubm90YXRpb24oYW5ub3RhdGlvbilcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGFuIGV4aXN0aW5nIGFubm90YXRpb25cbiAgICBkZXN0cm95QW5ub3RhdGlvbkJ5SWQgKGlkKSB7XG4gICAgICAgIGxldCBhbm5vdGF0aW9uID0gdGhpcy5maW5kQW5ub3RhdGlvbihpZCk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uKSBhbm5vdGF0aW9uLnRlYXJkb3duKCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFuIGFubm90YXRpb25cbiAgICByZW1vdmVBbm5vdGF0aW9uIChhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZCA9IGFubm90YXRpb24uaWQsXG4gICAgICAgICAgICBpID0gdGhpcy5fYW5ub3RhdGlvbnMuaW5kZXhPZihhbm5vdGF0aW9uKTtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZCgpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhbm5vdGF0aW9uRGVsZXRlZCcsIHtpZH0pO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbGl2ZSBhbm5vdGF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgdmlkZW8gdGltZVxuICAgIHNldExpdmVBbm5vdGF0aW9uICgpIHtcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgdGltZSA9IE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGltZSk7XG5cbiAgICAgICAgaWYodGhpcy5za2lwTGl2ZUNoZWNrKSB7XG4gICAgICAgICAgICBpZih0aW1lICE9PSB0aGlzLmxhc3RWaWRlb1RpbWUpIHRoaXMuc2tpcExpdmVDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1hdGNoZXMgPSB0aGlzLmFjdGl2ZUFubm90YXRpb25zRm9yVGltZSh0aW1lKTtcbiAgICAgICAgaWYoIW1hdGNoZXMubGVuZ3RoKSByZXR1cm4gdGhpcy5hY3RpdmVBbm5vdGF0aW9uLmNsb3NlKCk7XG5cbiAgICAgICAgLy8gU2V0IGxpdmUgYW5ub3RhdGlvbiBhcyB0aGUgbGFzdCBtYXRjaFxuICAgICAgICBsZXQgbGl2ZUFubm90YXRpb24gPSB0aGlzLmFubm90YXRpb25zW21hdGNoZXNbbWF0Y2hlcy5sZW5ndGgtMV1dO1xuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZXMgaWYgdGhpcyBvciBhbm90aGVyIGFubm90YXRpb24gaXMgYWN0aXZlXG4gICAgICAgIGlmKHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5yYW5nZSkge1xuICAgICAgICAgICAgaWYobGl2ZUFubm90YXRpb24gPT09IHRoaXMuYWN0aXZlQW5ub3RhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGl2ZSBhbm5vdGF0aW9uIGFuZCBsaXZlIGFubm90YXRpb24gc2hhcmUgYSBzdGFydCB0aW1lXG4gICAgICAgICAgICAvLyBJcyB0aGF0IHN0YXJ0IHRpbWUgYXQgdGhlIGN1cnJlbnQgcGxheWhlYWQ/XG4gICAgICAgICAgICAvLyBJZiBzbywgZG9uJ3Qgc3dpdGNoIHdoaWNoIGlzIGFjdGl2ZS5cbiAgICAgICAgICAgIGxldCBsaXZlU3RhcnQgPSBsaXZlQW5ub3RhdGlvbi5yYW5nZS5zdGFydCxcbiAgICAgICAgICAgICAgICBhY3RpdmVTdGFydCA9IHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGlmKGxpdmVTdGFydCA9PT0gYWN0aXZlU3RhcnQgJiYgbGl2ZVN0YXJ0ID09PSB0aW1lKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKGxpdmVBbm5vdGF0aW9uLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdldCBhbGwgYWN0aXZlIGFubm90YXRpb25zIGZvciBhIHRpbWUgKGluIHNlY29uZHMpXG4gICAgYWN0aXZlQW5ub3RhdGlvbnNGb3JUaW1lICh0aW1lKSB7XG4gICAgICAgIGlmKCF0aGlzLmFubm90YXRpb25zLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uVGltZU1hcFt0aW1lXSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAgICBSZWJ1aWxkIHRoZSBhbm5vdGF0aW9uIHRpbWUgbWFwXG4gICAgICAgIEV4YW1wbGU6IHRoaXMuX2Fubm90YXRpb25zWzFdIGFuZCB0aGlzLl9hbm5vdGF0aW9uc1szXSBhcmUgYWN0aXZlIGR1cmluZyBzZWNvbmQgNFxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uVGltZU1hcCA9IHsgNDogWzEsIDNdIH1cbiAgICAqL1xuICAgIHJlYnVpbGRBbm5vdGF0aW9uVGltZU1hcCAoKSB7XG4gICAgICAgIGxldCB0aW1lTWFwID0ge307XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbi5zZWNvbmRzQWN0aXZlLmZvckVhY2goKHNlY29uZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSAodGltZU1hcFtzZWNvbmRdIHx8IFtdKTtcbiAgICAgICAgICAgICAgICB2YWwucHVzaCh0aGlzLmFubm90YXRpb25zLmluZGV4T2YoYW5ub3RhdGlvbikpO1xuICAgICAgICAgICAgICAgIHRpbWVNYXBbc2Vjb25kXSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uVGltZU1hcCA9IHRpbWVNYXA7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgYWN0aXZlIGFubm90YXRpb24gYW5kIHJlbW92ZSByZWZlcmVuY2UgaW4gc3RhdGVcbiAgICBjbGVhckFjdGl2ZSAoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5jbG9zZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUFubm90YXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIE9wZW4gYW5ub3RhdGlvbiB3aXRoIG9wdGlvbnMgdG8gcGF1c2UgYW5kIHNob3cgcHJldmlld1xuICAgIC8vIHNraXBMaXZlQ2hlY2sgd2lsbCBzaG9ydCBjaXJjdWl0IHNldExpdmVBbm5vdGF0aW9uKClcbiAgICBvcGVuQW5ub3RhdGlvbiAoYW5ub3RhdGlvbiwgc2tpcExpdmVDaGVjaz1mYWxzZSwgcGF1c2U9dHJ1ZSwgcHJldmlld09ubHk9ZmFsc2UsIGZvcmNlU25hcFRvU3RhcnQ9ZmFsc2UpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLmFjdGl2ZSkgdGhpcy5wbHVnaW4udG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcbiAgICAgICAgdGhpcy5za2lwTGl2ZUNoZWNrID0gc2tpcExpdmVDaGVjaztcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgICBhbm5vdGF0aW9uLm9wZW4ocGF1c2UsIHByZXZpZXdPbmx5LCBmb3JjZVNuYXBUb1N0YXJ0KTtcbiAgICAgICAgdGhpcy5hY3RpdmVBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5sYXN0VmlkZW9UaW1lID0gdGhpcy5hY3RpdmVBbm5vdGF0aW9uLnJhbmdlLnN0YXJ0O1xuICAgIH1cblxuICAgIC8vIE9wZW4gYW4gYW5ub3RhdGlvbiBieSBJRCAoaWYgaXQgZXhpc3RzKVxuICAgIG9wZW5Bbm5vdGF0aW9uQnlJZCAoaWQpIHtcbiAgICAgICAgbGV0IGFubm90YXRpb24gPSB0aGlzLmZpbmRBbm5vdGF0aW9uKGlkKTtcbiAgICAgICAgaWYgKGFubm90YXRpb24pIHRoaXMub3BlbkFubm90YXRpb24oYW5ub3RhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBhbm5vdGF0aW9uIG9iamVjdCBnaXZlbiBJRFxuICAgIGZpbmRBbm5vdGF0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5maW5kKChhKSA9PiBhLmlkID09IGlkKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGNvbW1lbnQgb2JqZWN0IGdpdmVuIElEXG4gICAgZmluZENvbW1lbnQgKGlkKSB7XG4gICAgICAgIGxldCBjb21tZW50cyA9IHRoaXMuYW5ub3RhdGlvbnMubWFwKChhKSA9PiBhLmNvbW1lbnRMaXN0LmNvbW1lbnRzKTtcbiAgICAgICAgY29tbWVudHMgPSBbXS5jb25jYXQoLi4uY29tbWVudHMpOyAvLyBmbGF0dGVuIDJkIGFycmF5XG4gICAgICAgIHJldHVybiBjb21tZW50cy5maW5kKChjKSA9PiBjLmlkID09IGlkKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kcyB0aGUgbmV4dCBhbm5vdGF0aW9uIGluIGNvbGxlY3Rpb24gYW5kIG9wZW5zIGl0XG4gICAgbmV4dEFubm90YXRpb24gKCkge1xuICAgICAgICBpZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKXtcbiAgICAgICAgICAgIGxldCBpbmQgPSB0aGlzLmFubm90YXRpb25zLmluZGV4T2YodGhpcy5fYWN0aXZlQW5ub3RhdGlvbiksXG4gICAgICAgICAgICAgICAgbmV4dEluZCA9IChpbmQgPT09IHRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoLTEgPyAwIDogaW5kKzEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1tuZXh0SW5kXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWUgPSBNYXRoLmZsb29yKHRoaXMuY3VycmVudFRpbWUpO1xuICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLmFubm90YXRpb25zLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvbnNbaV0ucmFuZ2Uuc3RhcnQgPiB0aW1lKSByZXR1cm4gdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW2ldLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbMF0sIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEZpbmRzIHRoZSBwcmV2aW91cyBhbm5vdGF0aW9uIGluIGNvbGxlY3Rpb24gYW5kIG9wZW5zIGl0XG4gICAgcHJldkFubm90YXRpb24gKCkge1xuICAgICAgICBpZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKXtcbiAgICAgICAgICAgIGxldCBpbmQgPSB0aGlzLmFubm90YXRpb25zLmluZGV4T2YodGhpcy5fYWN0aXZlQW5ub3RhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmQgPSAoaW5kID09PSAwID8gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMSA6IGluZC0xKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbbmV4dEluZF0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0aW1lID0gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgZm9yKGxldCBpPXRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoLTE7IGk+PTA7IGktLSl7XG4gICAgICAgICAgICBpZih0aGlzLmFubm90YXRpb25zW2ldLnJhbmdlLnN0YXJ0IDwgdGltZSkgcmV0dXJuIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1tpXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW3RoaXMuYW5ub3RhdGlvbnMubGVuZ3RoLTFdLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBVc2UgYW55d2hlcmUgdGhlIGFubm90YXRpb24gZGF0YSBjaGFuZ2VzXG4gICAgLy8gQ2xlYW5zIGludGVybmFsIHN0YXRlIGRhdGEsIHVwZGF0ZXMgcGxheWVyIGJ1dHRvbiwgdHJpZ2dlcnMgY29uZmlndXJhYmxlIGNhbGxiYWNrXG4gICAgc3RhdGVDaGFuZ2VkICgpIHtcbiAgICAgICAgdGhpcy5zb3J0QW5ub3RhdGlvbnMoKTtcbiAgICAgICAgdGhpcy5yZWJ1aWxkQW5ub3RhdGlvblRpbWVNYXAoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnb25TdGF0ZUNoYW5nZWQnLCB0aGlzLmRhdGEpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIHN0YXRlIHByb3BlcnRpZXNcbiAgICByZXNldERhdGEgKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25zICAgICAgID0gW107XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblRpbWVNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5hY3RpdmVBbm5vdGF0aW9uICA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5hYmxlZCAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5za2lwTmV4dFRpbWVDaGVjayA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RWaWRlb1RpbWUgICAgID0gMDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgVUkgYW5kIHVuYmluZCBldmVudHMgZm9yIHRoaXMgYW5kIGNoaWxkIGNvbXBvbmVudHNcbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7IGFubm90YXRpb24udGVhcmRvd24oZmFsc2UpOyB9KTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvbXBvbmVudCBmb3IgYW4gaW52aWR1YWwgY29tbWVudFxuKi9cblxuY29uc3QgICBQbGF5ZXJVSUNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfdWlfY29tcG9uZW50XCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoXCIuLy4uL2xpYi91dGlsc1wiKSxcbiAgICAgICAgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKSxcbiAgICAgICAgdGVtcGxhdGVOYW1lID0gJ2NvbW1lbnQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZGF0YSwgcGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuY29tbWVudExpc3QgPSBkYXRhLmNvbW1lbnRMaXN0O1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZCB8fCB0aGlzLmNvbXBvbmVudElkO1xuICAgICAgICB0aGlzLm1ldGEgPSBkYXRhLm1ldGE7XG4gICAgICAgIHRoaXMuYm9keSA9IGRhdGEuYm9keTtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBtb21lbnQoZGF0YS5tZXRhLmRhdGV0aW1lKS51bml4KCk7XG4gICAgICAgIHRoaXMudGltZVNpbmNlID0gdGhpcy50aW1lU2luY2UoKTtcblxuICAgICAgICB0aGlzLiRlbCA9ICQodGhpcy5yZW5kZXIoKSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIGRhdGFcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIG1ldGE6IHRoaXMubWV0YSxcbiAgICAgICAgICAgIGJvZHk6IHRoaXMuYm9keVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBIVE1MICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGVsWzBdLm91dGVySFRNTDtcbiAgICB9XG5cbiAgICByZW5kZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJUZW1wbGF0ZShcbiAgICAgICAgICAgIHRlbXBsYXRlTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGJvZHk6ICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgICAgICBtZXRhOiAgICAgICB0aGlzLm1ldGEsXG4gICAgICAgICAgICAgICAgdGltZVNpbmNlOiAgdGhpcy50aW1lU2luY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGltZSBzaW5jZSBjb21tZW50IHRpbWVzdGFtcFxuICAgIHRpbWVTaW5jZSAoKSB7XG4gICAgICAgIHJldHVybiBtb21lbnQodGhpcy5tZXRhLmRhdGV0aW1lKS5mcm9tTm93KCk7XG4gICAgfVxuXG4gICAgdGVhcmRvd24gKGRlc3Ryb3k9ZmFsc2UpIHtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oZGVzdHJveSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgQ29tbWVudCBvYmogZ2l2ZW4gYm9keSBjb250ZW50IGFuZCBwbHVnaW4gcmVmZXJlbmNlXG4gICAgc3RhdGljIG5ld0Zyb21EYXRhIChib2R5LCBjb21tZW50TGlzdCwgcGx1Z2luKSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5kYXRhT2JqKGJvZHksIHBsdWdpbik7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWVudChkYXRhLCBwbHVnaW4ucGxheWVyKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gb2JqZWN0IHdpdGggcGx1Z2luIGRhdGEsIHRpbWVzdGFtcCwgdW5pcXVlIGlkLCBhbmQgYm9keSBjb250ZW50XG4gICAgc3RhdGljIGRhdGFPYmogKGJvZHksIHBsdWdpbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWV0YTogICBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lOiBtb21lbnQoKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH0sIHBsdWdpbi5tZXRhKSxcbiAgICAgICAgICAgIGlkOiAgICAgVXRpbHMuZ3VpZCgpLFxuICAgICAgICAgICAgYm9keVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgQ29tcG9uZW50IGZvciBhIGxpc3Qgb2YgY29tbWVudHMgaW4gYSB2aXNpYmxlL2FjdGl2ZSBhbm5vdGF0aW9uXG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBDb21tZW50ID0gcmVxdWlyZShcIi4vY29tbWVudFwiKSxcbiAgICAgICAgY29tbWVudExpc3RUZW1wbGF0ZU5hbWUgPSAnY29tbWVudF9saXN0JyxcbiAgICAgICAgbmV3Q29tbWVudFRlbXBsYXRlTmFtZSA9ICduZXdfY29tbWVudCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQ29tbWVudExpc3QgZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZGF0YSwgcGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG5cbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gZGF0YS5hbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLmNvbW1lbnRzID0gZGF0YS5jb21tZW50cy5tYXAoKGNvbW1lbnREYXRhKSA9PiB7XG4gICAgICAgICAgICBjb21tZW50RGF0YS5jb21tZW50TGlzdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbW1lbnQoY29tbWVudERhdGEsIHBsYXllcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvcnRDb21tZW50cygpO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBvYmplY3RcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRzLm1hcCgoYykgPT4gYy5kYXRhKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGFsbCBldmVudHMgbmVlZGVkIGZvciB0aGUgY29tbWVudCBsaXN0XG4gICAgYmluZExpc3RFdmVudHMgKCkge1xuICAgICAgICB0aGlzLiRlbFxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLWNsb3NlLWNvbW1lbnQtbGlzdFwiLCAoKCkgPT4gdGhpcy5hbm5vdGF0aW9uLmNsb3NlKCkpLmJpbmQodGhpcykpIC8vIEhpZGUgQ29tbWVudExpc3QgVUkgd2l0aCBjbG9zZSBidXR0b25cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1yZXBseS1idG5cIiwgdGhpcy5hZGROZXdDb21tZW50LmJpbmQodGhpcykpIC8vIE9wZW4gbmV3IHJlcGx5IFVJIHdpdGggcmVwbHkgYnV0dG9uXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29tbWVudFwiLCBcIi52YWMtZGVsZXRlLWFubm90YXRpb25cIiwgdGhpcy5oYW5kbGVEZWxldGVBbm5vdGF0aW9uQ2xpY2suYmluZCh0aGlzKSkgLy8gRGVsZXRlIGFubm90YXRpb24gd2l0aCBtYWluIGRlbGV0ZSBidXR0b25cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1kZWxldGUtY29tbWVudFwiLCB0aGlzLmRlc3Ryb3lDb21tZW50LmJpbmQodGhpcykpIC8vIERlbGV0ZSBjb21tZW50IHdpdGggZGVsZXRlIGNvbW1lbnQgYnV0dG9uXG4gICAgICAgICAgICAub24oXCJtb3VzZXdoZWVsLnZhYy1jb21tZW50IERPTU1vdXNlU2Nyb2xsLnZhYy1jb21tZW50XCIsIFwiLnZhYy1jb21tZW50cy13cmFwXCIsIHRoaXMuZGlzYWJsZVBhZ2VTY3JvbGwuYmluZCh0aGlzKSk7IC8vIFByZXZlbnQgb3V0ZXIgcGFnZSBzY3JvbGwgd2hlbiBzY3JvbGxpbmcgaW5zaWRlIG9mIHRoZSBDb21tZW50TGlzdCBVSVxuICAgIH1cblxuICAgIC8vIEJpbmQgZXZlbnQgbGlzdGVuZXJzIGZvciBuZXcgY29tbWVudHMgZm9ybVxuICAgIGJpbmRDb21tZW50Rm9ybUV2ZW50cyAoKSB7XG4gICAgICAgIHRoaXMuJG5ld0NvbW1lbnRGb3JtXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29tbWVudFwiLCBcIi52YWMtYWRkLWNvbnRyb2xzIGEsIC52YWMtdmlkZW8td3JpdGUtbmV3LnZhYy1pcy1jb21tZW50IGFcIiwgdGhpcy5jbG9zZU5ld0NvbW1lbnQuYmluZCh0aGlzKSkgLy8gQ2FuY2VsIG5ldyBjb21tZW50IGNyZWF0aW9uIHdpdGggY2FuY2VsIGxpbmtcbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy12aWRlby13cml0ZS1uZXcudmFjLWlzLWNvbW1lbnQgYnV0dG9uXCIsIHRoaXMuc2F2ZU5ld0NvbW1lbnQuYmluZCh0aGlzKSk7IC8vIFNhdmUgbmV3IGNvbW1lbnQgd2l0aCBzYXZlIGJ1dHRvblxuICAgIH1cblxuICAgIC8vIFJlbmRlciBDb21tZW50TGlzdCBVSSB3aXRoIGFsbCBjb21tZW50cyB1c2luZyB0ZW1wbGF0ZVxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHRoaXMuJGVsID0gJCh0aGlzLnJlbmRlclRlbXBsYXRlKFxuICAgICAgICAgICAgY29tbWVudExpc3RUZW1wbGF0ZU5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWVudHNIVE1MOiB0aGlzLmNvbW1lbnRzLm1hcCgoYykgPT4gYy5IVE1MKSxcbiAgICAgICAgICAgICAgICByYW5nZVN0cjogVXRpbHMuaHVtYW5UaW1lKHRoaXMuYW5ub3RhdGlvbi5yYW5nZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSk7XG5cbiAgICAgICAgdGhpcy4kcGxheWVyLmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgICAgIHRoaXMuJHdyYXAgPSB0aGlzLiRVSS5jb21tZW50c0NvbnRhaW5lcjtcbiAgICAgICAgdGhpcy5iaW5kTGlzdEV2ZW50cygpO1xuICAgIH1cblxuICAgIC8vIFJlLXJlbmRlciBVSSBvbiBzdGF0ZSBjaGFuZ2VcbiAgICByZVJlbmRlciAoKSB7XG4gICAgICAgIHRoaXMudGVhcmRvd24oZmFsc2UpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBuZXcgY29tbWVudCBmb3JtXG4gICAgYWRkTmV3Q29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMuJHdyYXAuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmFjdGl2ZSkuZmluZChcIi52YWMtY29tbWVudHMtd3JhcFwiKS5zY3JvbGxUb3AoOTk5OTk5KTtcbiAgICAgICAgdmFyICRzaGFwZWJveCA9IHRoaXMuJHdyYXAuZmluZChcIi52YWMtYWRkLW5ldy1zaGFwZWJveFwiKSxcbiAgICAgICAgICAgIHdpZHRoID0gJHNoYXBlYm94Lm91dGVyV2lkdGgoKSxcbiAgICAgICAgICAgIHRvcCA9ICRzaGFwZWJveC5wb3NpdGlvbigpLnRvcCArIDEwLFxuICAgICAgICAgICAgcmlnaHQgPSB0aGlzLiR3cmFwLm91dGVyV2lkdGgoKSAtICgkc2hhcGVib3gucG9zaXRpb24oKS5sZWZ0ICsgd2lkdGgpO1xuXG4gICAgICAgIHRoaXMuJG5ld0NvbW1lbnRGb3JtID0gJCh0aGlzLnJlbmRlclRlbXBsYXRlKG5ld0NvbW1lbnRUZW1wbGF0ZU5hbWUsIHt3aWR0aCwgdG9wLCByaWdodH0pKTtcbiAgICAgICAgdGhpcy5iaW5kQ29tbWVudEZvcm1FdmVudHMoKTtcbiAgICAgICAgdGhpcy4kcGxheWVyLmFwcGVuZCh0aGlzLiRuZXdDb21tZW50Rm9ybSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjb21tZW50IGZyb20gbmV3IGNvbW1lbnQgZm9ybSwgdXBkYXRlIHN0YXRlIGFuZCByZS1yZW5kZXIgVUlcbiAgICBzYXZlTmV3Q29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMuJHdyYXAucmVtb3ZlQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmFjdGl2ZSk7XG5cbiAgICAgICAgbGV0IHVzZXJfaWQgPSAxLFxuICAgICAgICAgICAgYm9keSA9IHRoaXMuJFVJLm5ld0NvbW1lbnRUZXh0YXJlYS52YWwoKTtcblxuICAgICAgICBpZighYm9keSkgcmV0dXJuOyAvLyBlbXB0eSBjb21tZW50IC0gVE9ETyBhZGQgdmFsaWRhdGlvbiAvIGVyciBtZXNzYWdlXG4gICAgICAgIHRoaXMuY3JlYXRlQ29tbWVudChib2R5KTtcbiAgICB9XG5cbiAgICBjcmVhdGVDb21tZW50IChib2R5KSB7XG4gICAgICAgIGxldCBjb21tZW50ID0gQ29tbWVudC5uZXdGcm9tRGF0YShib2R5LCB0aGlzLCB0aGlzLnBsdWdpbik7XG4gICAgICAgIHRoaXMuY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgdGhpcy5zb3J0Q29tbWVudHMoKTtcblxuICAgICAgICAvLyBEb24ndCBtdXRhdGUgVUkgaWYgY29tbWVudCBpcyBiZWluZyBjcmVhdGVkIGZvciBhbiBpbmFjdGl2ZSBhbm5vdGF0aW9uICh2aWEgQVBJKVxuICAgICAgICBpZih0aGlzLmFubm90YXRpb24uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVSZW5kZXIoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZU5ld0NvbW1lbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5zdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgY29tbWVudCBhZGRpbmcgcHJvY2Vzc1xuICAgIGNsb3NlTmV3Q29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMudW5iaW5kQ29tbWVudEZvcm1FdmVudHMoKTtcbiAgICAgICAgaWYodGhpcy4kd3JhcCkgdGhpcy4kd3JhcC5yZW1vdmVDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKTtcbiAgICAgICAgaWYodGhpcy4kbmV3Q29tbWVudEZvcm0pIHRoaXMuJG5ld0NvbW1lbnRGb3JtLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBhIGNvbW1lbnQuIElmIGl0IGlzIHRoZSBvbmx5IGNvbW1lbnQsIGRlbGV0ZSB0aGUgYW5ub3RhdGlvblxuICAgIC8vIFVwZGF0ZSBzdGF0ZSBhbmQgcmUtcmVuZGVyIFVJXG4gICAgZGVzdHJveUNvbW1lbnQgKGV2ZW50KSB7XG4gICAgICAgIGxldCBhbm5vdGF0aW9uSWQgPSB0aGlzLmFubm90YXRpb24uaWQ7XG4gICAgICAgIGlmKHRoaXMuY29tbWVudHMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbi50ZWFyZG93bigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbW1lbnRJZCAgPSB0aGlzLmZpbmRDb21tZW50SWQoZXZlbnQpLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0aGlzLmNvbW1lbnRzLmZpbmQoKGMpID0+IGMuaWQgPT0gY29tbWVudElkKSxcbiAgICAgICAgICAgICAgICBpID0gdGhpcy5jb21tZW50cy5pbmRleE9mKGNvbW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21tZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB0aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuc3RhdGVDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgZmluZENvbW1lbnRJZCAoZXZlbnQpIHtcbiAgICAgICAgbGV0IGlkID0gdHlwZW9mIGV2ZW50LmRldGFpbC5pZCA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJy52YWMtY29tbWVudCcpLmRhdGEoJ2lkJykgOlxuICAgICAgICAgICAgZXZlbnQuZGV0YWlsLmlkO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudHMgb3V0ZXIgcGFnZSBzY3JvbGwgd2hlbiBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBDb21tZW50TGlzdCBVSVxuICAgIC8vIFRPRE86IFRoaXMgbWlnaHQgbmVlZCB0byBiZSBmaW5lLXR1bmVkP1xuICAgIGRpc2FibGVQYWdlU2Nyb2xsIChldmVudCkge1xuICAgICAgICBsZXQgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCksXG4gICAgICAgICAgICBoZWlnaHQgID0gJHRhcmdldC5oZWlnaHQoKSxcbiAgICAgICAgICAgIG9nRXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50LFxuICAgICAgICAgICAgZGVsdGEgICA9IG9nRXZlbnQud2hlZWxEZWx0YSB8fCAtb2dFdmVudC5kZXRhaWwsXG4gICAgICAgICAgICBkaXIgICAgID0gZGVsdGEgPCAwID8gXCJkb3duXCIgOiBcInVwXCIsXG4gICAgICAgICAgICBzY3JvbGxEaWZmID0gTWF0aC5hYnMoZXZlbnQuY3VycmVudFRhcmdldC5zY3JvbGxIZWlnaHQgLSBldmVudC5jdXJyZW50VGFyZ2V0LmNsaWVudEhlaWdodCk7XG5cbiAgICAgICAgLy8gaWYgc2Nyb2xsaW5nIGludG8gdG9wIG9mIGRpdlxuICAgICAgICBpZiAoJHRhcmdldC5zY3JvbGxUb3AoKSA8IDIwICYmIGRpciA9PSBcInVwXCIpIHtcbiAgICAgICAgICAgICR0YXJnZXQuc3RvcCgpO1xuICAgICAgICAgICAgJHRhcmdldC5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCAxMDApO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHNjcm9sbGluZyBpbnRvIGJvdHRvbSBvZiBkaXZcbiAgICAgICAgaWYgKCR0YXJnZXQuc2Nyb2xsVG9wKCkgPiAoc2Nyb2xsRGlmZiAtIDEwKSAmJiBkaXIgPT0gXCJkb3duXCIpIHtcbiAgICAgICAgICAgICR0YXJnZXQuc3RvcCgpO1xuICAgICAgICAgICAgJHRhcmdldC5hbmltYXRlKHtzY3JvbGxUb3A6IGhlaWdodCArIDQwfSwgMTAwKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGNvbW1lbnRzIGJ5IHRpbWVzdGFtcFxuICAgIHNvcnRDb21tZW50cyAoKSB7XG4gICAgICAgIHRoaXMuY29tbWVudHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS50aW1lc3RhbXAgPCBiLnRpbWVzdGFtcCA/IC0xIDogKGEudGltZXN0YW1wID4gYi50aW1lc3RhbXAgPyAxIDogMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSB0aGUgYW5ub3RhdGlvblxuICAgIGhhbmRsZURlbGV0ZUFubm90YXRpb25DbGljayAoZSkge1xuICAgICAgICBsZXQgJGNvbmZpcm1FbCA9ICQoXCI8YS8+XCIpLmFkZENsYXNzKFwidmFjLWRlbGV0ZS1jb25maXJtXCIpLnRleHQoXCJDT05GSVJNXCIpO1xuICAgICAgICAkY29uZmlybUVsLm9uKFwiY2xpY2suY29tbWVudFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAkY29uZmlybUVsLm9mZihcImNsaWNrLmNvbW1lbnRcIik7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb24udGVhcmRvd24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgICQoZS50YXJnZXQpLnJlcGxhY2VXaXRoKCRjb25maXJtRWwpO1xuICAgIH1cblxuICAgIC8vIFVuYmluZCBsaXN0ZW5lcnMgZm9yIG5ldyBjb21tZW50cyBmb3JtXG4gICAgdW5iaW5kQ29tbWVudEZvcm1FdmVudHMgKCkge1xuICAgICAgICBpZih0aGlzLiRuZXdDb21tZW50Rm9ybSkgdGhpcy4kbmV3Q29tbWVudEZvcm0ub2ZmKFwiY2xpY2sudmFjLWNvbW1lbnRcIik7XG4gICAgfVxuXG4gICAgLy8gVGVhcmRvd24gQ29tbWVudExpc3QgVUksIHVuYmluZCBldmVudHNcbiAgICB0ZWFyZG93biAoZGVzdHJveUNvbW1lbnRzPXRydWUpIHtcbiAgICAgICAgaWYodGhpcy4kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLm9mZihcImNsaWNrLnZhYy1jb21tZW50IG1vdXNld2hlZWwudmFjLWNvbW1lbnQgRE9NTW91c2VTY3JvbGwudmFjLWNvbW1lbnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tZW50cy5mb3JFYWNoKChjKSA9PiBjLnRlYXJkb3duKGRlc3Ryb3lDb21tZW50cykpO1xuICAgICAgICBpZihkZXN0cm95Q29tbWVudHMpIHRoaXMuY29tbWVudHMgPSBbXTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBtYW5hZ2luZyBhbm5vdGF0aW9uIFwiY29udHJvbCBib3hcIiBpbiB1cHBlciBsZWZ0IG9mIHZpZGVvIHdoZW4gaW4gYW5ub3RhdGlvbiBtb2RlLFxuICAgIGluY2x1ZGluZyBhbGwgZnVuY3Rpb25hbGl0eSB0byBhZGQgbmV3IGFubm90YXRpb25zXG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBEcmFnZ2FibGVNYXJrZXIgPSByZXF1aXJlKFwiLi9kcmFnZ2FibGVfbWFya2VyLmpzXCIpLFxuICAgICAgICBTZWxlY3RhYmxlU2hhcGUgPSByZXF1aXJlKFwiLi9zZWxlY3RhYmxlX3NoYXBlLmpzXCIpLFxuICAgICAgICBQbGF5ZXJCdXR0b24gPSByZXF1aXJlKFwiLi9wbGF5ZXJfYnV0dG9uXCIpLFxuICAgICAgICBBbm5vdGF0aW9uID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvblwiKSxcbiAgICAgICAgdGVtcGxhdGVOYW1lID0gJ2NvbnRyb2xzJztcblxuLy8gQ29udHJvbCB1c2VzIGEgXCJ1aSBzdGF0ZVwiIHRvIGRldGVybWluZSBob3cgVUkgaXMgcmVuZGVyZWQgLSB0aGlzIG9iamVjdCBpcyB0aGUgYmFzZSBzdGF0ZSwgY29udGFpbmluZyBhXG4vLyBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIGl0ZW0gaW4gdGhlIHN0YXRlXG5jb25zdCBCQVNFX1VJX1NUQVRFID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgYWRkaW5nOiBmYWxzZSwgICAgICAgICAgLy8gQXJlIHdlIGN1cnJlbnRseSBhZGRpbmcgYSBuZXcgYW5ub3RhdGlvbj8gKHN0ZXAgMSBvZiBmbG93KVxuICAgIHdyaXRpbmdDb21tZW50OiBmYWxzZSAgIC8vIEFyZSB3ZSBjdXJyZW50bHkgd3JpdGluZyB0aGUgY29tbWVudCBmb3IgYW5ub3RhdGlvbiAoc3RlcCAyIG9mIGZsb3cpXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBDb250cm9scyBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIsIGJpbmRBcnJvd0tleXMpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5pbml0QVBJKHRoaXMsICdDb250cm9scycpO1xuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb21tZW50aW5nID0gdGhpcy5wbHVnaW4ub3B0aW9ucy5pbnRlcm5hbENvbW1lbnRpbmc7XG4gICAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHM7XG4gICAgICAgIHRoaXMudWlTdGF0ZSA9IFV0aWxzLmNsb25lT2JqZWN0KEJBU0VfVUlfU1RBVEUpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoYmluZEFycm93S2V5cyk7XG5cbiAgICAgICAgaWYodGhpcy5zaG93Q29udHJvbHMpe1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBsYXllciBidXR0b24gaW4gdGhlIGNvbnRyb2wgYmFyIGlmIGNvbnRyb2xzIGFyZSBzaG93blxuICAgICAgICAgICAgdGhpcy5wbGF5ZXJCdXR0b24gPSBuZXcgUGxheWVyQnV0dG9uKHRoaXMucGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gQmluZCBhbGwgdGhlIGV2ZW50cyB3ZSBuZWVkIGZvciBVSSBpbnRlcmFjdGlvblxuICAgIGJpbmRFdmVudHMgKGJpbmRBcnJvd0tleXMpIHtcbiAgICAgICAgdGhpcy4kcGxheWVyLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1jb250cm9scyBidXR0b25cIiwgdGhpcy5zdGFydEFkZE5ldy5iaW5kKHRoaXMpKSAvLyBBZGQgbmV3IGJ1dHRvbiBjbGlja1xuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1hbm5vdGF0aW9uLW5hdiAudmFjLWEtbmV4dFwiLCAoKSA9PiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUubmV4dEFubm90YXRpb24oKSApIC8vIENsaWNrICduZXh0JyBvbiBhbm5vdGF0aW9uIG5hdlxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1hbm5vdGF0aW9uLW5hdiAudmFjLWEtcHJldlwiLCAoKSA9PiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUucHJldkFubm90YXRpb24oKSApIC8vIENsaWNrICdwcmV2JyBvbiBhbm5vdGF0aW9uIG5hdlxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy12aWRlby1tb3ZlIC52YWMtYS1uZXh0XCIsICgpID0+IHRoaXMubWFya2VyLnNjcnViU3RhcnQoMSkgKSAvLyBDbGljayAnKzEgc2VjJyBvbiBtYXJrZXIgbmF2XG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLXZpZGVvLW1vdmUgLnZhYy1hLXByZXZcIiwgKCkgPT4gdGhpcy5tYXJrZXIuc2NydWJTdGFydCgtMSkgKTsgLy8gQ2xpY2sgJy0xIHNlYycgb24gbWFya2VyIG5hdlxuXG4gICAgICAgIGlmKHRoaXMuaW50ZXJuYWxDb21tZW50aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiRwbGF5ZXIub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFkZC1jb250cm9scyBidXR0b25cIiwgdGhpcy53cml0ZUNvbW1lbnQuYmluZCh0aGlzKSkgLy8gJ05leHQnIGJ1dHRvbiBjbGljayB3aGlsZSBhZGRpbmdcbiAgICAgICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLXZpZGVvLXdyaXRlLW5ldy52YWMtaXMtYW5ub3RhdGlvbiBidXR0b25cIiwgdGhpcy5zYXZlTmV3LmJpbmQodGhpcykpIC8vICdTYXZlJyBidXR0b24gY2xpY2sgd2hpbGUgYWRkaW5nXG4gICAgICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1hZGQtY29udHJvbHMgYSwgLnZhYy12aWRlby13cml0ZS1uZXcudmFjLWlzLWFubm90YXRpb24gYVwiLCB0aGlzLmNhbmNlbEFkZE5ldy5iaW5kKHRoaXMpKSAvLyBDYW5jZWwgbGluayBjbGlja1xuICAgICAgICB9XG4gICAgICAgIGlmKGJpbmRBcnJvd0tleXMpe1xuICAgICAgICAgICAgJChkb2N1bWVudCkub24oYGtleXVwLnZhYy1uYXYtJHt0aGlzLnBsYXllcklkfWAsIChlKSA9PiB0aGlzLmhhbmRsZUFycm93S2V5cyhlKSk7IC8vIFVzZSBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlIGFubm90YXRpb25zXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgVUkgYW5kIHVuYmluZCBldmVudHMgZm9yIHRoaXMgYW5kIGNoaWxkIGNvbXBvbmVudHNcbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIodHJ1ZSk7XG4gICAgICAgIHRoaXMuJHBsYXllci5vZmYoJ2NsaWNrLnZhYy1jb250cm9scycpO1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoYGtleXVwLnZhYy1uYXYtJHt0aGlzLnBsYXllcklkfSBtb3VzZW1vdmUudmFjLXRvb2x0aXAtJHt0aGlzLnBsYXllcklkfWApO1xuICAgICAgICBpZih0aGlzLnBsYXllckJ1dHRvbikgdGhpcy5wbGF5ZXJCdXR0b24udGVhcmRvd24oKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyBVSSAocmVzZXR0aW5nIGNvbXBvbmVudHMgaWYgbmVlZCBiZSlcbiAgICBjbGVhciAocmVzZXQ9ZmFsc2UpIHtcbiAgICAgICAgaWYocmVzZXQpe1xuICAgICAgICAgICAgaWYodGhpcy51aVN0YXRlLmFkZGluZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlTm9ybWFsVUkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlci50ZWFyZG93bigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZVNoYXBlLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVpU3RhdGUgPSBVdGlscy5jbG9uZU9iamVjdChCQVNFX1VJX1NUQVRFKTtcbiAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLXZpZGVvLWNvdmVyLWNhbnZhcycpXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2Vkb3duLnZhYy1jdXJzb3ItdG9vbHRpcCcpXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2V1cC52YWMtY3Vyc29yLXRvb2x0aXAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiR0b29sdGlwXyA9IG51bGw7XG4gICAgICAgIHRoaXMuJFVJLmNvbnRyb2xFbGVtZW50cy5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgdGhlIFVJIGVsZW1lbnRzIChiYXNlZCBvbiB1aVN0YXRlKVxuICAgIHJlbmRlciAocmVzZXQ9ZmFsc2UpIHtcbiAgICAgICAgdGhpcy5jbGVhcihyZXNldCk7XG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZVN0cjogdGhpcy5tYXJrZXIgPyBVdGlscy5odW1hblRpbWUodGhpcy5tYXJrZXIucmFuZ2UpIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzaG93TmF2OiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuYW5ub3RhdGlvbnMubGVuZ3RoID4gMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMudWlTdGF0ZSxcbiAgICAgICAgICAgIHsgaW50ZXJuYWxDb21tZW50aW5nOiB0aGlzLmludGVybmFsQ29tbWVudGluZywgc2hvd0NvbnRyb2xzOiB0aGlzLnNob3dDb250cm9scyB9XG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0ICRjdHJscyA9IHRoaXMucmVuZGVyVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBkYXRhKTtcbiAgICAgICAgdGhpcy4kcGxheWVyLmFwcGVuZCgkY3RybHMpO1xuXG4gICAgICAgIGlmKHRoaXMucGxheWVyQnV0dG9uKSB0aGlzLnBsYXllckJ1dHRvbi51cGRhdGVOdW1Bbm5vdGF0aW9ucygpO1xuICAgIH1cblxuICAgIC8vIFVzZXIgY2xpY2tlZCB0byBjYW5jZWwgaW4tcHJvZ3Jlc3MgYWRkIC0gcmVzdG9yZSB0byBub3JtYWwgc3RhdGVcbiAgICBjYW5jZWxBZGROZXcgKCkge1xuICAgICAgICBpZighKHRoaXMudWlTdGF0ZS5hZGRpbmcgfHwgdGhpcy51aVN0YXRlLndyaXRpbmdDb21tZW50KSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgICAgdGhpcy5tYXJrZXIudGVhcmRvd24oKTtcbiAgICAgICAgdGhpcy5tYXJrZXIgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFVzZXIgY2xpY2tlZCAnYWRkJyBidXR0b24gaW4gdGhlIGNvbnRyb2xzIC0gc2V0dXAgVUkgYW5kIG1hcmtlclxuICAgIHN0YXJ0QWRkTmV3ICgpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLmFjdGl2ZSkgdGhpcy5wbHVnaW4udG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcblxuICAgICAgICB0aGlzLnBsYXllci5wYXVzZSgpO1xuICAgICAgICB0aGlzLnNldEFkZGluZ1VJKCk7XG4gICAgICAgIHRoaXMudWlTdGF0ZS5hZGRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIC8vIGNvbnN0cnVjdCBuZXcgcmFuZ2UgYW5kIGNyZWF0ZSBtYXJrZXJcbiAgICAgICAgbGV0IHJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHBhcnNlSW50KHRoaXMuY3VycmVudFRpbWUsMTApLFxuICAgICAgICAgICAgc3RvcDogcGFyc2VJbnQodGhpcy5jdXJyZW50VGltZSwxMClcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5tYXJrZXIgPSBuZXcgRHJhZ2dhYmxlTWFya2VyKHRoaXMucGxheWVyLCByYW5nZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZVNoYXBlID0gbmV3IFNlbGVjdGFibGVTaGFwZSh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgLy8gc2hvdyBjdXJzb3IgaGVscCB0ZXh0IGlmIGNvbnRyb2xzIGFyZSBoaWRkZW5cbiAgICAgICAgaWYoIXRoaXMuc2hvd0NvbnRyb2xzKSB0aGlzLmJpbmRDdXJzb3JUb29sdGlwKCk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnZW50ZXJlZEFkZGluZ0Fubm90YXRpb24nLCB7IHJhbmdlOiByYW5nZSB9KTtcbiAgICB9XG5cbiAgICAvLyBVc2VyIGNsaWNrZWQgJ25leHQnIGFjdGlvbiAtIHNob3cgVUkgdG8gd3JpdGUgY29tbWVudFxuICAgIHdyaXRlQ29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMudWlTdGF0ZS53cml0aW5nQ29tbWVudCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gVXNlciBjbGlja2VkIHRvIHNhdmUgYSBuZXcgYW5ub3RhdGlvbi9jb21tZW50IGR1cmluZyBhZGQgbmV3IGZsb3dcbiAgICBzYXZlTmV3ICgpIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSB0aGlzLiRVSS5uZXdDb21tZW50VGV4dGFyZWEudmFsKCk7XG4gICAgICAgIGlmKCFjb21tZW50KSByZXR1cm47IC8vIGVtcHR5IGNvbW1lbnQgLSBUT0RPIGFkZCB2YWxpZGF0aW9uIC8gZXJyIG1lc3NhZ2VcblxuICAgICAgICBsZXQgYSA9IEFubm90YXRpb24ubmV3RnJvbURhdGEodGhpcy5tYXJrZXIucmFuZ2UsIHRoaXMuc2VsZWN0YWJsZVNoYXBlLnNoYXBlLCBjb21tZW50LCB0aGlzLnBsdWdpbik7XG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5hZGROZXdBbm5vdGF0aW9uKGEpO1xuXG4gICAgICAgIHRoaXMuY2FuY2VsQWRkTmV3KCk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIG5vcm1hbCBVSSAoaGlkZSBtYXJrZXJzLCBoaWRlIHBsYXliYWNrLCBldGMpIG9uIGluaXQgYWRkIHN0YXRlXG4gICAgc2V0QWRkaW5nVUkgKCkge1xuICAgICAgICB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpc2FibGVQbGF5aW5nQW5kQ29udHJvbCgpO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgbm9ybWFsIFVJIGFmdGVyIGFkZCBzdGF0ZVxuICAgIHJlc3RvcmVOb3JtYWxVSSAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5lbmFibGVkID0gdGhpcy5wbHVnaW4uYWN0aXZlO1xuICAgICAgICB0aGlzLmVuYWJsZVBsYXlpbmdBbmRDb250cm9sKCk7XG4gICAgICAgICQoZG9jdW1lbnQpLm9mZihgbW91c2Vtb3ZlLnZhYy10b29sdGlwLSR7dGhpcy5wbGF5ZXJJZH1gKTtcbiAgICB9XG5cbiAgICAvLyBPbiBhcnJvdyBrZXkgcHJlc3MsIG5hdmlnYXRlIHRvIG5leHQgb3IgcHJldiBBbm5vdGF0aW9uXG4gICAgaGFuZGxlQXJyb3dLZXlzIChlKSB7XG4gICAgICAgIGlmKCF0aGlzLnBsdWdpbi5hY3RpdmUpIHJldHVybjtcbiAgICAgICAgbGV0IGtleUlkID0gZS53aGljaDtcblxuICAgICAgICBpZihrZXlJZCA9PSAzNykgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLnByZXZBbm5vdGF0aW9uKCk7XG4gICAgICAgIGlmKGtleUlkID09IDM5KSB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUubmV4dEFubm90YXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBBZGRzIGhlbHAgdGV4dCB0byBjdXJzb3IgZHVyaW5nIGFubm90YXRpb24gbW9kZVxuICAgIGJpbmRDdXJzb3JUb29sdGlwICgpIHtcbiAgICAgICAgdGhpcy50b29sdGlwQXJlYSA9IFV0aWxzLmFyZWFPZkhpZGRlbkVsKHRoaXMuJHRvb2x0aXAsIHRoaXMuJFVJLmNvdmVyQ2FudmFzLCB0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKTtcblxuICAgICAgICAvLyBBc3NlcnQgYm91bmRzIGFyZSB1cGRhdGVkIGluIHBsdWdpbiBpbiBjYXNlIHBhZ2Ugd2FzIG1vZGlmaWVkIHNpbmNlIGNyZWF0aW9uLCBzbyB0b29sdGlwIG1hdGggaXMgY29ycmVjdFxuICAgICAgICB0aGlzLnBsdWdpbi5zZXRCb3VuZHMoZmFsc2UpO1xuICAgICAgICAkKGRvY3VtZW50KS5vbihgbW91c2Vtb3ZlLnZhYy10b29sdGlwLSR7dGhpcy5wbGF5ZXJJZH1gLCBVdGlscy50aHJvdHRsZSgoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZighdGhpcy5wbHVnaW4uYm91bmRzKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxldCB4ID0gZXZlbnQucGFnZVgsXG4gICAgICAgICAgICAgICAgeSA9IGV2ZW50LnBhZ2VZLFxuICAgICAgICAgICAgICAgIG91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgICAgICAgKHggPCB0aGlzLnBsdWdpbi5ib3VuZHMubGVmdCB8fCB4ID4gdGhpcy5wbHVnaW4uYm91bmRzLnJpZ2h0KSB8fFxuICAgICAgICAgICAgICAgICAgICAoeSA8IHRoaXMucGx1Z2luLmJvdW5kcy50b3AgfHwgeSA+IHRoaXMucGx1Z2luLmJvdW5kcy5ib3R0b20pLFxuICAgICAgICAgICAgICAgIHdpdGhpbkNvbnRyb2xzID0gIW91dE9mQm91bmRzICYmIHkgPj0gdGhpcy5wbHVnaW4uYm91bmRzLmJvdHRvbVdpdGhvdXRDb250cm9scyxcbiAgICAgICAgICAgICAgICBtYXJrZXJIb3ZlcmVkID0gdGhpcy4kdG9vbHRpcC5oYXNDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuXG4gICAgICAgICAgICBpZihvdXRPZkJvdW5kcykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjdXJzb3JYICAgICAgPSB4IC0gdGhpcy5wbHVnaW4uYm91bmRzLmxlZnQsXG4gICAgICAgICAgICAgICAgY3Vyc29yWSAgICAgID0geSAtIHRoaXMucGx1Z2luLmJvdW5kcy50b3AsXG4gICAgICAgICAgICAgICAgbWFyZ2luICAgICAgID0gMTAsXG4gICAgICAgICAgICAgICAgcmlnaHRFZGdlICAgID0gdGhpcy4kcGxheWVyLndpZHRoKCksXG4gICAgICAgICAgICAgICAgYm90dG9tRWRnZSAgID0gdGhpcy4kcGxheWVyLmhlaWdodCgpIC0gdGhpcy4kVUkuY29udHJvbEJhci5oZWlnaHQoKSxcbiAgICAgICAgICAgICAgICBhdFJpZ2h0RWRnZSAgPSAoY3Vyc29yWCArIHRoaXMudG9vbHRpcEFyZWEud2lkdGggKyBtYXJnaW4qMikgPj0gcmlnaHRFZGdlLFxuICAgICAgICAgICAgICAgIGF0Qm90dG9tRWRnZSA9IChjdXJzb3JZICsgdGhpcy50b29sdGlwQXJlYS5oZWlnaHQgKyBtYXJnaW4qMikgPj0gYm90dG9tRWRnZTtcblxuICAgICAgICAgICAgLy8gaXMgdGhlIHRvb2x0aXAgdG9vIGNsb3NlIHRvIHRoZSByaWdodCBvciBib3R0b20gZWRnZT9cbiAgICAgICAgICAgIGxldCBwb3NYID0gYXRSaWdodEVkZ2UgPyAocmlnaHRFZGdlIC0gdGhpcy50b29sdGlwQXJlYS53aWR0aCAtIG1hcmdpbikgOiAoY3Vyc29yWCArIG1hcmdpbiksXG4gICAgICAgICAgICAgICAgcG9zWSA9IGF0Qm90dG9tRWRnZSA/IChib3R0b21FZGdlIC0gdGhpcy50b29sdGlwQXJlYS5oZWlnaHQgLSBtYXJnaW4pIDogKGN1cnNvclkgKyBtYXJnaW4pO1xuXG4gICAgICAgICAgICAvLyBoaWRlIGlmIHRoZSBjdXJzb3IgaXMgb3ZlciB0aGUgY29udHJvbCBiYXIgYnV0IG5vdCBob3ZlcmluZyBvdmVyIHRoZSBkcmFnZ2FibGUgbWFya2VyXG4gICAgICAgICAgICAvLyBhbHNvIGhpZGUgaWYgbW91c2UgaXMgZG93blxuICAgICAgICAgICAgaWYoKHdpdGhpbkNvbnRyb2xzICYmICFtYXJrZXJIb3ZlcmVkKSB8fCB0aGlzLiR0b29sdGlwLmhhc0NsYXNzKCd2YWMtY3Vyc29yLWRyYWdnaW5nJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiR0b29sdGlwLmFkZENsYXNzKHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiR0b29sdGlwLnJlbW92ZUNsYXNzKHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLiR0b29sdGlwLmNzcyh7XG4gICAgICAgICAgICAgICAgbGVmdDogYCR7cG9zWH1weGAsXG4gICAgICAgICAgICAgICAgdG9wOiBgJHtwb3NZfXB4YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmJpbmQodGhpcyksIDUwKSk7XG4gICAgfVxuXG4gICAgZ2V0ICR0b29sdGlwICgpIHtcbiAgICAgICAgdGhpcy4kdG9vbHRpcF8gPSB0aGlzLiR0b29sdGlwXyB8fCB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHRvb2x0aXBfO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIGEgdGltZWxpbmUgbWFya2VyIHRoYXQgaXMgZHJhZ2dhYmxlIHdoZW4gdXNlciBjbGlja3MvZHJhZ3Mgb24gaXQsIGFuZCByZWJ1aWxkcyB1bmRlcmx5aW5nIHJhbmdlXG4gICAgYXMgZHJhZyBvY2N1cnNcbiovXG5cbmNvbnN0ICAgTWFya2VyID0gcmVxdWlyZShcIi4vbWFya2VyXCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoJy4vLi4vbGliL3V0aWxzJyksXG4gICAgICAgIG1hcmtlclRlbXBsYXRlTmFtZSA9ICdkcmFnZ2FibGVfbWFya2VyJztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBEcmFnZ2FibGVNYXJrZXIgZXh0ZW5kcyBNYXJrZXIge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllciwgcmFuZ2UpIHtcbiAgICAgICAgc3VwZXIocGxheWVyLCByYW5nZSk7XG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEUgLSB0aGlzIHNob3VsZG4ndCBiZSByZXF1aXJlZCBhbmQgaXMgYSBIQUNLIGZvciBob3cgdHJhbnNwaWxhdGlvbiB3b3JrcyBpbiBJRTEwXG4gICAgICAgIHRoaXMudGVtcGxhdGVOYW1lID0gbWFya2VyVGVtcGxhdGVOYW1lOyAgIC8vIENoYW5nZSB0ZW1wbGF0ZSBmcm9tIGJhc2UgTWFya2VyIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgIC8vIElzIGEgZHJhZyBhY3Rpb24gY3VycmVudGx5IG9jY3Jpbmc/XG4gICAgICAgIHRoaXMucmFuZ2VQaW4gPSByYW5nZS5zdGFydDsgICAgICAgICAgICAgIC8vIFdoYXQncyB0aGUgb3JpZ2luYWwgcGlubmVkIHRpbWVsaW5lIHBvaW50IHdoZW4gbWFya2VyIHdhcyBhZGRlZFxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLiRVSS5tYXJrZXJXcmFwOyAgICAgICAvLyBTZXQgcGFyZW50IGFzIG1hcmtlciB3cmFwXG4gICAgfVxuXG4gICAgLy8gQmluZCBuZWVkZWQgZXZuZXRzIGZvciBVSSBpbnRlcmFjdGlvblxuICAgIGJpbmRNYXJrZXJFdmVudHMgKCkge1xuICAgICAgICAvLyBPbiBtb3VzZSBkb3duIGluaXQgZHJhZ1xuICAgICAgICB0aGlzLiRlbC5vbignbW91c2Vkb3duLnZhYy1tYXJrZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICAvLyBXaGVuIG1vdXNlIG1vdmVzICh3aXRoIG1vdXNlIGRvd24pIGNhbGwgb25EcmFnLCB0aHJvdHRsaW5nIHRvIG9uY2UgZWFjaCAyNTAgbXNcbiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZW1vdmUudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWAsIFV0aWxzLnRocm90dGxlKHRoaXMub25EcmFnLmJpbmQodGhpcyksIDI1MCkgKTtcblxuICAgICAgICAgICAgLy8gQWRkIGRyYWcgY2xhc3MgdG8gY3Vyc29yIHRvb2x0aXAgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZighdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3ZhYy1tYXJrZXItaG92ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT24gbW91c2UgdXAgZW5kIGRyYWcgYWN0aW9uIGFuZCB1bmJpbmQgbW91c2Vtb3ZlIGV2ZW50XG4gICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZXVwLnZhYy1kbWFya2VyLSR7dGhpcy5wbGF5ZXJJZH1gLCAoZSkgPT4ge1xuICAgICAgICAgICAgIGlmKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWApO1xuICAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgIC8vIFJlbW92ZSBkcmFnIGNsYXNzIGFuZCBob3ZlciBjbGFzcyBmcm9tIGN1cnNvciB0b29sdGlwIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3ZhYy1tYXJrZXItaG92ZXInKTtcbiAgICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9uIG1vdXNlIG1vdXNlIGVudGVyLCBzaG93IGN1cnNvciB0b29sdGlwIGlmIGNvbnRyb2xzIGFyZSBub3Qgc2hvd25cbiAgICAgICAgLy8gVGhpcyBhZGRzIHRoZSBjbGFzcyB3aGljaCBpcyBwaWNrZWQgdXAgaW4gQ29udHJvbHNcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbnRyb2xzKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBzZWxmLiRlbFxuICAgICAgICAgICAgICAgIC5vbignbW91c2VlbnRlci52YWMtY3Vyc29yLXRvb2wtdGlwJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKS5hZGRDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdtb3VzZWxlYXZlLnZhYy1jdXJzb3ItdG9vbC10aXAnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLnJlbW92ZUNsYXNzKCd2YWMtbWFya2VyLWhvdmVyJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gT24gZHJhZyBhY3Rpb24sIGNhbGN1bGF0ZSBuZXcgcmFuZ2UgYW5kIHJlLXJlbmRlciBtYXJrZXJcbiAgICBvbkRyYWcgKGUpIHtcbiAgICAgICAgdmFyIGRyYWdQZXJjZW50ID0gdGhpcy5wZXJjZW50VmFsRnJvbVhwb3MoZS5wYWdlWCksXG4gICAgICAgICAgICBzZWNWYWwgPSBwYXJzZUludCh0aGlzLmR1cmF0aW9uICogZHJhZ1BlcmNlbnQpO1xuXG4gICAgICAgIGlmKHNlY1ZhbCA+IHRoaXMucmFuZ2VQaW4pe1xuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogIHRoaXMucmFuZ2VQaW4sXG4gICAgICAgICAgICAgICAgZW5kOiAgICBzZWNWYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogIHNlY1ZhbCxcbiAgICAgICAgICAgICAgICBlbmQ6ICAgIHRoaXMucmFuZ2VQaW5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYWRkaW5nQW5ub3RhdGlvbkRhdGFDaGFuZ2VkJywgeyByYW5nZTogdGhpcy5yYW5nZSB9KTtcbiAgICB9XG5cbiAgICAvLyBDYWwgcGVyY2VudGFnZSAob2YgdmlkZW8pIHBvc2l0aW9uIGZvciBhIHBpeGVsLWJhc2VkIFggcG9zaXRpb24gb24gdGhlIGRvY3VtZW50XG4gICAgcGVyY2VudFZhbEZyb21YcG9zICh4cG9zKSB7XG4gICAgICAgIHZhciB4ID0gTWF0aC5tYXgoMCwgeHBvcyAtIHRoaXMuJHBhcmVudC5vZmZzZXQoKS5sZWZ0KSwgLy8gcHggdmFsXG4gICAgICAgICAgICBtYXggPSB0aGlzLiRwYXJlbnQuaW5uZXJXaWR0aCgpLFxuICAgICAgICAgICAgcGVyID0gKHggLyBtYXgpO1xuICAgICAgICBpZihwZXIgPiAxKSBwZXIgPSAxO1xuICAgICAgICBpZihwZXIgPCAwKSBwZXIgPSAwO1xuICAgICAgICByZXR1cm4gcGVyO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBib3VuZCBldmVudHMgb24gZGVzdHJ1Y3RvblxuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfSBtb3VzZXVwLnZhYy1kbWFya2VyLSR7dGhpcy5wbGF5ZXJJZH1gKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdtb3VzZWVudGVyLnZhYy1jdXJzb3ItdG9vbC10aXAnKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdtb3VzZWxlYXZlLnZhYy1jdXJzb3ItdG9vbC10aXAnKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdtb3VzZWRvd24udmFjLW1hcmtlcicpO1xuICAgICAgICB0aGlzLiRlbC5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHRoZSB2aWRlbyAmIG1hcmtlciBzdGFydCBieSBzb21lIG51bSBzZWNvbmRzIChwb3Mgb3IgbmVnKVxuICAgIHNjcnViU3RhcnQgKHNlY29uZHNDaGFuZ2VkKSB7XG4gICAgICAgIGxldCBuZXdTdGFydCA9IHRoaXMucmFuZ2Uuc3RhcnQgKyBzZWNvbmRzQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IG5ld1N0YXJ0O1xuICAgICAgICB0aGlzLnJhbmdlLnN0YXJ0ID0gbmV3U3RhcnQ7XG4gICAgICAgIHRoaXMucmFuZ2VQaW4gPSBuZXdTdGFydDtcbiAgICAgICAgdGhpcy50ZWFyZG93bigpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2FkZGluZ0Fubm90YXRpb25EYXRhQ2hhbmdlZCcsIHsgcmFuZ2U6IHRoaXMucmFuZ2UgfSk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYSB0aW1lbGluZSBtYXJrZXIgd2l0aCBjYXBhYmlsaXRpZXMgdG8gcmVuZGVyIG9uIHRpbWVsaW5lLCBpbmNsdWRpbmcgdG9vbHRpcCBmb3IgY29tbWVudFxuKi9cblxuY29uc3QgICBQbGF5ZXJVSUNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfdWlfY29tcG9uZW50XCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoXCIuLy4uL2xpYi91dGlsc1wiKSxcbiAgICAgICAgbWFya2VyVGVtcGxhdGVOYW1lID0gJ21hcmtlcicsXG4gICAgICAgIG1hcmtlcldyYXBUZW1wbGF0ZU5hbWUgPSAnbWFya2VyX3dyYXAnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIE1hcmtlciBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIsIHJhbmdlLCBjb21tZW50PW51bGwpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICB0aGlzLnRlbXBsYXRlTmFtZSA9IG1hcmtlclRlbXBsYXRlTmFtZTtcblxuICAgICAgICBpZighdGhpcy4kVUkubWFya2VyV3JhcC5sZW5ndGgpe1xuICAgICAgICAgICAgdGhpcy4kVUkudGltZWxpbmUuYXBwZW5kKFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVGVtcGxhdGUobWFya2VyV3JhcFRlbXBsYXRlTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdGhpcyBtYXJrZXIgYXMgYWN0aXZlIChoaWdobGlnaHQpIGFuZCBvcHRpb25hbGx5IHNob3cgdG9vbHRpcCBhbHNvXG4gICAgc2V0QWN0aXZlIChzaG93VG9vbHRpcD1mYWxzZSkge1xuICAgICAgICB0aGlzLiRlbC5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKTtcbiAgICAgICAgaWYoc2hvd1Rvb2x0aXApIHRoaXMuJGVsLmFkZENsYXNzKCd2YWMtZm9yY2UtdG9vbHRpcCcpO1xuICAgIH1cblxuICAgIC8vIERlYWN0aXZhdGUgdGhpcyBtYXJrZXJcbiAgICBkZWFjdGl2YXRlICgpIHtcbiAgICAgICAgdGhpcy4kZWwucmVtb3ZlQ2xhc3MoYCR7dGhpcy5VSV9DTEFTU0VTLmFjdGl2ZX0gdmFjLWZvcmNlLXRvb2x0aXBgKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IG1hcmtlciBvbiB0aW1lbGluZSBmb3IgdGhpcy5yYW5nZTtcbiAgICByZW5kZXIgKCkge1xuICAgICAgICAvLyBjbGVhciBleGlzdGluZyBtYXJrZXIgaWYgdGhpcyBvbmUgd2FzIGFscmVhZHkgcmVuZGVyZWRcbiAgICAgICAgdGhpcy4kVUkudGltZWxpbmUuZmluZChgW2RhdGEtbWFya2VyLWlkPVwiJHt0aGlzLmNvbXBvbmVudElkfVwiXWApLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIEJpbmQgdG8gbG9jYWwgaW5zdGFuY2UgdmFyLCBhZGQgdG8gRE9NLCBhbmQgc2V0dXAgZXZlbnRzXG4gICAgICAgIHRoaXMuJGVsID0gJCh0aGlzLnJlbmRlclRlbXBsYXRlKHRoaXMudGVtcGxhdGVOYW1lLCB0aGlzLm1hcmtlclRlbXBsYXRlRGF0YSkpO1xuICAgICAgICB0aGlzLiRVSS5tYXJrZXJXcmFwLmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgICAgIHRoaXMuYmluZE1hcmtlckV2ZW50cygpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgbmVlZGVkIGV2ZW50cyBmb3IgdGhpcyBtYXJrZXJcbiAgICBiaW5kTWFya2VyRXZlbnRzICgpIHtcbiAgICAgICAgLy8gaGFuZGxlIGRpbW1pbmcgb3RoZXIgbWFya2VycyArIGhpZ2hsaWdodGluZyB0aGlzIG9uZSBvbiBtb3VzZWVudGVyL2xlYXZlXG4gICAgICAgIHRoaXMuJGVsLm9uKFwibW91c2VlbnRlci52YWMtbWFya2VyXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKCd2YWMtaG92ZXJpbmcnKS5jbG9zZXN0KFwiLnZhYy1tYXJrZXItd3JhcFwiKS5hZGRDbGFzcygndmFjLWRpbS1hbGwnKTtcbiAgICAgICAgfSkub24oXCJtb3VzZWxlYXZlLnZhYy1tYXJrZXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kZWwucmVtb3ZlQ2xhc3MoJ3ZhYy1ob3ZlcmluZycpLmNsb3Nlc3QoXCIudmFjLW1hcmtlci13cmFwXCIpLnJlbW92ZUNsYXNzKCd2YWMtZGltLWFsbCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvYmplY3QgZm9yIHRlbXBsYXRlXG4gICAgZ2V0IG1hcmtlclRlbXBsYXRlRGF0YSAoKSB7XG4gICAgICAgICAvLyB0aGUgc21hbGxlciB0aGUgd2lkdGgsIHRoZSBoaWdoZXIgdGhlIHotaW5kZXggc28gb3ZlcmxhcHMgYXJlIGNsaWNrYWJsZVxuICAgICAgICBsZXQgbGVmdCA9ICh0aGlzLnJhbmdlLnN0YXJ0IC8gdGhpcy5kdXJhdGlvbikgKiAxMDAsXG4gICAgICAgICAgICB3aWR0aCA9ICgodGhpcy5yYW5nZS5lbmQgLyB0aGlzLmR1cmF0aW9uKSAqIDEwMCkgLSBsZWZ0LFxuICAgICAgICAgICAgekluZGV4ID0gKDEwMCAtIE1hdGguZmxvb3Iod2lkdGgpKSB8fCAxMDA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAgICAgICAgIGxlZnQgKyAnJScsXG4gICAgICAgICAgICB3aWR0aDogICAgICAgIHdpZHRoICsgJyUnLFxuICAgICAgICAgICAgekluZGV4OiAgICAgICB6SW5kZXgsXG4gICAgICAgICAgICBzaG93VG9vbHRpcDogIHRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd01hcmtlclNoYXBlQW5kVG9vbHRpcHMsXG4gICAgICAgICAgICB0b29sdGlwUmlnaHQ6IGxlZnQgPiA1MCxcbiAgICAgICAgICAgIHRvb2x0aXBUaW1lOiAgVXRpbHMuaHVtYW5UaW1lKHRoaXMucmFuZ2UpLFxuICAgICAgICAgICAgdG9vbHRpcEJvZHk6ICAhdGhpcy5jb21tZW50ID8gbnVsbCA6IHRoaXMuY29tbWVudC5ib2R5LFxuICAgICAgICAgICAgcmFuZ2VTaG93OiAgICAhIXRoaXMucmFuZ2UuZW5kLFxuICAgICAgICAgICAgaWQ6ICAgICAgICAgICB0aGlzLmNvbXBvbmVudElkXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGxpc3RlbmVycyBvbiB0ZWFyZG93biBhbmQgcmVtb3ZlIERPTSBub2Rlc1xuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgdGhpcy4kZWxcbiAgICAgICAgICAgIC5vZmYoJ21vdXNlZW50ZXIudmFjLW1hcmtlcicpXG4gICAgICAgICAgICAub2ZmKCdtb3VzZWxlYXZlLnZhYy1tYXJrZXInKVxuICAgICAgICAgICAgLm9mZignY2xpY2sudmFjLW1hcmtlcicpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgbWFpbiAnYW5ub3RhdGlvbiB0b2dnbGUnIGJ1dHRvbiBpbiB0aGUgcGxheWVyIGNvbnRyb2xzLCBpbmNsdWRpbmcgbm90aWZpZXIgZm9yICMgYW5ub3RhdGlvbnNcbiovXG5cbmNvbnN0IFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICB0ZW1wbGF0ZU5hbWUgPSBcInBsYXllcl9idXR0b25cIjtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQbGF5ZXJCdXR0b24gZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgdGhpcy5pbml0QVBJKHRoaXMsICdQbGF5ZXJCdXR0b24nKTtcblxuICAgICAgICB0aGlzLiRlbC5vbignY2xpY2sudmFjLXBsYXllci1idXR0b24nLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgYnV0dG9uIHRvIHBsYXllclxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGxldCBidG4gPSB0aGlzLnBsYXllci5nZXRDaGlsZCgnY29udHJvbEJhcicpLmFkZENoaWxkKCdidXR0b24nLCB7fSk7XG4gICAgICAgIGJ0bi5jb250cm9sVGV4dChcIlRvZ2dsZSBBbmltYXRpb25zXCIpO1xuICAgICAgICB0aGlzLiRlbCA9ICQoYnRuLmVsKCkpO1xuICAgICAgICB0aGlzLiRlbC5hZGRDbGFzcygndmFjLXBsYXllci1idG4nKS5maW5kKFwiLnZqcy1pY29uLXBsYWNlaG9sZGVyXCIpLmh0bWwodGhpcy5yZW5kZXJUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucyBkaXNwbGF5ZWQgaW4gdGhlIGJ1YmJsZVxuICAgIHVwZGF0ZU51bUFubm90YXRpb25zICgpIHtcbiAgICAgICAgbGV0IG51bSA9IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5hbm5vdGF0aW9ucy5sZW5ndGgsXG4gICAgICAgICAgICAkYnViYmxlID0gdGhpcy4kZWwuZmluZChcImJcIik7XG4gICAgICAgICRidWJibGUudGV4dChudW0pO1xuICAgICAgICBudW0gPiAwID8gJGJ1YmJsZS5yZW1vdmVDbGFzcyh0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKSA6ICRidWJibGUuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGxpc3RlbmVycyBvbiB0ZWFyZG93biBhbmQgcmVtb3ZlIERPTSBub2Rlc1xuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdjbGljay52YWMtcGxheWVyLWJ1dHRvbicpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIGEgc2hhcGUgdGhhdCBjYW4gYmUgZHJ1Zy9zaXplZCBvbiB0b3Agb2YgdGhlIHZpZGVvIHdoaWxlIGFkZGluZyBhIG5ldyBhbm5vdGF0aW9uXG4qL1xuXG5jb25zdCAgIFNoYXBlID0gcmVxdWlyZShcIi4vc2hhcGVcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi8uLi9saWIvdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBTZWxlY3RhYmxlU2hhcGUgZXh0ZW5kcyBTaGFwZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJHBsYXllci5maW5kKFwiLnZhYy12aWRlby1jb3Zlci1jYW52YXNcIik7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQmluZCBhbGwgbmVlZGVkIGV2ZW50cyBmb3IgZHJhZyBhY3Rpb25cbiAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgLy8gT24gbW91c2Vkb3duIGluaXRpYWxpemUgZHJhZ1xuICAgICAgICB0aGlzLiRwYXJlbnQub24oXCJtb3VzZWRvd24udmFjLXNlbGVjdGFibGUtc2hhcGVcIiwgKGUpID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGEgZmV3IGNvbmRpdGlvbnMgdG8gc2VlIGlmIHdlIHNob3VsZCAqbm90KiBzdGFydCBkcmFnXG4gICAgICAgICAgICBpZiggISgkKGUudGFyZ2V0KS5oYXNDbGFzcygndmFjLXZpZGVvLWNvdmVyLWNhbnZhcycpKSApIHJldHVybjsgLy9kaWRuJ3QgY2xpY2sgb24gb3ZlcmxheVxuICAgICAgICAgICAgaWYoICQoZS50YXJnZXQpLmhhc0NsYXNzKCd2YWMtc2hhcGUnKSApIHJldHVybjsgLy91c2VyIGNsaWNrZWQgb24gYW5ub3RhdGlvblxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgb2xkIHNoYXBlIGlmIG9uZSBleGlzdGVkXG4gICAgICAgICAgICBpZih0aGlzLiRlbCkgdGhpcy4kZWwucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIC8vIERlZmluZSBkZWZhdWx0IHN0YXJ0aW5nIHNoYXBlIChqdXN0IHgveSBjb29yZHMgb2Ygd2hlcmUgdXNlciBjbGlja2VkIG5vIHdpZHRoL2hlaWdodCB5ZXQpXG4gICAgICAgICAgICBsZXQgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgeDE6IHRoaXMueENvb3JkVG9QZXJjZW50KGUucGFnZVgpLFxuICAgICAgICAgICAgICAgIHkxOiB0aGlzLllDb29yZFRvUGVyY2VudChlLnBhZ2VZKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNoYXBlLngyID0gc2hhcGUueDE7XG4gICAgICAgICAgICBzaGFwZS55MiA9IHNoYXBlLnkyO1xuICAgICAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlO1xuXG4gICAgICAgICAgICAvLyBTYXZlIG9yaWdpbiBwb2ludHMgZm9yIGZ1dHVyZSB1c2VcbiAgICAgICAgICAgIHRoaXMub3JpZ2luWCA9IHNoYXBlLngxO1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5ZID0gc2hhcGUueTE7XG5cbiAgICAgICAgICAgIC8vIERyYXcgc2hhcGUgYW5kIHN0YXJ0IGRyYWcgc3RhdGVcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ01vdmVkID0gZmFsc2U7IC8vIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHVzZXIgYWN0dWFsbHkgZHJhZ2dlZCBvciBqdXN0IGNsaWNrZWRcblxuICAgICAgICAgICAgLy8gQmluZCBldmVudCBvbiBkb2MgbW91c2Vtb3ZlIHRvIHRyYWNrIGRyYWcsIHRocm90dGxlZCB0byBvbmNlIGVhY2ggMTAwbXNcbiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZW1vdmUudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9YCwgVXRpbHMudGhyb3R0bGUodGhpcy5vbkRyYWcuYmluZCh0aGlzKSwgMTAwKSApO1xuXG4gICAgICAgICAgICAvLyBBZGQgZHJhZyBjbGFzcyB0byBjdXJzb3IgdG9vbHRpcCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLmFkZENsYXNzKCd2YWMtY3Vyc29yLWRyYWdnaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9uIG1vdXNldXAsIGlmIGR1cmluZyBkcmFnIGNhbmNlbCBkcmFnIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICAkKGRvY3VtZW50KS5vbihgbW91c2V1cC52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9YCk7XG5cbiAgICAgICAgICAgIGlmKCF0aGlzLmRyYWdNb3ZlZCl7XG4gICAgICAgICAgICAgICAgLy9jbGVhciBzaGFwZSBpZiBpdCdzIGp1c3QgYSBjbGljayAoYW5kIG5vdCBhIGRyYWcpXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYodGhpcy4kZWwpIHRoaXMuJGVsLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBkcmFnIGNsYXNzIGZyb20gY3Vyc29yIHRvb2x0aXAgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZighdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKS5yZW1vdmVDbGFzcygndmFjLWN1cnNvci1kcmFnZ2luZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBPbiBlYWNoIGludGVyYXRpb24gb2YgZHJhZyBhY3Rpb24gKG1vdXNlIG1vdmVtZW50KSwgcmVjYWxjIHBvc2l0aW9uIGFuZCByZWRyYXcgc2hhcGVcbiAgICBvbkRyYWcgKGUpIHtcbiAgICAgICAgdGhpcy5kcmFnTW92ZWQgPSB0cnVlO1xuXG4gICAgICAgIGxldCB4UGVyID0gdGhpcy54Q29vcmRUb1BlcmNlbnQoZS5wYWdlWCksXG4gICAgICAgICAgICB5UGVyID0gdGhpcy5ZQ29vcmRUb1BlcmNlbnQoZS5wYWdlWSk7XG5cbiAgICAgICAgaWYoeFBlciA8IHRoaXMub3JpZ2luWCl7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLngyID0gdGhpcy5vcmlnaW5YO1xuICAgICAgICAgICAgdGhpcy5zaGFwZS54MSA9IE1hdGgubWF4KDAsIHhQZXIpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueDIgPSBNYXRoLm1pbigxMDAsIHhQZXIpO1xuICAgICAgICAgICAgdGhpcy5zaGFwZS54MSA9IHRoaXMub3JpZ2luWDtcbiAgICAgICAgfVxuICAgICAgICBpZih5UGVyIDwgdGhpcy5vcmlnaW5ZKXtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueTIgPSB0aGlzLm9yaWdpblk7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLnkxID0gTWF0aC5tYXgoMCwgeVBlcik7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zaGFwZS55MiA9IE1hdGgubWluKDEwMCwgeVBlcik7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLnkxID0gdGhpcy5vcmlnaW5ZO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0RGltc0Zyb21TaGFwZSgpO1xuXG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2FkZGluZ0Fubm90YXRpb25EYXRhQ2hhbmdlZCcsIHsgc2hhcGU6IHRoaXMuc2hhcGUgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBwaXhlbC1iYXNlZCB4IHBvc2l0aW9uIChyZWxhdGl2ZSB0byBkb2N1bWVudCkgdG8gcGVyY2VudGFnZSBpbiB2aWRlb1xuICAgIHhDb29yZFRvUGVyY2VudCAoeCkge1xuICAgICAgICB4ID0geCAtIHRoaXMuJHBhcmVudC5vZmZzZXQoKS5sZWZ0OyAvL3BpeGVsIHBvc2l0aW9uXG4gICAgICAgIGxldCBtYXggPSB0aGlzLiRwYXJlbnQuaW5uZXJXaWR0aCgpO1xuICAgICAgICByZXR1cm4gTnVtYmVyKCgoeCAvIG1heCkgKiAxMDApLnRvRml4ZWQoMikpOyAvL3JvdW5kIHRvIDIgZGVjaW1hbCBwbGFjZXNcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHBpeGVsLWJhc2VkIHkgcG9zaXRpb24gKHJlbGF0aXZlIHRvIGRvY3VtZW50KSB0byBwZXJjZW50YWdlIGluIHZpZGVvXG4gICAgWUNvb3JkVG9QZXJjZW50ICh5KSB7XG4gICAgICAgIHkgPSB5IC0gdGhpcy4kcGFyZW50Lm9mZnNldCgpLnRvcDsgLy9waXhlbCBwb3NpdGlvblxuICAgICAgICBsZXQgbWF4ID0gdGhpcy4kcGFyZW50LmlubmVySGVpZ2h0KCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIoKCh5IC8gbWF4KSAqIDEwMCkudG9GaXhlZCgyKSk7IC8vcm91bmQgdG8gMiBkZWNpbWFsIHBsYWNlc1xuICAgIH1cblxuICAgIC8vIFVuYmluZCBldmVudHMgYW5kIHJlbW92ZSBlbGVtZW50XG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLiRwYXJlbnQub2ZmKCdtb3VzZWRvd24udmFjLXNlbGVjdGFibGUtc2hhcGUnKTtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZXVwLnZhYy1zc2hhcGUtJHt0aGlzLnBsYXllcklkfSBtb3VzZW1vdmUudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9YCk7XG4gICAgICAgIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgbWFuYWdpbmcgYSBzaGFwZSAoaS5lLiBib3ggZHJhd24gb24gdGhlIHBsYXllcikgZm9yIGFuIGFubm90YXRpb25cbiovXG5cbmNvbnN0IFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgU2hhcGUgZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyLCBzaGFwZT1udWxsKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuc2hhcGUgPSBzaGFwZTtcbiAgICAgICAgdGhpcy4kcGFyZW50ID0gdGhpcy4kcGxheWVyO1xuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHNoYXBlIGVsZW1lbnQgb24gdGhlICRwYXJlbnRcbiAgICByZW5kZXIgKCkge1xuICAgICAgICBpZighdGhpcy5zaGFwZSkgcmV0dXJuO1xuICAgICAgICBpZih0aGlzLiRlbCkgdGhpcy4kZWwucmVtb3ZlKCk7XG5cbiAgICAgICAgdGhpcy4kZWwgPSAkKFwiPGRpdi8+XCIpLmFkZENsYXNzKFwidmFjLXNoYXBlXCIpO1xuICAgICAgICB0aGlzLnNldERpbXNGcm9tU2hhcGUoKTtcbiAgICAgICAgdGhpcy4kcGFyZW50LmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgfVxuXG4gICAgLy8gU2V0L3VwZGF0ZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgc2hhcGUgYmFzZWQgIG9uIHRoaXMuc2hhcGVcbiAgICBzZXREaW1zRnJvbVNoYXBlICgpIHtcbiAgICAgICAgdGhpcy4kZWwuY3NzKHtcbiAgICAgICAgICAgIGxlZnQ6ICAgdGhpcy5zaGFwZS54MSArIFwiJVwiLFxuICAgICAgICAgICAgdG9wOiAgICB0aGlzLnNoYXBlLnkxICsgXCIlXCIsXG4gICAgICAgICAgICB3aWR0aDogICh0aGlzLnNoYXBlLngyLXRoaXMuc2hhcGUueDEpICsgXCIlXCIsXG4gICAgICAgICAgICBoZWlnaHQ6ICh0aGlzLnNoYXBlLnkyLXRoaXMuc2hhcGUueTEpICsgXCIlXCJcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIExvYWQgcGx1Z2luIGFuZCByZWdpc3RlciB0byBnbG9iYWwgdmlkZW9qc1xuKi9cblxuKCgkLCB2aWRlb2pzKSA9PiB7XG4gICAgY29uc3QgQW5ub3RhdGlvbkNvbW1lbnRzID0gcmVxdWlyZSgnLi9hbm5vdGF0aW9uX2NvbW1lbnRzLmpzJyk7XG4gICAgdmlkZW9qcy5yZWdpc3RlclBsdWdpbihcbiAgICAgICAgJ2Fubm90YXRpb25Db21tZW50cycsXG4gICAgICAgIEFubm90YXRpb25Db21tZW50cyh2aWRlb2pzKVxuICAgICk7XG59KShqUXVlcnksIHdpbmRvdy52aWRlb2pzKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qXG4gICAgQ2xhc3NlcyBmb3IgcmVnaXN0ZXJpbmcgYW5kIGhhbmRsaW5nIGN1c3RvbSBldmVudHMgZm9yIGV4dGVybmFsIGludGVyYWN0aW9uIHN1cHBvcnQuXG4gICAgV2lsbCBiZSBib3VuZCB0byBwbHVnaW4gb2JqZWN0IGFzIGEgbWVzc2FnZSBnYXRld2F5IGJldHdlZW4gZXh0ZXJuYWwgZWxlbWVudHMgYW5kIHRoZSBwbHVnaW4uXG4qL1xuXG5jb25zdCBMb2dnZXIgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5cbi8qXG4gICAgQSBjZW50cmFsaXplZCBjb2xsZWN0aW9uIG9mIGV2ZW50IGNhbGxiYWNrcyBvcmdhbml6ZWQgYnkgY29tcG9uZW50IGFuZCBuYW1lXG4gICAgTWFpbiByZWZlcmVuY2UgZm9yIGV4dGVybmFsIGV2ZW50IGFwaVxuICAgIFRoZXNlIGV2ZW50cyB3aWxsIGJlIGJvdW5kIHRvIHRoZSBwbHVnaW4gb24gaW5pdGlhbGl6YXRpb24gb2YgdGhlaXIgcmVzcGVjdGl2ZSBjb21wb25lbnRzXG4gICAgTk9URSAtICdzZWxmJyBhcyBzZWNvbmQgcGFyYW0gaW4gZWFjaCBmdW5jdGlvbiBpcyBhIHdvcmthcm91bmQgZm9yIHRyYW5zcGlsZXIgbm90IHByb3Blcmx5XG4gICAga2VlcGluZyB0aGlzICwgc28gd2UgcGFzcyBpbiBpbnN0YW5jZSB0byB1c2UgYXMgdGhpcyBmb3IgZWFjaCBmbiAtIGNhbid0IHJlbHkgb24gYmluZFxuICAgIGJlY2F1c2UgdGhpcyBpcyByZXdyaXR0ZW4gZnJvbSBzeW1ib2wgcmVnaXN0cnkgaW4gdHJhbnNwaWxlciBhbmQgaXQncyBub3QgcHJlc2VudFxuKi9cblxuY29uc3QgRXZlbnRSZWdpc3RyeSA9IHtcbiAgICBBbm5vdGF0aW9uU3RhdGU6IHtcbiAgICAgICAgb3BlbkFubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLm9wZW5Bbm5vdGF0aW9uQnlJZChldmVudC5kZXRhaWwuaWQpO1xuICAgICAgICB9LFxuICAgICAgICBjbG9zZUFjdGl2ZUFubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG5ld0Fubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLmNyZWF0ZUFuZEFkZEFubm90YXRpb24oZXZlbnQuZGV0YWlsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveUFubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLmRlc3Ryb3lBbm5vdGF0aW9uQnlJZChldmVudC5kZXRhaWwuaWQpO1xuICAgICAgICB9LFxuICAgICAgICBuZXdDb21tZW50OiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IF90aGlzLmZpbmRBbm5vdGF0aW9uKGV2ZW50LmRldGFpbC5hbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgaWYoYW5ub3RhdGlvbikgYW5ub3RhdGlvbi5jb21tZW50TGlzdC5jcmVhdGVDb21tZW50KGV2ZW50LmRldGFpbC5ib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveUNvbW1lbnQ6IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIGxldCBjb21tZW50ID0gX3RoaXMuZmluZENvbW1lbnQoZXZlbnQuZGV0YWlsLmlkKTtcbiAgICAgICAgICAgIGlmKGNvbW1lbnQpIGNvbW1lbnQuY29tbWVudExpc3QuZGVzdHJveUNvbW1lbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBDb250cm9sczoge1xuICAgICAgICBhZGRpbmdBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5zdGFydEFkZE5ldygpO1xuICAgICAgICB9LFxuICAgICAgICBjYW5jZWxBZGRpbmdBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5jYW5jZWxBZGROZXcoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUGxheWVyQnV0dG9uOiB7XG4gICAgICAgIG9uU3RhdGVDaGFuZ2VkOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy51cGRhdGVOdW1Bbm5vdGF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBBbm5vdGF0aW9uQ29tbWVudHM6IHtcbiAgICAgICAgdG9nZ2xlQW5ub3RhdGlvbk1vZGU6IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEV2ZW50RGlzcGF0Y2hlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGx1Z2luKSB7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLnBsdWdpblJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGVuZGluZ0V2dHMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMuZXZlbnRSZWdpc3RyeSA9IEV2ZW50UmVnaXN0cnk7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBFdmVudFJlZ2lzdHJ5IHRvIG1hc3MgcmVnaXN0ZXIgZXZlbnRzIG9uIGVhY2ggY29tcG9uZW50IGluaXRpYWxpemF0aW9uXG4gICAgcmVnaXN0ZXJMaXN0ZW5lcnNGb3IgKG9iaiwgY2xhc3NOYW1lKSB7XG4gICAgICAgIGxldCBtYXRjaGluZ0V2ZW50cyA9IHRoaXMuZXZlbnRSZWdpc3RyeVtjbGFzc05hbWVdO1xuICAgICAgICBpZiAobWF0Y2hpbmdFdmVudHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1hdGNoaW5nRXZlbnRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCByZWdpc3RlciBhZ2FpbiBpZiBhbHJlYWR5IGluIGNhY2hlZCBjb2xsZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCF+dGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzLmluZGV4T2Yoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSBtYXRjaGluZ0V2ZW50c1trZXldLmJpbmQob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVyKGtleSwgKChldnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpblJlYWR5KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NhbGxiYWNrKGtleSwgY2xhc3NOYW1lLCBldnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXZ0LCBvYmopO1xuICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJpbmQgYSBsaXN0ZW5lciB0byB0aGUgcGx1Z2luXG4gICAgcmVnaXN0ZXJMaXN0ZW5lciAodHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wbHVnaW4ub24odHlwZSwgY2FsbGJhY2spO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMucHVzaCh0eXBlKTtcbiAgICB9XG5cbiAgICAvLyBVbmJpbmQgYSBsaXN0ZW5lciBmcm9tIHRoZSBwbHVnaW5cbiAgICB1bnJlZ2lzdGVyTGlzdGVuZXIgKHR5cGUpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4ub2ZmKHR5cGUpO1xuICAgICAgICBsZXQgaSA9IHRoaXMucmVnaXN0ZXJlZExpc3RlbmVycy5pbmRleE9mKHR5cGUpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgYW4gZXZlbnQgb24gdGhlIHBsdWdpblxuICAgIGZpcmUgKHR5cGUsIGRhdGEpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luUmVhZHkpIHJldHVybjtcbiAgICAgICAgTG9nZ2VyLmxvZyhcImV2dC1kaXNwYXRjaC1GSVJFXCIsIHR5cGUsIGRhdGEpO1xuICAgICAgICBsZXQgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgJ2RldGFpbCc6IGRhdGEgfSk7XG4gICAgICAgIHRoaXMucGx1Z2luLnRyaWdnZXIoZXZ0KTtcbiAgICB9XG5cbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZExpc3RlbmVycy5mb3JFYWNoKCh0eXBlKSA9PiB7IHRoaXMudW5yZWdpc3Rlckxpc3RlbmVyKHR5cGUpIH0pO1xuICAgIH1cblxuICAgIGxvZ0NhbGxiYWNrIChldmVudE5hbWUsIGNsYXNzTmFtZSwgZXZlbnQpIHtcbiAgICAgICAgTG9nZ2VyLmxvZyhcImV2dC1kaXNwYXRjaC1SRUNFSVZFXCIsIGAke2V2ZW50TmFtZX0gKCR7Y2xhc3NOYW1lfSlgLCBldmVudCk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuLypcblx0R2VuZXJhbCBsb2dnaW5nIGxpYnJhcnksIGNoZWNraW5nIHRvIHNlZSBpZiB3aW5kb3cuVkFDX0RFQlVHIGlzIHByZXNlbnQgYW5kIHRydWUgdG8gZW5hYmxlIGRlYnVnZ2luZ1xuKi9cblxuLy8gUHJlZml4IGZvciBhcHBlbmRpbmcgdG8gYWxsIGxvZ2dlciBtZXNzYWdlc1xuY29uc3QgTE9HX1BSRUZJWCA9IFwiOjpWQUM6OlwiO1xuXG4vLyBBcmUgd2UgaW4gZGVidWcgbW9kZT9cbmZ1bmN0aW9uIGRlYnVnKCl7XG5cdHJldHVybiAhIXdpbmRvdy5WQUNfREVCVUc7XG59XG5cbi8vIEJ1aWxkIGFyZ3VtZW50cyBmb3IgY29uc29sZSBmbiwgYWRkaW5nIHByZWZpeFxuZnVuY3Rpb24gYnVpbGRBcmdzKGFyZ3Mpe1xuXHRyZXR1cm4gW0xPR19QUkVGSVhdLmNvbmNhdChhcmdzKTtcbn1cblxuLy8gTG9nIG1lc3NhZ2UvZGF0YVxubW9kdWxlLmV4cG9ydHMubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZighZGVidWcoKSkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nLmFwcGx5KG51bGwsIGJ1aWxkQXJncyhhcmdzKSk7XG59XG5cbi8vIEVycm9yIG1lc3NhZ2UvZGF0YVxubW9kdWxlLmV4cG9ydHMuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmKCFkZWJ1ZygpKSByZXR1cm47XG4gICAgY29uc29sZS5lcnJvci5hcHBseShudWxsLCBidWlsZEFyZ3MoYXJncykpO1xufVxuXG4vLyBJbmZvIG1lc3NhZ2UvZGF0YVxubW9kdWxlLmV4cG9ydHMuaW5mbyA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYoIWRlYnVnKCkpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8uYXBwbHkobnVsbCwgYnVpbGRBcmdzKGFyZ3MpKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBCYXNlIGNsYXNzIGFsbCBwbGF5ZXIgY29tcG9uZW50cyBpbnRlcml0IGZyb20gLSBpdCBpbmNsdWRlcyBsb3RzIG9mIGhlbHBlciBmdW5jdGlvbnMgKHRvIGdldCByZWZlcmVuY2UgdG9cbiAgICB0aGUgcGxheWVyLCB0aGUgcGx1Z2luLCB2aWRlbyBzdGF0ZSwgZXRjKVxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQbGF5ZXJDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllcikge1xuICAgICAgICB0aGlzLl9wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gYXR0cmlidXRlIHRvIGdldCByZWZlcmVuY2UgdG8gdGhlIG1haW4gcGx1Z2luIG9iamVjdCAobWFpbi5qcyBpbnN0YW5jZSlcbiAgICBnZXQgcGx1Z2luICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmFubm90YXRpb25Db21tZW50cygpO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGphdmFzY3JpcHQgaW5zdGFuY2VcbiAgICBnZXQgcGxheWVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXllcjtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHZpZGVvIGR1cmF0aW9uIChpbiBzZWNvbmRzKVxuICAgIGdldCBkdXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5kdXJhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGN1cnJlbnQgdGltZVxuICAgIGdldCBjdXJyZW50VGltZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5jdXJyZW50VGltZSgpO1xuICAgIH1cblxuICAgIC8vIHNldCBjdXJyZW50IHRpbWUgb2YgcGxheWVyXG4gICAgc2V0IGN1cnJlbnRUaW1lICh0aW1lKSB7XG4gICAgICAgIHRoaXMucGxheWVyLmN1cnJlbnRUaW1lKHRpbWUpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGFsbCBldmVudHMgaW4gdGhlIEV2ZW50UmVnaXN0cnkgbWF0Y2hpbmcgdGhpcyBjbGFzc05hbWVcbiAgICBpbml0QVBJIChvYmosIGNsYXNzTmFtZSkge1xuICAgICAgICB0aGlzLnBsdWdpbi5ldmVudERpc3BhdGNoZXIucmVnaXN0ZXJMaXN0ZW5lcnNGb3Iob2JqLCBjbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vIE51bGxpZnkgcGxheWVyIHJlZmVyZW5jZSBzbyBvYmplY3RzIGNhbiBiZSByZW1vdmVkIHNhZmVseVxuICAgIC8vIEFsbCBjb21wb25lbnRzIHNob3VsZCBjYWxsIHN1cGVyLnRlYXJkb3duKCkgd2l0aGluIHRoZWlyIHRlYXJkb3duIGZ1bmNzXG4gICAgdGVhcmRvd24gKGRlc3Ryb3k9ZmFsc2UpIHtcbiAgICAgICAgaWYoZGVzdHJveSkgdGhpcy5fcGxheWVyID0gbnVsbDtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQmFzZSBjbGFzcyBhbGwgcGxheWVyIFVJIGNvbXBvbmVudHMgaW50ZXJpdCBmcm9tIC0gaXQgaW5jbHVkZXMgbG90cyBvZiBoZWxwZXIgZnVuY3Rpb25zICh0byBnZXQgcmVmZXJlbmNlIHRvXG4gICAgdGhlIHBsYXllciAkZWwsIHZhcmlvdXMgY2xhc3Nlcy9oZWxwZXJzLCB0ZW1wbGF0ZSByZW5kZXJpbmcsIGV0YylcbiovXG5cbmNvbnN0IFBsYXllckNvbXBvbmVudCA9IHJlcXVpcmUoXCIuL3BsYXllcl9jb21wb25lbnRcIiksXG4gICAgICBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycy9ydW50aW1lJyksXG4gICAgICBUZW1wbGF0ZXMgPSByZXF1aXJlKCcuLy4uL2NvbXBpbGVkL3RlbXBsYXRlcycpLFxuICAgICAgVXRpbHMgPSByZXF1aXJlKCcuLy4uL2xpYi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFBsYXllclVJQ29tcG9uZW50IGV4dGVuZHMgUGxheWVyQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICB9XG5cbiAgICAvLyBoZWxwZXJzIHRvIGdldCB2YXJpb3VzIFVJIGNvbXBvbmVudHMgb2YgdGhlIHBsYXllciBxdWlja2x5LCBrZWVwaW5nIGNvbW1vbmx5IHJldXNlZCBjbGFzcyBuYW1lc1xuICAgIC8vIGNvbnNvbGlkYXRlZCBpbiBjYXNlIG9mIG5lZWQgdG8gY2hhbmdlIGluIHRoZSBmdXR1cmUgKGFuZCBmb3IgcXVpY2sgYWNjZXNzKVxuICAgIGdldCAkVUkgKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBjb21tZW50c0NvbnRhaW5lcjogICAgICB0aGlzLiRwbGF5ZXIuZmluZChcIi52YWMtY29tbWVudHMtY29udGFpbmVyXCIpLCAgICAgICAvLyBvdXRlciBjb250YWluZXIgZm9yIGFsbCBjb21tZW50c1xuICAgICAgICAgICAgY29udHJvbEVsZW1lbnRzOiAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLWNvbnRyb2xcIiksICAgICAgICAgICAgICAgICAgLy8gRWFjaCBvZiBtdWx0aXBsZSBjb250cm9sIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIGJhclxuICAgICAgICAgICAgbmV3Q29tbWVudFRleHRhcmVhOiAgICAgdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLXZpZGVvLXdyaXRlLW5ldyB0ZXh0YXJlYVwiKSwgLy8gVGV4dGFyZWEgZm9yIHdyaXRpbmcgYSBuZXcgY29tbWVudFxuICAgICAgICAgICAgdGltZWxpbmU6ICAgICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52anMtcHJvZ3Jlc3MtY29udHJvbCcpLCAgICAgICAgIC8vIFRpbWVsaW5lIGVsZW1lbnRcbiAgICAgICAgICAgIG1hcmtlckN1cnNvckhlbHBUZXh0OiAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci1oZWxwLXRleHQnKSwgICAgICAgICAvLyBIZWxwIHRleHQgdGhhdCBhcHBlYXJzIHdpdGggJ2NsaWNrL2RyYWcuLicgb24gdGltZWxpbmVcbiAgICAgICAgICAgIGNvbnRyb2xCYXI6ICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmpzLWNvbnRyb2wtYmFyJyksICAgICAgICAgICAgICAvLyBDb25yb2wgYmFyIHdyYXBwZXIgZm9yIHZqc1xuICAgICAgICAgICAgbWFya2VyV3JhcDogICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtbWFya2VyLXdyYXAnKSwgICAgICAgICAgICAgIC8vIHdyYXBwZXIgZWxlbWVudCB0byBwbGFjZSBtYXJrZXJzIGluIG9uIHRpbWVsaW5lXG4gICAgICAgICAgICBjb3ZlckNhbnZhczogICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy12aWRlby1jb3Zlci1jYW52YXMnKSAgICAgICAgLy8gUGxheWVyIGNvdmVyIGR1cmluZyBhZGRpbmcgYW5ub3RhdGlvbiBzdGF0ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB1dGlsaXR5IGNsYXNzZXMgdXNlZCBpbiB2YXJpb3VzIGNvbXBvbmVudHNcbiAgICBnZXQgVUlfQ0xBU1NFUyAoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIGhpZGRlbjogXCJ2YWMtaGlkZGVuXCIsXG4gICAgICAgICAgICBhY3RpdmU6IFwidmFjLWFjdGl2ZVwiXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGpxdWVyeSBlbGVtZW50XG4gICAgZ2V0ICRwbGF5ZXIgKCkge1xuICAgICAgICByZXR1cm4gJCh0aGlzLnBsYXllci5lbCgpKTtcbiAgICB9XG5cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGlkIGZyb20gRE9NXG4gICAgZ2V0IHBsYXllcklkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHBsYXllci5hdHRyKCdpZCcpO1xuICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZSBhIHBzZXVkby1ndWlkIElEIGZvciB0aGlzIGNvbXBvbmVudCwgdG8gdXNlIGFzIGFuIElEIGluIHRoZSBET01cbiAgICBnZXQgY29tcG9uZW50SWQgKCkge1xuICAgICAgICB0aGlzLmNpZF8gPSB0aGlzLmNpZF8gfHwgVXRpbHMuZ3VpZCgpXG4gICAgICAgIHJldHVybiB0aGlzLmNpZF87XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBwbGF5L2NvbnRyb2wgYWN0aW9ucyBvbiB0aGUgY3VycmVudCBwbGF5ZXJcbiAgICBkaXNhYmxlUGxheWluZ0FuZENvbnRyb2wgKCkge1xuICAgICAgICB0aGlzLiRwbGF5ZXIuYWRkQ2xhc3MoJ3ZhYy1kaXNhYmxlLXBsYXknKTtcbiAgICAgICAgLy9UT0RPIC0gY2F0Y2ggc3BhY2ViYXIgYmVpbmcgaGl0XG4gICAgICAgIC8vVE9ETyAtIHByZXZlbnQgc2NydWJiaW5nIGFuZCB0aW1lbGluZSBjbGljayB0byBzZWVrXG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHBsYXkvY29udHJvbCBhY3Rpb25zIG9uIHRoZSBjb250cm9sbGVyXG4gICAgZW5hYmxlUGxheWluZ0FuZENvbnRyb2wgKCkge1xuICAgICAgICB0aGlzLiRwbGF5ZXIucmVtb3ZlQ2xhc3MoJ3ZhYy1kaXNhYmxlLXBsYXknKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgYSBoYW5kbGViYXJzIHRlbXBsYXRlIHdpdGggbG9jYWwgZGF0YSBwYXNzZWQgaW4gdmlhIGtleS92YWwgaW4gb2JqZWN0XG4gICAgcmVuZGVyVGVtcGxhdGUgKHRlbXBsYXRlTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIYW5kbGViYXJzSGVscGVycygpO1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0ob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVzY2FwZWQgYnJlYWtsaW5lcyBpbiBIYW5kbGViYXJzXG4gICAgcmVnaXN0ZXJIYW5kbGViYXJzSGVscGVycyAoKSB7XG4gICAgICAgIGlmKCdicmVha2xpbmVzJyBpbiBIYW5kbGViYXJzLmhlbHBlcnMpIHJldHVybjtcblxuICAgICAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdicmVha2xpbmVzJywgKHRleHQpID0+IHtcbiAgICAgICAgICAgIHRleHQgPSBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24odGV4dCk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2dtLCAnPGJyPicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFByb3ZpZGUgYmFzaWMgdGVhcmRvd24gZnVuY3Rpb24gdG8gaW5oZXJpdFxuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgaWYodGhpcy4kZWwpIHRoaXMuJGVsLnJlbW92ZSgpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIi8qXG4gICAgQ29sbGVjdGlvbiBvZiBwb2x5ZmlsbHMgbmVlZGVkZiBvciBJRTEwKyBzdXBwb3J0XG4qL1xuXG4vLyBBcnJheS5wcm90b3R5cGUuZmluZCgpIGZvciBJRTEwK1xucmVxdWlyZSgnaWUtYXJyYXktZmluZC1wb2x5ZmlsbCcpO1xuLy8gT2JqZWN0LmFzc2lnbiBmb3IgSUUxMCtcbnJlcXVpcmUoJ2VzNi1vYmplY3QtYXNzaWduJykucG9seWZpbGwoKTtcblxuLy8gQWxsb3cgdXNlIG9mIG9iamVjdC5jb25zdHJ1Y3Rvci5zdGF0aWNGdW5jKCkgaW4gSUVcbi8vIE5vdCB5ZXQgc3VwcG9ydGVkIGJ5IGJhYmVsXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9lZG9hcmRvY2F2YXp6YS80NzI0Njg1Njc1OWYyMjczZTQ4YlxuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIE9iamVjdC5zZXRQcm90b3R5cGVPZiA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBfZXhjbHVkZSA9IFsnbGVuZ3RoJywgJ25hbWUnLCAnYXJndW1lbnRzJywgJ2NhbGxlcicsICdwcm90b3R5cGUnXTtcblxuICAgICAgICBmdW5jdGlvbiBiaW5kRnVuY3Rpb24oY3R4LCBmbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYmluZFByb3BlcnR5KGN0eCwgcHJvcCwgcGFyZW50RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgaWYgKCFwYXJlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGN0eC5fX3Byb3RvX19bcHJvcF07XG4gICAgICAgICAgICAgICAgcGFyZW50RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4WydfXycgKyBwcm9wXSB8fCBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHhbJ19fJyArIHByb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgcHJvcCwge1xuICAgICAgICAgICAgICAgIGdldDogcGFyZW50RGVzY3JpcHRvci5nZXQgPyBwYXJlbnREZXNjcmlwdG9yLmdldC5iaW5kKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2V0OiBwYXJlbnREZXNjcmlwdG9yLnNldCA/IHBhcmVudERlc2NyaXB0b3Iuc2V0LmJpbmQoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpdGVyYXRlUHJvcHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN1cGVyQ2xhc3MpLFxuICAgICAgICAgICAgICAgIHByb3RvO1xuXG4gICAgICAgICAgICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHByb3BzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBzdXBlckNsYXNzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2V4Y2x1ZGUuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN1YkNsYXNzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VwZXJEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdXBlckNsYXNzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3VwZXJEZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc3VwZXJDbGFzc1twcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkNsYXNzW3Byb3BdID0gYmluZEZ1bmN0aW9uKHN1YkNsYXNzLCBzdXBlckNsYXNzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN1cGVyRGVzY3JpcHRvci5nZXQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRQcm9wZXJ0eShzdWJDbGFzcywgcHJvcCwgc3VwZXJEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFByb3BlcnR5KHN1YkNsYXNzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm90bykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdGVQcm9wcyhzdWJDbGFzcywgcHJvdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mID0gaXRlcmF0ZVByb3BzO1xuICAgIH1cbn0pKCk7XG5cbi8vIFVzZSBDdXN0b21FdmVudCBpbiBJRVxuKGZ1bmN0aW9uICgpIHtcbiAgaWYgKCB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIgKSByZXR1cm4gZmFsc2U7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKCBldmVudCwgcGFyYW1zICkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoICdDdXN0b21FdmVudCcgKTtcbiAgICBldnQuaW5pdEN1c3RvbUV2ZW50KCBldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsICk7XG4gICAgcmV0dXJuIGV2dDtcbiAgIH1cblxuICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuXG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBHZW5lYWwgdXRpbGl0eSBmdW5jdGlvbnMsIHNvdXJjZWQgZnJvbSB1bmRlcnNjb3JlICYgc2NyYXRjaCBidWlsdCBhcyBuZWVkZWRcbiovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gICAgLy8gQ2xvbmUgYW4gb2JqZWN0XG4gICAgY2xvbmVPYmplY3Q6IChvYmopID0+IE9iamVjdC5hc3NpZ24oe30sIG9iaiksXG5cbiAgICAvLyBfdGhyb3R0bGUgZnJvbSB1bmRlcnNjb3JlXG4gICAgdGhyb3R0bGU6IChmdW5jLCB3YWl0LCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgICAgIHZhciB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZpb3VzID0gMDtcbiAgICAgICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBEYXRlLm5vdygpO1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gbm93O1xuICAgICAgICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICAgICAgICBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCByZW1haW5pbmcgPiB3YWl0KSB7XG4gICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFsbCBrZXlzIG9mIGFuIG9iamVjdCB0byBpbnRcbiAgICBwYXJzZUludE9iajogKG9iaikgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYocGFyc2VJbnQob2JqW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBwYXJzZUludChvYmpba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICAvLyBDb252ZXJ0IGEgcmFuZ2Uge3N0YXJ0OiBpbnQsIChvcHRpb25hbCkgZW5kOiBpbnR9IHRvIGh1bWFuIHJlYWRhYmxlIHRpbWVcbiAgICBodW1hblRpbWU6IChyYW5nZSkgPT4ge1xuICAgICAgICBmdW5jdGlvbiByZWFkYWJsZShzZWMpe1xuICAgICAgICAgICAgbGV0IG1pbnMgPSBNYXRoLmZsb29yKHNlYy82MCksXG4gICAgICAgICAgICBzZWNzID0gU3RyaW5nKHNlYyAlIDYwKTtcbiAgICAgICAgICAgIHJldHVybiBtaW5zICsgXCI6XCIgKyAoc2Vjcy5sZW5ndGg9PTEgPyBcIjBcIiA6IFwiXCIpICsgc2VjcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGltZSA9IFtyZWFkYWJsZShyYW5nZS5zdGFydCldO1xuICAgICAgICBpZihyYW5nZS5lbmQpIHRpbWUucHVzaChyZWFkYWJsZShyYW5nZS5lbmQpKTtcbiAgICAgICAgcmV0dXJuIHRpbWUuam9pbihcIi1cIik7XG4gICAgfSxcblxuICAgIC8vIFBzZWR1by1yYW5kb20gZ3VpZCBnZW5lcmF0b3JcbiAgICBndWlkOiAoKSA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIHM0KCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM0KCkgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyAgczQoKSArICctJyArIHM0KCkgKyBzNCgpICsgczQoKTtcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBvZiBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHZpc2libGVcbiAgICAvLyBjbG9uZXMgZWwgYW5kIHRyaWNrcyBET00gaW50byByZW5kZXJpbmcgaXQgdyB0aGUgY29ycmVjdCBzaXplXG4gICAgLy8gYmV3YXJlIHRoZSBjb250YWluZXIgbWF5IGJlIGltcG9ydGFudCBmb3Igc2NvcGVkIHN0eWxlc1xuICAgIGFyZWFPZkhpZGRlbkVsOiAoJGVsLCAkY29udGFpbmVyLCBoaWRlQ2xhc3M9JycpID0+IHtcbiAgICAgICAgbGV0ICRjbG9uZSA9ICRlbC5jbG9uZSgpLFxuICAgICAgICAgICAgZGF0YSA9IHt9O1xuICAgICAgICAkY2xvbmUuY3NzKHtcbiAgICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgICAgICAgfSk7XG4gICAgICAgICRjbG9uZS5yZW1vdmVDbGFzcyhoaWRlQ2xhc3MpO1xuICAgICAgICAkY29udGFpbmVyLmFwcGVuZCgkY2xvbmUpO1xuICAgICAgICBkYXRhLndpZHRoID0gJGNsb25lLm91dGVyV2lkdGgoKTtcbiAgICAgICAgZGF0YS5oZWlnaHQgPSAkY2xvbmUub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgJGNsb25lLnJlbW92ZSgpO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgYSB2YWx1ZSAobikgaXMgd2l0aGluIGEgcmFuZ2UgKHN0YXJ0IDw9IG4gPD0gZW5kKVxuICAgIGlzV2l0aGluUmFuZ2U6IChzdGFydCwgZW5kLCBuKSA9PiB7XG4gICAgICAgIGVuZCA9IGVuZCB8fCBzdGFydCArIDE7IC8vIGZvciByYW5nZXMgd2l0aCBOTyBlbmQgZGVmaW5lZCwgYXNzdW1lIGEgMXMgcmFuZ2VcbiAgICAgICAgcmV0dXJuIG4gPj0gc3RhcnQgJiYgbiA8PSBlbmQ7XG4gICAgfVxufTtcbiJdfQ=="} \ No newline at end of file diff --git a/build/videojs-annotation-comments.min.js b/build/videojs-annotation-comments.min.js new file mode 100644 index 0000000..b9d3170 --- /dev/null +++ b/build/videojs-annotation-comments.min.js @@ -0,0 +1,5 @@ +!function(){function t(e,n,i){function r(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n||t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a= 2.0.0-beta.1",7:">= 4.0.0"};n.REVISION_CHANGES=p;var m="[object Object]";r.prototype={constructor:r,logger:h["default"],log:h["default"].log,registerHelper:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple helpers");o.extend(this.helpers,t)}else this.helpers[t]=e},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,e){if(o.toString.call(t)===m)o.extend(this.partials,t);else{if("undefined"==typeof e)throw new s["default"]('Attempting to register a partial called "'+t+'" as undefined');this.partials[t]=e}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple decorators");o.extend(this.decorators,t)}else this.decorators[t]=e},unregisterDecorator:function(t){delete this.decorators[t]}};var v=h["default"].log;n.log=v,n.createFrame=o.createFrame,n.logger=h["default"]},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t){a["default"](t)}n.__esModule=!0,n.registerDefaultDecorators=r;var o=t("./decorators/inline"),a=i(o)},{"./decorators/inline":5}],5:[function(t,e,n){"use strict";n.__esModule=!0;var i=t("../utils");n["default"]=function(t){t.registerDecorator("inline",function(t,e,n,r){var o=t;return e.partials||(e.partials={},o=function(r,o){var a=n.partials;n.partials=i.extend({},a,e.partials);var s=t(r,o);return n.partials=a,s}),e.partials[r.args[0]]=r.fn,o})},e.exports=n["default"]},{"../utils":19}],6:[function(t,e,n){"use strict";function i(t,e){var n=e&&e.loc,o=void 0,a=void 0;n&&(o=n.start.line,a=n.start.column,t+=" - "+o+":"+a);for(var s=Error.prototype.constructor.call(this,t),l=0;l0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var a=i.createFrame(n.data);a.contextPath=i.appendContextPath(n.data.contextPath,n.name),n={data:a}}return o(e,n)})},e.exports=n["default"]},{"../utils":19}],9:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}n.__esModule=!0;var r=t("../utils"),o=t("../exception"),a=i(o);n["default"]=function(t){t.registerHelper("each",function(t,e){function n(e,n,o){u&&(u.key=e,u.index=n,u.first=0===n,u.last=!!o,c&&(u.contextPath=c+e)),l+=i(t[e],{data:u,blockParams:r.blockParams([t[e],e],[c+e,null])})}if(!e)throw new a["default"]("Must pass iterator to #each");var i=e.fn,o=e.inverse,s=0,l="",u=void 0,c=void 0;if(e.data&&e.ids&&(c=r.appendContextPath(e.data.contextPath,e.ids[0])+"."),r.isFunction(t)&&(t=t.call(this)),e.data&&(u=r.createFrame(e.data)),t&&"object"==typeof t)if(r.isArray(t))for(var h=t.length;s=0?e:parseInt(t,10)}return t},log:function(t){if(t=r.lookupLevel(t),"undefined"!=typeof console&&r.lookupLevel(r.level)<=t){var e=r.methodMap[t];console[e]||(e="log");for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o":">",'"':""","'":"'","`":"`","=":"="},d=/[&<>"'`=]/g,f=/[&<>"'`=]/,p=Object.prototype.toString;n.toString=p;var m=function(t){return"function"==typeof t};m(/x/)&&(n.isFunction=m=function(t){return"function"==typeof t&&"[object Function]"===p.call(t)}),n.isFunction=m;var v=Array.isArray||function(t){return!(!t||"object"!=typeof t)&&"[object Array]"===p.call(t)};n.isArray=v},{}],20:[function(t,e,n){e.exports=t("./dist/cjs/handlebars.runtime")["default"]},{"./dist/cjs/handlebars.runtime":2}],21:[function(t,e,n){"use strict";Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError("this is null or not defined");var e=Object(this),n=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r0)for(n=0;n0?"future":"past"];return x(n)?n(e):n.replace(/%s/i,e)}function L(t,e){var n=t.toLowerCase();Ri[n]=Ri[n+"s"]=Ri[e]=t}function F(t){return"string"==typeof t?Ri[t]||Ri[t.toLowerCase()]:void 0}function H(t){var e,n,i={};for(n in t)h(t,n)&&(e=F(n),e&&(i[e]=t[n]));return i}function N(t,e){Wi[t]=e}function R(t){var e=[];for(var n in t)e.push({unit:n,priority:Wi[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function W(t,e,n){var i=""+Math.abs(t),r=e-i.length,o=t>=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+i}function U(t,e,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),t&&(zi[t]=r),e&&(zi[e[0]]=function(){return W(r.apply(this,arguments),e[1],e[2])}),n&&(zi[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function V(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,n,i=t.match(Ui);for(e=0,n=i.length;e=0&&Vi.test(t);)t=t.replace(Vi,n),Vi.lastIndex=0,i-=1;return t}function Z(t,e,n){cr[t]=x(e)?e:function(t,i){return t&&n?n:e}}function q(t,e){return h(cr,t)?cr[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return J(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,r){return e||n||i||r}))}function J(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function kt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function St(t,e,n){var i=7+e-n,r=(7+kt(t,0,i).getUTCDay()-e)%7;return-r+i-1}function Ot(t,e,n,i,r){var o,a,s=(7+n-i)%7,l=St(t,i,r),u=1+7*(e-1)+s+l;return u<=0?(o=t-1,a=et(o)+u):u>et(t)?(o=t+1,a=u-et(t)):(o=t,a=u),{year:o,dayOfYear:a}}function Mt(t,e,n){var i,r,o=St(t.year(),e,n),a=Math.floor((t.dayOfYear()-o-1)/7)+1;return a<1?(r=t.year()-1,i=a+Dt(r,e,n)):a>Dt(t.year(),e,n)?(i=a-Dt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function Dt(t,e,n){var i=St(t,e,n),r=St(t+1,e,n);return(et(t)-i+r)/7}function xt(t){return Mt(t,this._week.dow,this._week.doy).week}function Ct(){return this._week.dow}function Pt(){return this._week.doy}function Tt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Yt(t){var e=Mt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function At(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function jt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Et(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone}function $t(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function It(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Lt(t,e,n){var i,r,o,a=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)o=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:null):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null):"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null)))}function Ft(t,e,n){var i,r,o;if(this._weekdaysParseExact)return Lt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Ht(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=At(t,this.localeData()),this.add(t-e,"d")):e}function Nt(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Rt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=jt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function Wt(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=Ar),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ut(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=jr),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Vt(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Er),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Gt(){function t(t,e){return e.length-t.length}var e,n,i,r,o,a=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(i),s.push(r),l.push(o),u.push(i),u.push(r),u.push(o);for(a.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=J(s[e]),l[e]=J(l[e]),u[e]=J(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i"); +}function zt(){return this.hours()%12||12}function Bt(){return this.hours()||24}function Zt(t,e){U(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Jt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Qt(t){return t?t.toLowerCase().replace("_","-"):t}function Kt(t){for(var e,n,i,r,o=0;o0;){if(i=te(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&S(r,n,!0)>=e-1)break;e--}o++}return $r}function te(n){var i=null;if(!Hr[n]&&"undefined"!=typeof e&&e&&e.exports)try{i=$r._abbr;var r=t;r("./locale/"+n),ee(i)}catch(o){}return Hr[n]}function ee(t,e){var n;return t&&(n=s(e)?re(t):ne(t,e),n?$r=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),$r._abbr}function ne(t,e){if(null!==e){var n,i=Fr;if(e.abbr=t,null!=Hr[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=Hr[t]._config;else if(null!=e.parentLocale)if(null!=Hr[e.parentLocale])i=Hr[e.parentLocale]._config;else{if(n=te(e.parentLocale),null==n)return Nr[e.parentLocale]||(Nr[e.parentLocale]=[]),Nr[e.parentLocale].push({name:t,config:e}),null;i=n._config}return Hr[t]=new T(P(i,e)),Nr[t]&&Nr[t].forEach(function(t){ne(t.name,t.config)}),ee(t),Hr[t]}return delete Hr[t],null}function ie(t,e){if(null!=e){var n,i,r=Fr;i=te(t),null!=i&&(r=i._config),e=P(r,e),n=new T(e),n.parentLocale=Hr[t],Hr[t]=n,ee(t)}else null!=Hr[t]&&(null!=Hr[t].parentLocale?Hr[t]=Hr[t].parentLocale:null!=Hr[t]&&delete Hr[t]);return Hr[t]}function re(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return $r;if(!r(t)){if(e=te(t))return e;t=[t]}return Kt(t)}function oe(){return Ei(Hr)}function ae(t){var e,n=t._a;return n&&m(t).overflow===-2&&(e=n[fr]<0||n[fr]>11?fr:n[pr]<1||n[pr]>ct(n[dr],n[fr])?pr:n[mr]<0||n[mr]>24||24===n[mr]&&(0!==n[vr]||0!==n[yr]||0!==n[gr])?mr:n[vr]<0||n[vr]>59?vr:n[yr]<0||n[yr]>59?yr:n[gr]<0||n[gr]>999?gr:-1,m(t)._overflowDayOfYear&&(epr)&&(e=pr),m(t)._overflowWeeks&&e===-1&&(e=_r),m(t)._overflowWeekday&&e===-1&&(e=br),m(t).overflow=e),t}function se(t,e,n){return null!=t?t:null!=e?e:n}function le(t){var e=new Date(n.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function ue(t){var e,n,i,r,o,a=[];if(!t._d){for(i=le(t),t._w&&null==t._a[pr]&&null==t._a[fr]&&ce(t),null!=t._dayOfYear&&(o=se(t._a[dr],i[dr]),(t._dayOfYear>et(o)||0===t._dayOfYear)&&(m(t)._overflowDayOfYear=!0),n=kt(o,0,t._dayOfYear),t._a[fr]=n.getUTCMonth(),t._a[pr]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=i[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[mr]&&0===t._a[vr]&&0===t._a[yr]&&0===t._a[gr]&&(t._nextDay=!0,t._a[mr]=0),t._d=(t._useUTC?kt:wt).apply(null,a),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[mr]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==r&&(m(t).weekdayMismatch=!0)}}function ce(t){var e,n,i,r,o,a,s,l;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)o=1,a=4,n=se(e.GG,t._a[dr],Mt(xe(),1,4).year),i=se(e.W,1),r=se(e.E,1),(r<1||r>7)&&(l=!0);else{o=t._locale._week.dow,a=t._locale._week.doy;var u=Mt(xe(),o,a);n=se(e.gg,t._a[dr],u.year),i=se(e.w,u.week),null!=e.d?(r=e.d,(r<0||r>6)&&(l=!0)):null!=e.e?(r=e.e+o,(e.e<0||e.e>6)&&(l=!0)):r=o}i<1||i>Dt(n,o,a)?m(t)._overflowWeeks=!0:null!=l?m(t)._overflowWeekday=!0:(s=Ot(n,i,r,o,a),t._a[dr]=s.year,t._dayOfYear=s.dayOfYear)}function he(t){var e,n,i,r,o,a,s=t._i,l=Rr.exec(s)||Wr.exec(s);if(l){for(m(t).iso=!0,e=0,n=Vr.length;e0&&m(t).unusedInput.push(a),s=s.slice(s.indexOf(i)+i.length),u+=i.length),zi[o]?(i?m(t).empty=!1:m(t).unusedTokens.push(o),tt(o,i,t)):t._strict&&!i&&m(t).unusedTokens.push(o);m(t).charsLeftOver=l-u,s.length>0&&m(t).unusedInput.push(s),t._a[mr]<=12&&m(t).bigHour===!0&&t._a[mr]>0&&(m(t).bigHour=void 0),m(t).parsedDateParts=t._a.slice(0),m(t).meridiem=t._meridiem,t._a[mr]=be(t._locale,t._a[mr],t._meridiem),ue(t),ae(t)}function be(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function we(t){var e,n,i,r,o;if(0===t._f.length)return m(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ze(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(g(t,this),t=Oe(t),t._a){var e=t._isUTC?f(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&S(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Je(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Qe(t,e){var n,i,r,o=t,a=null;return $e(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(o={},e?o[e]=t:o.milliseconds=t):(a=to.exec(t))?(n="-"===a[1]?-1:1,o={y:0,d:k(a[pr])*n,h:k(a[mr])*n,m:k(a[vr])*n,s:k(a[yr])*n,ms:k(Ie(1e3*a[gr]))*n}):(a=eo.exec(t))?(n="-"===a[1]?-1:("+"===a[1],1),o={y:Ke(a[2],n),M:Ke(a[3],n),w:Ke(a[4],n),d:Ke(a[5],n),h:Ke(a[6],n),m:Ke(a[7],n),s:Ke(a[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(r=en(xe(o.from),xe(o.to)),o={},o.ms=r.milliseconds,o.M=r.months),i=new Ee(o),$e(t)&&h(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function tn(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function en(t,e){var n;return t.isValid()&&e.isValid()?(e=He(e,t),t.isBefore(e)?n=tn(t,e):(n=tn(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(t,e){return function(n,i){var r,o;return null===i||isNaN(+i)||(D(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=i,i=o),n="string"==typeof n?+n:n,r=Qe(n,i),rn(this,r,t),this}}function rn(t,e,i,r){var o=e._milliseconds,a=Ie(e._days),s=Ie(e._months);t.isValid()&&(r=null==r||r,s&&mt(t,ot(t,"Month")+s*i),a&&at(t,"Date",ot(t,"Date")+a*i),o&&t._d.setTime(t._d.valueOf()+o*i),r&&n.updateOffset(t,a||s))}function on(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(t,e){var i=t||xe(),r=He(i,this).startOf("day"),o=n.calendarFormat(this,r)||"sameElse",a=e&&(x(e[o])?e[o].call(this,i):e[o]);return this.format(a||this.localeData().calendar(o,this,xe(i)))}function sn(){return new _(this)}function ln(t,e){var n=b(t)?t:xe(t);return!(!this.isValid()||!n.isValid())&&(e=F(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()9999?z(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",z(n,"Z")):z(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function gn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",r="-MM-DD[T]HH:mm:ss.SSS",o=e+'[")]';return this.format(n+i+r+o)}function _n(t){t||(t=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var e=z(this,t);return this.localeData().postformat(e)}function bn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function wn(t){return this.from(xe(),t)}function kn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Sn(t){return this.to(xe(),t)}function On(t){var e;return void 0===t?this._locale._abbr:(e=re(t),null!=e&&(this._locale=e),this)}function Mn(){return this._locale}function Dn(t){switch(t=F(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function xn(t){return t=F(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Cn(){return this._d.valueOf()-6e4*(this._offset||0)}function Pn(){return Math.floor(this.valueOf()/1e3)}function Tn(){return new Date(this.valueOf())}function Yn(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function An(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function jn(){return this.isValid()?this.toISOString():null}function En(){return v(this)}function $n(){return d({},m(this))}function In(){return m(this).overflow}function Ln(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Fn(t,e){U(0,[t,t.length],0,e)}function Hn(t){return Un.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Nn(t){return Un.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Rn(){return Dt(this.year(),1,4)}function Wn(){var t=this.localeData()._week;return Dt(this.year(),t.dow,t.doy)}function Un(t,e,n,i,r){var o;return null==t?Mt(this,i,r).year:(o=Dt(t,i,r),e>o&&(e=o),Vn.call(this,t,e,n,i,r))}function Vn(t,e,n,i,r){var o=Ot(t,e,n,i,r),a=kt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Gn(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function zn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Bn(t,e){e[gr]=k(1e3*("0."+t))}function Zn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Xn(t){return xe(1e3*t)}function Jn(){return xe.apply(null,arguments).parseZone()}function Qn(t){return t}function Kn(t,e,n,i){var r=re(),o=f().set(i,e);return r[n](o,t)}function ti(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Kn(t,e,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=Kn(t,i,n,"month");return r}function ei(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var r=re(),o=t?r._week.dow:0;if(null!=n)return Kn(e,(n+o)%7,i,"day");var a,s=[];for(a=0;a<7;a++)s[a]=Kn(e,(a+o)%7,i,"day");return s}function ni(t,e){return ti(t,e,"months")}function ii(t,e){return ti(t,e,"monthsShort")}function ri(t,e,n){return ei(t,e,n,"weekdays")}function oi(t,e,n){return ei(t,e,n,"weekdaysShort")}function ai(t,e,n){return ei(t,e,n,"weekdaysMin")}function si(){var t=this._data;return this._milliseconds=fo(this._milliseconds),this._days=fo(this._days),this._months=fo(this._months),t.milliseconds=fo(t.milliseconds),t.seconds=fo(t.seconds),t.minutes=fo(t.minutes),t.hours=fo(t.hours),t.months=fo(t.months),t.years=fo(t.years),this}function li(t,e,n,i){var r=Qe(e,n);return t._milliseconds+=i*r._milliseconds,t._days+=i*r._days,t._months+=i*r._months,t._bubble()}function ui(t,e){return li(this,t,e,1)}function ci(t,e){return li(this,t,e,-1)}function hi(t){return t<0?Math.floor(t):Math.ceil(t)}function di(){var t,e,n,i,r,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*hi(pi(s)+a),a=0,s=0),l.milliseconds=o%1e3,t=w(o/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,a+=w(n/24),r=w(fi(a)),s+=r,a-=hi(pi(r)),i=w(s/12),s%=12,l.days=a,l.months=s,l.years=i,this}function fi(t){return 4800*t/146097}function pi(t){return 146097*t/4800}function mi(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(t=F(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+fi(e),"month"===t?n:n/12;switch(e=this._days+Math.round(pi(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function vi(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN}function yi(t){return function(){return this.as(t)}}function gi(){return Qe(this)}function _i(t){return t=F(t),this.isValid()?this[t+"s"]():NaN}function bi(t){return function(){return this.isValid()?this._data[t]:NaN}}function wi(){return w(this.days()/7)}function ki(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}function Si(t,e,n){var i=Qe(t).abs(),r=Po(i.as("s")),o=Po(i.as("m")),a=Po(i.as("h")),s=Po(i.as("d")),l=Po(i.as("M")),u=Po(i.as("y")),c=r<=To.ss&&["s",r]||r0,c[4]=n,ki.apply(null,c)}function Oi(t){return void 0===t?Po:"function"==typeof t&&(Po=t,!0)}function Mi(t,e){return void 0!==To[t]&&(void 0===e?To[t]:(To[t]=e,"s"===t&&(To.ss=e-1),!0))}function Di(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=Si(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function xi(t){return(t>0)-(t<0)||+t}function Ci(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=Yo(this._milliseconds)/1e3,r=Yo(this._days),o=Yo(this._months);t=w(i/60),e=w(t/60),i%=60,t%=60,n=w(o/12),o%=12;var a=n,s=o,l=r,u=e,c=t,h=i?i.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var f=d<0?"-":"",p=xi(this._months)!==xi(d)?"-":"",m=xi(this._days)!==xi(d)?"-":"",v=xi(this._milliseconds)!==xi(d)?"-":"";return f+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?m+l+"D":"")+(u||c||h?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(h?v+h+"S":"")}var Pi,Ti;Ti=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var wr,kr=rt("FullYear",!0);wr=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:y()}),Jr=function(){return Date.now?Date.now():+new Date},Qr=["year","quarter","month","week","day","hour","minute","second","millisecond"];Le("Z",":"),Le("ZZ",""),Z("Z",sr),Z("ZZ",sr),Q(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Fe(sr,t)});var Kr=/([\+\-]|\d\d)/gi;n.updateOffset=function(){};var to=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,eo=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Qe.fn=Ee.prototype,Qe.invalid=je;var no=nn(1,"add"),io=nn(-1,"subtract");n.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",n.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ro=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Fn("gggg","weekYear"),Fn("ggggg","weekYear"),Fn("GGGG","isoWeekYear"),Fn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),Z("G",or),Z("g",or),Z("GG",Qi,Zi),Z("gg",Qi,Zi),Z("GGGG",nr,Xi),Z("gggg",nr,Xi),Z("GGGGG",ir,Ji),Z("ggggg",ir,Ji),K(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=k(t)}),K(["gg","GG"],function(t,e,i,r){e[r]=n.parseTwoDigitYear(t)}),U("Q",0,"Qo","quarter"),L("quarter","Q"),N("quarter",7),Z("Q",Bi),Q("Q",function(t,e){e[fr]=3*(k(t)-1)}),U("D",["DD",2],"Do","date"),L("date","D"),N("date",9),Z("D",Qi),Z("DD",Qi,Zi),Z("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),Q(["D","DD"],pr),Q("Do",function(t,e){e[pr]=k(t.match(Qi)[0])});var oo=rt("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),N("dayOfYear",4),Z("DDD",er),Z("DDDD",qi),Q(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),U("m",["mm",2],0,"minute"),L("minute","m"),N("minute",14),Z("m",Qi),Z("mm",Qi,Zi),Q(["m","mm"],vr);var ao=rt("Minutes",!1);U("s",["ss",2],0,"second"),L("second","s"),N("second",15),Z("s",Qi),Z("ss",Qi,Zi),Q(["s","ss"],yr);var so=rt("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond(); +}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),N("millisecond",16),Z("S",er,Bi),Z("SS",er,Zi),Z("SSS",er,qi);var lo;for(lo="SSSS";lo.length<=9;lo+="S")Z(lo,rr);for(lo="S";lo.length<=9;lo+="S")Q(lo,Bn);var uo=rt("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var co=_.prototype;co.add=no,co.calendar=an,co.clone=sn,co.diff=pn,co.endOf=xn,co.format=_n,co.from=bn,co.fromNow=wn,co.to=kn,co.toNow=Sn,co.get=st,co.invalidAt=In,co.isAfter=ln,co.isBefore=un,co.isBetween=cn,co.isSame=hn,co.isSameOrAfter=dn,co.isSameOrBefore=fn,co.isValid=En,co.lang=ro,co.locale=On,co.localeData=Mn,co.max=Xr,co.min=qr,co.parsingFlags=$n,co.set=lt,co.startOf=Dn,co.subtract=io,co.toArray=Yn,co.toObject=An,co.toDate=Tn,co.toISOString=yn,co.inspect=gn,co.toJSON=jn,co.toString=vn,co.unix=Pn,co.valueOf=Cn,co.creationData=Ln,co.year=kr,co.isLeapYear=it,co.weekYear=Hn,co.isoWeekYear=Nn,co.quarter=co.quarters=Gn,co.month=vt,co.daysInMonth=yt,co.week=co.weeks=Tt,co.isoWeek=co.isoWeeks=Yt,co.weeksInYear=Wn,co.isoWeeksInYear=Rn,co.date=oo,co.day=co.days=Ht,co.weekday=Nt,co.isoWeekday=Rt,co.dayOfYear=zn,co.hour=co.hours=Lr,co.minute=co.minutes=ao,co.second=co.seconds=so,co.millisecond=co.milliseconds=uo,co.utcOffset=Re,co.utc=Ue,co.local=Ve,co.parseZone=Ge,co.hasAlignedHourOffset=ze,co.isDST=Be,co.isLocal=qe,co.isUtcOffset=Xe,co.isUtc=Je,co.isUTC=Je,co.zoneAbbr=Zn,co.zoneName=qn,co.dates=M("dates accessor is deprecated. Use date instead.",oo),co.months=M("months accessor is deprecated. Use month instead",vt),co.years=M("years accessor is deprecated. Use year instead",kr),co.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",We),co.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ze);var ho=T.prototype;ho.calendar=Y,ho.longDateFormat=A,ho.invalidDate=j,ho.ordinal=E,ho.preparse=Qn,ho.postformat=Qn,ho.relativeTime=$,ho.pastFuture=I,ho.set=C,ho.months=ht,ho.monthsShort=dt,ho.monthsParse=pt,ho.monthsRegex=_t,ho.monthsShortRegex=gt,ho.week=xt,ho.firstDayOfYear=Pt,ho.firstDayOfWeek=Ct,ho.weekdays=Et,ho.weekdaysMin=It,ho.weekdaysShort=$t,ho.weekdaysParse=Ft,ho.weekdaysRegex=Wt,ho.weekdaysShortRegex=Ut,ho.weekdaysMinRegex=Vt,ho.isPM=Xt,ho.meridiem=Jt,ee("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),n.lang=M("moment.lang is deprecated. Use moment.locale instead.",ee),n.langData=M("moment.langData is deprecated. Use moment.localeData instead.",re);var fo=Math.abs,po=yi("ms"),mo=yi("s"),vo=yi("m"),yo=yi("h"),go=yi("d"),_o=yi("w"),bo=yi("M"),wo=yi("y"),ko=bi("milliseconds"),So=bi("seconds"),Oo=bi("minutes"),Mo=bi("hours"),Do=bi("days"),xo=bi("months"),Co=bi("years"),Po=Math.round,To={ss:44,s:45,m:45,h:22,d:26,M:11},Yo=Math.abs,Ao=Ee.prototype;return Ao.isValid=Ae,Ao.abs=si,Ao.add=ui,Ao.subtract=ci,Ao.as=mi,Ao.asMilliseconds=po,Ao.asSeconds=mo,Ao.asMinutes=vo,Ao.asHours=yo,Ao.asDays=go,Ao.asWeeks=_o,Ao.asMonths=bo,Ao.asYears=wo,Ao.valueOf=vi,Ao._bubble=di,Ao.clone=gi,Ao.get=_i,Ao.milliseconds=ko,Ao.seconds=So,Ao.minutes=Oo,Ao.hours=Mo,Ao.days=Do,Ao.weeks=wi,Ao.months=xo,Ao.years=Co,Ao.humanize=Di,Ao.toISOString=Ci,Ao.toString=Ci,Ao.toJSON=Ci,Ao.locale=On,Ao.localeData=Mn,Ao.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ci),Ao.lang=ro,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",or),Z("X",lr),Q("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),Q("x",function(t,e,n){n._d=new Date(k(t))}),n.version="2.22.1",i(xe),n.fn=co,n.min=Pe,n.max=Te,n.now=Jr,n.utc=f,n.unix=Xn,n.months=ni,n.isDate=u,n.locale=ee,n.invalid=y,n.duration=Qe,n.isMoment=b,n.weekdays=ri,n.parseZone=Jn,n.localeData=re,n.isDuration=$e,n.monthsShort=ii,n.weekdaysMin=ai,n.defineLocale=ne,n.updateLocale=ie,n.locales=oe,n.weekdaysShort=oi,n.normalizeUnits=F,n.relativeTimeRounding=Oi,n.relativeTimeThreshold=Mi,n.calendarFormat=on,n.prototype=co,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},n})},{}],23:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n=3?o.postLoadDataConstructor():t.on("loadeddata",o.postLoadDataConstructor.bind(o)),o}return o(e,t),a(e,[{key:"postLoadDataConstructor",value:function(){this.annotationState=new c(this.player),this.annotationState.annotations=this.options.annotationsObjects,this.controls=new u(this.player,this.options.bindArrowKeys),this.bindEvents(),this.setBounds(!1),this.options.startInAnnotationMode&&this.toggleAnnotationMode(),this.pluginReady()}},{key:"bindEvents",value:function(){var t=this;$(window).on("resize.vac-window-resize",l.throttle(this.setBounds.bind(this),500)),this.player.on("fullscreenchange",l.throttle(this.setBounds.bind(this),500)),this.options.showFullScreen||this.player.on("fullscreenchange",function(){t.player.isFullscreen_?(t.preFullscreenAnnotationsEnabled=t.active,$(t.player.el()).addClass("vac-disable-fullscreen")):$(t.player.el()).removeClass("vac-disable-fullscreen"),t.preFullscreenAnnotationsEnabled&&t.toggleAnnotationMode()}.bind(this))}},{key:"fire",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.eventDispatcher.fire(t,e)}},{key:"toggleAnnotationMode",value:function(){this.active=!this.active,this.player.toggleClass("vac-active"),this.annotationState.enabled=this.active,this.active?this.fire("annotationModeEnabled"):this.fire("annotationModeDisabled"),this.options.showControls&&(this.active?this.controls.render():this.controls.clear(!0))}},{key:"setBounds",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.bounds={};var e=$(this.player.el()),n=e.find(".vjs-control-bar");this.bounds.left=e.offset().left,this.bounds.top=e.offset().top,this.bounds.right=this.bounds.left+e.width(),this.bounds.bottom=this.bounds.top+e.height(),this.bounds.bottomWithoutControls=this.bounds.bottom-n.height(),t&&this.fire("playerBoundsChanged",this.bounds)}},{key:"onReady",value:function(t){return this.eventDispatcher.pluginReady?t():void this._readyCallbacks.push(t)}},{key:"pluginReady",value:function(){for(this.eventDispatcher.pluginReady=!0;this._readyCallbacks.length;)this._readyCallbacks.pop()()}},{key:"dispose",value:function(){this.controls=this.controls.teardown(),this.annotationState=this.annotationState.teardown(),this.eventDispatcher=this.eventDispatcher.teardown(),this.teardown(),this.player&&(this.player.annotationComments=null,$(this.player.el()).removeClass("vac-active"),$(this.player.el()).find("[class^='vac-']").remove()),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"dispose",this).call(this)}},{key:"teardown",value:function(){this.player&&this.player.off("fullscreenchange"),$(window).off("resize.vac-window-resize")}}]),e}(n)}},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":36,"./lib/polyfills":40,"./lib/utils":41}],24:[function(t,e,n){var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=t("handlebars/runtime");n.comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",h=t.escapeExpression;return'
\n
\n
'+h(t.lambda(null!=(a=null!=e?e.meta:e)?a.user_name:a,e))+'
\n
'+h((s=null!=(s=n.timeSince||(null!=e?e.timeSince:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"timeSince",hash:{},data:o}):s))+'\n   X\n
\n
\n
\n '+h((n.breaklines||e&&e.breaklines||u).call(l,null!=e?e.body:e,{name:"breaklines",hash:{},data:o}))+"\n
\n
\n"},useData:!0}),n.comment_list=r.template({1:function(t,e,n,i,r,o){var a;return" "+(null!=(a=t.lambda(o[0][0],e))?a:"")+"\n"},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r,o){var a,s,l=null!=e?e:t.nullContext||{};return'
\n'},useData:!0,useBlockParams:!0}),n.controls=r.template({1:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(2,r,0),inverse:t.noop,data:r}))?o:""},2:function(t,e,n,i,r){var o;return'
\n \n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showNav:e,{name:"if",hash:{},fn:t.program(3,r,0),inverse:t.noop,data:r}))?o:"")+"
\n"},3:function(t,e,n,i,r){return'
\n
Prev
\n
Next
\n
\n'},5:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return'
\n
\n
Click and drag to select
\n
\n
\n'+(null!=(o=n["if"].call(a,null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.writingComment:e,{name:"if",hash:{},fn:t.program(9,r,0),inverse:t.noop,data:r}))?o:"")},6:function(t,e,n,i,r){var o;return'
\n Select shape + range\n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.internalCommenting:e,{name:"if",hash:{},fn:t.program(7,r,0),inverse:t.noop,data:r}))?o:"")+'
\n
-1 sec
\n
+1 sec
\n
\n
\n'},7:function(t,e,n,i,r){return' \n cancel\n'},9:function(t,e,n,i,r){var o;return'
\n
\n
\n
New Annotation @ '+t.escapeExpression((o=null!=(o=n.rangeStr||(null!=e?e.rangeStr:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"rangeStr",hash:{},data:r}):o))+'
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n'},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return(null!=(o=n.unless.call(a,null!=e?e.adding:e,{name:"unless",hash:{},fn:t.program(1,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.adding:e,{name:"if",hash:{},fn:t.program(5,r,0),inverse:t.noop,data:r}))?o:"")},useData:!0}),n.draggable_marker=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n'},useData:!0}),n.marker=r.template({1:function(t,e,n,i,r){return"vac-ranged-marker"},3:function(t,e,n,i,r){var o;return"width:"+t.escapeExpression((o=null!=(o=n.width||(null!=e?e.width:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"width",hash:{},data:r}):o))+";"},5:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.tooltipBody:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:""},6:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",h=t.escapeExpression;return'
\n \n '+h((s=null!=(s=n.tooltipTime||(null!=e?e.tooltipTime:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipTime",hash:{},data:o}):s))+" - "+h((s=null!=(s=n.tooltipBody||(null!=e?e.tooltipBody:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipBody",hash:{},data:o}):s))+"\n \n
\n"},7:function(t,e,n,i,r){return"vac-right-side"},compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",h=t.escapeExpression;return'
\n'+(null!=(a=n["if"].call(l,null!=e?e.showTooltip:e,{name:"if",hash:{},fn:t.program(5,o,0),inverse:t.noop,data:o}))?a:"")+"
\n"},useData:!0}),n.marker_wrap=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'
\n\t
\n
'},useData:!0}),n.new_comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n'},useData:!0}),n.player_button=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'\n\n\t\n\t \n\t \n\t\n'},useData:!0})},{"handlebars/runtime":20}],25:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0],e=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.isOpen=!0;var r=i||!u.isWithinRange(this.range.start,this.range.end,Math.floor(this.currentTime)),o=n&&this.plugin.options.showMarkerShapeAndTooltips;this.marker.setActive(o),!n&&this.plugin.options.showCommentList&&this.commentList.render(),(!n||n&&this.plugin.options.showMarkerShapeAndTooltips)&&(this.annotationShape.render(),this.shape&&this.annotationShape.$el.on("click.vac-annotation",function(){e.plugin.annotationState.openAnnotation(e,!1,!1,!1)})),t&&this.player.pause(),r&&(this.currentTime=this.range.start),this.plugin.fire("annotationOpened",{annotation:this.data,triggered_by_timeline:n})}},{key:"close",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isOpen&&(this.isOpen=!1,this.marker.deactivate(),this.commentList.teardown(!1),this.annotationShape.$el&&this.annotationShape.$el.off("click.vac-annotation"),this.annotationShape.teardown(),t&&this.plugin.annotationState.clearActive(),this.plugin.fire("annotationClosed",this.data))}},{key:"buildSecondsActiveArray",value:function(){var t=[];if(this.range.end)for(var e=this.range.start;e<=this.range.end;e++)t.push(e);else{var n=this.range.start;t.push(n),n0&&void 0!==arguments[0])||arguments[0];this.close(!0),this.marker.teardown(),this.commentList&&this.commentList.teardown(t),t&&this.plugin.annotationState.removeAnnotation(this),this.annotationShape&&this.annotationShape.teardown(),t&&s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return{id:this.id,range:this.range,shape:this.shape,comments:this.commentList.data}}},{key:"isActive",get:function(){return this.plugin.annotationState.activeAnnotation===this}}],[{key:"newFromData",value:function(t,n,i,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,a=d.dataObj(i,r);t&&(t=u.parseIntObj(t)),n&&(n=u.parseIntObj(n));var s={id:o,range:t,shape:n,comments:[a]};return new e(s,r.player)}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils.js":41,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(t,e,n){"use strict";function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);ee.range.start?1:0})}},{key:"addNewAnnotation",value:function(t){this._annotations.push(t),this.openAnnotation(t,!0,!0,!1,!0),this.stateChanged()}},{key:"createAndAddAnnotation",value:function(t){this.plugin.controls.uiState.adding&&this.plugin.controls.cancelAddNew();var e=h.newFromData(t.range,t.shape,t.commentStr||"",this.plugin,t.id);this.addNewAnnotation(e)}},{key:"destroyAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&e.teardown()}},{key:"removeAnnotation",value:function(t){var e=t.id,n=this._annotations.indexOf(t);this._annotations.splice(n,1),this.stateChanged(),this.plugin.fire("annotationDeleted",{id:e})}},{key:"setLiveAnnotation",value:function(){if(this.enabled){var t=Math.floor(this.currentTime);if(this.skipLiveCheck)return void(t!==this.lastVideoTime&&(this.skipLiveCheck=!1));var e=this.activeAnnotationsForTime(t);if(!e.length)return this.activeAnnotation.close();var n=this.annotations[e[e.length-1]];if(this.activeAnnotation.range){if(n===this.activeAnnotation)return;var i=n.range.start,r=this.activeAnnotation.range.start;if(i===r&&i===t)return}this.openAnnotation(n,!1,!1,!0)}}},{key:"activeAnnotationsForTime",value:function(t){return this.annotations.length?this.annotationTimeMap[t]||[]:[]}},{key:"rebuildAnnotationTimeMap",value:function(){var t=this,e={};this.annotations.forEach(function(n){n.secondsActive.forEach(function(i){var r=e[i]||[];r.push(t.annotations.indexOf(n)),e[i]=r})}),this.annotationTimeMap=e}},{key:"clearActive",value:function(){this.activeAnnotation.close(!1),this._activeAnnotation=null}},{key:"openAnnotation",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.plugin.active||this.plugin.toggleAnnotationMode(),this.skipLiveCheck=e,this.clearActive(),t.open(n,i,r),this.activeAnnotation=t,this.lastVideoTime=this.activeAnnotation.range.start}},{key:"openAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&this.openAnnotation(e)}},{key:"findAnnotation",value:function(t){return this.annotations.find(function(e){return e.id==t})}},{key:"findComment",value:function(t){var e,n=this.annotations.map(function(t){return t.commentList.comments});return n=(e=[]).concat.apply(e,i(n)),n.find(function(e){return e.id==t})}},{key:"nextAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=t===this.annotations.length-1?0:t+1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=0;in)return this.openAnnotation(this.annotations[i],!0);this.openAnnotation(this.annotations[0],!0)}},{key:"prevAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=0===t?this.annotations.length-1:t-1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=this.annotations.length-1;i>=0;i--)if(this.annotations[i].range.start0&&void 0!==arguments[0]?arguments[0]:null;this._activeAnnotation=t},get:function(){return this._activeAnnotation||{close:function(){}}}},{key:"data",get:function(){return this._annotations.map(function(t){return t.data})}}]),e}(c)},{"./../lib/player_component":38,"./../lib/utils":41,"./annotation":25}],27:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this,t)}},{key:"data",get:function(){return{id:this.id,meta:this.meta,body:this.body}}},{key:"HTML",get:function(){return this.$el[0].outerHTML}}],[{key:"newFromData",value:function(t,n,i){var r=this.dataObj(t,i);return new e(r,i.player)}},{key:"dataObj",value:function(t,e){return{meta:Object.assign({datetime:c().toISOString()},e.meta),id:u.guid(),body:t}}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41,moment:22}],28:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){ +if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;na-10&&"down"==o&&(e.stop(),e.animate({scrollTop:n+40},100),t.preventDefault())}},{key:"sortComments",value:function(){this.comments.sort(function(t,e){return t.timestampe.timestamp?1:0})}},{key:"handleDeleteAnnotationClick",value:function(t){var e=this,n=$("").addClass("vac-delete-confirm").text("CONFIRM");n.on("click.comment",function(){n.off("click.comment"),e.annotation.teardown()}),$(t.target).replaceWith(n)}},{key:"unbindCommentFormEvents",value:function(){this.$newCommentForm&&this.$newCommentForm.off("click.vac-comment")}},{key:"teardown",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.$el&&this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"),this.comments.forEach(function(e){return e.teardown(t)}),t&&(this.comments=[]),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return this.comments.map(function(t){return t.data})}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./comment":27}],29:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this.uiState.adding&&(this.restoreNormalUI(),this.marker.teardown(),this.selectableShape.teardown()),this.uiState=u.cloneObject(m),this.$player.find(".vac-video-cover-canvas").off("mousedown.vac-cursor-tooltip").off("mouseup.vac-cursor-tooltip")),this.$tooltip_=null,this.$UI.controlElements.remove()}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.clear(t);var e=Object.assign({rangeStr:this.marker?u.humanTime(this.marker.range):null,showNav:this.plugin.annotationState.annotations.length>1},this.uiState,{internalCommenting:this.internalCommenting,showControls:this.showControls}),n=this.renderTemplate(p,e);this.$player.append(n),this.playerButton&&this.playerButton.updateNumAnnotations()}},{key:"cancelAddNew",value:function(){(this.uiState.adding||this.uiState.writingComment)&&(this.render(!0),this.marker.teardown(),this.marker=null)}},{key:"startAddNew",value:function(){this.plugin.active||this.plugin.toggleAnnotationMode(),this.player.pause(),this.setAddingUI(),this.uiState.adding=!0,this.render();var t={start:parseInt(this.currentTime,10),stop:parseInt(this.currentTime,10)};this.marker=new c(this.player,t),this.selectableShape=new h(this.player),this.showControls||this.bindCursorTooltip(),this.plugin.fire("enteredAddingAnnotation",{range:t})}},{key:"writeComment",value:function(){this.uiState.writingComment=!0,this.render()}},{key:"saveNew",value:function(){var t=this.$UI.newCommentTextarea.val();if(t){var e=f.newFromData(this.marker.range,this.selectableShape.shape,t,this.plugin);this.plugin.annotationState.addNewAnnotation(e),this.cancelAddNew()}}},{key:"setAddingUI",value:function(){this.plugin.annotationState.enabled=!1,this.disablePlayingAndControl()}},{key:"restoreNormalUI",value:function(){this.plugin.annotationState.enabled=this.plugin.active,this.enablePlayingAndControl(),$(document).off("mousemove.vac-tooltip-"+this.playerId)}},{key:"handleArrowKeys",value:function(t){if(this.plugin.active){var e=t.which;37==e&&this.plugin.annotationState.prevAnnotation(),39==e&&this.plugin.annotationState.nextAnnotation()}}},{key:"bindCursorTooltip",value:function(){var t=this;this.tooltipArea=u.areaOfHiddenEl(this.$tooltip,this.$UI.coverCanvas,this.UI_CLASSES.hidden),this.plugin.setBounds(!1),$(document).on("mousemove.vac-tooltip-"+this.playerId,u.throttle(function(e){if(t.plugin.bounds){var n=e.pageX,i=e.pageY,r=nt.plugin.bounds.right||it.plugin.bounds.bottom,o=!r&&i>=t.plugin.bounds.bottomWithoutControls,a=t.$tooltip.hasClass("vac-marker-hover");if(r)return void t.$tooltip.addClass(t.UI_CLASSES.hidden);var s=n-t.plugin.bounds.left,l=i-t.plugin.bounds.top,u=10,c=t.$player.width(),h=t.$player.height()-t.$UI.controlBar.height(),d=s+t.tooltipArea.width+2*u>=c,f=l+t.tooltipArea.height+2*u>=h,p=d?c-t.tooltipArea.width-u:s+u,m=f?h-t.tooltipArea.height-u:l+u;o&&!a||t.$tooltip.hasClass("vac-cursor-dragging")?t.$tooltip.addClass(t.UI_CLASSES.hidden):t.$tooltip.removeClass(t.UI_CLASSES.hidden),t.$tooltip.css({left:p+"px",top:m+"px"})}}.bind(this),50))}},{key:"$tooltip",get:function(){return this.$tooltip_=this.$tooltip_||this.$player.find(".vac-cursor-tool-tip"),this.$tooltip_}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;nthis.rangePin?this.range={start:this.rangePin,end:n}:this.range={start:n,end:this.rangePin},this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}},{key:"percentValFromXpos",value:function(t){var e=Math.max(0,t-this.$parent.offset().left),n=this.$parent.innerWidth(),i=e/n;return i>1&&(i=1),i<0&&(i=0),i}},{key:"teardown",value:function(){$(document).off("mousemove.vac-dmarker-"+this.playerId+" mouseup.vac-dmarker-"+this.playerId),this.$el.off("mouseenter.vac-cursor-tool-tip"),this.$el.off("mouseleave.vac-cursor-tool-tip"),this.$el.off("mousedown.vac-marker"),this.$el.remove()}},{key:"scrubStart",value:function(t){var e=this.range.start+t;this.currentTime=e,this.range.start=e,this.rangePin=e,this.teardown(),this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}}]),e}(s)},{"./../lib/utils":41,"./marker":31}],31:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:null;i(this,e);var a=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return a.range=n,a.comment=o,a.templateName=c,a.$UI.markerWrap.length||a.$UI.timeline.append(a.renderTemplate(h)),a}return o(e,t),a(e,[{key:"setActive",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$el.addClass(this.UI_CLASSES.active),t&&this.$el.addClass("vac-force-tooltip")}},{key:"deactivate",value:function(){this.$el.removeClass(this.UI_CLASSES.active+" vac-force-tooltip")}},{key:"render",value:function(){this.$UI.timeline.find('[data-marker-id="'+this.componentId+'"]').remove(),this.$el=$(this.renderTemplate(this.templateName,this.markerTemplateData)),this.$UI.markerWrap.append(this.$el),this.bindMarkerEvents()}},{key:"bindMarkerEvents",value:function(){var t=this;this.$el.on("mouseenter.vac-marker",function(){t.$el.addClass("vac-hovering").closest(".vac-marker-wrap").addClass("vac-dim-all")}).on("mouseleave.vac-marker",function(){t.$el.removeClass("vac-hovering").closest(".vac-marker-wrap").removeClass("vac-dim-all")})}},{key:"teardown",value:function(){this.$el.off("mouseenter.vac-marker").off("mouseleave.vac-marker").off("click.vac-marker"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"markerTemplateData",get:function(){var t=this.range.start/this.duration*100,e=this.range.end/this.duration*100-t,n=100-Math.floor(e)||100;return{left:t+"%",width:e+"%",zIndex:n,showTooltip:this.plugin.options.showMarkerShapeAndTooltips,tooltipRight:t>50,tooltipTime:u.humanTime(this.range),tooltipBody:this.comment?this.comment.body:null,rangeShow:!!this.range.end,id:this.componentId}}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41}],32:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0?e.removeClass(this.UI_CLASSES.hidden):e.addClass(this.UI_CLASSES.hidden)}},{key:"teardown",value:function(){this.$el.off("click.vac-player-button"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}}]),e}(l)},{"./../lib/player_ui_component":39}],33:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var o=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return o.shape=n,o.$parent=o.$player,o}return o(e,t),a(e,[{key:"render",value:function(){this.shape&&(this.$el&&this.$el.remove(),this.$el=$("
").addClass("vac-shape"),this.setDimsFromShape(),this.$parent.append(this.$el))}},{key:"setDimsFromShape",value:function(){this.$el.css({left:this.shape.x1+"%",top:this.shape.y1+"%",width:this.shape.x2-this.shape.x1+"%",height:this.shape.y2-this.shape.y1+"%"})}}]),e}(s)},{"./../lib/player_ui_component":39}],35:[function(t,e,n){"use strict";!function(e,n){var i=t("./annotation_comments.js");n.registerPlugin("annotationComments",i(n))}(jQuery,window.videojs)},{"./annotation_comments.js":23}],36:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this._player=null)}},{key:"plugin",get:function(){return this.player.annotationComments()}},{key:"player",get:function(){return this._player}},{key:"duration",get:function(){return this.player.duration()}},{key:"currentTime",get:function(){return this.player.currentTime()},set:function(t){this.player.currentTime(t)}}]),t}()},{}],39:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return this.registerHandlebarsHelpers(),c[t](e)}},{key:"registerHandlebarsHelpers",value:function(){"breaklines"in u.helpers||u.registerHelper("breaklines",function(t){return t=u.Utils.escapeExpression(t),t=t.replace(/(\r\n|\n|\r)/gm,"
"),new u.SafeString(t)})}},{key:"teardown",value:function(){this.$el&&this.$el.remove(),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"$UI",get:function(){return Object.freeze({commentsContainer:this.$player.find(".vac-comments-container"),controlElements:this.$player.find(".vac-control"),newCommentTextarea:this.$player.find(".vac-video-write-new textarea"),timeline:this.$player.find(".vjs-progress-control"),markerCursorHelpText:this.$player.find(".vac-cursor-help-text"),controlBar:this.$player.find(".vjs-control-bar"),markerWrap:this.$player.find(".vac-marker-wrap"),coverCanvas:this.$player.find(".vac-video-cover-canvas")})}},{key:"UI_CLASSES",get:function(){return Object.freeze({hidden:"vac-hidden",active:"vac-active"})}},{key:"$player",get:function(){return $(this.player.el())}},{key:"playerId",get:function(){return this.$player.attr("id")}},{key:"componentId",get:function(){return this.cid_=this.cid_||h.guid(),this.cid_}}]),e}(l)},{"./../compiled/templates":24,"./../lib/utils":41,"./player_component":38,"handlebars/runtime":20}],40:[function(t,e,n){t("ie-array-find-polyfill"),t("es6-object-assign").polyfill(),function(){if("undefined"==typeof Object.setPrototypeOf&&"function"==typeof Object.getOwnPropertyNames){var t=function(t,e){return function(){return e.apply(this,arguments)}},e=function(t,e,n){if(!n){var i=t.__proto__[e];n={get:function(){return t["__"+e]||i},set:function(n){t["__"+e]=n}}}Object.defineProperty(t,e,{ +get:n.get?n.get.bind(t):void 0,set:n.set?n.set.bind(t):void 0,configurable:!0})},n=function r(n,o){var a,s=Object.getOwnPropertyNames(o);n.__proto__=o;for(var l=0,u=s.length;le?(a&&(clearTimeout(a),a=null),s=u,o=t.apply(i,r),a||(i=r=null)):a||n.trailing===!1||(a=setTimeout(l,c)),o}},parseIntObj:function(t){return Object.keys(t).forEach(function(e){parseInt(t[e])&&(t[e]=parseInt(t[e]))}),t},humanTime:function(t){function e(t){var e=Math.floor(t/60),n=String(t%60);return e+":"+(1==n.length?"0":"")+n}var n=[e(t.start)];return t.end&&n.push(e(t.end)),n.join("-")},guid:function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},areaOfHiddenEl:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=t.clone(),r={};return i.css({visibility:"hidden",display:"inline-block"}),i.removeClass(n),e.append(i),r.width=i.outerWidth(),r.height=i.outerHeight(),i.remove(),r},isWithinRange:function(t,e,n){return e=e||t+1,n>=t&&n<=e}}},{}]},{},[35]); \ No newline at end of file diff --git a/docs/build/videojs-annotation-comments.cjs.min.js b/docs/build/videojs-annotation-comments.cjs.min.js new file mode 100644 index 0000000..6a6aa40 --- /dev/null +++ b/docs/build/videojs-annotation-comments.cjs.min.js @@ -0,0 +1,5 @@ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.AnnotationComments=t()}}(function(){var t;return function(){function t(e,n,i){function r(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n||t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a= 2.0.0-beta.1",7:">= 4.0.0"};n.REVISION_CHANGES=p;var m="[object Object]";r.prototype={constructor:r,logger:d["default"],log:d["default"].log,registerHelper:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple helpers");o.extend(this.helpers,t)}else this.helpers[t]=e},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,e){if(o.toString.call(t)===m)o.extend(this.partials,t);else{if("undefined"==typeof e)throw new s["default"]('Attempting to register a partial called "'+t+'" as undefined');this.partials[t]=e}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple decorators");o.extend(this.decorators,t)}else this.decorators[t]=e},unregisterDecorator:function(t){delete this.decorators[t]}};var v=d["default"].log;n.log=v,n.createFrame=o.createFrame,n.logger=d["default"]},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t){a["default"](t)}n.__esModule=!0,n.registerDefaultDecorators=r;var o=t("./decorators/inline"),a=i(o)},{"./decorators/inline":5}],5:[function(t,e,n){"use strict";n.__esModule=!0;var i=t("../utils");n["default"]=function(t){t.registerDecorator("inline",function(t,e,n,r){var o=t;return e.partials||(e.partials={},o=function(r,o){var a=n.partials;n.partials=i.extend({},a,e.partials);var s=t(r,o);return n.partials=a,s}),e.partials[r.args[0]]=r.fn,o})},e.exports=n["default"]},{"../utils":19}],6:[function(t,e,n){"use strict";function i(t,e){var n=e&&e.loc,o=void 0,a=void 0;n&&(o=n.start.line,a=n.start.column,t+=" - "+o+":"+a);for(var s=Error.prototype.constructor.call(this,t),l=0;l0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var a=i.createFrame(n.data);a.contextPath=i.appendContextPath(n.data.contextPath,n.name),n={data:a}}return o(e,n)})},e.exports=n["default"]},{"../utils":19}],9:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}n.__esModule=!0;var r=t("../utils"),o=t("../exception"),a=i(o);n["default"]=function(t){t.registerHelper("each",function(t,e){function n(e,n,o){u&&(u.key=e,u.index=n,u.first=0===n,u.last=!!o,c&&(u.contextPath=c+e)),l+=i(t[e],{data:u,blockParams:r.blockParams([t[e],e],[c+e,null])})}if(!e)throw new a["default"]("Must pass iterator to #each");var i=e.fn,o=e.inverse,s=0,l="",u=void 0,c=void 0;if(e.data&&e.ids&&(c=r.appendContextPath(e.data.contextPath,e.ids[0])+"."),r.isFunction(t)&&(t=t.call(this)),e.data&&(u=r.createFrame(e.data)),t&&"object"==typeof t)if(r.isArray(t))for(var d=t.length;s=0?e:parseInt(t,10)}return t},log:function(t){if(t=r.lookupLevel(t),"undefined"!=typeof console&&r.lookupLevel(r.level)<=t){var e=r.methodMap[t];console[e]||(e="log");for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o":">",'"':""","'":"'","`":"`","=":"="},h=/[&<>"'`=]/g,f=/[&<>"'`=]/,p=Object.prototype.toString;n.toString=p;var m=function(t){return"function"==typeof t};m(/x/)&&(n.isFunction=m=function(t){return"function"==typeof t&&"[object Function]"===p.call(t)}),n.isFunction=m;var v=Array.isArray||function(t){return!(!t||"object"!=typeof t)&&"[object Array]"===p.call(t)};n.isArray=v},{}],20:[function(t,e,n){e.exports=t("./dist/cjs/handlebars.runtime")["default"]},{"./dist/cjs/handlebars.runtime":2}],21:[function(t,e,n){"use strict";Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError("this is null or not defined");var e=Object(this),n=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r0)for(n=0;n0?"future":"past"];return x(n)?n(e):n.replace(/%s/i,e)}function L(t,e){var n=t.toLowerCase();Ri[n]=Ri[n+"s"]=Ri[e]=t}function F(t){return"string"==typeof t?Ri[t]||Ri[t.toLowerCase()]:void 0}function H(t){var e,n,i={};for(n in t)d(t,n)&&(e=F(n),e&&(i[e]=t[n]));return i}function N(t,e){Wi[t]=e}function R(t){var e=[];for(var n in t)e.push({unit:n,priority:Wi[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function W(t,e,n){var i=""+Math.abs(t),r=e-i.length,o=t>=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+i}function U(t,e,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),t&&(zi[t]=r),e&&(zi[e[0]]=function(){return W(r.apply(this,arguments),e[1],e[2])}),n&&(zi[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function V(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,n,i=t.match(Ui);for(e=0,n=i.length;e=0&&Vi.test(t);)t=t.replace(Vi,n),Vi.lastIndex=0,i-=1;return t}function Z(t,e,n){cr[t]=x(e)?e:function(t,i){return t&&n?n:e}}function q(t,e){return d(cr,t)?cr[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return J(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,r){return e||n||i||r}))}function J(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function kt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function St(t,e,n){var i=7+e-n,r=(7+kt(t,0,i).getUTCDay()-e)%7;return-r+i-1}function Ot(t,e,n,i,r){var o,a,s=(7+n-i)%7,l=St(t,i,r),u=1+7*(e-1)+s+l;return u<=0?(o=t-1,a=et(o)+u):u>et(t)?(o=t+1,a=u-et(t)):(o=t,a=u),{year:o,dayOfYear:a}}function Mt(t,e,n){var i,r,o=St(t.year(),e,n),a=Math.floor((t.dayOfYear()-o-1)/7)+1;return a<1?(r=t.year()-1,i=a+Dt(r,e,n)):a>Dt(t.year(),e,n)?(i=a-Dt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function Dt(t,e,n){var i=St(t,e,n),r=St(t+1,e,n);return(et(t)-i+r)/7}function xt(t){return Mt(t,this._week.dow,this._week.doy).week}function Ct(){return this._week.dow}function Pt(){return this._week.doy}function Tt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Yt(t){var e=Mt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function At(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function jt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Et(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone}function $t(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function It(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Lt(t,e,n){var i,r,o,a=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)o=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:null):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null):"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null)))}function Ft(t,e,n){var i,r,o;if(this._weekdaysParseExact)return Lt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Ht(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=At(t,this.localeData()),this.add(t-e,"d")):e}function Nt(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Rt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=jt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Ar),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ut(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=jr),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Vt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Er),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Gt(){function t(t,e){return e.length-t.length}var e,n,i,r,o,a=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(i),s.push(r),l.push(o),u.push(i),u.push(r),u.push(o);for(a.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=J(s[e]),l[e]=J(l[e]),u[e]=J(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"), +this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function zt(){return this.hours()%12||12}function Bt(){return this.hours()||24}function Zt(t,e){U(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Jt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Qt(t){return t?t.toLowerCase().replace("_","-"):t}function Kt(t){for(var e,n,i,r,o=0;o0;){if(i=te(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&S(r,n,!0)>=e-1)break;e--}o++}return $r}function te(t){var i=null;if(!Hr[t]&&"undefined"!=typeof n&&n&&n.exports)try{i=$r._abbr;var r=e;r("./locale/"+t),ee(i)}catch(o){}return Hr[t]}function ee(t,e){var n;return t&&(n=s(e)?re(t):ne(t,e),n?$r=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),$r._abbr}function ne(t,e){if(null!==e){var n,i=Fr;if(e.abbr=t,null!=Hr[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=Hr[t]._config;else if(null!=e.parentLocale)if(null!=Hr[e.parentLocale])i=Hr[e.parentLocale]._config;else{if(n=te(e.parentLocale),null==n)return Nr[e.parentLocale]||(Nr[e.parentLocale]=[]),Nr[e.parentLocale].push({name:t,config:e}),null;i=n._config}return Hr[t]=new T(P(i,e)),Nr[t]&&Nr[t].forEach(function(t){ne(t.name,t.config)}),ee(t),Hr[t]}return delete Hr[t],null}function ie(t,e){if(null!=e){var n,i,r=Fr;i=te(t),null!=i&&(r=i._config),e=P(r,e),n=new T(e),n.parentLocale=Hr[t],Hr[t]=n,ee(t)}else null!=Hr[t]&&(null!=Hr[t].parentLocale?Hr[t]=Hr[t].parentLocale:null!=Hr[t]&&delete Hr[t]);return Hr[t]}function re(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return $r;if(!r(t)){if(e=te(t))return e;t=[t]}return Kt(t)}function oe(){return Ei(Hr)}function ae(t){var e,n=t._a;return n&&m(t).overflow===-2&&(e=n[fr]<0||n[fr]>11?fr:n[pr]<1||n[pr]>ct(n[hr],n[fr])?pr:n[mr]<0||n[mr]>24||24===n[mr]&&(0!==n[vr]||0!==n[yr]||0!==n[gr])?mr:n[vr]<0||n[vr]>59?vr:n[yr]<0||n[yr]>59?yr:n[gr]<0||n[gr]>999?gr:-1,m(t)._overflowDayOfYear&&(epr)&&(e=pr),m(t)._overflowWeeks&&e===-1&&(e=_r),m(t)._overflowWeekday&&e===-1&&(e=br),m(t).overflow=e),t}function se(t,e,n){return null!=t?t:null!=e?e:n}function le(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function ue(t){var e,n,i,r,o,a=[];if(!t._d){for(i=le(t),t._w&&null==t._a[pr]&&null==t._a[fr]&&ce(t),null!=t._dayOfYear&&(o=se(t._a[hr],i[hr]),(t._dayOfYear>et(o)||0===t._dayOfYear)&&(m(t)._overflowDayOfYear=!0),n=kt(o,0,t._dayOfYear),t._a[fr]=n.getUTCMonth(),t._a[pr]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=i[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[mr]&&0===t._a[vr]&&0===t._a[yr]&&0===t._a[gr]&&(t._nextDay=!0,t._a[mr]=0),t._d=(t._useUTC?kt:wt).apply(null,a),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[mr]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==r&&(m(t).weekdayMismatch=!0)}}function ce(t){var e,n,i,r,o,a,s,l;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)o=1,a=4,n=se(e.GG,t._a[hr],Mt(xe(),1,4).year),i=se(e.W,1),r=se(e.E,1),(r<1||r>7)&&(l=!0);else{o=t._locale._week.dow,a=t._locale._week.doy;var u=Mt(xe(),o,a);n=se(e.gg,t._a[hr],u.year),i=se(e.w,u.week),null!=e.d?(r=e.d,(r<0||r>6)&&(l=!0)):null!=e.e?(r=e.e+o,(e.e<0||e.e>6)&&(l=!0)):r=o}i<1||i>Dt(n,o,a)?m(t)._overflowWeeks=!0:null!=l?m(t)._overflowWeekday=!0:(s=Ot(n,i,r,o,a),t._a[hr]=s.year,t._dayOfYear=s.dayOfYear)}function de(t){var e,n,i,r,o,a,s=t._i,l=Rr.exec(s)||Wr.exec(s);if(l){for(m(t).iso=!0,e=0,n=Vr.length;e0&&m(e).unusedInput.push(a),s=s.slice(s.indexOf(i)+i.length),u+=i.length),zi[o]?(i?m(e).empty=!1:m(e).unusedTokens.push(o),tt(o,i,e)):e._strict&&!i&&m(e).unusedTokens.push(o);m(e).charsLeftOver=l-u,s.length>0&&m(e).unusedInput.push(s),e._a[mr]<=12&&m(e).bigHour===!0&&e._a[mr]>0&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[mr]=be(e._locale,e._a[mr],e._meridiem),ue(e),ae(e)}function be(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function we(t){var e,n,i,r,o;if(0===t._f.length)return m(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ze(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(g(t,this),t=Oe(t),t._a){var e=t._isUTC?f(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&S(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Je(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Qe(t,e){var n,i,r,o=t,a=null;return $e(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(o={},e?o[e]=t:o.milliseconds=t):(a=to.exec(t))?(n="-"===a[1]?-1:1,o={y:0,d:k(a[pr])*n,h:k(a[mr])*n,m:k(a[vr])*n,s:k(a[yr])*n,ms:k(Ie(1e3*a[gr]))*n}):(a=eo.exec(t))?(n="-"===a[1]?-1:("+"===a[1],1),o={y:Ke(a[2],n),M:Ke(a[3],n),w:Ke(a[4],n),d:Ke(a[5],n),h:Ke(a[6],n),m:Ke(a[7],n),s:Ke(a[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(r=en(xe(o.from),xe(o.to)),o={},o.ms=r.milliseconds,o.M=r.months),i=new Ee(o),$e(t)&&d(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function tn(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function en(t,e){var n;return t.isValid()&&e.isValid()?(e=He(e,t),t.isBefore(e)?n=tn(t,e):(n=tn(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(t,e){return function(n,i){var r,o;return null===i||isNaN(+i)||(D(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=i,i=o),n="string"==typeof n?+n:n,r=Qe(n,i),rn(this,r,t),this}}function rn(e,n,i,r){var o=n._milliseconds,a=Ie(n._days),s=Ie(n._months);e.isValid()&&(r=null==r||r,s&&mt(e,ot(e,"Month")+s*i),a&&at(e,"Date",ot(e,"Date")+a*i),o&&e._d.setTime(e._d.valueOf()+o*i),r&&t.updateOffset(e,a||s))}function on(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(e,n){var i=e||xe(),r=He(i,this).startOf("day"),o=t.calendarFormat(this,r)||"sameElse",a=n&&(x(n[o])?n[o].call(this,i):n[o]);return this.format(a||this.localeData().calendar(o,this,xe(i)))}function sn(){return new _(this)}function ln(t,e){var n=b(t)?t:xe(t);return!(!this.isValid()||!n.isValid())&&(e=F(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()9999?z(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",z(n,"Z")):z(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function gn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",r="-MM-DD[T]HH:mm:ss.SSS",o=e+'[")]';return this.format(n+i+r+o)}function _n(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=z(this,e);return this.localeData().postformat(n)}function bn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function wn(t){return this.from(xe(),t)}function kn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Sn(t){return this.to(xe(),t)}function On(t){var e;return void 0===t?this._locale._abbr:(e=re(t),null!=e&&(this._locale=e),this)}function Mn(){return this._locale}function Dn(t){switch(t=F(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function xn(t){return t=F(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Cn(){return this._d.valueOf()-6e4*(this._offset||0)}function Pn(){return Math.floor(this.valueOf()/1e3)}function Tn(){return new Date(this.valueOf())}function Yn(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function An(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function jn(){return this.isValid()?this.toISOString():null}function En(){return v(this)}function $n(){return h({},m(this))}function In(){return m(this).overflow}function Ln(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Fn(t,e){U(0,[t,t.length],0,e)}function Hn(t){return Un.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Nn(t){return Un.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Rn(){return Dt(this.year(),1,4)}function Wn(){var t=this.localeData()._week;return Dt(this.year(),t.dow,t.doy)}function Un(t,e,n,i,r){var o;return null==t?Mt(this,i,r).year:(o=Dt(t,i,r),e>o&&(e=o),Vn.call(this,t,e,n,i,r))}function Vn(t,e,n,i,r){var o=Ot(t,e,n,i,r),a=kt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Gn(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function zn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Bn(t,e){e[gr]=k(1e3*("0."+t))}function Zn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Xn(t){return xe(1e3*t)}function Jn(){return xe.apply(null,arguments).parseZone()}function Qn(t){return t}function Kn(t,e,n,i){var r=re(),o=f().set(i,e);return r[n](o,t)}function ti(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Kn(t,e,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=Kn(t,i,n,"month");return r}function ei(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var r=re(),o=t?r._week.dow:0;if(null!=n)return Kn(e,(n+o)%7,i,"day");var a,s=[];for(a=0;a<7;a++)s[a]=Kn(e,(a+o)%7,i,"day");return s}function ni(t,e){return ti(t,e,"months")}function ii(t,e){return ti(t,e,"monthsShort")}function ri(t,e,n){return ei(t,e,n,"weekdays")}function oi(t,e,n){return ei(t,e,n,"weekdaysShort")}function ai(t,e,n){return ei(t,e,n,"weekdaysMin")}function si(){var t=this._data;return this._milliseconds=fo(this._milliseconds),this._days=fo(this._days),this._months=fo(this._months),t.milliseconds=fo(t.milliseconds),t.seconds=fo(t.seconds),t.minutes=fo(t.minutes),t.hours=fo(t.hours),t.months=fo(t.months),t.years=fo(t.years),this}function li(t,e,n,i){var r=Qe(e,n);return t._milliseconds+=i*r._milliseconds,t._days+=i*r._days,t._months+=i*r._months,t._bubble()}function ui(t,e){return li(this,t,e,1)}function ci(t,e){return li(this,t,e,-1)}function di(t){return t<0?Math.floor(t):Math.ceil(t)}function hi(){var t,e,n,i,r,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*di(pi(s)+a),a=0,s=0),l.milliseconds=o%1e3,t=w(o/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,a+=w(n/24),r=w(fi(a)),s+=r,a-=di(pi(r)),i=w(s/12),s%=12,l.days=a,l.months=s,l.years=i,this}function fi(t){return 4800*t/146097}function pi(t){return 146097*t/4800}function mi(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(t=F(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+fi(e),"month"===t?n:n/12;switch(e=this._days+Math.round(pi(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function vi(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN}function yi(t){return function(){return this.as(t)}}function gi(){return Qe(this)}function _i(t){return t=F(t),this.isValid()?this[t+"s"]():NaN}function bi(t){return function(){return this.isValid()?this._data[t]:NaN}}function wi(){return w(this.days()/7)}function ki(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}function Si(t,e,n){var i=Qe(t).abs(),r=Po(i.as("s")),o=Po(i.as("m")),a=Po(i.as("h")),s=Po(i.as("d")),l=Po(i.as("M")),u=Po(i.as("y")),c=r<=To.ss&&["s",r]||r0,c[4]=n,ki.apply(null,c)}function Oi(t){return void 0===t?Po:"function"==typeof t&&(Po=t,!0)}function Mi(t,e){return void 0!==To[t]&&(void 0===e?To[t]:(To[t]=e,"s"===t&&(To.ss=e-1),!0))}function Di(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=Si(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function xi(t){return(t>0)-(t<0)||+t}function Ci(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=Yo(this._milliseconds)/1e3,r=Yo(this._days),o=Yo(this._months);t=w(i/60),e=w(t/60),i%=60,t%=60,n=w(o/12),o%=12;var a=n,s=o,l=r,u=e,c=t,d=i?i.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var f=h<0?"-":"",p=xi(this._months)!==xi(h)?"-":"",m=xi(this._days)!==xi(h)?"-":"",v=xi(this._milliseconds)!==xi(h)?"-":"";return f+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?m+l+"D":"")+(u||c||d?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(d?v+d+"S":"")}var Pi,Ti;Ti=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var wr,kr=rt("FullYear",!0);wr=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:y()}),Jr=function(){return Date.now?Date.now():+new Date},Qr=["year","quarter","month","week","day","hour","minute","second","millisecond"];Le("Z",":"),Le("ZZ",""),Z("Z",sr),Z("ZZ",sr),Q(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Fe(sr,t)});var Kr=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var to=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,eo=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Qe.fn=Ee.prototype,Qe.invalid=je;var no=nn(1,"add"),io=nn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ro=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Fn("gggg","weekYear"),Fn("ggggg","weekYear"),Fn("GGGG","isoWeekYear"),Fn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),Z("G",or),Z("g",or),Z("GG",Qi,Zi),Z("gg",Qi,Zi),Z("GGGG",nr,Xi),Z("gggg",nr,Xi),Z("GGGGG",ir,Ji),Z("ggggg",ir,Ji),K(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=k(t)}),K(["gg","GG"],function(e,n,i,r){n[r]=t.parseTwoDigitYear(e)}),U("Q",0,"Qo","quarter"),L("quarter","Q"),N("quarter",7),Z("Q",Bi),Q("Q",function(t,e){e[fr]=3*(k(t)-1)}),U("D",["DD",2],"Do","date"),L("date","D"),N("date",9),Z("D",Qi),Z("DD",Qi,Zi),Z("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),Q(["D","DD"],pr),Q("Do",function(t,e){e[pr]=k(t.match(Qi)[0])});var oo=rt("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),N("dayOfYear",4),Z("DDD",er),Z("DDDD",qi),Q(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),U("m",["mm",2],0,"minute"),L("minute","m"),N("minute",14),Z("m",Qi),Z("mm",Qi,Zi),Q(["m","mm"],vr);var ao=rt("Minutes",!1);U("s",["ss",2],0,"second"),L("second","s"),N("second",15),Z("s",Qi),Z("ss",Qi,Zi),Q(["s","ss"],yr);var so=rt("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100); +}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),N("millisecond",16),Z("S",er,Bi),Z("SS",er,Zi),Z("SSS",er,qi);var lo;for(lo="SSSS";lo.length<=9;lo+="S")Z(lo,rr);for(lo="S";lo.length<=9;lo+="S")Q(lo,Bn);var uo=rt("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var co=_.prototype;co.add=no,co.calendar=an,co.clone=sn,co.diff=pn,co.endOf=xn,co.format=_n,co.from=bn,co.fromNow=wn,co.to=kn,co.toNow=Sn,co.get=st,co.invalidAt=In,co.isAfter=ln,co.isBefore=un,co.isBetween=cn,co.isSame=dn,co.isSameOrAfter=hn,co.isSameOrBefore=fn,co.isValid=En,co.lang=ro,co.locale=On,co.localeData=Mn,co.max=Xr,co.min=qr,co.parsingFlags=$n,co.set=lt,co.startOf=Dn,co.subtract=io,co.toArray=Yn,co.toObject=An,co.toDate=Tn,co.toISOString=yn,co.inspect=gn,co.toJSON=jn,co.toString=vn,co.unix=Pn,co.valueOf=Cn,co.creationData=Ln,co.year=kr,co.isLeapYear=it,co.weekYear=Hn,co.isoWeekYear=Nn,co.quarter=co.quarters=Gn,co.month=vt,co.daysInMonth=yt,co.week=co.weeks=Tt,co.isoWeek=co.isoWeeks=Yt,co.weeksInYear=Wn,co.isoWeeksInYear=Rn,co.date=oo,co.day=co.days=Ht,co.weekday=Nt,co.isoWeekday=Rt,co.dayOfYear=zn,co.hour=co.hours=Lr,co.minute=co.minutes=ao,co.second=co.seconds=so,co.millisecond=co.milliseconds=uo,co.utcOffset=Re,co.utc=Ue,co.local=Ve,co.parseZone=Ge,co.hasAlignedHourOffset=ze,co.isDST=Be,co.isLocal=qe,co.isUtcOffset=Xe,co.isUtc=Je,co.isUTC=Je,co.zoneAbbr=Zn,co.zoneName=qn,co.dates=M("dates accessor is deprecated. Use date instead.",oo),co.months=M("months accessor is deprecated. Use month instead",vt),co.years=M("years accessor is deprecated. Use year instead",kr),co.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",We),co.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ze);var ho=T.prototype;ho.calendar=Y,ho.longDateFormat=A,ho.invalidDate=j,ho.ordinal=E,ho.preparse=Qn,ho.postformat=Qn,ho.relativeTime=$,ho.pastFuture=I,ho.set=C,ho.months=dt,ho.monthsShort=ht,ho.monthsParse=pt,ho.monthsRegex=_t,ho.monthsShortRegex=gt,ho.week=xt,ho.firstDayOfYear=Pt,ho.firstDayOfWeek=Ct,ho.weekdays=Et,ho.weekdaysMin=It,ho.weekdaysShort=$t,ho.weekdaysParse=Ft,ho.weekdaysRegex=Wt,ho.weekdaysShortRegex=Ut,ho.weekdaysMinRegex=Vt,ho.isPM=Xt,ho.meridiem=Jt,ee("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=M("moment.lang is deprecated. Use moment.locale instead.",ee),t.langData=M("moment.langData is deprecated. Use moment.localeData instead.",re);var fo=Math.abs,po=yi("ms"),mo=yi("s"),vo=yi("m"),yo=yi("h"),go=yi("d"),_o=yi("w"),bo=yi("M"),wo=yi("y"),ko=bi("milliseconds"),So=bi("seconds"),Oo=bi("minutes"),Mo=bi("hours"),Do=bi("days"),xo=bi("months"),Co=bi("years"),Po=Math.round,To={ss:44,s:45,m:45,h:22,d:26,M:11},Yo=Math.abs,Ao=Ee.prototype;return Ao.isValid=Ae,Ao.abs=si,Ao.add=ui,Ao.subtract=ci,Ao.as=mi,Ao.asMilliseconds=po,Ao.asSeconds=mo,Ao.asMinutes=vo,Ao.asHours=yo,Ao.asDays=go,Ao.asWeeks=_o,Ao.asMonths=bo,Ao.asYears=wo,Ao.valueOf=vi,Ao._bubble=hi,Ao.clone=gi,Ao.get=_i,Ao.milliseconds=ko,Ao.seconds=So,Ao.minutes=Oo,Ao.hours=Mo,Ao.days=Do,Ao.weeks=wi,Ao.months=xo,Ao.years=Co,Ao.humanize=Di,Ao.toISOString=Ci,Ao.toString=Ci,Ao.toJSON=Ci,Ao.locale=On,Ao.localeData=Mn,Ao.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ci),Ao.lang=ro,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",or),Z("X",lr),Q("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),Q("x",function(t,e,n){n._d=new Date(k(t))}),t.version="2.22.1",i(xe),t.fn=co,t.min=Pe,t.max=Te,t.now=Jr,t.utc=f,t.unix=Xn,t.months=ni,t.isDate=u,t.locale=ee,t.invalid=y,t.duration=Qe,t.isMoment=b,t.weekdays=ri,t.parseZone=Jn,t.localeData=re,t.isDuration=$e,t.monthsShort=ii,t.weekdaysMin=ai,t.defineLocale=ne,t.updateLocale=ie,t.locales=oe,t.weekdaysShort=oi,t.normalizeUnits=F,t.relativeTimeRounding=Oi,t.relativeTimeThreshold=Mi,t.calendarFormat=on,t.prototype=co,t.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},t})},{}],23:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n=3?o.postLoadDataConstructor():t.on("loadeddata",o.postLoadDataConstructor.bind(o)),o}return o(e,t),a(e,[{key:"postLoadDataConstructor",value:function(){this.annotationState=new c(this.player),this.annotationState.annotations=this.options.annotationsObjects,this.controls=new u(this.player,this.options.bindArrowKeys),this.bindEvents(),this.setBounds(!1),this.options.startInAnnotationMode&&this.toggleAnnotationMode(),this.pluginReady()}},{key:"bindEvents",value:function(){var t=this;$(window).on("resize.vac-window-resize",l.throttle(this.setBounds.bind(this),500)),this.player.on("fullscreenchange",l.throttle(this.setBounds.bind(this),500)),this.options.showFullScreen||this.player.on("fullscreenchange",function(){t.player.isFullscreen_?(t.preFullscreenAnnotationsEnabled=t.active,$(t.player.el()).addClass("vac-disable-fullscreen")):$(t.player.el()).removeClass("vac-disable-fullscreen"),t.preFullscreenAnnotationsEnabled&&t.toggleAnnotationMode()}.bind(this))}},{key:"fire",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.eventDispatcher.fire(t,e)}},{key:"toggleAnnotationMode",value:function(){this.active=!this.active,this.player.toggleClass("vac-active"),this.annotationState.enabled=this.active,this.active?this.fire("annotationModeEnabled"):this.fire("annotationModeDisabled"),this.options.showControls&&(this.active?this.controls.render():this.controls.clear(!0))}},{key:"setBounds",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.bounds={};var e=$(this.player.el()),n=e.find(".vjs-control-bar");this.bounds.left=e.offset().left,this.bounds.top=e.offset().top,this.bounds.right=this.bounds.left+e.width(),this.bounds.bottom=this.bounds.top+e.height(),this.bounds.bottomWithoutControls=this.bounds.bottom-n.height(),t&&this.fire("playerBoundsChanged",this.bounds)}},{key:"onReady",value:function(t){return this.eventDispatcher.pluginReady?t():void this._readyCallbacks.push(t)}},{key:"pluginReady",value:function(){for(this.eventDispatcher.pluginReady=!0;this._readyCallbacks.length;)this._readyCallbacks.pop()()}},{key:"dispose",value:function(){this.controls=this.controls.teardown(),this.annotationState=this.annotationState.teardown(),this.eventDispatcher=this.eventDispatcher.teardown(),this.teardown(),this.player&&(this.player.annotationComments=null,$(this.player.el()).removeClass("vac-active"),$(this.player.el()).find("[class^='vac-']").remove()),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"dispose",this).call(this)}},{key:"teardown",value:function(){this.player&&this.player.off("fullscreenchange"),$(window).off("resize.vac-window-resize")}}]),e}(n)}},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":35,"./lib/polyfills":39,"./lib/utils":40}],24:[function(t,e,n){"use strict";var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=t("handlebars/runtime");n.comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n
\n
'+d(t.lambda(null!=(a=null!=e?e.meta:e)?a.user_name:a,e))+'
\n
'+d((s=null!=(s=n.timeSince||(null!=e?e.timeSince:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"timeSince",hash:{},data:o}):s))+'\n   X\n
\n
\n
\n '+d((n.breaklines||e&&e.breaklines||u).call(l,null!=e?e.body:e,{name:"breaklines",hash:{},data:o}))+"\n
\n
\n"},useData:!0}),n.comment_list=r.template({1:function(t,e,n,i,r,o){var a;return" "+(null!=(a=t.lambda(o[0][0],e))?a:"")+"\n"},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r,o){var a,s,l=null!=e?e:t.nullContext||{};return'
\n'},useData:!0,useBlockParams:!0}),n.controls=r.template({1:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(2,r,0),inverse:t.noop,data:r}))?o:""},2:function(t,e,n,i,r){var o;return'
\n \n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showNav:e,{name:"if",hash:{},fn:t.program(3,r,0),inverse:t.noop,data:r}))?o:"")+"
\n"},3:function(t,e,n,i,r){return'
\n
Prev
\n
Next
\n
\n'},5:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return'
\n
\n
Click and drag to select
\n
\n
\n'+(null!=(o=n["if"].call(a,null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.writingComment:e,{name:"if",hash:{},fn:t.program(9,r,0),inverse:t.noop,data:r}))?o:"")},6:function(t,e,n,i,r){var o;return'
\n Select shape + range\n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.internalCommenting:e,{name:"if",hash:{},fn:t.program(7,r,0),inverse:t.noop,data:r}))?o:"")+'
\n
-1 sec
\n
+1 sec
\n
\n
\n'},7:function(t,e,n,i,r){return' \n cancel\n'},9:function(t,e,n,i,r){var o;return'
\n
\n
\n
New Annotation @ '+t.escapeExpression((o=null!=(o=n.rangeStr||(null!=e?e.rangeStr:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"rangeStr",hash:{},data:r}):o))+'
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n'},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return(null!=(o=n.unless.call(a,null!=e?e.adding:e,{name:"unless",hash:{},fn:t.program(1,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.adding:e,{name:"if",hash:{},fn:t.program(5,r,0),inverse:t.noop,data:r}))?o:"")},useData:!0}),n.draggable_marker=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n'},useData:!0}),n.marker=r.template({1:function(t,e,n,i,r){return"vac-ranged-marker"},3:function(t,e,n,i,r){var o;return"width:"+t.escapeExpression((o=null!=(o=n.width||(null!=e?e.width:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"width",hash:{},data:r}):o))+";"},5:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.tooltipBody:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:""},6:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n \n '+d((s=null!=(s=n.tooltipTime||(null!=e?e.tooltipTime:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipTime",hash:{},data:o}):s))+" - "+d((s=null!=(s=n.tooltipBody||(null!=e?e.tooltipBody:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipBody",hash:{},data:o}):s))+"\n \n
\n"},7:function(t,e,n,i,r){return"vac-right-side"},compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n'+(null!=(a=n["if"].call(l,null!=e?e.showTooltip:e,{name:"if",hash:{},fn:t.program(5,o,0),inverse:t.noop,data:o}))?a:"")+"
\n"},useData:!0}),n.marker_wrap=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'
\n\t
\n
'},useData:!0}),n.new_comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n'},useData:!0}),n.player_button=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'\n\n\t\n\t \n\t \n\t\n'},useData:!0})},{"handlebars/runtime":20}],25:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0],e=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.isOpen=!0;var r=i||!u.isWithinRange(this.range.start,this.range.end,Math.floor(this.currentTime)),o=n&&this.plugin.options.showMarkerShapeAndTooltips;this.marker.setActive(o),!n&&this.plugin.options.showCommentList&&this.commentList.render(),(!n||n&&this.plugin.options.showMarkerShapeAndTooltips)&&(this.annotationShape.render(),this.shape&&this.annotationShape.$el.on("click.vac-annotation",function(){e.plugin.annotationState.openAnnotation(e,!1,!1,!1)})),t&&this.player.pause(),r&&(this.currentTime=this.range.start),this.plugin.fire("annotationOpened",{annotation:this.data,triggered_by_timeline:n})}},{key:"close",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isOpen&&(this.isOpen=!1,this.marker.deactivate(),this.commentList.teardown(!1),this.annotationShape.$el&&this.annotationShape.$el.off("click.vac-annotation"),this.annotationShape.teardown(),t&&this.plugin.annotationState.clearActive(),this.plugin.fire("annotationClosed",this.data))}},{key:"buildSecondsActiveArray",value:function(){var t=[];if(this.range.end)for(var e=this.range.start;e<=this.range.end;e++)t.push(e);else{var n=this.range.start;t.push(n),n0&&void 0!==arguments[0])||arguments[0];this.close(!0),this.marker.teardown(),this.commentList&&this.commentList.teardown(t),t&&this.plugin.annotationState.removeAnnotation(this),this.annotationShape&&this.annotationShape.teardown(),t&&s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return{id:this.id,range:this.range,shape:this.shape,comments:this.commentList.data}}},{key:"isActive",get:function(){return this.plugin.annotationState.activeAnnotation===this}}],[{key:"newFromData",value:function(t,n,i,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,a=h.dataObj(i,r);t&&(t=u.parseIntObj(t)),n&&(n=u.parseIntObj(n));var s={id:o,range:t,shape:n,comments:[a]};return new e(s,r.player)}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils.js":40,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(t,e,n){"use strict";function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);ee.range.start?1:0})}},{key:"addNewAnnotation",value:function(t){this._annotations.push(t),this.openAnnotation(t,!0,!0,!1,!0),this.stateChanged()}},{key:"createAndAddAnnotation",value:function(t){this.plugin.controls.uiState.adding&&this.plugin.controls.cancelAddNew();var e=d.newFromData(t.range,t.shape,t.commentStr||"",this.plugin,t.id);this.addNewAnnotation(e)}},{key:"destroyAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&e.teardown()}},{key:"removeAnnotation",value:function(t){var e=t.id,n=this._annotations.indexOf(t);this._annotations.splice(n,1),this.stateChanged(),this.plugin.fire("annotationDeleted",{id:e})}},{key:"setLiveAnnotation",value:function(){if(this.enabled){var t=Math.floor(this.currentTime);if(this.skipLiveCheck)return void(t!==this.lastVideoTime&&(this.skipLiveCheck=!1));var e=this.activeAnnotationsForTime(t);if(!e.length)return this.activeAnnotation.close();var n=this.annotations[e[e.length-1]];if(this.activeAnnotation.range){if(n===this.activeAnnotation)return;var i=n.range.start,r=this.activeAnnotation.range.start;if(i===r&&i===t)return}this.openAnnotation(n,!1,!1,!0)}}},{key:"activeAnnotationsForTime",value:function(t){return this.annotations.length?this.annotationTimeMap[t]||[]:[]}},{key:"rebuildAnnotationTimeMap",value:function(){var t=this,e={};this.annotations.forEach(function(n){n.secondsActive.forEach(function(i){var r=e[i]||[];r.push(t.annotations.indexOf(n)),e[i]=r})}),this.annotationTimeMap=e}},{key:"clearActive",value:function(){this.activeAnnotation.close(!1),this._activeAnnotation=null}},{key:"openAnnotation",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.plugin.active||this.plugin.toggleAnnotationMode(),this.skipLiveCheck=e,this.clearActive(),t.open(n,i,r),this.activeAnnotation=t,this.lastVideoTime=this.activeAnnotation.range.start}},{key:"openAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&this.openAnnotation(e)}},{key:"findAnnotation",value:function(t){return this.annotations.find(function(e){return e.id==t})}},{key:"findComment",value:function(t){var e,n=this.annotations.map(function(t){return t.commentList.comments});return n=(e=[]).concat.apply(e,i(n)),n.find(function(e){return e.id==t})}},{key:"nextAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=t===this.annotations.length-1?0:t+1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=0;in)return this.openAnnotation(this.annotations[i],!0);this.openAnnotation(this.annotations[0],!0)}},{key:"prevAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=0===t?this.annotations.length-1:t-1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=this.annotations.length-1;i>=0;i--)if(this.annotations[i].range.start0&&void 0!==arguments[0]?arguments[0]:null;this._activeAnnotation=t},get:function(){return this._activeAnnotation||{close:function(){}}}},{key:"data",get:function(){return this._annotations.map(function(t){return t.data})}}]),e}(c)},{"./../lib/player_component":37,"./../lib/utils":40,"./annotation":25}],27:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this,t)}},{key:"data",get:function(){return{id:this.id,meta:this.meta,body:this.body}}},{key:"HTML",get:function(){return this.$el[0].outerHTML}}],[{key:"newFromData",value:function(t,n,i){var r=this.dataObj(t,i);return new e(r,i.player)}},{key:"dataObj",value:function(t,e){return{meta:Object.assign({ +datetime:c().toISOString()},e.meta),id:u.guid(),body:t}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,moment:22}],28:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;na-10&&"down"==o&&(e.stop(),e.animate({scrollTop:n+40},100),t.preventDefault())}},{key:"sortComments",value:function(){this.comments.sort(function(t,e){return t.timestampe.timestamp?1:0})}},{key:"handleDeleteAnnotationClick",value:function(t){var e=this,n=$("").addClass("vac-delete-confirm").text("CONFIRM");n.on("click.comment",function(){n.off("click.comment"),e.annotation.teardown()}),$(t.target).replaceWith(n)}},{key:"unbindCommentFormEvents",value:function(){this.$newCommentForm&&this.$newCommentForm.off("click.vac-comment")}},{key:"teardown",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.$el&&this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"),this.comments.forEach(function(e){return e.teardown(t)}),t&&(this.comments=[]),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return this.comments.map(function(t){return t.data})}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./comment":27}],29:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this.uiState.adding&&(this.restoreNormalUI(),this.marker.teardown(),this.selectableShape.teardown()),this.uiState=u.cloneObject(m),this.$player.find(".vac-video-cover-canvas").off("mousedown.vac-cursor-tooltip").off("mouseup.vac-cursor-tooltip")),this.$tooltip_=null,this.$UI.controlElements.remove()}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.clear(t);var e=Object.assign({rangeStr:this.marker?u.humanTime(this.marker.range):null,showNav:this.plugin.annotationState.annotations.length>1},this.uiState,{internalCommenting:this.internalCommenting,showControls:this.showControls}),n=this.renderTemplate(p,e);this.$player.append(n),this.playerButton&&this.playerButton.updateNumAnnotations()}},{key:"cancelAddNew",value:function(){(this.uiState.adding||this.uiState.writingComment)&&(this.render(!0),this.marker.teardown(),this.marker=null)}},{key:"startAddNew",value:function(){this.plugin.active||this.plugin.toggleAnnotationMode(),this.player.pause(),this.setAddingUI(),this.uiState.adding=!0,this.render();var t={start:parseInt(this.currentTime,10),stop:parseInt(this.currentTime,10)};this.marker=new c(this.player,t),this.selectableShape=new d(this.player),this.showControls||this.bindCursorTooltip(),this.plugin.fire("enteredAddingAnnotation",{range:t})}},{key:"writeComment",value:function(){this.uiState.writingComment=!0,this.render()}},{key:"saveNew",value:function(){var t=this.$UI.newCommentTextarea.val();if(t){var e=f.newFromData(this.marker.range,this.selectableShape.shape,t,this.plugin);this.plugin.annotationState.addNewAnnotation(e),this.cancelAddNew()}}},{key:"setAddingUI",value:function(){this.plugin.annotationState.enabled=!1,this.disablePlayingAndControl()}},{key:"restoreNormalUI",value:function(){this.plugin.annotationState.enabled=this.plugin.active,this.enablePlayingAndControl(),$(document).off("mousemove.vac-tooltip-"+this.playerId)}},{key:"handleArrowKeys",value:function(t){if(this.plugin.active){var e=t.which;37==e&&this.plugin.annotationState.prevAnnotation(),39==e&&this.plugin.annotationState.nextAnnotation()}}},{key:"bindCursorTooltip",value:function(){var t=this;this.tooltipArea=u.areaOfHiddenEl(this.$tooltip,this.$UI.coverCanvas,this.UI_CLASSES.hidden),this.plugin.setBounds(!1),$(document).on("mousemove.vac-tooltip-"+this.playerId,u.throttle(function(e){if(t.plugin.bounds){var n=e.pageX,i=e.pageY,r=nt.plugin.bounds.right||it.plugin.bounds.bottom,o=!r&&i>=t.plugin.bounds.bottomWithoutControls,a=t.$tooltip.hasClass("vac-marker-hover");if(r)return void t.$tooltip.addClass(t.UI_CLASSES.hidden);var s=n-t.plugin.bounds.left,l=i-t.plugin.bounds.top,u=10,c=t.$player.width(),d=t.$player.height()-t.$UI.controlBar.height(),h=s+t.tooltipArea.width+2*u>=c,f=l+t.tooltipArea.height+2*u>=d,p=h?c-t.tooltipArea.width-u:s+u,m=f?d-t.tooltipArea.height-u:l+u;o&&!a||t.$tooltip.hasClass("vac-cursor-dragging")?t.$tooltip.addClass(t.UI_CLASSES.hidden):t.$tooltip.removeClass(t.UI_CLASSES.hidden),t.$tooltip.css({left:p+"px",top:m+"px"})}}.bind(this),50))}},{key:"$tooltip",get:function(){return this.$tooltip_=this.$tooltip_||this.$player.find(".vac-cursor-tool-tip"),this.$tooltip_}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;nthis.rangePin?this.range={start:this.rangePin,end:n}:this.range={start:n,end:this.rangePin},this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}},{key:"percentValFromXpos",value:function(t){var e=Math.max(0,t-this.$parent.offset().left),n=this.$parent.innerWidth(),i=e/n;return i>1&&(i=1),i<0&&(i=0),i}},{key:"teardown",value:function(){$(document).off("mousemove.vac-dmarker-"+this.playerId+" mouseup.vac-dmarker-"+this.playerId),this.$el.off("mouseenter.vac-cursor-tool-tip"),this.$el.off("mouseleave.vac-cursor-tool-tip"),this.$el.off("mousedown.vac-marker"),this.$el.remove()}},{key:"scrubStart",value:function(t){var e=this.range.start+t;this.currentTime=e,this.range.start=e,this.rangePin=e,this.teardown(),this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}}]),e}(s)},{"./../lib/utils":40,"./marker":31}],31:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:null;i(this,e);var a=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return a.range=n,a.comment=o,a.templateName=c,a.$UI.markerWrap.length||a.$UI.timeline.append(a.renderTemplate(d)),a}return o(e,t),a(e,[{key:"setActive",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$el.addClass(this.UI_CLASSES.active),t&&this.$el.addClass("vac-force-tooltip")}},{key:"deactivate",value:function(){this.$el.removeClass(this.UI_CLASSES.active+" vac-force-tooltip")}},{key:"render",value:function(){this.$UI.timeline.find('[data-marker-id="'+this.componentId+'"]').remove(),this.$el=$(this.renderTemplate(this.templateName,this.markerTemplateData)),this.$UI.markerWrap.append(this.$el),this.bindMarkerEvents()}},{key:"bindMarkerEvents",value:function(){var t=this;this.$el.on("mouseenter.vac-marker",function(){t.$el.addClass("vac-hovering").closest(".vac-marker-wrap").addClass("vac-dim-all")}).on("mouseleave.vac-marker",function(){t.$el.removeClass("vac-hovering").closest(".vac-marker-wrap").removeClass("vac-dim-all")})}},{key:"teardown",value:function(){this.$el.off("mouseenter.vac-marker").off("mouseleave.vac-marker").off("click.vac-marker"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"markerTemplateData",get:function(){var t=this.range.start/this.duration*100,e=this.range.end/this.duration*100-t,n=100-Math.floor(e)||100;return{left:t+"%",width:e+"%",zIndex:n,showTooltip:this.plugin.options.showMarkerShapeAndTooltips,tooltipRight:t>50,tooltipTime:u.humanTime(this.range),tooltipBody:this.comment?this.comment.body:null,rangeShow:!!this.range.end,id:this.componentId}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40}],32:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0?e.removeClass(this.UI_CLASSES.hidden):e.addClass(this.UI_CLASSES.hidden)}},{key:"teardown",value:function(){this.$el.off("click.vac-player-button"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}}]),e}(l)},{"./../lib/player_ui_component":38}],33:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var o=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return o.shape=n,o.$parent=o.$player,o}return o(e,t),a(e,[{key:"render",value:function(){this.shape&&(this.$el&&this.$el.remove(),this.$el=$("
").addClass("vac-shape"),this.setDimsFromShape(),this.$parent.append(this.$el))}},{key:"setDimsFromShape",value:function(){this.$el.css({left:this.shape.x1+"%",top:this.shape.y1+"%",width:this.shape.x2-this.shape.x1+"%",height:this.shape.y2-this.shape.y1+"%"})}}]),e}(s)},{"./../lib/player_ui_component":38}],35:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this._player=null)}},{key:"plugin",get:function(){return this.player.annotationComments()}},{key:"player",get:function(){return this._player}},{key:"duration",get:function(){return this.player.duration()}},{key:"currentTime",get:function(){return this.player.currentTime()},set:function(t){this.player.currentTime(t)}}]),t}()},{}],38:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return this.registerHandlebarsHelpers(),c[t](e)}},{key:"registerHandlebarsHelpers",value:function(){"breaklines"in u.helpers||u.registerHelper("breaklines",function(t){return t=u.Utils.escapeExpression(t),t=t.replace(/(\r\n|\n|\r)/gm,"
"),new u.SafeString(t)})}},{key:"teardown",value:function(){this.$el&&this.$el.remove(),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"$UI",get:function(){return Object.freeze({commentsContainer:this.$player.find(".vac-comments-container"),controlElements:this.$player.find(".vac-control"),newCommentTextarea:this.$player.find(".vac-video-write-new textarea"),timeline:this.$player.find(".vjs-progress-control"),markerCursorHelpText:this.$player.find(".vac-cursor-help-text"),controlBar:this.$player.find(".vjs-control-bar"),markerWrap:this.$player.find(".vac-marker-wrap"),coverCanvas:this.$player.find(".vac-video-cover-canvas")})}},{key:"UI_CLASSES",get:function(){return Object.freeze({hidden:"vac-hidden",active:"vac-active"})}},{key:"$player",get:function(){return $(this.player.el())}},{key:"playerId",get:function(){return this.$player.attr("id")}},{key:"componentId",get:function(){return this.cid_=this.cid_||d.guid(),this.cid_}}]),e}(l)},{"./../compiled/templates":24,"./../lib/utils":40,"./player_component":37,"handlebars/runtime":20}],39:[function(t,e,n){"use strict";t("ie-array-find-polyfill"),t("es6-object-assign").polyfill(),function(){if("undefined"==typeof Object.setPrototypeOf&&"function"==typeof Object.getOwnPropertyNames){var t=function(t,e){return function(){return e.apply(this,arguments)}},e=function(t,e,n){if(!n){var i=t.__proto__[e]; +n={get:function(){return t["__"+e]||i},set:function(n){t["__"+e]=n}}}Object.defineProperty(t,e,{get:n.get?n.get.bind(t):void 0,set:n.set?n.set.bind(t):void 0,configurable:!0})},n=function r(n,o){var a,s=Object.getOwnPropertyNames(o);n.__proto__=o;for(var l=0,u=s.length;le?(a&&(clearTimeout(a),a=null),s=u,o=t.apply(i,r),a||(i=r=null)):a||n.trailing===!1||(a=setTimeout(l,c)),o}},parseIntObj:function(t){return Object.keys(t).forEach(function(e){parseInt(t[e])&&(t[e]=parseInt(t[e]))}),t},humanTime:function(t){function e(t){var e=Math.floor(t/60),n=String(t%60);return e+":"+(1==n.length?"0":"")+n}var n=[e(t.start)];return t.end&&n.push(e(t.end)),n.join("-")},guid:function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},areaOfHiddenEl:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=t.clone(),r={};return i.css({visibility:"hidden",display:"inline-block"}),i.removeClass(n),e.append(i),r.width=i.outerWidth(),r.height=i.outerHeight(),i.remove(),r},isWithinRange:function(t,e,n){return e=e||t+1,n>=t&&n<=e}}},{}]},{},[23])(23)}); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 1f22b0d..c575bb7 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,201 +1,173 @@ -const gulp = require("gulp"), - sourcemaps = require("gulp-sourcemaps"), - source = require("vinyl-source-stream"), - buffer = require("vinyl-buffer"), - browserify = require("browserify"), - watchify = require("watchify"), - insert = require("gulp-insert"), - babelify = require("babelify"), - stripComments = require("gulp-strip-comments"), - rename = require("gulp-rename"), - webserver = require("gulp-webserver"), - uglify = require("gulp-uglify"), - gutil = require("gulp-util"), - sass = require("gulp-sass"), - debug = require("gulp-debug"), - pump = require("pump"), - mocha = require("gulp-mocha"), - jshint = require("gulp-jshint"), - stylish = require("jshint-stylish"), - handlebars = require("gulp-handlebars"), - wrap = require("gulp-wrap"), - concat = require("gulp-concat"), - declare = require("gulp-declare"), - autoprefixer = require("gulp-autoprefixer"); - -const FILENAME = "videojs-annotation-comments.js"; -const CJSFILENAME = "videojs-annotation-comments.cjs.js"; -const PACKAGE = require("./package.json"); +const gulp = require('gulp'), + sourcemaps = require('gulp-sourcemaps'), + source = require('vinyl-source-stream'), + buffer = require('vinyl-buffer'), + browserify = require('browserify'), + watchify = require('watchify'), + insert = require('gulp-insert'), + babelify = require('babelify'), + stripComments = require('gulp-strip-comments'), + rename = require('gulp-rename'), + webserver = require('gulp-webserver'), + uglify = require('gulp-uglify'), + gutil = require('gulp-util'), + sass = require('gulp-sass'), + debug = require('gulp-debug'), + pump = require('pump'), + mocha = require('gulp-mocha'), + jshint = require('gulp-jshint'), + stylish = require('jshint-stylish'), + handlebars = require('gulp-handlebars'), + wrap = require('gulp-wrap'), + concat = require('gulp-concat'), + declare = require('gulp-declare'), + autoprefixer = require('gulp-autoprefixer'); + +const FILENAME = "videojs-annotation-comments.js", + CJSFILENAME = "videojs-annotation-comments.cjs.js" + PACKAGE = require('./package.json'); //compilation function for browserify/bundler/transpilation -function compile(watch, cb) { - var bundlerDefault = { - entry: "./src/js/index.js", - browserifyOptions: { debug: true }, - transformOptions: {}, - filename: FILENAME - }; - - var bundlerCjs = { - entry: "./src/js/annotation_comments.js", - browserifyOptions: { - debug: true, - standalone: "AnnotationComments" - }, - transformOptions: { - presets: ["es2015"], - plugins: ["babel-plugin-transform-es2015-modules-simple-commonjs"] - }, - filename: CJSFILENAME - }; - - function buildStream(bundler) { - return browserify(bundler.entry, bundler.browserifyOptions).transform( - babelify, - bundler.transformOptions - ); - } - - function rebundle(bundlers, watch) { - for (b of bundlers) { - var browserifyStream = watch ? watchify(buildStream(b)) : buildStream(b); - - browserifyStream - .bundle() - .on("log", gutil.log) - .on("error", gutil.log.bind(gutil.colors.red, "Browserify Error")) - .pipe(source("src/js/index.js")) - .pipe(buffer()) - .pipe(rename(b.filename)) - .pipe(sourcemaps.init({ loadMaps: true })) - .pipe(sourcemaps.write("./")) - .pipe(gulp.dest("./build")); +function compile(watch, cb){ + var bundler = { + processor: watchify( + browserify('./src/js/index.js', { debug: true }) + .transform(babelify) + ), + filename: FILENAME + }; + + var bundlerCjs = { + processor: watchify( + browserify('./src/js/annotation_comments.js', { debug: true, standalone: 'AnnotationComments' }) + .transform( + babelify, + { + presets: ["es2015"], + plugins: ["babel-plugin-transform-es2015-modules-simple-commonjs"] + } + ) + ), + filename: CJSFILENAME + }; + + function rebundle() { + for (b of [bundler, bundlerCjs]) { + b.processor.bundle() + .on('log', gutil.log) + .on('error', gutil.log.bind(gutil.colors.red, 'Browserify Error')) + .pipe(source('src/js/index.js')) + .pipe(rename(b.filename)) + .pipe(buffer()) + .pipe(sourcemaps.init({ loadMaps: true })) + .pipe(sourcemaps.write('./')) + .pipe(gulp.dest('./build')); + } } - } - - if (watch) { - rebundle([bundlerDefault], true); - buildStream(bundlerDefault).on("update", function() { - console.log("-> bundling..."); - rebundle([bundlerDefault]); - }); - } else { - rebundle([bundlerDefault, bundlerCjs], false); - cb(); - } -} -gulp.task("dev_webserver", () => { - console.log(":::: > Test page at http://localhost:3004/test.html"); - return gulp - .src(["build", "test", "node_modules"]) - .pipe(webserver({ port: 3004 })); -}); + if (watch) { + rebundle(); + bundler.processor.on('update', function() { + console.log('-> bundling...'); + rebundle(); + }); + } else { + rebundle(); + cb(); + } +} -gulp.task("sass", () => { - return gulp - .src("src/css/*.scss") - .pipe(sass().on("error", sass.logError)) - .pipe( - autoprefixer({ - browsers: ["defaults", "not ie <= 9"], - cascade: false - }) - ) - .pipe(sourcemaps.write(".")) - .pipe(gulp.dest("./build/css")) - .pipe(gulp.dest("./docs/build/css")); +// Get bundler from bundlify +function getBundler(path, options){ + var bundler = browserify(path, { debug: options.debug, cache: {}, packageCache: {} }); + bundler.transform(babelify, {presets: ["es2015"]}) + bundler.on('log', gutil.log); + bundler.on('error', gutil.log.bind(gutil.colors.red, 'Browserify Error')); + return bundler; +}; + +gulp.task('dev_webserver', () => { + console.log(":::: > Test page at http://localhost:3004/test.html"); + return gulp.src(['build','test','node_modules']) + .pipe(webserver({ port: 3004 })); }); -gulp.task("templates:watch", () => { - gulp.watch("./src/templates/**/*.hbs", ["templates"]); +gulp.task('sass', () => { + return gulp.src('src/css/*.scss') + .pipe(sass().on('error', sass.logError)) + .pipe(autoprefixer({ + browsers: ['defaults','not ie <= 9'], + cascade: false + })) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest('./build/css')) + .pipe(gulp.dest('./docs/build/css')); }); -gulp.task("sass:watch", () => { - gulp.watch("./src/css/**/*.scss", ["sass"]); +gulp.task('templates:watch', () => { + gulp.watch('./src/templates/**/*.hbs', ['templates']); }); -gulp.task("transpile:watch", () => { - gulp.watch("./src/js/**/*", ["transpile"]); +gulp.task('sass:watch', () => { + gulp.watch('./src/css/**/*.scss', ['sass']); }); -gulp.task("templates", () => { - gulp - .src("./src/templates/**/*.hbs") - .pipe( - handlebars({ - handlebars: require("handlebars") - }) - ) - .pipe(wrap("Handlebars.template(<%= contents %>)")) - .pipe( - declare({ - root: "exports", - noRedeclare: true, // Avoid duplicate declarations - processName: function(filePath) { - // Allow nesting based on path using gulp-declare's processNameByPath() - // You can remove this option completely if you aren't using nested folders - // Drop the templates/ folder from the namespace path by removing it from the filePath - return declare.processNameByPath( - filePath.replace("src/templates/", "") - ); - } - }) - ) - .pipe(concat("templates.js")) - .pipe( - wrap('var Handlebars = require("handlebars/runtime");\n <%= contents %>') - ) - .pipe(gulp.dest("./src/js/compiled/")); +gulp.task('templates',() => { + gulp.src('./src/templates/**/*.hbs') + .pipe(handlebars({ + handlebars: require('handlebars') + })) + .pipe(wrap('Handlebars.template(<%= contents %>)')) + .pipe(declare({ + root: 'exports', + noRedeclare: true, // Avoid duplicate declarations + processName: function(filePath) { + // Allow nesting based on path using gulp-declare's processNameByPath() + // You can remove this option completely if you aren't using nested folders + // Drop the templates/ folder from the namespace path by removing it from the filePath + return declare.processNameByPath(filePath.replace('src/templates/', '')); + } + })) + .pipe(concat('templates.js')) + .pipe(wrap('var Handlebars = require("handlebars/runtime");\n <%= contents %>')) + .pipe(gulp.dest('./src/js/compiled/')); }); -gulp.task("build", ["templates", "sass", "transpile"], cb => { - pump([ - gulp.src("build/videojs-annotation-comments.js"), - rename(FILENAME.replace(".js", ".min.js")), - stripComments(), - uglify(), - gulp.dest("./build") - ]); - - pump( - [ - gulp.src("build/videojs-annotation-comments.cjs.js"), - rename(CJSFILENAME.replace(".js", ".min.js")), - stripComments(), - uglify(), - gulp.dest("./build"), - gulp.dest("./docs/build") - ], - cb - ); +gulp.task('build', ['templates', 'sass', 'transpile'], (cb) => { + pump([ + gulp.src('build/videojs-annotation-comments.js'), + rename(FILENAME.replace(".js",".min.js")), + stripComments(), + uglify(), + gulp.dest('./build') + ]); + + pump([ + gulp.src('build/videojs-annotation-comments.cjs.js'), + rename(CJSFILENAME.replace(".js",".min.js")), + stripComments(), + uglify(), + gulp.dest('./build'), + gulp.dest('./docs/build') + ], cb); }); -gulp.task("test", () => { - gulp.src(["test/mocha/components/*.js"], { read: false }).pipe(mocha()); +gulp.task('test', () => { + gulp.src(['test/mocha/components/*.js'], { read: false }) + .pipe(mocha({ compilers: ['js:babel-core/register'] })); }); -gulp.task("tdd", function() { - gulp.watch( - ["src/**/*.js", "src/**/.hbs", "test/mocha/components/*.js"], - ["test"] - ); +gulp.task('tdd', function() { + gulp.watch(['src/**/*.js', 'src/**/.hbs', 'test/mocha/components/*.js'], ['test']); }); -gulp.task("lint", function() { - return gulp - .src("./src/*/*.js") - .pipe(jshint(".jshintrc")) +gulp.task('lint', function() { + return gulp.src('./src/*/*.js') + .pipe(jshint('.jshintrc')) .pipe(jshint.reporter(stylish)); }); -gulp.task("transpile", cb => compile(false, cb)); -gulp.task("bundle_watch", cb => compile(true, cb)); -gulp.task("watch", [ - "dev_webserver", - "templates:watch", - "sass:watch", - "transpile:watch", - "tdd" -]); -gulp.task("default", ["watch"]); +gulp.task('transpile', (cb) => compile(false, cb) ); +gulp.task('bundle_watch', (cb) => compile(true, cb) ); +gulp.task('watch', ['bundle_watch', 'dev_webserver', 'sass', 'sass:watch', 'templates', 'templates:watch', 'tdd']); +gulp.task('default', ['watch']); diff --git a/license.md b/license.md new file mode 100644 index 0000000..4249b7d --- /dev/null +++ b/license.md @@ -0,0 +1,13 @@ +Copyright Contently, Inc. 2017 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b2c5b09 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,16798 @@ +{ + "name": "@contently/videojs-annotation-comments", + "version": "1.1.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz", + "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=", + "dev": true, + "requires": { + "acorn": "^5.0.3", + "css": "^2.2.1", + "normalize-path": "^2.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.3" + }, + "dependencies": { + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@octokit/endpoint": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.1.1.tgz", + "integrity": "sha512-KPkoTvKwCTetu/UqonLs1pfwFO5HAqTv/Ksp9y4NAg//ZgUCpvJsT4Hrst85uEzJvkB8+LxKyR4Bfv2X8O4cmQ==", + "dev": true, + "requires": { + "deepmerge": "3.0.0", + "is-plain-object": "^2.0.4", + "universal-user-agent": "^2.0.1", + "url-template": "^2.0.8" + } + }, + "@octokit/request": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.2.1.tgz", + "integrity": "sha512-enwbVOl3vWWIUuEj0LJRq+mxWNyv95fa13GJitz7qGt/ycYCwtSoVssW3pCqvxS4GlJfHfO2OA+8czIcEF522A==", + "dev": true, + "requires": { + "@octokit/endpoint": "^3.1.1", + "is-plain-object": "^2.0.4", + "node-fetch": "^2.3.0", + "universal-user-agent": "^2.0.1" + } + }, + "@octokit/rest": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.10.0.tgz", + "integrity": "sha512-RoMHiaiwnYSYyUPr3WGXlhefTMp1r+Mu0Pma2OhqZILxKtOtjW6ZviTvLoG+SR3EEefLIpzufF9B00R+GQG93A==", + "dev": true, + "requires": { + "@octokit/request": "2.2.1", + "before-after-hook": "^1.2.0", + "btoa-lite": "^1.0.0", + "lodash.get": "^4.4.2", + "lodash.pick": "^4.4.0", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "octokit-pagination-methods": "^1.1.0", + "universal-user-agent": "^2.0.0", + "url-template": "^2.0.8" + } + }, + "@semantic-release/changelog": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-3.0.2.tgz", + "integrity": "sha512-pDUaBNAuPAqQ+ArHwvR160RG2LbfyIVz9EJXgxH0V547rlx/hCs0Sp7L4Rtzi5Z+d6CHcv9g2ynxplE1xAzp2g==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.1.0", + "aggregate-error": "^2.0.0", + "fs-extra": "^7.0.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "@semantic-release/commit-analyzer": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.1.0.tgz", + "integrity": "sha512-2lb+t6muGenI86mYGpZYOgITx9L3oZYF697tJoqXeQEk0uw0fm+OkkOuDTBA3Oax9ftoNIrCKv9bwgYvxrbM6w==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "import-from": "^2.1.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@semantic-release/error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", + "dev": true + }, + "@semantic-release/github": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.2.9.tgz", + "integrity": "sha512-6d0U2ySf3/dvGZTdFu4OM82HMmnSpCKfqkD9zuwc7/H5cleY7moxYMzRTRgeQKP/LskHdFrNjED/x27vKvc5nw==", + "dev": true, + "requires": { + "@octokit/rest": "^16.0.1", + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^2.0.0", + "bottleneck": "^2.0.1", + "debug": "^4.0.0", + "dir-glob": "^2.0.0", + "fs-extra": "^7.0.0", + "globby": "^9.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "issue-parser": "^3.0.0", + "lodash": "^4.17.4", + "mime": "^2.0.3", + "p-filter": "^1.0.0", + "p-retry": "^3.0.0", + "parse-github-url": "^1.0.1", + "url-join": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@semantic-release/npm": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.1.3.tgz", + "integrity": "sha512-DpHWUMuBVuHTLuAwT8xAfbBdf62OrghDxdBiVA2Cp52WblZihPMTBz/WtCJYWlvcdv1e1K9aAoSNoVImHfAU3w==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^2.0.0", + "execa": "^1.0.0", + "fs-extra": "^7.0.0", + "lodash": "^4.17.4", + "nerf-dart": "^1.0.0", + "normalize-url": "^4.0.0", + "npm": "^6.3.0", + "rc": "^1.2.8", + "read-pkg": "^4.0.0", + "registry-auth-token": "^3.3.1" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "@semantic-release/release-notes-generator": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.1.4.tgz", + "integrity": "sha512-pWPouZujddgb6t61t9iA9G3yIfp3TeQ7bPbV1ixYSeP6L7gI1+Du82fY/OHfEwyifpymLUQW0XnIKgKct5IMMw==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^4.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "get-stream": "^4.0.0", + "import-from": "^2.1.0", + "into-stream": "^4.0.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "acorn-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.3.0.tgz", + "integrity": "sha512-efP54n3d1aLfjL2UMdaXa6DsswwzJeI5rqhbFvXMrKiJ6eJFpf+7R0zN7t8IC+XKn2YOAFAv6xbBNgHUkoHWLw==", + "dev": true, + "requires": { + "acorn": "^5.4.1", + "xtend": "^4.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + } + } + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "aggregate-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-2.0.0.tgz", + "integrity": "sha512-xA1VQPApQdDehIIpS3gBFkMGDRb9pDYwZPVUOoX8A0lU3GB0mjiACqsa9ByBurU53erhjamf5I4VNRitCfXhjg==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^3.0.0" + }, + "dependencies": { + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + } + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + } + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-modules-simple-commonjs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-simple-commonjs/-/babel-plugin-transform-es2015-modules-simple-commonjs-0.3.0.tgz", + "integrity": "sha1-wV71BpZ8Hui3KQzt7Nukr2WB7h4=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.8.0", + "babel-runtime": "^6.3.19", + "babel-template": "^6.3.13", + "better-log": "^1.3.1" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "dev": true, + "requires": { + "regenerator-transform": "0.9.11" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-es2015-script": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-es2015-script/-/babel-preset-es2015-script-1.1.0.tgz", + "integrity": "sha1-c32jmRPctFAO5NsTLELNPPcQZOU=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.3.13", + "babel-plugin-transform-es2015-arrow-functions": "^6.3.13", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.3.13", + "babel-plugin-transform-es2015-block-scoping": "^6.14.0", + "babel-plugin-transform-es2015-classes": "^6.14.0", + "babel-plugin-transform-es2015-computed-properties": "^6.3.13", + "babel-plugin-transform-es2015-destructuring": "^6.9.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.6.0", + "babel-plugin-transform-es2015-for-of": "^6.6.0", + "babel-plugin-transform-es2015-function-name": "^6.9.0", + "babel-plugin-transform-es2015-literals": "^6.3.13", + "babel-plugin-transform-es2015-object-super": "^6.3.13", + "babel-plugin-transform-es2015-parameters": "^6.9.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.3.13", + "babel-plugin-transform-es2015-spread": "^6.3.13", + "babel-plugin-transform-es2015-sticky-regex": "^6.3.13", + "babel-plugin-transform-es2015-template-literals": "^6.6.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.6.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.3.13", + "babel-plugin-transform-regenerator": "^6.14.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^1.0.1" + } + }, + "babelify": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", + "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", + "dev": true, + "requires": { + "babel-core": "^6.0.14", + "object-assign": "^4.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "before-after-hook": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.2.tgz", + "integrity": "sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w==", + "dev": true + }, + "better-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/better-log/-/better-log-1.3.3.tgz", + "integrity": "sha1-IZocA4Oo+cRBaJfto6z5tNaZDo8=", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "binaryextensions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", + "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", + "dev": true + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.8.4.tgz", + "integrity": "sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg=", + "dev": true, + "requires": { + "bytes": "1.0.0", + "depd": "0.4.5", + "iconv-lite": "0.4.4", + "media-typer": "0.3.0", + "on-finished": "2.1.0", + "qs": "2.2.4", + "raw-body": "1.3.0", + "type-is": "~1.5.1" + }, + "dependencies": { + "depd": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.5.tgz", + "integrity": "sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E=", + "dev": true + }, + "ee-first": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.5.tgz", + "integrity": "sha1-jJshKJjYzZ8alDZlDOe+ICyen/A=", + "dev": true + }, + "on-finished": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.0.tgz", + "integrity": "sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0=", + "dev": true, + "requires": { + "ee-first": "1.0.5" + } + }, + "qs": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.4.tgz", + "integrity": "sha1-Lp+800tUDjQhySTs0B6QqpdTGcg=", + "dev": true + } + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "bottleneck": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.15.3.tgz", + "integrity": "sha512-2sHF/gMwTshF//gQninQBEHDNBXuvDLfSczPHpDc2U/9SC+P/97Zt01hy7UTEV0atSZ9BQBIHsdju/6wn7m4+w==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, + "buffer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", + "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "bufferstreams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", + "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=", + "dev": true, + "requires": { + "readable-stream": "^1.0.33" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cached-path-relative": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", + "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", + "dev": true + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000832", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000832.tgz", + "integrity": "sha512-WMC2GiGTPxGywFL70h+CnP7GAYo6LM6JSI1sF13vAZfXCzOeunHzl20DpfbDGMdvtT2wpqvabY96MHEp/la+BQ==", + "dev": true + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.0.0.tgz", + "integrity": "sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A==", + "dev": true + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^1.0.6", + "through2": "^2.0.1" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + } + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + } + } + }, + "connect-livereload": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.4.1.tgz", + "integrity": "sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "conventional-changelog-angular": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.2.tgz", + "integrity": "sha512-yx7m7lVrXmt4nKWQgWZqxSALEiAKZhOAcbxdUaU9575mB0CzXVbgrgpfSnSP7OqWDUTYGD0YVJ0MSRdyOPgAwA==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-writer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.2.tgz", + "integrity": "sha512-d8/FQY/fix2xXEBUhOo8u3DCbyEw3UOQgYHxLsPDw+wHUDma/GQGAGsGtoH876WyNs32fViHmTOUrgRKVLvBug==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^2.0.1", + "dateformat": "^3.0.0", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^5.5.0", + "split": "^1.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz", + "integrity": "sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A==", + "dev": true, + "requires": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz", + "integrity": "sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-props": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-1.6.0.tgz", + "integrity": "sha1-8DJLvumXcRAeezraES8xPDk9uO0=", + "dev": true, + "requires": { + "each-props": "^1.2.1", + "is-plain-object": "^2.0.1" + } + }, + "core-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", + "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "dev": true, + "optional": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "deap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz", + "integrity": "sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "dev": true, + "requires": { + "debug": "3.X", + "memoizee": "0.4.X", + "object-assign": "4.X" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decomment": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.1.tgz", + "integrity": "sha512-9vwabbCoArDvgbZnFqWcGPVvSIIvWTNu1yaAc3Tg3q5pOzORo6nANO3TPwBuiKwN7stMDZJgNnR6USU3H6EQrQ==", + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deepmerge": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.0.0.tgz", + "integrity": "sha512-a8z8bkgHsAML+uHLqmMS83HHlpy3PvZOOuiTQqaa3wu8ZVg3h0hqHk6aCsGdOnZV2XMM/FRimNGjUh0KCcmHBw==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "^0.1.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "detective": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.1.tgz", + "integrity": "sha512-UN6X6XwRjllabfRhBdkVSo63uurJ8nSvMGrwl94EYVz6g+exhTV+yVSYk5VC/xl3MBFBTtC0J20uFKce4Brrng==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "each-props": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz", + "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.44", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.44.tgz", + "integrity": "sha1-72sVCmDVIwgjiMra2ICF7NL9RoQ=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "env-ci": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.2.0.tgz", + "integrity": "sha512-TFjNiDlXrL8/pfHswdvJGEZzJcq3aBPb8Eka83hlGLwuNw9F9BC9S9ETlkfkItLRT9k5JgpGgeP+rL6/3cEbcw==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "java-properties": "^0.2.9" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es5-shim": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.10.tgz", + "integrity": "sha512-vmryBdqKRO8Ei9LJ4yyEk/EOmAOGIagcHDYPpTAi6pot4IMHS1AC2q5cTKPmydpijg2iX8DVmCuqgrNxIWj8Yg==", + "dev": true + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "dev": true + } + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", + "integrity": "sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.2", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.6.3.tgz", + "integrity": "sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + }, + "dependencies": { + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "optional": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "optional": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "dev": true, + "optional": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "faye-websocket": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz", + "integrity": "sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=", + "dev": true, + "requires": { + "websocket-driver": ">=0.3.6" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "optional": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + } + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "find-versions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", + "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", + "dev": true, + "requires": { + "array-uniq": "^2.0.0", + "semver-regex": "^2.0.0" + }, + "dependencies": { + "array-uniq": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", + "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", + "dev": true + } + } + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "^0.1.0", + "is-glob": "^2.0.1", + "micromatch": "^2.3.7", + "resolve-dir": "^0.1.0" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "for-each": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", + "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", + "dev": true, + "requires": { + "is-function": "~1.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + } + } + }, + "fs-readfile-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz", + "integrity": "sha1-gAI4I5gfn//+AWCei+Zo9prknnA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", + "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.9.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minipass": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz", + "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", + "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "tar": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "~0.1.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", + "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "dev": true, + "requires": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + }, + "dependencies": { + "split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", + "dev": true, + "requires": { + "through2": "~2.0.0" + } + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "^0.5.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "^0.1.1" + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "dev": true + } + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.0.0.tgz", + "integrity": "sha512-q0qiO/p1w/yJ0hk8V9x1UXlgsXUxlGd0AHUOXZVXBO6aznDtpx7M8D1kBrCAItoPm+4l8r6ATXV1JpjY2SBQOw==", + "dev": true, + "requires": { + "array-union": "^1.0.2", + "dir-glob": "^2.2.1", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "^1.1.0" + } + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "gulp-autoprefixer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-4.1.0.tgz", + "integrity": "sha1-Bkr3PMAsrayP800L+T/9+5TqEqo=", + "dev": true, + "requires": { + "autoprefixer": "^7.0.0", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2", + "postcss": "^6.0.1", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" + } + } + } + }, + "gulp-babel": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz", + "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==", + "dev": true, + "requires": { + "babel-core": "^6.23.1", + "object-assign": "^4.0.1", + "plugin-error": "^1.0.1", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + } + } + }, + "gulp-cli": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-1.4.0.tgz", + "integrity": "sha1-b1u+LNC9tISdEs+eEkalhh+LT4g=", + "dev": true, + "requires": { + "archy": "^1.0.0", + "chalk": "^1.1.0", + "copy-props": "^1.4.1", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.3.0", + "lodash.isfunction": "^3.0.8", + "lodash.isplainobject": "^4.0.4", + "lodash.sortby": "^4.5.0", + "matchdep": "^1.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "semver-greatest-satisfied-range": "^1.0.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.9", + "wreck": "^6.3.0", + "yargs": "^3.28.0" + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "gulp-debug": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gulp-debug/-/gulp-debug-3.2.0.tgz", + "integrity": "sha512-2LZzP+ydczqz1rhqq/NYxvVvYTmOa0IgBl2B1sQTdkQgku9ayOUM/KHuGPjF4QA5aO1VcG+Sskw7iCcRUqHKkA==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "fancy-log": "^1.3.2", + "plur": "^2.0.0", + "stringify-object": "^3.0.0", + "through2": "^2.0.0", + "tildify": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "gulp-declare": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/gulp-declare/-/gulp-declare-0.3.0.tgz", + "integrity": "sha1-hoMPxvqojgY4IWLIZkuOlJV6/Nk=", + "dev": true, + "requires": { + "nsdeclare": "^0.1.0", + "vinyl-map": "^1.0.1", + "xtend": "^4.0.0" + } + }, + "gulp-delete-lines": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/gulp-delete-lines/-/gulp-delete-lines-0.0.7.tgz", + "integrity": "sha1-USFDQpznrn8uCoown3oPYeoGlVU=", + "dev": true, + "requires": { + "event-stream": "~3.1.0", + "gulp-util": ">=2.2.0" + } + }, + "gulp-handlebars": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-handlebars/-/gulp-handlebars-4.0.0.tgz", + "integrity": "sha1-tf9GpBl+fMyfJZpQkqLCn0eVOyk=", + "dev": true, + "requires": { + "gulp-util": "^3.0.4", + "handlebars": "^3.0.0", + "through2": "^0.6.3" + }, + "dependencies": { + "handlebars": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.6.tgz", + "integrity": "sha512-LxzdOvkYFsdL6ZT92igXthJIZLYKBSowtrM3oxfMdOwjv0dRWk6EK4PygNgXc0xwjH38BWMCSnktrOpKbec+Qw==", + "dev": true, + "requires": { + "optimist": "^0.6.1", + "source-map": "^0.1.40", + "uglify-js": "^2.6" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "gulp-insert": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/gulp-insert/-/gulp-insert-0.5.0.tgz", + "integrity": "sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI=", + "dev": true, + "requires": { + "readable-stream": "^1.0.26-4", + "streamqueue": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "gulp-jshint": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-2.1.0.tgz", + "integrity": "sha512-sP3NK8Y/1e58O0PH9t6s7DAr/lKDSUbIY207oWSeufM6/VclB7jJrIBcPCsyhrFTCDUl9DauePbt6VqP2vPM5w==", + "dev": true, + "requires": { + "lodash": "^4.12.0", + "minimatch": "^3.0.3", + "plugin-error": "^0.1.2", + "rcloader": "^0.2.2", + "through2": "^2.0.0" + } + }, + "gulp-mocha": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-4.3.1.tgz", + "integrity": "sha1-d5ULQ7z/gWWVdnwHNOD9p9Fz3Nk=", + "dev": true, + "requires": { + "dargs": "^5.1.0", + "execa": "^0.6.0", + "gulp-util": "^3.0.0", + "mocha": "^3.0.0", + "npm-run-path": "^2.0.2", + "through2": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "gulp-rename": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", + "dev": true + }, + "gulp-replace": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", + "integrity": "sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=", + "dev": true, + "requires": { + "istextorbinary": "1.0.2", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + } + }, + "gulp-sass": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-3.2.1.tgz", + "integrity": "sha512-UATbRpSDsyXCnpYSPBUEvdvtSEzksJs7/oQ0CujIpzKqKrO6vlnYwhX2UTsGrf4rNLwqlSSaM271It0uHYvJ3Q==", + "dev": true, + "requires": { + "gulp-util": "^3.0", + "lodash.clonedeep": "^4.3.2", + "node-sass": "^4.8.3", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-sourcemaps": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz", + "integrity": "sha1-y7IAhFCxvM5s0jv5gze+dRv24wo=", + "dev": true, + "requires": { + "@gulp-sourcemaps/identity-map": "1.X", + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "5.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "1.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom-string": "1.X", + "through2": "2.X" + }, + "dependencies": { + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "gulp-strip-comments": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/gulp-strip-comments/-/gulp-strip-comments-2.5.2.tgz", + "integrity": "sha512-lb1bW7rsPWDD8f4ZPSguDvmCdjKmjr5HR4yZb9ros3sLl5AfW7oUj8KzY9/VRisT7dG8dL7hVHzNpQEVxfwZGQ==", + "dev": true, + "requires": { + "decomment": "^0.9.0", + "plugin-error": "^0.1.2", + "through2": "^2.0.3" + } + }, + "gulp-uglify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", + "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", + "dev": true, + "requires": { + "deap": "^1.0.0", + "fancy-log": "^1.0.0", + "gulp-util": "^3.0.0", + "isobject": "^2.0.0", + "through2": "^2.0.0", + "uglify-js": "2.6.4", + "uglify-save-license": "^0.4.1", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulp-webserver": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/gulp-webserver/-/gulp-webserver-0.9.1.tgz", + "integrity": "sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ=", + "dev": true, + "requires": { + "connect": "^3.0.1", + "connect-livereload": "^0.4.0", + "gulp-util": "^2.2.19", + "isarray": "0.0.1", + "node.extend": "^1.0.10", + "open": "^0.0.5", + "proxy-middleware": "^0.5.0", + "serve-index": "^1.1.4", + "serve-static": "^1.3.0", + "through2": "^0.5.1", + "tiny-lr": "0.1.4", + "watch": "^0.11.0" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "requires": { + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" + } + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "~0.0.1" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "gulp-wrap": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/gulp-wrap/-/gulp-wrap-0.13.0.tgz", + "integrity": "sha1-kPsLSieiZkM4Mv98YSLbXB7olMY=", + "dev": true, + "requires": { + "consolidate": "^0.14.1", + "es6-promise": "^3.1.2", + "fs-readfile-promise": "^2.0.1", + "gulp-util": "^3.0.3", + "js-yaml": "^3.2.6", + "lodash": "^4.11.1", + "node.extend": "^1.1.2", + "through2": "^2.0.1", + "tryit": "^1.0.1", + "vinyl-bufferstream": "^1.0.1" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "^1.0.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "optional": true, + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hook-std": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.2.0.tgz", + "integrity": "sha512-yntre2dbOAjgQ5yoRykyON0D9T96BfshR8IuiL/r3celeHD8I/76w4qo8m3z99houR4Z678jakV3uXrQdSvW/w==", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz", + "integrity": "sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g=", + "dev": true + }, + "ie-array-find-polyfill": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ie-array-find-polyfill/-/ie-array-find-polyfill-1.1.0.tgz", + "integrity": "sha1-UHjlM/Amgx2iK9dHZRPZRg1loUI=", + "dev": true + }, + "ieee754": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "individual": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz", + "integrity": "sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.6.tgz", + "integrity": "sha512-R3sidKJr3SsggqQQ5cEwQb3pWG8RNx0UnpyeiOSR6jorRIeAOzH2gkTWnNdMnyRiVbjrG047K7UCtlMkQ1Mo9w==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "lexical-scope": "^1.2.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "into-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-4.0.0.tgz", + "integrity": "sha512-i29KNyE5r0Y/UQzcQ0IbZO1MYJ53Jn0EcFRZPj5FzWKYH17kDFEOwuA+3jroymOI06SW1dEDnly9A1CAreC5dg==", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^2.0.0" + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "^0.1.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "issue-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.1.tgz", + "integrity": "sha512-5wdT3EE8Kq38x/hJD8QZCJ9scGoOZ5QnzwXyClkviSWTS+xOCE6hJ0qco3H5n5jCsFqpbofZCcMWqlXJzF72VQ==", + "dev": true, + "requires": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + } + }, + "istextorbinary": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", + "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", + "dev": true, + "requires": { + "binaryextensions": "~1.0.0", + "textextensions": "~1.0.0" + } + }, + "java-properties": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", + "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", + "dev": true + }, + "js-base64": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "jshint": { + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz", + "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==", + "dev": true, + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.10", + "minimatch": "~3.0.2", + "phantom": "~4.0.1", + "phantomjs-prebuilt": "~2.1.7", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x", + "unicode-5.2.0": "^0.7.5" + } + }, + "jshint-stylish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.0.1.tgz", + "integrity": "sha1-hFvzg4blVVH/n4QMx3Jfeoi1stQ=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "log-symbols": "^1.0.0", + "plur": "^1.0.0", + "string-length": "^1.0.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", + "dev": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.6" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + } + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true, + "optional": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.9" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + } + } + }, + "labeled-stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", + "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "isarray": "^2.0.4", + "stream-splicer": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", + "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", + "dev": true + } + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "dev": true, + "requires": { + "astw": "^2.0.0" + } + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^0.4.2", + "fined": "^1.0.1", + "flagged-respawn": "^0.3.2", + "lodash.isplainobject": "^4.0.4", + "lodash.isstring": "^4.0.1", + "lodash.mapvalues": "^4.4.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.4.1" + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "macos-release": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz", + "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.0.tgz", + "integrity": "sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g==", + "dev": true + }, + "marked-terminal": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.2.0.tgz", + "integrity": "sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.1.0", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "cli-table": "^0.3.1", + "node-emoji": "^1.4.1", + "supports-hyperlinks": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "matchdep": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-1.0.1.tgz", + "integrity": "sha1-pXozgESR+64girqPaDgEN6vC3KU=", + "dev": true, + "requires": { + "findup-sync": "~0.3.0", + "micromatch": "^2.3.7", + "resolve": "~1.1.6", + "stack-trace": "0.0.9" + }, + "dependencies": { + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "~5.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + }, + "dependencies": { + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + } + } + }, + "memoizee": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz", + "integrity": "sha512-sprBu6nwxBWBvBOh5v2jcsGqiGLlL2xr2dLub3vR8dnE8YB17omwtm/0NSHl8jjNbcsJd5GMWJAnTSVe/O0Wfg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.30", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.2" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "module-deps": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", + "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "natives": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", + "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", + "dev": true + }, + "new-from": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/new-from/-/new-from-0.0.3.tgz", + "integrity": "sha1-HErRNhPePhXWMhtw7Vwjk36iXmc=", + "dev": true, + "requires": { + "readable-stream": "~1.1.8" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "dev": true + }, + "node-sass": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", + "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "2.87.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "requires": { + "mime-db": "~1.36.0" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + } + } + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, + "requires": { + "is": "^3.1.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.1.0.tgz", + "integrity": "sha512-X781mkWeK6PDMAZJfGn/wnwil4dV6pIdF9euiNqtA89uJvZuNDJO2YyJxiwpPhTQcF5pYUU1v+kcOxzYV6rZlA==", + "dev": true + }, + "npm": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.6.0.tgz", + "integrity": "sha512-Q6Lb4YPWIGsyVzfxcZrTu6VQcMEvCHOBlSE0fbuNHj6CYCUuanMUf6HgNyj4QekWTORxQpOgOgaca2YEQ721Ug==", + "dev": true, + "requires": { + "JSONStream": "^1.3.5", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "^2.0.0", + "archy": "~1.0.0", + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "byte-size": "^5.0.1", + "cacache": "^11.3.2", + "call-limit": "~1.1.0", + "chownr": "^1.1.1", + "ci-info": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.1", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "^1.1.12", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.0.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.7.1", + "iferr": "^1.0.2", + "imurmurhash": "*", + "inflight": "~1.0.6", + "inherits": "~2.0.3", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^3.0.0", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^3.0.2", + "libnpm": "^2.0.1", + "libnpmaccess": "*", + "libnpmhook": "^5.0.2", + "libnpmorg": "*", + "libnpmsearch": "*", + "libnpmteam": "*", + "libnpx": "^10.2.0", + "lock-verify": "^2.0.2", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^4.1.5", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "~0.5.1", + "move-concurrently": "^1.0.1", + "node-gyp": "^3.8.0", + "nopt": "~4.0.1", + "normalize-package-data": "~2.4.0", + "npm-audit-report": "^1.3.2", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-lifecycle": "^2.1.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.2.0", + "npm-pick-manifest": "^2.2.3", + "npm-profile": "*", + "npm-registry-fetch": "^3.8.0", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.1", + "osenv": "^0.1.5", + "pacote": "^9.3.0", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.2.0", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "^2.0.13", + "read-package-tree": "^5.2.1", + "readable-stream": "^3.1.1", + "readdir-scoped-modules": "*", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "^2.6.3", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.1", + "stringify-package": "^1.0.0", + "tar": "^4.4.8", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "^1.1.1", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.6.0", + "write-file-atomic": "^2.3.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "agent-base": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "5.5.2", + "bundled": true, + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "asap": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "cmd-shim": "^2.0.2", + "gentle-fs": "^2.0.0", + "graceful-fs": "^4.1.11", + "write-file-atomic": "^2.3.0" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.3", + "bundled": true, + "dev": true + }, + "boxen": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "byline": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "byte-size": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "cacache": { + "version": "11.3.2", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "call-limit": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "2.0.10", + "bundled": true, + "dev": true, + "requires": { + "ip-regex": "^2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "colors": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "encoding": { + "version": "0.1.12", + "bundled": true, + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "err-code": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "bundled": true, + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "bundled": true, + "dev": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "genfun": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "gentle-fs": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true, + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "ip": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-ci": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^1.0.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "bundled": true, + "dev": true + } + } + }, + "is-cidr": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "cidr-regex": "^2.0.10" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true, + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "libcipm": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "ini": "^1.3.5", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^2.0.3", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^9.1.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" + } + }, + "libnpm": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "find-npm-prefix": "^1.0.2", + "libnpmaccess": "^3.0.1", + "libnpmconfig": "^1.2.1", + "libnpmhook": "^5.0.2", + "libnpmorg": "^1.0.0", + "libnpmpublish": "^1.1.0", + "libnpmsearch": "^2.0.0", + "libnpmteam": "^1.0.1", + "lock-verify": "^2.0.2", + "npm-lifecycle": "^2.1.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "npm-profile": "^4.0.1", + "npm-registry-fetch": "^3.8.0", + "npmlog": "^4.1.2", + "pacote": "^9.2.3", + "read-package-json": "^2.0.13", + "stringify-package": "^1.0.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "libnpmhook": { + "version": "5.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + } + } + } + }, + "libnpmaccess": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^3.8.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "libnpmconfig": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "libnpmhook": { + "version": "5.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + } + }, + "libnpmorg": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "libnpmpublish": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^3.8.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "libnpmsearch": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + } + }, + "libnpmteam": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "libnpx": { + "version": "10.2.0", + "bundled": true, + "dev": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock-verify": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^5.1.2 || 6", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "signal-exit": "^3.0.2" + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._createset": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true, + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true, + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "meant": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mime-db": { + "version": "1.35.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "minizlib": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "bundled": true, + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "bundled": true, + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-audit-report": { + "version": "1.3.2", + "bundled": true, + "dev": true, + "requires": { + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.11", + "node-gyp": "^3.8.0", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2 || 2", + "figgy-pudding": "^3.4.1", + "npm-registry-fetch": "^3.8.0" + } + }, + "npm-registry-fetch": { + "version": "3.8.0", + "bundled": true, + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "npm-package-arg": "^6.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.1", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "package-json": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "9.3.0", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true, + "dev": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "protoduck": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "prr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "psl": { + "version": "1.1.29", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.5.2", + "bundled": true, + "dev": true + }, + "query-string": { + "version": "6.2.0", + "bundled": true, + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "strict-uri-encode": "^2.0.0" + } + }, + "qw": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.0.13", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.2.1", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "request": { + "version": "2.88.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slash": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + } + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "dev": true, + "requires": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "isarray": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "bundled": true, + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-package": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "through": { + "version": "2.3.8", + "bundled": true, + "dev": true + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timed-out": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "bundled": true, + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "umask": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "util-extend": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "worker-farm": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "11.0.0", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nsdeclare": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/nsdeclare/-/nsdeclare-0.1.0.tgz", + "integrity": "sha1-ENqhU2QjgtPPLAGpFvTrIKEosZ8=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", + "integrity": "sha1-tTkr7peC2m2ft9avr1OXefEjTCs=", + "dev": true, + "requires": { + "isobject": "^2.1.0" + } + }, + "octokit-pagination-methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", + "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", + "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", + "dev": true, + "requires": { + "macos-release": "^2.0.0", + "windows-release": "^3.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "dev": true, + "requires": { + "shell-quote": "^1.4.2" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", + "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", + "dev": true, + "requires": { + "p-map": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + }, + "dependencies": { + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + } + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true, + "requires": { + "is-absolute": "^0.2.3", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "dev": true, + "requires": { + "for-each": "^0.3.2", + "trim": "0.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phantom": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz", + "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==", + "dev": true, + "optional": true, + "requires": { + "phantomjs-prebuilt": "^2.1.16", + "split": "^1.0.1", + "winston": "^2.4.0" + }, + "dependencies": { + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "optional": true, + "requires": { + "through": "2" + } + } + } + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "dev": true, + "optional": true, + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true, + "optional": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + } + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "^1.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true, + "optional": true + }, + "proxy-middleware": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.5.1.tgz", + "integrity": "sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true, + "optional": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.0.tgz", + "integrity": "sha1-l4IwoValVI9C7vFN4i0PT2EAg9E=", + "dev": true, + "requires": { + "bytes": "1", + "iconv-lite": "0.4.4" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "rcfinder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", + "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", + "dev": true, + "requires": { + "lodash.clonedeep": "^4.3.2" + } + }, + "rcloader": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.2.2.tgz", + "integrity": "sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc=", + "dev": true, + "requires": { + "lodash.assign": "^4.2.0", + "lodash.isobject": "^3.0.2", + "lodash.merge": "^4.6.0", + "rcfinder": "^0.1.6" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + }, + "regenerator-transform": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3", + "is-primitive": "^2.0.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "replacestream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.2.tgz", + "integrity": "sha1-DEFAcH5PAyP1DeBEhRcIz1i8N70=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "requires": { + "mime-db": "~1.36.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "optional": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "optional": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true, + "optional": true + } + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "optional": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rust-result": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz", + "integrity": "sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=", + "dev": true, + "requires": { + "individual": "^2.0.0" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "safe-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz", + "integrity": "sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=", + "dev": true, + "requires": { + "rust-result": "^1.0.0" + } + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semantic-release": { + "version": "15.13.3", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.13.3.tgz", + "integrity": "sha512-cax0xPPTtsxHlrty2HxhPql2TTvS74Ni2O8BzwFHxNY/mviVKEhI4OxHzBYJkpVxx1fMVj36+oH7IlP+SJtPNA==", + "dev": true, + "requires": { + "@semantic-release/commit-analyzer": "^6.1.0", + "@semantic-release/error": "^2.2.0", + "@semantic-release/github": "^5.1.0", + "@semantic-release/npm": "^5.0.5", + "@semantic-release/release-notes-generator": "^7.1.2", + "aggregate-error": "^2.0.0", + "cosmiconfig": "^5.0.1", + "debug": "^4.0.0", + "env-ci": "^3.0.0", + "execa": "^1.0.0", + "figures": "^2.0.0", + "find-versions": "^3.0.0", + "get-stream": "^4.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^1.1.0", + "hosted-git-info": "^2.7.1", + "lodash": "^4.17.4", + "marked": "^0.6.0", + "marked-terminal": "^3.2.0", + "p-locate": "^3.0.0", + "p-reduce": "^1.0.0", + "read-pkg-up": "^4.0.0", + "resolve-from": "^4.0.0", + "semver": "^5.4.1", + "signale": "^1.2.1", + "yargs": "^12.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "requires": { + "mime-db": "~1.36.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "signale": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz", + "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "split": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "~0.1.1" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "stream-http": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "streamqueue": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/streamqueue/-/streamqueue-0.0.6.tgz", + "integrity": "sha1-ZvX17JTpuK8knkrsLdH3Qb/pTeM=", + "dev": true, + "requires": { + "readable-stream": "^1.0.26-2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "dev": true, + "requires": { + "strip-ansi": "^3.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-object": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.2.tgz", + "integrity": "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^2.0.1", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "supports-hyperlinks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", + "dev": true, + "requires": { + "has-flag": "^2.0.0", + "supports-color": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + } + } + } + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", + "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true, + "optional": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, + "timers-ext": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.5.tgz", + "integrity": "sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg==", + "dev": true, + "requires": { + "es5-ext": "~0.10.14", + "next-tick": "1" + } + }, + "tiny-lr": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.1.4.tgz", + "integrity": "sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00=", + "dev": true, + "requires": { + "body-parser": "~1.8.0", + "debug": "~0.8.1", + "faye-websocket": "~0.7.2", + "parseurl": "~1.3.0", + "qs": "~2.2.3" + }, + "dependencies": { + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", + "dev": true + }, + "qs": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.5.tgz", + "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=", + "dev": true + } + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "dev": true, + "requires": { + "glob": "^6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tsml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tsml/-/tsml-1.0.1.tgz", + "integrity": "sha1-ifghi52eJX9H1/a1bQHFpNLGj8M=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", + "integrity": "sha1-uTaKWTzG730GReeLL0xky+zQXpA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.0.9" + }, + "dependencies": { + "mime-db": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", + "dev": true + }, + "mime-types": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", + "dev": true, + "requires": { + "mime-db": "~1.12.0" + } + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "dev": true, + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz", + "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==", + "dev": true + }, + "unicode-5.2.0": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz", + "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "universal-user-agent": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.3.tgz", + "integrity": "sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g==", + "dev": true, + "requires": { + "os-name": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "dev": true + }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "^1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "video.js": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-6.9.0.tgz", + "integrity": "sha512-54s7ZZKiY8dTMxBM6IkGMUeG0Yjq8RfyOn7bdU88nL6eWw1I+zLPY4fUVEFwGtxNAzZxGj7VVhVsCM/38QM9GA==", + "dev": true, + "requires": { + "babel-runtime": "^6.9.2", + "global": "4.3.2", + "safe-json-parse": "4.0.0", + "tsml": "1.0.1", + "videojs-font": "2.1.0", + "videojs-ie8": "1.1.2", + "videojs-vtt.js": "0.12.6", + "xhr": "2.4.0" + } + }, + "videojs-font": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-2.1.0.tgz", + "integrity": "sha1-olkwpn9snPvyu4jay4xrRR8JM3k=", + "dev": true + }, + "videojs-ie8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/videojs-ie8/-/videojs-ie8-1.1.2.tgz", + "integrity": "sha1-oj09hgitcZK2nGB3/E64SJmNNdk=", + "dev": true, + "requires": { + "es5-shim": "^4.5.1" + } + }, + "videojs-vtt.js": { + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz", + "integrity": "sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==", + "dev": true, + "requires": { + "global": "^4.3.1" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", + "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", + "dev": true, + "requires": { + "bl": "^1.2.1", + "through2": "^2.0.3" + } + }, + "vinyl-bufferstream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz", + "integrity": "sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo=", + "dev": true, + "requires": { + "bufferstreams": "1.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "vinyl-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vinyl-map/-/vinyl-map-1.0.2.tgz", + "integrity": "sha1-qLKWAl+XP6fK1igXlnpI8dF2v3w=", + "dev": true, + "requires": { + "bl": "^1.1.2", + "new-from": "0.0.3", + "through2": "^0.4.1" + }, + "dependencies": { + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "dev": true, + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "vinyl-source-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", + "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "dev": true, + "requires": { + "through2": "^2.0.3", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "watch": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.11.0.tgz", + "integrity": "sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY=", + "dev": true + }, + "watchify": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.0.tgz", + "integrity": "sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA==", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "browserify": "^16.1.0", + "chokidar": "^1.0.0", + "defined": "^1.0.0", + "outpipe": "^1.1.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "detective": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "module-deps": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", + "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "windows-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", + "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", + "dev": true, + "requires": { + "execa": "^0.10.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "winston": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", + "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", + "dev": true, + "optional": true, + "requires": { + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", + "dev": true, + "optional": true + } + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "wreck": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", + "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", + "dev": true, + "requires": { + "boom": "2.x.x", + "hoek": "2.x.x" + } + }, + "xhr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.0.tgz", + "integrity": "sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=", + "dev": true, + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "optional": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/package.json b/package.json index a256f98..bb08256 100644 --- a/package.json +++ b/package.json @@ -1,31 +1,24 @@ { "name": "@contently/videojs-annotation-comments", - "version": "2.0.0-pre.2", + "version": "1.1.1", "description": "A plugin for video.js to add support for timeline moment/range comments and annotations", "repository": "git@github.com:contently/videojs-annotation-comments.git", "main": "build/videojs-annotation-comments.cjs.js", - "style": "build/css/annotations.css", - "files": [ - "build" - ], "scripts": { - "test": "gulp test", - "watch": "gulp watch", - "build": "gulp build" + "test": "./node_modules/gulp/bin/gulp.js test" }, "author": "Evan Carothers (@ecaroth) & Jack Pope (@jackpope)", "copyright": "Copyright Contently, Inc. ", "license": "Apache-2.0", "devDependencies": { - "@semantic-release/changelog": "^3.0.5", - "@semantic-release/git": "^7.0.18", + "@semantic-release/changelog": "^3.0.2", "babel-core": "^6.26.3", "babel-plugin-transform-es2015-modules-simple-commonjs": "^0.3.0", "babel-preset-es2015": "^6.24.1", "babel-preset-es2015-script": "^1.1.0", "babelify": "^7.3.0", - "browserify": "^16.5.0", - "chai": "^4.2.0", + "browserify": "^16.2.3", + "chai": "^4.1.2", "es6-object-assign": "^1.1.0", "gulp": "^3.9.1", "gulp-autoprefixer": "^4.1.0", @@ -39,7 +32,7 @@ "gulp-insert": "^0.5.0", "gulp-jshint": "^2.1.0", "gulp-mocha": "^4.3.1", - "gulp-rename": "^1.4.0", + "gulp-rename": "^1.2.2", "gulp-replace": "^0.5.4", "gulp-sass": "^3.2.1", "gulp-sourcemaps": "^2.6.4", @@ -52,20 +45,16 @@ "ie-array-find-polyfill": "^1.1.0", "jshint": "^2.9.6", "jshint-stylish": "~2.0.1", - "mocha": "^6.2.0", - "moment": "^2.24.0", + "mocha": "^4.0.0", + "moment": "^2.22.1", "pump": "^1.0.3", - "semantic-release": "^15.13.21", - "underscore": "^1.9.1", - "video.js": "^7.6.5", + "semantic-release": "^15.13.3", + "underscore": "^1.9.0", + "video.js": "^6.9.0", "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^1.1.2", "watchify": "^3.11.0" }, - "peerDependencies": { - "jquery": "^3", - "video.js": "^7" - }, "babel": { "presets": [ "es2015" @@ -78,21 +67,7 @@ "@semantic-release/release-notes-generator", "@semantic-release/changelog", "@semantic-release/npm", - "@semantic-release/github", - [ - "@semantic-release/git", - { - "assets": [ - "CHANGELOG.md", - "package.json", - "yarn.lock" - ], - "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" - } - ] + "@semantic-release/github" ] - }, - "dependencies": { - "mitt": "^1.2.0" } } diff --git a/src/js/annotation_comments.js b/src/js/annotation_comments.js index 711b81e..e2e877b 100644 --- a/src/js/annotation_comments.js +++ b/src/js/annotation_comments.js @@ -31,7 +31,7 @@ module.exports = (videojs) => { options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options); super(player, options); - this.eventDispatcher = new EventDispatcher(); + this.eventDispatcher = new EventDispatcher(this); this.eventDispatcher.registerListenersFor(this, 'AnnotationComments'); this.player = player; @@ -96,11 +96,6 @@ module.exports = (videojs) => { this.eventDispatcher.fire(type, data); } - // A wrapper func to make it easier to listen to API events from the client - registerListener (type, callback) { - this.eventDispatcher.registerListener(type, callback, false); - } - // Toggle annotations mode on/off toggleAnnotationMode() { this.active = !this.active; diff --git a/src/js/lib/event_dispatcher.js b/src/js/lib/event_dispatcher.js index 76d4a48..5a947f8 100644 --- a/src/js/lib/event_dispatcher.js +++ b/src/js/lib/event_dispatcher.js @@ -5,7 +5,6 @@ */ const Logger = require("./logger"); -const mitt = require("mitt"); /* A centralized collection of event callbacks organized by component and name @@ -61,12 +60,12 @@ const EventRegistry = { module.exports = class EventDispatcher { - constructor () { + constructor (plugin) { + this.plugin = plugin; this.pluginReady = false; this.pendingEvts = []; this.registeredListeners = []; this.eventRegistry = EventRegistry; - this.eventEmitter = mitt(); } // Use the EventRegistry to mass register events on each component initialization @@ -87,26 +86,25 @@ module.exports = class EventDispatcher { } } - // Bind a listener - // Register internal listeners to make sure callbacks are not duped as modules are reloaded - // register = false for consumer usage with more flexibility - registerListener (type, callback, register = true) { - this.eventEmitter.on(type, callback); - if (register) this.registeredListeners.push(type); + // Bind a listener to the plugin + registerListener (type, callback) { + this.plugin.on(type, callback); + this.registeredListeners.push(type); } - // Unbind a listener + // Unbind a listener from the plugin unregisterListener (type) { - this.eventEmitter.off(type); + this.plugin.off(type); let i = this.registeredListeners.indexOf(type); this.registeredListeners.splice(i, 1); } - // Trigger an event + // Trigger an event on the plugin fire (type, data) { if(!this.pluginReady) return; Logger.log("evt-dispatch-FIRE", type, data); - this.eventEmitter.emit(type, { detail: data }); + let evt = new CustomEvent(type, { 'detail': data }); + this.plugin.trigger(evt); } teardown () { diff --git a/test/mocha/components/event_dispatcher_test.js b/test/mocha/components/event_dispatcher_test.js index 3a0bce6..c212688 100644 --- a/test/mocha/components/event_dispatcher_test.js +++ b/test/mocha/components/event_dispatcher_test.js @@ -3,6 +3,7 @@ const EventDispatcher = require("../../../src/js/lib/event_dispatcher"), expect = require('chai').expect; +const MockedPlugin = { on: (type, callback) => {} }; const MockedEventRegistry = { ClassOne: { myFirstEvent: () => {}, @@ -17,14 +18,15 @@ describe('EventDispatcher', () => { describe('constructor', () => { it('creates an EventDispatcher instance w a listener cache and a plugin reference', () => { - let eventDispatcher = new EventDispatcher(); + let eventDispatcher = new EventDispatcher(MockedPlugin); + expect(eventDispatcher.plugin).to.deep.equal(MockedPlugin); expect(eventDispatcher.registeredListeners).to.be.an("array").that.is.empty; }); }); describe('registerListener', () => { it('caches the type as a registered listener', () => { - let eventDispatcher = new EventDispatcher(); + let eventDispatcher = new EventDispatcher(MockedPlugin); eventDispatcher.registerListener('my-type', (changeMe) => { changeMe = 'changed' }); expect(eventDispatcher.registeredListeners).to.include('my-type'); }); @@ -32,7 +34,7 @@ describe('EventDispatcher', () => { describe('registerListenersFor', () => { it('iterates through the registry and registers listeners based on object type', () => { - let eventDispatcher = new EventDispatcher(); + let eventDispatcher = new EventDispatcher(MockedPlugin); eventDispatcher.eventRegistry = MockedEventRegistry; eventDispatcher.registerListenersFor({}, 'ClassOne'); @@ -45,7 +47,7 @@ describe('EventDispatcher', () => { }); it('does not create duplicate event listeners', () => { - let eventDispatcher = new EventDispatcher(); + let eventDispatcher = new EventDispatcher(MockedPlugin); eventDispatcher.eventRegistry = MockedEventRegistry; eventDispatcher.registerListenersFor({}, 'ClassOne'); diff --git a/test/test_api.html b/test/test_api.html index 6dcb403..744ea37 100644 --- a/test/test_api.html +++ b/test/test_api.html @@ -270,23 +270,23 @@ plugin.fire("destroyComment", {id: id}); }); - plugin.registerListener("annotationOpened", function(event) { + plugin.on("annotationOpened", function(event) { var id = event.detail.annotation.id; $("#annotation-opened-id").html(id); }); - plugin.registerListener("addingAnnotationDataChanged", function(event) { + plugin.on("addingAnnotationDataChanged", function(event) { console.log(event.detail); }); - plugin.registerListener("enteredAddingAnnotation", function(event) { + plugin.on("enteredAddingAnnotation", function(event) { var range = event.detail.range; console.log("Starting add annotation process"); $("#new-annotation-form").removeClass("hidden"); $("#new-annotation-range-start").val(range.start); }); - plugin.registerListener("addingAnnotationDataChanged", function(event) { + plugin.on("addingAnnotationDataChanged", function(event) { if(event.detail.shape) { $("#new-annotation-shape-x1").val(event.detail.shape.x1); $("#new-annotation-shape-x2").val(event.detail.shape.x2); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 2de6955..0000000 --- a/yarn.lock +++ /dev/null @@ -1,10388 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.4.5": - version "7.5.5" - resolved "https://npm-registry.prod.contently.systems/@babel%2fruntime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" - integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@gulp-sourcemaps/identity-map@1.X": - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/@gulp-sourcemaps%2fidentity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9" - integrity sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ== - dependencies: - acorn "^5.0.3" - css "^2.2.1" - normalize-path "^2.1.1" - source-map "^0.6.0" - through2 "^2.0.3" - -"@gulp-sourcemaps/map-sources@1.X": - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/@gulp-sourcemaps%2fmap-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" - integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o= - dependencies: - normalize-path "^2.0.1" - through2 "^2.0.3" - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://npm-registry.prod.contently.systems/@mrmlnc%2freaddir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== - dependencies: - "@nodelib/fs.scandir" "2.1.3" - fastq "^1.6.0" - -"@octokit/endpoint@^5.1.0": - version "5.1.8" - resolved "https://npm-registry.prod.contently.systems/@octokit%2fendpoint/-/endpoint-5.1.8.tgz#5c8c204aece0eb6f030df1e97a11b8096ba198b8" - integrity sha512-BVVNVVeVGySIF6nvoaO6AaickboZr7A1O6z1wmnMRslewi6O+KILSp0ZsXbkgLnP8V8pa7WM9+wSYYczIUBm5w== - dependencies: - deepmerge "3.3.0" - is-plain-object "^3.0.0" - universal-user-agent "^2.1.0" - url-template "^2.0.8" - -"@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/@octokit%2frequest-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be" - integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig== - dependencies: - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^4.0.1": - version "4.1.1" - resolved "https://npm-registry.prod.contently.systems/@octokit%2frequest/-/request-4.1.1.tgz#614262214f48417b4d3b14e047d09a9c8e2f7a09" - integrity sha512-LOyL0i3oxRo418EXRSJNk/3Q4I0/NKawTn6H/CQp+wnrG1UFLGu080gSsgnWobhPo5BpUNgSQ5BRk5FOOJhD1Q== - dependencies: - "@octokit/endpoint" "^5.1.0" - "@octokit/request-error" "^1.0.1" - deprecation "^2.0.0" - is-plain-object "^3.0.0" - node-fetch "^2.3.0" - once "^1.4.0" - universal-user-agent "^2.1.0" - -"@octokit/rest@^16.27.0": - version "16.28.2" - resolved "https://npm-registry.prod.contently.systems/@octokit%2frest/-/rest-16.28.2.tgz#3fc3b8700046ab29ab1e2a4bdf49f89e94f7ba27" - integrity sha512-csuYiHvJ1P/GFDadVn0QhwO83R1+YREjcwCY7ZIezB6aJTRIEidJZj+R7gAkUhT687cqYb4cXTZsDVu9F+Fmug== - dependencies: - "@octokit/request" "^4.0.1" - "@octokit/request-error" "^1.0.2" - atob-lite "^2.0.0" - before-after-hook "^1.4.0" - btoa-lite "^1.0.0" - deprecation "^2.0.0" - lodash.get "^4.4.2" - lodash.set "^4.3.2" - lodash.uniq "^4.5.0" - octokit-pagination-methods "^1.1.0" - once "^1.4.0" - universal-user-agent "^2.0.0" - url-template "^2.0.8" - -"@semantic-release/changelog@^3.0.5": - version "3.0.5" - resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fchangelog/-/changelog-3.0.5.tgz#37423eee40f550acb8e09ff1d951ba79263e3b2d" - integrity sha512-/U44eK5qL2olevbEi+GrJxq1lNGUABChqK58A3SkiDsZS6AoGO8CJHQ7OG0zx+spxwkY4TevZ85Whz/hYyO+5w== - dependencies: - "@semantic-release/error" "^2.1.0" - aggregate-error "^3.0.0" - fs-extra "^8.0.0" - lodash "^4.17.4" - -"@semantic-release/commit-analyzer@^6.1.0": - version "6.2.0" - resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fcommit-analyzer/-/commit-analyzer-6.2.0.tgz#5cd25ce67ba9ba5b46e47457505e63629e186695" - integrity sha512-oUtPydYcbtJsEY6WCPi4wynTgRecK5zCkKaGmHi+9Xl7d6jGf7LomnJCg++6dNF1tyavrbGMSdXTCPH6Dx9LbA== - dependencies: - conventional-changelog-angular "^5.0.0" - conventional-commits-filter "^2.0.0" - conventional-commits-parser "^3.0.0" - debug "^4.0.0" - import-from "^3.0.0" - lodash "^4.17.4" - -"@semantic-release/error@^2.1.0", "@semantic-release/error@^2.2.0": - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/@semantic-release%2ferror/-/error-2.2.0.tgz#ee9d5a09c9969eade1ec864776aeda5c5cddbbf0" - integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg== - -"@semantic-release/git@^7.0.18": - version "7.0.18" - resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fgit/-/git-7.0.18.tgz#f37c076bc094762cb343dab49ab893d31de961e8" - integrity sha512-VwnsGUXpNdvPcsq05BQyLBZxGUlEiJCMKNi8ttLvZZAhjI1mAp9dwypOeyxSJ5eFQ+iGMBLdoKF1LL0pmA/d0A== - dependencies: - "@semantic-release/error" "^2.1.0" - aggregate-error "^3.0.0" - debug "^4.0.0" - dir-glob "^3.0.0" - execa "^3.2.0" - fs-extra "^8.0.0" - globby "^10.0.0" - lodash "^4.17.4" - micromatch "^4.0.0" - p-reduce "^2.0.0" - -"@semantic-release/github@^5.1.0": - version "5.4.0" - resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fgithub/-/github-5.4.0.tgz#b170d1ceb3f682604cb4a2aff39bf5906159c91d" - integrity sha512-qtaV/8xIu2a8jt6lACFps0gVDfJby1h7Ra5On3VF60PkrKft87ru9sywAl9gtTfSfOyUlFaNCNlf3mvDaekpzQ== - dependencies: - "@octokit/rest" "^16.27.0" - "@semantic-release/error" "^2.2.0" - aggregate-error "^3.0.0" - bottleneck "^2.18.1" - debug "^4.0.0" - dir-glob "^2.0.0" - fs-extra "^8.0.0" - globby "^9.0.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - issue-parser "^4.0.0" - lodash "^4.17.4" - mime "^2.4.3" - p-filter "^2.0.0" - p-retry "^4.0.0" - parse-github-url "^1.0.1" - url-join "^4.0.0" - -"@semantic-release/npm@^5.0.5": - version "5.1.9" - resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fnpm/-/npm-5.1.9.tgz#30d775433c91f32d7365382574aeda3b1422a5df" - integrity sha512-Hcwhiu7zC0hD0ZPTkEE5bsK9l0z7Ou+N/mcSpYT1kq96ETMQtyZee0gjxXiAGaIHJ7wlMuUhHbYp7iAaI1965w== - dependencies: - "@semantic-release/error" "^2.2.0" - aggregate-error "^3.0.0" - execa "^1.0.0" - fs-extra "^8.0.0" - lodash "^4.17.4" - nerf-dart "^1.0.0" - normalize-url "^4.0.0" - npm "^6.8.0" - rc "^1.2.8" - read-pkg "^5.0.0" - registry-auth-token "^3.3.1" - -"@semantic-release/release-notes-generator@^7.1.2": - version "7.2.0" - resolved "https://npm-registry.prod.contently.systems/@semantic-release%2frelease-notes-generator/-/release-notes-generator-7.2.0.tgz#d09f9f97a0f33149411c36843d1378d3c290ada8" - integrity sha512-CQAN6ViNL27p0TivCabpuDSjLl9eaP5yHRwSVYLLGg6RXu972PFk3DqOKuMQHsyDAx7wze2vU8qESt6/Mt6AuQ== - dependencies: - conventional-changelog-angular "^5.0.0" - conventional-changelog-writer "^4.0.0" - conventional-commits-filter "^2.0.0" - conventional-commits-parser "^3.0.0" - debug "^4.0.0" - get-stream "^5.0.0" - import-from "^3.0.0" - into-stream "^5.0.0" - lodash "^4.17.4" - -"@types/events@*": - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/@types%2fevents/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://npm-registry.prod.contently.systems/@types%2fglob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/minimatch@*": - version "3.0.3" - resolved "https://npm-registry.prod.contently.systems/@types%2fminimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*": - version "12.0.8" - resolved "https://npm-registry.prod.contently.systems/@types%2fnode/-/node-12.0.8.tgz#551466be11b2adc3f3d47156758f610bd9f6b1d8" - integrity sha512-b8bbUOTwzIY3V5vDTY1fIJ+ePKDUBqt2hC2woVGotdQQhG/2Sh62HOKHrT7ab+VerXAcPyAiTEipPu/FsreUtg== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://npm-registry.prod.contently.systems/@types%2fnormalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/retry@^0.12.0": - version "0.12.0" - resolved "https://npm-registry.prod.contently.systems/@types%2fretry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@videojs/http-streaming@1.10.3": - version "1.10.3" - resolved "https://npm-registry.prod.contently.systems/@videojs%2fhttp-streaming/-/http-streaming-1.10.3.tgz#0c028443b9a3c96da85e5995748ed94280884584" - integrity sha512-fxXtwVrQBdhOFh6GymPAPCb4utCI01Zs5fdyZgtR6FSsaz/zGmnzfNS5GvNjBi/hZviMsbNPFaOTTFMMNLNA3A== - dependencies: - aes-decrypter "3.0.0" - global "^4.3.0" - m3u8-parser "4.3.0" - mpd-parser "0.8.1" - mux.js "5.1.3" - url-toolkit "^2.1.3" - video.js "^6.8.0 || ^7.0.0" - -"@videojs/http-streaming@1.10.6": - version "1.10.6" - resolved "https://npm-registry.prod.contently.systems/@videojs%2fhttp-streaming/-/http-streaming-1.10.6.tgz#a9119b1828b354c5cc17b42ea051cc7bcce2dca0" - integrity sha512-uPBuunHnxWeFRYxRX0j6h1IIWv3+QKvSkZGmW9TvqxWBqeNGSrQymR6tm1nVjQ2HhMVxVphQTUhUTTPDVWqmQg== - dependencies: - aes-decrypter "3.0.0" - global "^4.3.0" - m3u8-parser "4.4.0" - mpd-parser "0.8.1" - mux.js "5.2.1" - url-toolkit "^2.1.3" - video.js "^6.8.0 || ^7.0.0" - -JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: - version "1.3.5" - resolved "https://npm-registry.prod.contently.systems/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abbrev@1, abbrev@~1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.4: - version "1.3.7" - resolved "https://npm-registry.prod.contently.systems/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - -acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: - version "1.7.0" - resolved "https://npm-registry.prod.contently.systems/acorn-node/-/acorn-node-1.7.0.tgz#aac6a559d27af6176b076ab6fb13c5974c213e3b" - integrity sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw== - dependencies: - acorn "^6.1.1" - acorn-dynamic-import "^4.0.0" - acorn-walk "^6.1.1" - xtend "^4.0.1" - -acorn-walk@^6.1.1: - version "6.1.1" - resolved "https://npm-registry.prod.contently.systems/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== - -acorn@5.X, acorn@^5.0.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - -acorn@^6.1.1: - version "6.1.1" - resolved "https://npm-registry.prod.contently.systems/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== - -aes-decrypter@3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/aes-decrypter/-/aes-decrypter-3.0.0.tgz#7848a1c145b9fdbf57ae3e2b5b1bc7cf0644a8fb" - integrity sha1-eEihwUW5/b9Xrj4rWxvHzwZEqPs= - dependencies: - commander "^2.9.0" - global "^4.3.2" - pkcs7 "^1.0.2" - -agent-base@4, agent-base@^4.1.0: - version "4.3.0" - resolved "https://npm-registry.prod.contently.systems/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - -agent-base@~4.2.1: - version "4.2.1" - resolved "https://npm-registry.prod.contently.systems/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - -agentkeepalive@^3.4.1: - version "3.5.2" - resolved "https://npm-registry.prod.contently.systems/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" - integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== - dependencies: - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" - integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== - dependencies: - clean-stack "^2.0.0" - indent-string "^3.2.0" - -ajv@^6.5.5: - version "6.10.0" - resolved "https://npm-registry.prod.contently.systems/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://npm-registry.prod.contently.systems/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== - dependencies: - ansi-wrap "^0.1.0" - -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^3.1.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://npm-registry.prod.contently.systems/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://npm-registry.prod.contently.systems/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= - -ansicolors@~0.3.2: - version "0.3.2" - resolved "https://npm-registry.prod.contently.systems/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= - -ansistyles@~0.1.3: - version "0.1.3" - resolved "https://npm-registry.prod.contently.systems/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" - integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -"aproba@^1.1.2 || 2", aproba@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -archy@^1.0.0, archy@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://npm-registry.prod.contently.systems/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://npm-registry.prod.contently.systems/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argv-formatter@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" - integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk= - -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^2.0.1: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= - -array-each@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= - -array-map@~0.0.0: - version "0.0.0" - resolved "https://npm-registry.prod.contently.systems/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://npm-registry.prod.contently.systems/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://npm-registry.prod.contently.systems/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= - -array-slice@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" - integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== - -array-union@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-uniq@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" - integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://npm-registry.prod.contently.systems/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -arrify@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asap@^2.0.0: - version "2.0.6" - resolved "https://npm-registry.prod.contently.systems/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://npm-registry.prod.contently.systems/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://npm-registry.prod.contently.systems/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@^1.4.0: - version "1.5.0" - resolved "https://npm-registry.prod.contently.systems/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://npm-registry.prod.contently.systems/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - -async@~0.2.6: - version "0.2.10" - resolved "https://npm-registry.prod.contently.systems/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://npm-registry.prod.contently.systems/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= - -atob@^2.1.1: - version "2.1.2" - resolved "https://npm-registry.prod.contently.systems/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^7.0.0: - version "7.2.6" - resolved "https://npm-registry.prod.contently.systems/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" - integrity sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ== - dependencies: - browserslist "^2.11.3" - caniuse-lite "^1.0.30000805" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^6.0.17" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://npm-registry.prod.contently.systems/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.8.0" - resolved "https://npm-registry.prod.contently.systems/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.14, babel-core@^6.23.1, babel-core@^6.26.0, babel-core@^6.26.3: - version "6.26.3" - resolved "https://npm-registry.prod.contently.systems/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://npm-registry.prod.contently.systems/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://npm-registry.prod.contently.systems/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13: - version "6.22.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13: - version "6.22.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: - version "6.22.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.14.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.14.0, babel-plugin-transform-es2015-classes@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.9.0: - version "6.23.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0: - version "6.23.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13: - version "6.22.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-simple-commonjs@^0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-simple-commonjs/-/babel-plugin-transform-es2015-modules-simple-commonjs-0.3.0.tgz#c15ef506967c1ee8b7290cedecdba4af6581ee1e" - integrity sha1-wV71BpZ8Hui3KQzt7Nukr2WB7h4= - dependencies: - babel-plugin-transform-strict-mode "^6.8.0" - babel-runtime "^6.3.19" - babel-template "^6.3.13" - better-log "^1.3.1" - -babel-plugin-transform-es2015-modules-systemjs@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.9.0: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13: - version "6.22.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0: - version "6.22.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0: - version "6.23.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-regenerator@^6.14.0, babel-plugin-transform-regenerator@^6.24.1: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1, babel-plugin-transform-strict-mode@^6.8.0: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-es2015-script@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/babel-preset-es2015-script/-/babel-preset-es2015-script-1.1.0.tgz#737da39913dcb4500ee4db132c42cd3cf71064e5" - integrity sha1-c32jmRPctFAO5NsTLELNPPcQZOU= - dependencies: - babel-plugin-check-es2015-constants "^6.3.13" - babel-plugin-transform-es2015-arrow-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoping "^6.14.0" - babel-plugin-transform-es2015-classes "^6.14.0" - babel-plugin-transform-es2015-computed-properties "^6.3.13" - babel-plugin-transform-es2015-destructuring "^6.9.0" - babel-plugin-transform-es2015-duplicate-keys "^6.6.0" - babel-plugin-transform-es2015-for-of "^6.6.0" - babel-plugin-transform-es2015-function-name "^6.9.0" - babel-plugin-transform-es2015-literals "^6.3.13" - babel-plugin-transform-es2015-object-super "^6.3.13" - babel-plugin-transform-es2015-parameters "^6.9.0" - babel-plugin-transform-es2015-shorthand-properties "^6.3.13" - babel-plugin-transform-es2015-spread "^6.3.13" - babel-plugin-transform-es2015-sticky-regex "^6.3.13" - babel-plugin-transform-es2015-template-literals "^6.6.0" - babel-plugin-transform-es2015-typeof-symbol "^6.6.0" - babel-plugin-transform-es2015-unicode-regex "^6.3.13" - babel-plugin-transform-regenerator "^6.14.0" - -babel-preset-es2015@^6.24.1: - version "6.24.1" - resolved "https://npm-registry.prod.contently.systems/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" - integrity sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk= - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.24.1" - babel-plugin-transform-es2015-classes "^6.24.1" - babel-plugin-transform-es2015-computed-properties "^6.24.1" - babel-plugin-transform-es2015-destructuring "^6.22.0" - babel-plugin-transform-es2015-duplicate-keys "^6.24.1" - babel-plugin-transform-es2015-for-of "^6.22.0" - babel-plugin-transform-es2015-function-name "^6.24.1" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-plugin-transform-es2015-modules-systemjs "^6.24.1" - babel-plugin-transform-es2015-modules-umd "^6.24.1" - babel-plugin-transform-es2015-object-super "^6.24.1" - babel-plugin-transform-es2015-parameters "^6.24.1" - babel-plugin-transform-es2015-shorthand-properties "^6.24.1" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.24.1" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.22.0" - babel-plugin-transform-es2015-unicode-regex "^6.24.1" - babel-plugin-transform-regenerator "^6.24.1" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.3.19: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.13: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://npm-registry.prod.contently.systems/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babelify@^7.3.0: - version "7.3.0" - resolved "https://npm-registry.prod.contently.systems/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= - dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://npm-registry.prod.contently.systems/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== - -base@^0.11.1: - version "0.11.2" - resolved "https://npm-registry.prod.contently.systems/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://npm-registry.prod.contently.systems/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= - -before-after-hook@^1.4.0: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" - integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== - -better-log@^1.3.1: - version "1.3.3" - resolved "https://npm-registry.prod.contently.systems/better-log/-/better-log-1.3.3.tgz#219a1c0383a8f9c4416897eda3acf9b4d6990e8f" - integrity sha1-IZocA4Oo+cRBaJfto6z5tNaZDo8= - -bin-links@^1.1.2: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" - integrity sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg== - dependencies: - bluebird "^3.5.0" - cmd-shim "^2.0.2" - gentle-fs "^2.0.0" - graceful-fs "^4.1.11" - write-file-atomic "^2.3.0" - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://npm-registry.prod.contently.systems/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binaryextensions@~1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" - integrity sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U= - -bl@^1.1.2, bl@^1.2.1: - version "1.2.2" - resolved "https://npm-registry.prod.contently.systems/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -block-stream@*: - version "0.0.9" - resolved "https://npm-registry.prod.contently.systems/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - -bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: - version "3.5.5" - resolved "https://npm-registry.prod.contently.systems/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://npm-registry.prod.contently.systems/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -body-parser@~1.8.0: - version "1.8.4" - resolved "https://npm-registry.prod.contently.systems/body-parser/-/body-parser-1.8.4.tgz#d497e04bc13b3f9a8bd8c70bb0cdc16f2e028898" - integrity sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg= - dependencies: - bytes "1.0.0" - depd "0.4.5" - iconv-lite "0.4.4" - media-typer "0.3.0" - on-finished "2.1.0" - qs "2.2.4" - raw-body "1.3.0" - type-is "~1.5.1" - -boom@2.x.x: - version "2.10.1" - resolved "https://npm-registry.prod.contently.systems/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= - dependencies: - hoek "2.x.x" - -bottleneck@^2.18.1: - version "2.19.1" - resolved "https://npm-registry.prod.contently.systems/bottleneck/-/bottleneck-2.19.1.tgz#f7657aed83edff1fa41d438cdbdf3e0931a1d3f0" - integrity sha512-TrdmthuOG5SpYfFQTprSQOtqQUTreAgPkCFfow/aVOnryRRpIwiwfiQmmJUiiHUKgPV7LBNlfGecJ5hCVs30gw== - -boxen@^1.2.1: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://npm-registry.prod.contently.systems/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://npm-registry.prod.contently.systems/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://npm-registry.prod.contently.systems/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-pack@^6.0.1: - version "6.1.0" - resolved "https://npm-registry.prod.contently.systems/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" - integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== - dependencies: - JSONStream "^1.0.3" - combine-source-map "~0.8.0" - defined "^1.0.0" - safe-buffer "^5.1.1" - through2 "^2.0.0" - umd "^3.0.0" - -browser-resolve@^1.11.0, browser-resolve@^1.7.0: - version "1.11.3" - resolved "https://npm-registry.prod.contently.systems/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://npm-registry.prod.contently.systems/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://npm-registry.prod.contently.systems/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@~0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserify@^16.1.0: - version "16.2.3" - resolved "https://npm-registry.prod.contently.systems/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" - integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== - dependencies: - JSONStream "^1.0.3" - assert "^1.4.0" - browser-pack "^6.0.1" - browser-resolve "^1.11.0" - browserify-zlib "~0.2.0" - buffer "^5.0.2" - cached-path-relative "^1.0.0" - concat-stream "^1.6.0" - console-browserify "^1.1.0" - constants-browserify "~1.0.0" - crypto-browserify "^3.0.0" - defined "^1.0.0" - deps-sort "^2.0.0" - domain-browser "^1.2.0" - duplexer2 "~0.1.2" - events "^2.0.0" - glob "^7.1.0" - has "^1.0.0" - htmlescape "^1.1.0" - https-browserify "^1.0.0" - inherits "~2.0.1" - insert-module-globals "^7.0.0" - labeled-stream-splicer "^2.0.0" - mkdirp "^0.5.0" - module-deps "^6.0.0" - os-browserify "~0.3.0" - parents "^1.0.1" - path-browserify "~0.0.0" - process "~0.11.0" - punycode "^1.3.2" - querystring-es3 "~0.2.0" - read-only-stream "^2.0.0" - readable-stream "^2.0.2" - resolve "^1.1.4" - shasum "^1.0.0" - shell-quote "^1.6.1" - stream-browserify "^2.0.0" - stream-http "^2.0.0" - string_decoder "^1.1.1" - subarg "^1.0.0" - syntax-error "^1.1.1" - through2 "^2.0.0" - timers-browserify "^1.0.1" - tty-browserify "0.0.1" - url "~0.11.0" - util "~0.10.1" - vm-browserify "^1.0.0" - xtend "^4.0.0" - -browserify@^16.5.0: - version "16.5.0" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.0.tgz#a1c2bc0431bec11fd29151941582e3f645ede881" - integrity sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw== - dependencies: - JSONStream "^1.0.3" - assert "^1.4.0" - browser-pack "^6.0.1" - browser-resolve "^1.11.0" - browserify-zlib "~0.2.0" - buffer "^5.0.2" - cached-path-relative "^1.0.0" - concat-stream "^1.6.0" - console-browserify "^1.1.0" - constants-browserify "~1.0.0" - crypto-browserify "^3.0.0" - defined "^1.0.0" - deps-sort "^2.0.0" - domain-browser "^1.2.0" - duplexer2 "~0.1.2" - events "^2.0.0" - glob "^7.1.0" - has "^1.0.0" - htmlescape "^1.1.0" - https-browserify "^1.0.0" - inherits "~2.0.1" - insert-module-globals "^7.0.0" - labeled-stream-splicer "^2.0.0" - mkdirp "^0.5.0" - module-deps "^6.0.0" - os-browserify "~0.3.0" - parents "^1.0.1" - path-browserify "~0.0.0" - process "~0.11.0" - punycode "^1.3.2" - querystring-es3 "~0.2.0" - read-only-stream "^2.0.0" - readable-stream "^2.0.2" - resolve "^1.1.4" - shasum "^1.0.0" - shell-quote "^1.6.1" - stream-browserify "^2.0.0" - stream-http "^3.0.0" - string_decoder "^1.1.1" - subarg "^1.0.0" - syntax-error "^1.1.1" - through2 "^2.0.0" - timers-browserify "^1.0.1" - tty-browserify "0.0.1" - url "~0.11.0" - util "~0.10.1" - vm-browserify "^1.0.0" - xtend "^4.0.0" - -browserslist@^2.11.3: - version "2.11.3" - resolved "https://npm-registry.prod.contently.systems/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== - dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" - -btoa-lite@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^5.0.2: - version "5.2.1" - resolved "https://npm-registry.prod.contently.systems/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" - integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -bufferstreams@1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/bufferstreams/-/bufferstreams-1.0.1.tgz#cfb1ad9568d3ba3cfe935ba9abdd952de88aab2a" - integrity sha1-z7GtlWjTujz+k1upq92VLeiKqyo= - dependencies: - readable-stream "^1.0.33" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -builtins@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= - -byline@^5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" - integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= - -byte-size@^5.0.1: - version "5.0.1" - resolved "https://npm-registry.prod.contently.systems/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" - integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== - -bytes@1, bytes@1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" - integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= - -cacache@^11.0.1, cacache@^11.3.2: - version "11.3.3" - resolved "https://npm-registry.prod.contently.systems/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" - integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" - integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== - -call-limit@~1.1.0: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" - integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ== - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://npm-registry.prod.contently.systems/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - -camelcase@^2.0.0, camelcase@^2.0.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= - -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805: - version "1.0.30000976" - resolved "https://npm-registry.prod.contently.systems/caniuse-lite/-/caniuse-lite-1.0.30000976.tgz#d30fe12662cb2a21e130d307db9907513ca830a2" - integrity sha512-tleNB1IwPRqZiod6nUNum63xQCMN96BUO2JTeiwuRM7p9d616EHsMBjBWJMudX39qCaPuWY8KEWzMZq7A9XQMQ== - -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - -cardinal@^2.1.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://npm-registry.prod.contently.systems/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -center-align@^0.1.1: - version "0.1.3" - resolved "https://npm-registry.prod.contently.systems/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chai@^4.2.0: - version "4.2.0" - resolved "https://npm-registry.prod.contently.systems/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - -chalk@^0.5.0: - version "0.5.1" - resolved "https://npm-registry.prod.contently.systems/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1: - version "2.4.2" - resolved "https://npm-registry.prod.contently.systems/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@^2.1.1: - version "2.1.6" - resolved "https://npm-registry.prod.contently.systems/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" - integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://npm-registry.prod.contently.systems/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cidr-regex@^2.0.10: - version "2.0.10" - resolved "https://npm-registry.prod.contently.systems/cidr-regex/-/cidr-regex-2.0.10.tgz#af13878bd4ad704de77d6dc800799358b3afa70d" - integrity sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q== - dependencies: - ip-regex "^2.1.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://npm-registry.prod.contently.systems/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" - integrity sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA== - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-columns@^3.1.2: - version "3.1.2" - resolved "https://npm-registry.prod.contently.systems/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" - integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4= - dependencies: - string-width "^2.0.0" - strip-ansi "^3.0.1" - -cli-table3@^0.5.0, cli-table3@^0.5.1: - version "0.5.1" - resolved "https://npm-registry.prod.contently.systems/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - -cli-table@^0.3.1: - version "0.3.1" - resolved "https://npm-registry.prod.contently.systems/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= - dependencies: - colors "1.0.3" - -cli@~1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" - integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ= - dependencies: - exit "0.1.2" - glob "^7.1.1" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.0.3, cliui@^3.2.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= - -clone-stats@^0.0.1, clone-stats@~0.0.1: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= - -clone@^0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= - -clone@^1.0.0, clone@^1.0.2: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -clone@^2.1.1: - version "2.1.2" - resolved "https://npm-registry.prod.contently.systems/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - -cloneable-readable@^1.0.0: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" - integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - -cmd-shim@^2.0.2, cmd-shim@~2.0.2: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" - integrity sha1-b8vamUg6j9FdfTChlspp1oii79s= - dependencies: - graceful-fs "^4.1.2" - mkdirp "~0.5.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://npm-registry.prod.contently.systems/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-support@^1.1.3: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colors@1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= - -colors@^1.1.2: - version "1.3.3" - resolved "https://npm-registry.prod.contently.systems/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== - -columnify@~1.5.4: - version "1.5.4" - resolved "https://npm-registry.prod.contently.systems/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" - integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= - dependencies: - strip-ansi "^3.0.0" - wcwidth "^1.0.0" - -combine-source-map@^0.8.0, combine-source-map@~0.8.0: - version "0.8.0" - resolved "https://npm-registry.prod.contently.systems/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" - integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= - dependencies: - convert-source-map "~1.1.0" - inline-source-map "~0.6.0" - lodash.memoize "~3.0.3" - source-map "~0.5.3" - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://npm-registry.prod.contently.systems/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@2.9.0: - version "2.9.0" - resolved "https://npm-registry.prod.contently.systems/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - -commander@^2.9.0, commander@~2.20.0: - version "2.20.0" - resolved "https://npm-registry.prod.contently.systems/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== - -compare-func@^1.3.1: - version "1.3.2" - resolved "https://npm-registry.prod.contently.systems/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= - dependencies: - array-ify "^1.0.0" - dot-prop "^3.0.0" - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: - version "1.6.2" - resolved "https://npm-registry.prod.contently.systems/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-with-sourcemaps@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - -config-chain@^1.1.12: - version "1.1.12" - resolved "https://npm-registry.prod.contently.systems/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -configstore@^3.0.0: - version "3.1.2" - resolved "https://npm-registry.prod.contently.systems/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -connect-livereload@^0.4.0: - version "0.4.1" - resolved "https://npm-registry.prod.contently.systems/connect-livereload/-/connect-livereload-0.4.1.tgz#0f8a1a816bc9baffae4637ccea917462fe35917a" - integrity sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo= - -connect@^3.0.1: - version "3.7.0" - resolved "https://npm-registry.prod.contently.systems/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -console-browserify@1.1.x, console-browserify@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -consolidate@^0.14.1: - version "0.14.5" - resolved "https://npm-registry.prod.contently.systems/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" - integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= - dependencies: - bluebird "^3.1.1" - -constants-browserify@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -conventional-changelog-angular@^5.0.0: - version "5.0.3" - resolved "https://npm-registry.prod.contently.systems/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0" - integrity sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA== - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - -conventional-changelog-writer@^4.0.0: - version "4.0.3" - resolved "https://npm-registry.prod.contently.systems/conventional-changelog-writer/-/conventional-changelog-writer-4.0.3.tgz#916a2b302d0bb5ef18efd236a034c13fb273cde1" - integrity sha512-bIlpSiQtQZ1+nDVHEEh798Erj2jhN/wEjyw9sfxY9es6h7pREE5BNJjfv0hXGH/FTrAsEpHUq4xzK99eePpwuA== - dependencies: - compare-func "^1.3.1" - conventional-commits-filter "^2.0.1" - dateformat "^3.0.0" - handlebars "^4.1.0" - json-stringify-safe "^5.0.1" - lodash "^4.2.1" - meow "^4.0.0" - semver "^5.5.0" - split "^1.0.0" - through2 "^2.0.0" - -conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz#55a135de1802f6510b6758e0a6aa9e0b28618db3" - integrity sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A== - dependencies: - is-subset "^0.1.1" - modify-values "^1.0.0" - -conventional-commits-parser@^3.0.0: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz#fe1c49753df3f98edb2285a5e485e11ffa7f2e4c" - integrity sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.0" - lodash "^4.2.1" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - trim-off-newlines "^1.0.0" - -convert-source-map@1.X, convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://npm-registry.prod.contently.systems/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@~1.1.0: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" - integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://npm-registry.prod.contently.systems/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -copy-props@^1.4.1: - version "1.6.0" - resolved "https://npm-registry.prod.contently.systems/copy-props/-/copy-props-1.6.0.tgz#f0324bbee99771101e7b3ada112f313c393db8ed" - integrity sha1-8DJLvumXcRAeezraES8xPDk9uO0= - dependencies: - each-props "^1.2.1" - is-plain-object "^2.0.1" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.9" - resolved "https://npm-registry.prod.contently.systems/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.1: - version "5.2.1" - resolved "https://npm-registry.prod.contently.systems/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://npm-registry.prod.contently.systems/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://npm-registry.prod.contently.systems/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0: - version "7.0.1" - resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@^3.0.0: - version "3.12.0" - resolved "https://npm-registry.prod.contently.systems/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - -css@2.X, css@^2.2.1: - version "2.2.4" - resolved "https://npm-registry.prod.contently.systems/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://npm-registry.prod.contently.systems/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://npm-registry.prod.contently.systems/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= - -d@1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dargs@^5.1.0: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" - integrity sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk= - -dash-ast@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" - integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://npm-registry.prod.contently.systems/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -date-now@^0.1.4: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://npm-registry.prod.contently.systems/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= - -dateformat@^3.0.0: - version "3.0.3" - resolved "https://npm-registry.prod.contently.systems/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - -deap@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/deap/-/deap-1.0.1.tgz#0646e9e1a095ffe8a9e404d68d1f76dcf57e66fb" - integrity sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw== - -debug-fabulous@1.X: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" - integrity sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg== - dependencies: - debug "3.X" - memoizee "0.4.X" - object-assign "4.X" - -debug@2.6.8: - version "2.6.8" - resolved "https://npm-registry.prod.contently.systems/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= - dependencies: - ms "2.0.0" - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://npm-registry.prod.contently.systems/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@3.1.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@3.2.6, debug@3.X, debug@^3.1.0, debug@^3.2.6: - version "3.2.6" - resolved "https://npm-registry.prod.contently.systems/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.0: - version "4.1.1" - resolved "https://npm-registry.prod.contently.systems/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@~0.8.1: - version "0.8.1" - resolved "https://npm-registry.prod.contently.systems/debug/-/debug-0.8.1.tgz#20ff4d26f5e422cb68a1bacbbb61039ad8c1c130" - integrity sha1-IP9NJvXkIstoobrLu2EDmtjBwTA= - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= - -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decomment@^0.9.0: - version "0.9.2" - resolved "https://npm-registry.prod.contently.systems/decomment/-/decomment-0.9.2.tgz#4dffdfbe96a32b0fdf301f758b7f92f7fbe82ab4" - integrity sha512-sblyUmOJZxiL7oJ2ogJS6jtl/67+CTOW87SrYE/96u3PhDYikYoLCdLzcnceToiQejOLlqNnLCkaxx/+nE/ehg== - dependencies: - esprima "4.0.1" - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://npm-registry.prod.contently.systems/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@3.3.0: - version "3.3.0" - resolved "https://npm-registry.prod.contently.systems/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== - -defaults@^1.0.0, defaults@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -define-properties@^1.1.2: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://npm-registry.prod.contently.systems/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@0.4.5: - version "0.4.5" - resolved "https://npm-registry.prod.contently.systems/depd/-/depd-0.4.5.tgz#1a664b53388b4a6573e8ae67b5f767c693ca97f1" - integrity sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E= - -depd@~1.1.2: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -deprecated@^0.0.1: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk= - -deprecation@^2.0.0: - version "2.3.1" - resolved "https://npm-registry.prod.contently.systems/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - -deps-sort@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" - integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= - dependencies: - JSONStream "^1.0.3" - shasum "^1.0.0" - subarg "^1.0.0" - through2 "^2.0.0" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - -detect-indent@~5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -detect-newline@2.X, detect-newline@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -detective@^5.0.2: - version "5.2.0" - resolved "https://npm-registry.prod.contently.systems/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" - integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== - dependencies: - acorn-node "^1.6.1" - defined "^1.0.0" - minimist "^1.1.1" - -dezalgo@^1.0.0, dezalgo@~1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= - dependencies: - asap "^2.0.0" - wrappy "1" - -diff@3.2.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" - integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= - -diff@3.5.0: - version "3.5.0" - resolved "https://npm-registry.prod.contently.systems/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://npm-registry.prod.contently.systems/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^2.0.0, dir-glob@^2.2.2: - version "2.2.2" - resolved "https://npm-registry.prod.contently.systems/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - -dir-glob@^3.0.0, dir-glob@^3.0.1: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dom-serializer@0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= - -domain-browser@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1, domelementtype@^1.3.0: - version "1.3.1" - resolved "https://npm-registry.prod.contently.systems/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domhandler@2.3: - version "2.3.0" - resolved "https://npm-registry.prod.contently.systems/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" - integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= - dependencies: - domelementtype "1" - -domutils@1.5: - version "1.5.1" - resolved "https://npm-registry.prod.contently.systems/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= - dependencies: - is-obj "^1.0.0" - -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://npm-registry.prod.contently.systems/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - dependencies: - is-obj "^1.0.0" - -dotenv@^5.0.1: - version "5.0.1" - resolved "https://npm-registry.prod.contently.systems/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" - integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://npm-registry.prod.contently.systems/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= - dependencies: - readable-stream "~1.1.9" - -duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -duplexer@~0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://npm-registry.prod.contently.systems/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -each-props@^1.2.1: - version "1.3.2" - resolved "https://npm-registry.prod.contently.systems/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" - integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== - dependencies: - is-plain-object "^2.0.1" - object.defaults "^1.1.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -editor@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" - integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= - -ee-first@1.0.5: - version "1.0.5" - resolved "https://npm-registry.prod.contently.systems/ee-first/-/ee-first-1.0.5.tgz#8c9b212898d8cd9f1a9436650ce7be202c9e9ff0" - integrity sha1-jJshKJjYzZ8alDZlDOe+ICyen/A= - -ee-first@1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.30: - version "1.3.167" - resolved "https://npm-registry.prod.contently.systems/electron-to-chromium/-/electron-to-chromium-1.3.167.tgz#6c22e5384a6b54fb13136ca5b3ade5daac9bf894" - integrity sha512-84IjpeRudjP43Q0+K7tlS7ESoHOl0W6CIdzs5reS9p+sAjCQEDiaAyiXN2v1qLUdL+Of6ZSaH4Cq6bl+sfzy8A== - -elliptic@^6.0.0: - version "6.4.1" - resolved "https://npm-registry.prod.contently.systems/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://npm-registry.prod.contently.systems/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@^0.1.11: - version "0.1.12" - resolved "https://npm-registry.prod.contently.systems/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://npm-registry.prod.contently.systems/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== - dependencies: - once "^1.4.0" - -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://npm-registry.prod.contently.systems/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8= - dependencies: - once "~1.3.0" - -entities@1.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" - integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= - -entities@^1.1.1: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -env-ci@^4.0.0: - version "4.1.1" - resolved "https://npm-registry.prod.contently.systems/env-ci/-/env-ci-4.1.1.tgz#b8438fc7258a0dc7a4f4c4816de730767946a718" - integrity sha512-eTgpkALDeYRGNhYM2fO9LKsWDifoUgKL7hxpPZqFMP2IU7f+r89DtKqCmk3yQB/jxS8CmZTfKnWO5TiIDFs9Hw== - dependencies: - execa "^1.0.0" - java-properties "^1.0.0" - -err-code@^1.0.0: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= - -errno@~0.1.7: - version "0.1.7" - resolved "https://npm-registry.prod.contently.systems/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://npm-registry.prod.contently.systems/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.5.0, es-abstract@^1.5.1: - version "1.13.0" - resolved "https://npm-registry.prod.contently.systems/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.50" - resolved "https://npm-registry.prod.contently.systems/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" - integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "^1.0.0" - -es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://npm-registry.prod.contently.systems/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= - -es6-promise@^3.1.2: - version "3.3.1" - resolved "https://npm-registry.prod.contently.systems/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://npm-registry.prod.contently.systems/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://npm-registry.prod.contently.systems/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.2: - version "2.0.3" - resolved "https://npm-registry.prod.contently.systems/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://npm-registry.prod.contently.systems/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@4.0.1, esprima@^4.0.0, esprima@~4.0.0: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esutils@^2.0.2: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= - -etag@~1.8.1: - version "1.8.1" - resolved "https://npm-registry.prod.contently.systems/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://npm-registry.prod.contently.systems/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - -event-stream@~3.1.0: - version "3.1.7" - resolved "https://npm-registry.prod.contently.systems/event-stream/-/event-stream-3.1.7.tgz#b4c540012d0fe1498420f3d8946008db6393c37a" - integrity sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o= - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.2" - stream-combiner "~0.0.4" - through "~2.3.1" - -events@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" - integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.6.0: - version "0.6.3" - resolved "https://npm-registry.prod.contently.systems/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" - integrity sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.7.0: - version "0.7.0" - resolved "https://npm-registry.prod.contently.systems/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^3.2.0: - version "3.3.0" - resolved "https://npm-registry.prod.contently.systems/execa/-/execa-3.3.0.tgz#7e348eef129a1937f21ecbbd53390942653522c1" - integrity sha512-j5Vit5WZR/cbHlqU97+qcnw9WHRCIL4V1SVe75VcHcD1JRBdt8fv0zw89b7CQHQdUHTt2VjuhcF5ibAgVOxqpg== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -exit@0.1.2, exit@0.1.x: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://npm-registry.prod.contently.systems/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://npm-registry.prod.contently.systems/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://npm-registry.prod.contently.systems/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://npm-registry.prod.contently.systems/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= - dependencies: - kind-of "^1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0, extend@~3.0.2: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^0.3.1: - version "0.3.2" - resolved "https://npm-registry.prod.contently.systems/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://npm-registry.prod.contently.systems/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fancy-log@^1.0.0, fancy-log@^1.1.0, fancy-log@^1.3.2: - version "1.3.3" - resolved "https://npm-registry.prod.contently.systems/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-glob@^2.2.6: - version "2.2.7" - resolved "https://npm-registry.prod.contently.systems/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.0.3: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae" - integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -fastq@^1.6.0: - version "1.6.0" - resolved "https://npm-registry.prod.contently.systems/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" - integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== - dependencies: - reusify "^1.0.0" - -faye-websocket@~0.7.2: - version "0.7.3" - resolved "https://npm-registry.prod.contently.systems/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" - integrity sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE= - dependencies: - websocket-driver ">=0.3.6" - -figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://npm-registry.prod.contently.systems/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== - -figures@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" - integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== - dependencies: - escape-string-regexp "^1.0.5" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://npm-registry.prod.contently.systems/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://npm-registry.prod.contently.systems/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-index@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= - -find-npm-prefix@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" - integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA== - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-versions@^3.0.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/find-versions/-/find-versions-3.1.0.tgz#10161f29cf3eb4350dec10a29bdde75bff0df32d" - integrity sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q== - dependencies: - array-uniq "^2.1.0" - semver-regex "^2.0.0" - -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -findup-sync@~0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" - integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY= - dependencies: - glob "~5.0.0" - -fined@^1.0.1: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" - integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= - -flagged-respawn@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" - integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== - -flat@^4.1.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -for-each@^0.3.3: - version "0.3.3" - resolved "https://npm-registry.prod.contently.systems/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.4: - version "0.1.5" - resolved "https://npm-registry.prod.contently.systems/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -for-own@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://npm-registry.prod.contently.systems/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://npm-registry.prod.contently.systems/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://npm-registry.prod.contently.systems/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" - integrity sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0= - dependencies: - inherits "~2.0.1" - readable-stream "~1.1.10" - -from2@^2.1.0, from2@^2.3.0: - version "2.3.0" - resolved "https://npm-registry.prod.contently.systems/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -from@~0: - version "0.1.7" - resolved "https://npm-registry.prod.contently.systems/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= - -fs-extra@^8.0.0: - version "8.0.1" - resolved "https://npm-registry.prod.contently.systems/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" - integrity sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.6" - resolved "https://npm-registry.prod.contently.systems/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" - integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== - dependencies: - minipass "^2.2.1" - -fs-readfile-promise@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz#80023823981f9ffffe01609e8be668f69ae49e70" - integrity sha1-gAI4I5gfn//+AWCei+Zo9prknnA= - dependencies: - graceful-fs "^4.1.2" - -fs-vacuum@^1.2.10, fs-vacuum@~1.2.10: - version "1.2.10" - resolved "https://npm-registry.prod.contently.systems/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" - integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY= - dependencies: - graceful-fs "^4.1.2" - path-is-inside "^1.0.1" - rimraf "^2.5.2" - -fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10: - version "1.0.10" - resolved "https://npm-registry.prod.contently.systems/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.9" - resolved "https://npm-registry.prod.contently.systems/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://npm-registry.prod.contently.systems/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2, function-bind@^1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://npm-registry.prod.contently.systems/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^0.5.1: - version "0.5.2" - resolved "https://npm-registry.prod.contently.systems/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8= - dependencies: - globule "~0.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - -genfun@^5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" - integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== - -gentle-fs@^2.0.0, gentle-fs@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687" - integrity sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew== - dependencies: - aproba "^1.1.2" - fs-vacuum "^1.2.10" - graceful-fs "^4.1.11" - iferr "^0.1.5" - mkdirp "^0.5.1" - path-is-inside "^1.0.2" - read-cmd-shim "^1.0.1" - slide "^1.1.6" - -get-assigned-identifiers@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" - integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://npm-registry.prod.contently.systems/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" - integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0, get-stream@^4.1.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://npm-registry.prod.contently.systems/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://npm-registry.prod.contently.systems/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -git-log-parser@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" - integrity sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo= - dependencies: - argv-formatter "~1.0.0" - spawn-error-forwarder "~1.0.0" - split2 "~1.0.0" - stream-combiner2 "~1.1.1" - through2 "~2.0.0" - traverse "~0.6.6" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.1.0: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== - dependencies: - is-glob "^4.0.1" - -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://npm-registry.prod.contently.systems/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs= - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://npm-registry.prod.contently.systems/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs= - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://npm-registry.prod.contently.systems/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= - dependencies: - find-index "^0.1.1" - -glob@7.1.1: - version "7.1.1" - resolved "https://npm-registry.prod.contently.systems/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.3: - version "7.1.3" - resolved "https://npm-registry.prod.contently.systems/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^4.3.1: - version "4.5.3" - resolved "https://npm-registry.prod.contently.systems/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: - version "7.1.4" - resolved "https://npm-registry.prod.contently.systems/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.1.21: - version "3.1.21" - resolved "https://npm-registry.prod.contently.systems/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -glob@~5.0.0: - version "5.0.15" - resolved "https://npm-registry.prod.contently.systems/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global@4.3.2, global@~4.3.0: - version "4.3.2" - resolved "https://npm-registry.prod.contently.systems/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -global@^4.3.0, global@^4.3.1, global@^4.3.2: - version "4.4.0" - resolved "https://npm-registry.prod.contently.systems/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^9.18.0: - version "9.18.0" - resolved "https://npm-registry.prod.contently.systems/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globby@^10.0.0: - version "10.0.1" - resolved "https://npm-registry.prod.contently.systems/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" - integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^9.0.0: - version "9.2.0" - resolved "https://npm-registry.prod.contently.systems/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -globule@^1.0.0: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - -globule@~0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU= - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" - integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== - dependencies: - sparkles "^1.0.0" - -got@^6.7.1: - version "6.7.1" - resolved "https://npm-registry.prod.contently.systems/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@4.X, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.15" - resolved "https://npm-registry.prod.contently.systems/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://npm-registry.prod.contently.systems/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg= - dependencies: - natives "^1.1.0" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://npm-registry.prod.contently.systems/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= - -growl@1.10.5: - version "1.10.5" - resolved "https://npm-registry.prod.contently.systems/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -growl@1.9.2: - version "1.9.2" - resolved "https://npm-registry.prod.contently.systems/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= - -gulp-autoprefixer@^4.1.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/gulp-autoprefixer/-/gulp-autoprefixer-4.1.0.tgz#064af73cc02cadac8ff34d0bf93ffdfb94ea12aa" - integrity sha1-Bkr3PMAsrayP800L+T/9+5TqEqo= - dependencies: - autoprefixer "^7.0.0" - fancy-log "^1.3.2" - plugin-error "^0.1.2" - postcss "^6.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-babel@^6.1.3: - version "6.1.3" - resolved "https://npm-registry.prod.contently.systems/gulp-babel/-/gulp-babel-6.1.3.tgz#5aad8acb0db6b7f2f0be19eeee9528f2064df631" - integrity sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ== - dependencies: - babel-core "^6.23.1" - object-assign "^4.0.1" - plugin-error "^1.0.1" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-cli@^1.4.0: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/gulp-cli/-/gulp-cli-1.4.0.tgz#6f5bbe2cd0bdb4849d12cf9e1246a5861f8b4f88" - integrity sha1-b1u+LNC9tISdEs+eEkalhh+LT4g= - dependencies: - archy "^1.0.0" - chalk "^1.1.0" - copy-props "^1.4.1" - fancy-log "^1.1.0" - gulplog "^1.0.0" - interpret "^1.0.0" - liftoff "^2.3.0" - lodash.isfunction "^3.0.8" - lodash.isplainobject "^4.0.4" - lodash.sortby "^4.5.0" - matchdep "^1.0.0" - mute-stdout "^1.0.0" - pretty-hrtime "^1.0.0" - semver-greatest-satisfied-range "^1.0.0" - tildify "^1.0.0" - v8flags "^2.0.9" - wreck "^6.3.0" - yargs "^3.28.0" - -gulp-concat@^2.6.1: - version "2.6.1" - resolved "https://npm-registry.prod.contently.systems/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" - integrity sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M= - dependencies: - concat-with-sourcemaps "^1.0.0" - through2 "^2.0.0" - vinyl "^2.0.0" - -gulp-debug@^3.2.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/gulp-debug/-/gulp-debug-3.2.0.tgz#45aba4439fa79fe0788f6a411ee0778f4492dfa5" - integrity sha512-2LZzP+ydczqz1rhqq/NYxvVvYTmOa0IgBl2B1sQTdkQgku9ayOUM/KHuGPjF4QA5aO1VcG+Sskw7iCcRUqHKkA== - dependencies: - chalk "^2.3.0" - fancy-log "^1.3.2" - plur "^2.0.0" - stringify-object "^3.0.0" - through2 "^2.0.0" - tildify "^1.1.2" - -gulp-declare@^0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/gulp-declare/-/gulp-declare-0.3.0.tgz#86830fc6faa88e06382162c8664b8e94957afcd9" - integrity sha1-hoMPxvqojgY4IWLIZkuOlJV6/Nk= - dependencies: - nsdeclare "^0.1.0" - vinyl-map "^1.0.1" - xtend "^4.0.0" - -gulp-delete-lines@0.0.7: - version "0.0.7" - resolved "https://npm-registry.prod.contently.systems/gulp-delete-lines/-/gulp-delete-lines-0.0.7.tgz#512143429ce7ae7f2e0a8a309f7a0f61ea069555" - integrity sha1-USFDQpznrn8uCoown3oPYeoGlVU= - dependencies: - event-stream "~3.1.0" - gulp-util ">=2.2.0" - -gulp-handlebars@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/gulp-handlebars/-/gulp-handlebars-4.0.0.tgz#b5ff46a4197e7ccc9f259a5092a2c29f47953b29" - integrity sha1-tf9GpBl+fMyfJZpQkqLCn0eVOyk= - dependencies: - gulp-util "^3.0.4" - handlebars "^3.0.0" - through2 "^0.6.3" - -gulp-insert@^0.5.0: - version "0.5.0" - resolved "https://npm-registry.prod.contently.systems/gulp-insert/-/gulp-insert-0.5.0.tgz#32313f13e4a23cf5acca5ce5f0c080923c778602" - integrity sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI= - dependencies: - readable-stream "^1.0.26-4" - streamqueue "0.0.6" - -gulp-jshint@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/gulp-jshint/-/gulp-jshint-2.1.0.tgz#bfaf927f78eee263c5bbac5f63e314d44a7bd41e" - integrity sha512-sP3NK8Y/1e58O0PH9t6s7DAr/lKDSUbIY207oWSeufM6/VclB7jJrIBcPCsyhrFTCDUl9DauePbt6VqP2vPM5w== - dependencies: - lodash "^4.12.0" - minimatch "^3.0.3" - plugin-error "^0.1.2" - rcloader "^0.2.2" - through2 "^2.0.0" - -gulp-mocha@^4.3.1: - version "4.3.1" - resolved "https://npm-registry.prod.contently.systems/gulp-mocha/-/gulp-mocha-4.3.1.tgz#77950b43bcff816595767c0734e0fda7d173dcd9" - integrity sha1-d5ULQ7z/gWWVdnwHNOD9p9Fz3Nk= - dependencies: - dargs "^5.1.0" - execa "^0.6.0" - gulp-util "^3.0.0" - mocha "^3.0.0" - npm-run-path "^2.0.2" - through2 "^2.0.3" - -gulp-rename@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd" - integrity sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg== - -gulp-replace@^0.5.4: - version "0.5.4" - resolved "https://npm-registry.prod.contently.systems/gulp-replace/-/gulp-replace-0.5.4.tgz#69a67914bbd13c562bff14f504a403796aa0daa9" - integrity sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk= - dependencies: - istextorbinary "1.0.2" - readable-stream "^2.0.1" - replacestream "^4.0.0" - -gulp-sass@^3.2.1: - version "3.2.1" - resolved "https://npm-registry.prod.contently.systems/gulp-sass/-/gulp-sass-3.2.1.tgz#2e3688a96fd8be1c0c01340750c191b2e79fab94" - integrity sha512-UATbRpSDsyXCnpYSPBUEvdvtSEzksJs7/oQ0CujIpzKqKrO6vlnYwhX2UTsGrf4rNLwqlSSaM271It0uHYvJ3Q== - dependencies: - gulp-util "^3.0" - lodash.clonedeep "^4.3.2" - node-sass "^4.8.3" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-sourcemaps@^2.6.4: - version "2.6.5" - resolved "https://npm-registry.prod.contently.systems/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6" - integrity sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg== - dependencies: - "@gulp-sourcemaps/identity-map" "1.X" - "@gulp-sourcemaps/map-sources" "1.X" - acorn "5.X" - convert-source-map "1.X" - css "2.X" - debug-fabulous "1.X" - detect-newline "2.X" - graceful-fs "4.X" - source-map "~0.6.0" - strip-bom-string "1.X" - through2 "2.X" - -gulp-strip-comments@^2.5.2: - version "2.5.2" - resolved "https://npm-registry.prod.contently.systems/gulp-strip-comments/-/gulp-strip-comments-2.5.2.tgz#d97e1d8b0be205600b1a2923d4f8b6b558bfbfc6" - integrity sha512-lb1bW7rsPWDD8f4ZPSguDvmCdjKmjr5HR4yZb9ros3sLl5AfW7oUj8KzY9/VRisT7dG8dL7hVHzNpQEVxfwZGQ== - dependencies: - decomment "^0.9.0" - plugin-error "^0.1.2" - through2 "^2.0.3" - -gulp-uglify@^1.5.4: - version "1.5.4" - resolved "https://npm-registry.prod.contently.systems/gulp-uglify/-/gulp-uglify-1.5.4.tgz#524788d87666d09f9d0c21fb2177f90039a658c9" - integrity sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk= - dependencies: - deap "^1.0.0" - fancy-log "^1.0.0" - gulp-util "^3.0.0" - isobject "^2.0.0" - through2 "^2.0.0" - uglify-js "2.6.4" - uglify-save-license "^0.4.1" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-util@>=2.2.0, gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.3, gulp-util@^3.0.4, gulp-util@^3.0.8: - version "3.0.8" - resolved "https://npm-registry.prod.contently.systems/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@^2.2.19: - version "2.2.20" - resolved "https://npm-registry.prod.contently.systems/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw= - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - -gulp-webserver@^0.9.1: - version "0.9.1" - resolved "https://npm-registry.prod.contently.systems/gulp-webserver/-/gulp-webserver-0.9.1.tgz#e09992165d97c5865616d642a1601529b0367064" - integrity sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ= - dependencies: - connect "^3.0.1" - connect-livereload "^0.4.0" - gulp-util "^2.2.19" - isarray "0.0.1" - node.extend "^1.0.10" - open "^0.0.5" - proxy-middleware "^0.5.0" - serve-index "^1.1.4" - serve-static "^1.3.0" - through2 "^0.5.1" - tiny-lr "0.1.4" - watch "^0.11.0" - -gulp-wrap@^0.13.0: - version "0.13.0" - resolved "https://npm-registry.prod.contently.systems/gulp-wrap/-/gulp-wrap-0.13.0.tgz#90fb0b4a27a266433832ff7c6122db5c1ee894c6" - integrity sha1-kPsLSieiZkM4Mv98YSLbXB7olMY= - dependencies: - consolidate "^0.14.1" - es6-promise "^3.1.2" - fs-readfile-promise "^2.0.1" - gulp-util "^3.0.3" - js-yaml "^3.2.6" - lodash "^4.11.1" - node.extend "^1.1.2" - through2 "^2.0.1" - tryit "^1.0.1" - vinyl-bufferstream "^1.0.1" - -gulp@^3.9.1: - version "3.9.1" - resolved "https://npm-registry.prod.contently.systems/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= - dependencies: - glogg "^1.0.0" - -handlebars@^3.0.0: - version "3.0.6" - resolved "https://npm-registry.prod.contently.systems/handlebars/-/handlebars-3.0.6.tgz#61cf316cf98395971d38c66523fa530b8a3c7ed2" - integrity sha512-LxzdOvkYFsdL6ZT92igXthJIZLYKBSowtrM3oxfMdOwjv0dRWk6EK4PygNgXc0xwjH38BWMCSnktrOpKbec+Qw== - dependencies: - optimist "^0.6.1" - source-map "^0.1.40" - optionalDependencies: - uglify-js "^2.6" - -handlebars@^4.0.11, handlebars@^4.1.0: - version "4.1.2" - resolved "https://npm-registry.prod.contently.systems/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://npm-registry.prod.contently.systems/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= - dependencies: - ansi-regex "^0.2.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4= - dependencies: - sparkles "^1.0.0" - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has-unicode@^2.0.0, has-unicode@~2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://npm-registry.prod.contently.systems/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://npm-registry.prod.contently.systems/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://npm-registry.prod.contently.systems/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - -he@1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@2.x.x: - version "2.16.3" - resolved "https://npm-registry.prod.contently.systems/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hook-std@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" - integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g== - -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: - version "2.7.1" - resolved "https://npm-registry.prod.contently.systems/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== - -hosted-git-info@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/hosted-git-info/-/hosted-git-info-3.0.0.tgz#dd8af49cd01e73cc8e61ba13e217a772fd4ecd2d" - integrity sha512-zYSx1cP4MLsvKtTg8DF/PI6e6FHZ3wcawcTGsrLU2TM+UfD4jmSrn2wdQT16TFbH3lO4PIdjLG0E+cuYDgFD9g== - dependencies: - lru-cache "^5.1.1" - -htmlescape@^1.1.0: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" - integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= - -htmlparser2@3.8.x: - version "3.8.3" - resolved "https://npm-registry.prod.contently.systems/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" - integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= - dependencies: - domelementtype "1" - domhandler "2.3" - domutils "1.5" - entities "1.0" - readable-stream "1.1" - -http-cache-semantics@^3.8.1: - version "3.8.1" - resolved "https://npm-registry.prod.contently.systems/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://npm-registry.prod.contently.systems/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@~1.7.2: - version "1.7.2" - resolved "https://npm-registry.prod.contently.systems/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://npm-registry.prod.contently.systems/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= - -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -https-proxy-agent@^2.2.1: - version "2.2.1" - resolved "https://npm-registry.prod.contently.systems/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== - dependencies: - agent-base "^4.1.0" - debug "^3.1.0" - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= - dependencies: - ms "^2.0.0" - -iconv-lite@0.4.4: - version "0.4.4" - resolved "https://npm-registry.prod.contently.systems/iconv-lite/-/iconv-lite-0.4.4.tgz#e95f2e41db0735fc21652f7827a5ee32e63c83a8" - integrity sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g= - -iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.24" - resolved "https://npm-registry.prod.contently.systems/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ie-array-find-polyfill@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/ie-array-find-polyfill/-/ie-array-find-polyfill-1.1.0.tgz#5078e533f026831da22bd7476513d9460d65a142" - integrity sha1-UHjlM/Amgx2iK9dHZRPZRg1loUI= - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://npm-registry.prod.contently.systems/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://npm-registry.prod.contently.systems/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -iferr@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d" - integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg== - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - dependencies: - minimatch "^3.0.4" - -ignore@^4.0.3: - version "4.0.6" - resolved "https://npm-registry.prod.contently.systems/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1: - version "5.1.4" - resolved "https://npm-registry.prod.contently.systems/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-from@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -in-publish@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^3.0.0, indent-string@^3.2.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -individual@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97" - integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c= - -inflight@^1.0.4, inflight@~1.0.6: - version "1.0.6" - resolved "https://npm-registry.prod.contently.systems/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://npm-registry.prod.contently.systems/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -init-package-json@^1.10.3: - version "1.10.3" - resolved "https://npm-registry.prod.contently.systems/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" - integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== - dependencies: - glob "^7.1.1" - npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" - promzard "^0.3.0" - read "~1.0.1" - read-package-json "1 || 2" - semver "2.x || 3.x || 4 || 5" - validate-npm-package-license "^3.0.1" - validate-npm-package-name "^3.0.0" - -inline-source-map@~0.6.0: - version "0.6.2" - resolved "https://npm-registry.prod.contently.systems/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" - integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= - dependencies: - source-map "~0.5.3" - -insert-module-globals@^7.0.0: - version "7.2.0" - resolved "https://npm-registry.prod.contently.systems/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" - integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== - dependencies: - JSONStream "^1.0.3" - acorn-node "^1.5.2" - combine-source-map "^0.8.0" - concat-stream "^1.6.1" - is-buffer "^1.1.0" - path-is-absolute "^1.0.1" - process "~0.11.0" - through2 "^2.0.0" - undeclared-identifiers "^1.1.2" - xtend "^4.0.0" - -interpret@^1.0.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - -into-stream@^5.0.0: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/into-stream/-/into-stream-5.1.0.tgz#b05f37d8fed05c06a0b43b556d74e53e5af23878" - integrity sha512-cbDhb8qlxKMxPBk/QxTtYg1DQ4CwXmadu7quG3B7nrJsgSncEreF2kwWKZFdnjc/lSNNIkFPsjI7SM0Cx/QXPw== - dependencies: - from2 "^2.3.0" - p-is-promise "^2.0.0" - -invariant@^2.2.2: - version "2.2.4" - resolved "https://npm-registry.prod.contently.systems/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.5: - version "1.1.5" - resolved "https://npm-registry.prod.contently.systems/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -irregular-plurals@^1.0.0: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" - integrity sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y= - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://npm-registry.prod.contently.systems/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.0, is-buffer@^1.1.5: - version "1.1.6" - resolved "https://npm-registry.prod.contently.systems/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@~2.0.3: - version "2.0.3" - resolved "https://npm-registry.prod.contently.systems/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" - integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== - -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://npm-registry.prod.contently.systems/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - -is-cidr@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/is-cidr/-/is-cidr-3.0.0.tgz#1acf35c9e881063cd5f696d48959b30fed3eed56" - integrity sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q== - dependencies: - cidr-regex "^2.0.10" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://npm-registry.prod.contently.systems/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://npm-registry.prod.contently.systems/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://npm-registry.prod.contently.systems/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-function@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - -is-number@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.0, is-obj@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://npm-registry.prod.contently.systems/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-promise@^2.1: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-subset@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== - dependencies: - has-symbols "^1.0.0" - -is-text-path@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= - dependencies: - text-extensions "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is@^3.2.1: - version "3.3.0" - resolved "https://npm-registry.prod.contently.systems/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" - integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg== - -isarray@0.0.1: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isobject@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -issue-parser@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/issue-parser/-/issue-parser-4.0.0.tgz#397817323abbb70c7c29cea2ff62448cf83b686c" - integrity sha512-1RmmAXHl5+cqTZ9dRr861xWy0Gkc9TWTEklgjKv+nhlB1dY1NmGBV8b20jTWRL5cPGpOIXkz84kEcDBM8Nc0cw== - dependencies: - lodash.capitalize "^4.2.1" - lodash.escaperegexp "^4.1.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.uniqby "^4.7.0" - -istextorbinary@1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" - integrity sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8= - dependencies: - binaryextensions "~1.0.0" - textextensions "~1.0.0" - -java-properties@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/java-properties/-/java-properties-1.0.1.tgz#ea0b5986c0894d73cf2a44de8bd216c459a07a94" - integrity sha512-HbTaaXlIHoDVNXjmp4flOBWOfYBkrVN8dD1tp4m+95M/ADSDW/BxWbiwyVIhw/2+5d0cof4PHZCbE7+S1ukTQw== - -js-base64@^2.1.8: - version "2.5.1" - resolved "https://npm-registry.prod.contently.systems/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" - integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@3.13.1, js-yaml@^3.13.1, js-yaml@^3.2.6: - version "3.13.1" - resolved "https://npm-registry.prod.contently.systems/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://npm-registry.prod.contently.systems/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -jshint-stylish@~2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/jshint-stylish/-/jshint-stylish-2.0.1.tgz#845bf38386e55551ff9f840cc7725f7a88b5b2d4" - integrity sha1-hFvzg4blVVH/n4QMx3Jfeoi1stQ= - dependencies: - chalk "^1.0.0" - log-symbols "^1.0.0" - plur "^1.0.0" - string-length "^1.0.0" - text-table "^0.2.0" - -jshint@^2.9.6: - version "2.10.2" - resolved "https://npm-registry.prod.contently.systems/jshint/-/jshint-2.10.2.tgz#ed6626c4f8223c98e94aaea62767435427a49a3d" - integrity sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA== - dependencies: - cli "~1.0.0" - console-browserify "1.1.x" - exit "0.1.x" - htmlparser2 "3.8.x" - lodash "~4.17.11" - minimatch "~3.0.2" - shelljs "0.3.x" - strip-json-comments "1.0.x" - -json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://npm-registry.prod.contently.systems/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://npm-registry.prod.contently.systems/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stable-stringify@~0.0.0: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" - integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://npm-registry.prod.contently.systems/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json3@3.3.2: - version "3.3.2" - resolved "https://npm-registry.prod.contently.systems/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= - -json5@^0.5.1: - version "0.5.1" - resolved "https://npm-registry.prod.contently.systems/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://npm-registry.prod.contently.systems/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://npm-registry.prod.contently.systems/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://npm-registry.prod.contently.systems/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -keycode@^2.2.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" - integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= - -kind-of@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -labeled-stream-splicer@^2.0.0: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" - integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== - dependencies: - inherits "^2.0.1" - stream-splicer "^2.0.0" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - dependencies: - package-json "^4.0.0" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -lazy-property@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" - integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc= - -lcid@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -libcipm@^3.0.3: - version "3.0.3" - resolved "https://npm-registry.prod.contently.systems/libcipm/-/libcipm-3.0.3.tgz#2e764effe0b90d458790dab3165794c804075ed3" - integrity sha512-71V5CpTI+zFydTc5IjJ/tx8JHbXEJvmYF2zaSVW1V3X1rRnRjXqh44iuiyry1xgi3ProUQ1vX1uwFiWs00+2og== - dependencies: - bin-links "^1.1.2" - bluebird "^3.5.1" - figgy-pudding "^3.5.1" - find-npm-prefix "^1.0.2" - graceful-fs "^4.1.11" - ini "^1.3.5" - lock-verify "^2.0.2" - mkdirp "^0.5.1" - npm-lifecycle "^2.0.3" - npm-logical-tree "^1.2.1" - npm-package-arg "^6.1.0" - pacote "^9.1.0" - read-package-json "^2.0.13" - rimraf "^2.6.2" - worker-farm "^1.6.0" - -libnpm@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/libnpm/-/libnpm-2.0.1.tgz#a48fcdee3c25e13c77eb7c60a0efe561d7fb0d8f" - integrity sha512-qTKoxyJvpBxHZQB6k0AhSLajyXq9ZE/lUsZzuHAplr2Bpv9G+k4YuYlExYdUCeVRRGqcJt8hvkPh4tBwKoV98w== - dependencies: - bin-links "^1.1.2" - bluebird "^3.5.3" - find-npm-prefix "^1.0.2" - libnpmaccess "^3.0.1" - libnpmconfig "^1.2.1" - libnpmhook "^5.0.2" - libnpmorg "^1.0.0" - libnpmpublish "^1.1.0" - libnpmsearch "^2.0.0" - libnpmteam "^1.0.1" - lock-verify "^2.0.2" - npm-lifecycle "^2.1.0" - npm-logical-tree "^1.2.1" - npm-package-arg "^6.1.0" - npm-profile "^4.0.1" - npm-registry-fetch "^3.8.0" - npmlog "^4.1.2" - pacote "^9.2.3" - read-package-json "^2.0.13" - stringify-package "^1.0.0" - -libnpmaccess@^3.0.1: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/libnpmaccess/-/libnpmaccess-3.0.1.tgz#5b3a9de621f293d425191aa2e779102f84167fa8" - integrity sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA== - dependencies: - aproba "^2.0.0" - get-stream "^4.0.0" - npm-package-arg "^6.1.0" - npm-registry-fetch "^3.8.0" - -libnpmconfig@^1.2.1: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0" - integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA== - dependencies: - figgy-pudding "^3.5.1" - find-up "^3.0.0" - ini "^1.3.5" - -libnpmhook@^5.0.2: - version "5.0.2" - resolved "https://npm-registry.prod.contently.systems/libnpmhook/-/libnpmhook-5.0.2.tgz#d12817b0fb893f36f1d5be20017f2aea25825d94" - integrity sha512-vLenmdFWhRfnnZiNFPNMog6CK7Ujofy2TWiM2CrpZUjBRIhHkJeDaAbJdYCT6W4lcHtyrJR8yXW8KFyq6UAp1g== - dependencies: - aproba "^2.0.0" - figgy-pudding "^3.4.1" - get-stream "^4.0.0" - npm-registry-fetch "^3.8.0" - -libnpmorg@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/libnpmorg/-/libnpmorg-1.0.0.tgz#979b868c48ba28c5820e3bb9d9e73c883c16a232" - integrity sha512-o+4eVJBoDGMgRwh2lJY0a8pRV2c/tQM/SxlqXezjcAg26Qe9jigYVs+Xk0vvlYDWCDhP0g74J8UwWeAgsB7gGw== - dependencies: - aproba "^2.0.0" - figgy-pudding "^3.4.1" - get-stream "^4.0.0" - npm-registry-fetch "^3.8.0" - -libnpmpublish@^1.1.0: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/libnpmpublish/-/libnpmpublish-1.1.1.tgz#ff0c6bb0b4ad2bda2ad1f5fba6760a4af37125f0" - integrity sha512-nefbvJd/wY38zdt+b9SHL6171vqBrMtZ56Gsgfd0duEKb/pB8rDT4/ObUQLrHz1tOfht1flt2zM+UGaemzAG5g== - dependencies: - aproba "^2.0.0" - figgy-pudding "^3.5.1" - get-stream "^4.0.0" - lodash.clonedeep "^4.5.0" - normalize-package-data "^2.4.0" - npm-package-arg "^6.1.0" - npm-registry-fetch "^3.8.0" - semver "^5.5.1" - ssri "^6.0.1" - -libnpmsearch@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/libnpmsearch/-/libnpmsearch-2.0.1.tgz#eccc73a8fbf267d765d18082b85daa2512501f96" - integrity sha512-K0yXyut9MHHCAH+DOiglQCpmBKPZXSUu76+BE2maSEfQN15OwNaA/Aiioe9lRFlVFOr7WcuJCY+VSl+gLi9NTA== - dependencies: - figgy-pudding "^3.5.1" - get-stream "^4.0.0" - npm-registry-fetch "^3.8.0" - -libnpmteam@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/libnpmteam/-/libnpmteam-1.0.1.tgz#ff704b1b6c06ea674b3b1101ac3e305f5114f213" - integrity sha512-gDdrflKFCX7TNwOMX1snWojCoDE5LoRWcfOC0C/fqF7mBq8Uz9zWAX4B2RllYETNO7pBupBaSyBDkTAC15cAMg== - dependencies: - aproba "^2.0.0" - figgy-pudding "^3.4.1" - get-stream "^4.0.0" - npm-registry-fetch "^3.8.0" - -libnpx@^10.2.0: - version "10.2.0" - resolved "https://npm-registry.prod.contently.systems/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102" - integrity sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ== - dependencies: - dotenv "^5.0.1" - npm-package-arg "^6.0.0" - rimraf "^2.6.2" - safe-buffer "^5.1.0" - update-notifier "^2.3.0" - which "^1.3.0" - y18n "^4.0.0" - yargs "^11.0.0" - -liftoff@^2.1.0, liftoff@^2.3.0: - version "2.5.0" - resolved "https://npm-registry.prod.contently.systems/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" - integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= - dependencies: - extend "^3.0.0" - findup-sync "^2.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lock-verify@^2.0.2, lock-verify@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/lock-verify/-/lock-verify-2.1.0.tgz#fff4c918b8db9497af0c5fa7f6d71555de3ceb47" - integrity sha512-vcLpxnGvrqisKvLQ2C2v0/u7LVly17ak2YSgoK4PrdsYBXQIax19vhKiLfvKNFx7FRrpTnitrpzF/uuCMuorIg== - dependencies: - npm-package-arg "^6.1.0" - semver "^5.4.1" - -lockfile@^1.0.4: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== - dependencies: - signal-exit "^3.0.2" - -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= - -lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://npm-registry.prod.contently.systems/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= - -lodash._baseuniq@~4.6.0: - version "4.6.0" - resolved "https://npm-registry.prod.contently.systems/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" - integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg= - dependencies: - lodash._createset "~4.0.0" - lodash._root "~3.0.0" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= - -lodash._createset@~4.0.0: - version "4.0.3" - resolved "https://npm-registry.prod.contently.systems/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" - integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= - -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0= - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I= - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://npm-registry.prod.contently.systems/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs= - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://npm-registry.prod.contently.systems/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= - -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo= - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0= - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI= - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c= - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._root@^3.0.0, lodash._root@~3.0.0: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://npm-registry.prod.contently.systems/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - -lodash.capitalize@^4.2.1: - version "4.2.1" - resolved "https://npm-registry.prod.contently.systems/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" - integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= - -lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: - version "4.5.0" - resolved "https://npm-registry.prod.contently.systems/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.create@3.1.1: - version "3.1.1" - resolved "https://npm-registry.prod.contently.systems/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" - -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ= - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= - dependencies: - lodash._root "^3.0.0" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q= - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://npm-registry.prod.contently.systems/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://npm-registry.prod.contently.systems/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://npm-registry.prod.contently.systems/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= - -lodash.isfunction@^3.0.8: - version "3.0.9" - resolved "https://npm-registry.prod.contently.systems/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== - -lodash.isobject@^3.0.2: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= - -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.isplainobject@^4.0.4, lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://npm-registry.prod.contently.systems/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://npm-registry.prod.contently.systems/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - -lodash.memoize@~3.0.3: - version "3.0.4" - resolved "https://npm-registry.prod.contently.systems/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" - integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= - -lodash.merge@^4.6.0: - version "4.6.1" - resolved "https://npm-registry.prod.contently.systems/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://npm-registry.prod.contently.systems/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://npm-registry.prod.contently.systems/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= - -lodash.sortby@^4.5.0: - version "4.7.0" - resolved "https://npm-registry.prod.contently.systems/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0= - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://npm-registry.prod.contently.systems/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://npm-registry.prod.contently.systems/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk= - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://npm-registry.prod.contently.systems/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= - -lodash.union@~4.6.0: - version "4.6.0" - resolved "https://npm-registry.prod.contently.systems/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= - -lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: - version "4.5.0" - resolved "https://npm-registry.prod.contently.systems/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash.uniqby@^4.7.0: - version "4.7.0" - resolved "https://npm-registry.prod.contently.systems/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= - -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://npm-registry.prod.contently.systems/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ= - dependencies: - lodash.keys "~2.4.1" - -lodash.without@~4.4.0: - version "4.4.0" - resolved "https://npm-registry.prod.contently.systems/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" - integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= - -lodash@^4.0.0, lodash@^4.11.1, lodash@^4.12.0, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.10, lodash@~4.17.11: - version "4.17.11" - resolved "https://npm-registry.prod.contently.systems/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -lodash@^4.17.15: - version "4.17.15" - resolved "https://npm-registry.prod.contently.systems/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@~1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE= - -log-symbols@2.2.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-symbols@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - -longest@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://npm-registry.prod.contently.systems/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lru-cache@2: - version "2.7.3" - resolved "https://npm-registry.prod.contently.systems/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - -lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3, lru-cache@^4.1.5: - version "4.1.5" - resolved "https://npm-registry.prod.contently.systems/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://npm-registry.prod.contently.systems/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-queue@0.1: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= - dependencies: - es5-ext "~0.10.2" - -m3u8-parser@4.3.0: - version "4.3.0" - resolved "https://npm-registry.prod.contently.systems/m3u8-parser/-/m3u8-parser-4.3.0.tgz#4b4e988f87b6d8b2401d209a1d17798285a9da04" - integrity sha512-bVbjuBMoVIgFL1vpXVIxjeaoB5TPDJRb0m5qiTdM738SGqv/LAmsnVVPlKjM4fulm/rr1XZsKM+owHm+zvqxYA== - dependencies: - global "^4.3.2" - -m3u8-parser@4.4.0: - version "4.4.0" - resolved "https://npm-registry.prod.contently.systems/m3u8-parser/-/m3u8-parser-4.4.0.tgz#adf606c0af6d97f6750095a42006c2ae03dde177" - integrity sha512-iH2AygTFILtato+XAgnoPYzLHM4R3DjATj7Ozbk7EHdB2XoLF2oyOUguM7Kc4UVHbQHHL/QPaw98r7PbWzG0gg== - dependencies: - global "^4.3.2" - -macos-release@^2.2.0: - version "2.3.0" - resolved "https://npm-registry.prod.contently.systems/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-fetch-happen@^4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" - integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ== - dependencies: - agentkeepalive "^3.4.1" - cacache "^11.0.1" - http-cache-semantics "^3.8.1" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - lru-cache "^4.1.2" - mississippi "^3.0.0" - node-fetch-npm "^2.0.2" - promise-retry "^1.1.1" - socks-proxy-agent "^4.0.0" - ssri "^6.0.0" - -make-iterator@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" - integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== - dependencies: - kind-of "^6.0.2" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://npm-registry.prod.contently.systems/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.0, map-cache@^0.2.2: - version "0.2.2" - resolved "https://npm-registry.prod.contently.systems/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -marked-terminal@^3.2.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/marked-terminal/-/marked-terminal-3.2.0.tgz#3fc91d54569332bcf096292af178d82219000474" - integrity sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ== - dependencies: - ansi-escapes "^3.1.0" - cardinal "^2.1.1" - chalk "^2.4.1" - cli-table "^0.3.1" - node-emoji "^1.4.1" - supports-hyperlinks "^1.0.1" - -marked@^0.7.0: - version "0.7.0" - resolved "https://npm-registry.prod.contently.systems/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" - integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== - -matchdep@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/matchdep/-/matchdep-1.0.1.tgz#a57a33804491fbae208aba8f68380437abc2dca5" - integrity sha1-pXozgESR+64girqPaDgEN6vC3KU= - dependencies: - findup-sync "~0.3.0" - micromatch "^2.3.7" - resolve "~1.1.6" - stack-trace "0.0.9" - -math-random@^1.0.1: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://npm-registry.prod.contently.systems/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -meant@~1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" - integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - -mem@^4.0.0: - version "4.3.0" - resolved "https://npm-registry.prod.contently.systems/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memoizee@0.4.X: - version "0.4.14" - resolved "https://npm-registry.prod.contently.systems/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== - dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" - event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" - -meow@^3.3.0, meow@^3.7.0: - version "3.7.0" - resolved "https://npm-registry.prod.contently.systems/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -meow@^4.0.0: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" - integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3: - version "1.2.3" - resolved "https://npm-registry.prod.contently.systems/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== - -merge2@^1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -micromatch@^2.3.7: - version "2.3.11" - resolved "https://npm-registry.prod.contently.systems/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://npm-registry.prod.contently.systems/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.0, micromatch@^4.0.2: - version "4.0.2" - resolved "https://npm-registry.prod.contently.systems/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.40.0: - version "1.40.0" - resolved "https://npm-registry.prod.contently.systems/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" - integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== - -mime-db@~1.12.0: - version "1.12.0" - resolved "https://npm-registry.prod.contently.systems/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" - integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc= - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.24" - resolved "https://npm-registry.prod.contently.systems/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== - dependencies: - mime-db "1.40.0" - -mime-types@~2.0.9: - version "2.0.14" - resolved "https://npm-registry.prod.contently.systems/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" - integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY= - dependencies: - mime-db "~1.12.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://npm-registry.prod.contently.systems/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.3: - version "2.4.4" - resolved "https://npm-registry.prod.contently.systems/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.0.0, mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://npm-registry.prod.contently.systems/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://npm-registry.prod.contently.systems/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^2.0.1: - version "2.0.10" - resolved "https://npm-registry.prod.contently.systems/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= - dependencies: - brace-expansion "^1.0.0" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://npm-registry.prod.contently.systems/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784= - -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.2.1, minipass@^2.3.5: - version "2.3.5" - resolved "https://npm-registry.prod.contently.systems/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== - dependencies: - minipass "^2.2.1" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mitt@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" - integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://npm-registry.prod.contently.systems/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://npm-registry.prod.contently.systems/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mocha@^3.0.0: - version "3.5.3" - resolved "https://npm-registry.prod.contently.systems/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" - integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.6.8" - diff "3.2.0" - escape-string-regexp "1.0.5" - glob "7.1.1" - growl "1.9.2" - he "1.1.1" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" - -mocha@^6.2.0: - version "6.2.0" - resolved "https://npm-registry.prod.contently.systems/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" - integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "2.2.0" - minimatch "3.0.4" - mkdirp "0.5.1" - ms "2.1.1" - node-environment-flags "1.0.5" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.2.2" - yargs-parser "13.0.0" - yargs-unparser "1.5.0" - -modify-values@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" - integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== - -module-deps@^6.0.0: - version "6.2.1" - resolved "https://npm-registry.prod.contently.systems/module-deps/-/module-deps-6.2.1.tgz#cfe558784060e926824f474b4e647287837cda50" - integrity sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A== - dependencies: - JSONStream "^1.0.3" - browser-resolve "^1.7.0" - cached-path-relative "^1.0.2" - concat-stream "~1.6.0" - defined "^1.0.0" - detective "^5.0.2" - duplexer2 "^0.1.2" - inherits "^2.0.1" - parents "^1.0.0" - readable-stream "^2.0.2" - resolve "^1.4.0" - stream-combiner2 "^1.1.1" - subarg "^1.0.0" - through2 "^2.0.0" - xtend "^4.0.0" - -moment@^2.24.0: - version "2.24.0" - resolved "https://npm-registry.prod.contently.systems/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -mpd-parser@0.8.1: - version "0.8.1" - resolved "https://npm-registry.prod.contently.systems/mpd-parser/-/mpd-parser-0.8.1.tgz#db299dbec337999fbbbace989d227c7b03dc8ea7" - integrity sha512-WBTJ1bKk8OLUIxBh6s1ju1e2yz/5CzhPbgi6P3F3kJHKhGy1Z+ElvEnuzEbtC/dnbRcJtMXazE3f93N5LLdp9Q== - dependencies: - global "^4.3.2" - url-toolkit "^2.1.1" - -ms@2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.0.0, ms@^2.1.1: - version "2.1.2" - resolved "https://npm-registry.prod.contently.systems/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multipipe@^0.1.0, multipipe@^0.1.2: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s= - dependencies: - duplexer2 "0.0.2" - -mute-stdout@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" - integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== - -mute-stream@~0.0.4: - version "0.0.8" - resolved "https://npm-registry.prod.contently.systems/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mux.js@5.1.3: - version "5.1.3" - resolved "https://npm-registry.prod.contently.systems/mux.js/-/mux.js-5.1.3.tgz#1a59b8979a6780be5bcb63983c7e883c90cd615b" - integrity sha512-FhDcysLvAkO9H8ftBJ2sK1O4Rmz0AWnMS+2uqP7WjrnaAyE/ox11GEiZkRzrWIdp8at9R9qBHDqdURY3/h/xTg== - -mux.js@5.2.1: - version "5.2.1" - resolved "https://npm-registry.prod.contently.systems/mux.js/-/mux.js-5.2.1.tgz#6698761fc88da5acecea0758ac25f11d3a08bee8" - integrity sha512-1t2payD3Y8izfZRq7tfUQlhL2fKzjeLr9v1/2qNCTkEQnd9Abtn1JgzsBgGZubEXh6lM5L8B0iLGoWQiukjtbQ== - -nan@^2.12.1, nan@^2.13.2: - version "2.14.0" - resolved "https://npm-registry.prod.contently.systems/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://npm-registry.prod.contently.systems/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natives@^1.1.0: - version "1.1.6" - resolved "https://npm-registry.prod.contently.systems/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" - integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== - -needle@^2.2.1: - version "2.4.0" - resolved "https://npm-registry.prod.contently.systems/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://npm-registry.prod.contently.systems/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.6.0: - version "2.6.1" - resolved "https://npm-registry.prod.contently.systems/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -nerf-dart@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" - integrity sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo= - -new-from@0.0.3: - version "0.0.3" - resolved "https://npm-registry.prod.contently.systems/new-from/-/new-from-0.0.3.tgz#1c4ad13613de3e15d6321b70ed5c23937ea25e67" - integrity sha1-HErRNhPePhXWMhtw7Vwjk36iXmc= - dependencies: - readable-stream "~1.1.8" - -next-tick@1, next-tick@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://npm-registry.prod.contently.systems/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-emoji@^1.4.1: - version "1.10.0" - resolved "https://npm-registry.prod.contently.systems/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" - integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== - dependencies: - lodash.toarray "^4.4.0" - -node-environment-flags@1.0.5: - version "1.0.5" - resolved "https://npm-registry.prod.contently.systems/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" - integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch-npm@^2.0.2: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" - integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== - dependencies: - encoding "^0.1.11" - json-parse-better-errors "^1.0.0" - safe-buffer "^5.1.1" - -node-fetch@^2.3.0: - version "2.6.0" - resolved "https://npm-registry.prod.contently.systems/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== - -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://npm-registry.prod.contently.systems/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-gyp@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/node-gyp/-/node-gyp-4.0.0.tgz#972654af4e5dd0cd2a19081b4b46fe0442ba6f45" - integrity sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA== - dependencies: - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^4.4.8" - which "1" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://npm-registry.prod.contently.systems/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-sass@^4.8.3: - version "4.12.0" - resolved "https://npm-registry.prod.contently.systems/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" - integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.11" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -node.extend@^1.0.10, node.extend@^1.1.2: - version "1.1.8" - resolved "https://npm-registry.prod.contently.systems/node.extend/-/node.extend-1.1.8.tgz#0aab3e63789f4e6d68b42bc00073ad1881243cf0" - integrity sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA== - dependencies: - has "^1.0.3" - is "^3.2.1" - -"nopt@2 || 3": - version "3.0.6" - resolved "https://npm-registry.prod.contently.systems/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -nopt@^4.0.1, nopt@~4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://npm-registry.prod.contently.systems/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@^4.0.0: - version "4.3.0" - resolved "https://npm-registry.prod.contently.systems/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" - integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== - -npm-audit-report@^1.3.2: - version "1.3.2" - resolved "https://npm-registry.prod.contently.systems/npm-audit-report/-/npm-audit-report-1.3.2.tgz#303bc78cd9e4c226415076a4f7e528c89fc77018" - integrity sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw== - dependencies: - cli-table3 "^0.5.0" - console-control-strings "^1.1.0" - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://npm-registry.prod.contently.systems/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-cache-filename@~1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" - integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE= - -npm-install-checks@~3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" - integrity sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc= - dependencies: - semver "^2.3.0 || 3.x || 4 || 5" - -npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/npm-lifecycle/-/npm-lifecycle-2.1.1.tgz#0027c09646f0fd346c5c93377bdaba59c6748fdf" - integrity sha512-+Vg6I60Z75V/09pdcH5iUo/99Q/vop35PaI99elvxk56azSVVsdsSsS/sXqKDNwbRRNN1qSxkcO45ZOu0yOWew== - dependencies: - byline "^5.0.0" - graceful-fs "^4.1.15" - node-gyp "^4.0.0" - resolve-from "^4.0.0" - slide "^1.1.6" - uid-number "0.0.6" - umask "^1.1.0" - which "^1.3.1" - -npm-logical-tree@^1.2.1: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" - integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg== - -"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: - version "6.1.0" - resolved "https://npm-registry.prod.contently.systems/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" - integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== - dependencies: - hosted-git-info "^2.6.0" - osenv "^0.1.5" - semver "^5.5.0" - validate-npm-package-name "^3.0.0" - -npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.1: - version "1.4.1" - resolved "https://npm-registry.prod.contently.systems/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-pick-manifest@^2.2.3: - version "2.2.3" - resolved "https://npm-registry.prod.contently.systems/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" - integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== - dependencies: - figgy-pudding "^3.5.1" - npm-package-arg "^6.0.0" - semver "^5.4.1" - -npm-profile@^4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/npm-profile/-/npm-profile-4.0.1.tgz#d350f7a5e6b60691c7168fbb8392c3603583f5aa" - integrity sha512-NQ1I/1Q7YRtHZXkcuU1/IyHeLy6pd+ScKg4+DQHdfsm769TGq6HPrkbuNJVJS4zwE+0mvvmeULzQdWn2L2EsVA== - dependencies: - aproba "^1.1.2 || 2" - figgy-pudding "^3.4.1" - npm-registry-fetch "^3.8.0" - -npm-registry-fetch@^3.8.0, npm-registry-fetch@^3.9.0: - version "3.9.0" - resolved "https://npm-registry.prod.contently.systems/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz#44d841780e2833f06accb34488f8c7450d1a6856" - integrity sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw== - dependencies: - JSONStream "^1.3.4" - bluebird "^3.5.1" - figgy-pudding "^3.4.1" - lru-cache "^4.1.3" - make-fetch-happen "^4.0.1" - npm-package-arg "^6.1.0" - -npm-run-path@^2.0.0, npm-run-path@^2.0.2: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" - integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== - dependencies: - path-key "^3.0.0" - -npm-user-validate@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" - integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= - -npm@^6.8.0: - version "6.9.0" - resolved "https://npm-registry.prod.contently.systems/npm/-/npm-6.9.0.tgz#5296720486814a64a7fb082de00c4b5cfd11211f" - integrity sha512-91V+zB5hDxO+Jyp2sUKS7juHlIM95dGQxTeQtmZI1nAI/7kjWXFipPrtwwKjhyKmV4GsS2LzJhrxRjGWsU9z/w== - dependencies: - JSONStream "^1.3.5" - abbrev "~1.1.1" - ansicolors "~0.3.2" - ansistyles "~0.1.3" - aproba "^2.0.0" - archy "~1.0.0" - bin-links "^1.1.2" - bluebird "^3.5.3" - byte-size "^5.0.1" - cacache "^11.3.2" - call-limit "~1.1.0" - chownr "^1.1.1" - ci-info "^2.0.0" - cli-columns "^3.1.2" - cli-table3 "^0.5.1" - cmd-shim "~2.0.2" - columnify "~1.5.4" - config-chain "^1.1.12" - detect-indent "~5.0.0" - detect-newline "^2.1.0" - dezalgo "~1.0.3" - editor "~1.0.0" - figgy-pudding "^3.5.1" - find-npm-prefix "^1.0.2" - fs-vacuum "~1.2.10" - fs-write-stream-atomic "~1.0.10" - gentle-fs "^2.0.1" - glob "^7.1.3" - graceful-fs "^4.1.15" - has-unicode "~2.0.1" - hosted-git-info "^2.7.1" - iferr "^1.0.2" - inflight "~1.0.6" - inherits "~2.0.3" - ini "^1.3.5" - init-package-json "^1.10.3" - is-cidr "^3.0.0" - json-parse-better-errors "^1.0.2" - lazy-property "~1.0.0" - libcipm "^3.0.3" - libnpm "^2.0.1" - libnpmhook "^5.0.2" - libnpx "^10.2.0" - lock-verify "^2.1.0" - lockfile "^1.0.4" - lodash._baseuniq "~4.6.0" - lodash.clonedeep "~4.5.0" - lodash.union "~4.6.0" - lodash.uniq "~4.5.0" - lodash.without "~4.4.0" - lru-cache "^4.1.5" - meant "~1.0.1" - mississippi "^3.0.0" - mkdirp "~0.5.1" - move-concurrently "^1.0.1" - node-gyp "^3.8.0" - nopt "~4.0.1" - normalize-package-data "^2.5.0" - npm-audit-report "^1.3.2" - npm-cache-filename "~1.0.2" - npm-install-checks "~3.0.0" - npm-lifecycle "^2.1.0" - npm-package-arg "^6.1.0" - npm-packlist "^1.4.1" - npm-pick-manifest "^2.2.3" - npm-registry-fetch "^3.9.0" - npm-user-validate "~1.0.0" - npmlog "~4.1.2" - once "~1.4.0" - opener "^1.5.1" - osenv "^0.1.5" - pacote "^9.5.0" - path-is-inside "~1.0.2" - promise-inflight "~1.0.1" - qrcode-terminal "^0.12.0" - query-string "^6.2.0" - qw "~1.0.1" - read "~1.0.7" - read-cmd-shim "~1.0.1" - read-installed "~4.0.3" - read-package-json "^2.0.13" - read-package-tree "^5.2.2" - readable-stream "^3.1.1" - request "^2.88.0" - retry "^0.12.0" - rimraf "^2.6.3" - safe-buffer "^5.1.2" - semver "^5.6.0" - sha "~2.0.1" - slide "~1.1.6" - sorted-object "~2.0.1" - sorted-union-stream "~2.1.3" - ssri "^6.0.1" - stringify-package "^1.0.0" - tar "^4.4.8" - text-table "~0.2.0" - tiny-relative-date "^1.3.0" - uid-number "0.0.6" - umask "~1.1.0" - unique-filename "^1.1.1" - unpipe "~1.0.0" - update-notifier "^2.5.0" - uuid "^3.3.2" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "~3.0.0" - which "^1.3.1" - worker-farm "^1.6.0" - write-file-atomic "^2.4.2" - -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2: - version "4.1.2" - resolved "https://npm-registry.prod.contently.systems/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nsdeclare@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/nsdeclare/-/nsdeclare-0.1.0.tgz#10daa153642382d3cf2c01a916f4eb20a128b19f" - integrity sha1-ENqhU2QjgtPPLAGpFvTrIKEosZ8= - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://npm-registry.prod.contently.systems/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://npm-registry.prod.contently.systems/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://npm-registry.prod.contently.systems/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@^1.0.11, object-keys@^1.0.12: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://npm-registry.prod.contently.systems/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://npm-registry.prod.contently.systems/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.map@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" - integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.2.0, object.pick@^1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -octokit-pagination-methods@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" - integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== - -on-finished@2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/on-finished/-/on-finished-2.1.0.tgz#0c539f09291e8ffadde0c8a25850fb2cedc7022d" - integrity sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0= - dependencies: - ee-first "1.0.5" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://npm-registry.prod.contently.systems/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://npm-registry.prod.contently.systems/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -open@^0.0.5: - version "0.0.5" - resolved "https://npm-registry.prod.contently.systems/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" - integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw= - -opener@^1.5.1: - version "1.5.1" - resolved "https://npm-registry.prod.contently.systems/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== - -optimist@^0.6.1: - version "0.6.1" - resolved "https://npm-registry.prod.contently.systems/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://npm-registry.prod.contently.systems/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4= - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= - -os-browserify@~0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-locale@^3.0.0, os-locale@^3.1.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-name@^3.0.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== - dependencies: - macos-release "^2.2.0" - windows-release "^3.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@0, osenv@^0.1.4, osenv@^0.1.5: - version "0.1.5" - resolved "https://npm-registry.prod.contently.systems/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -outpipe@^1.1.0: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" - integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= - dependencies: - shell-quote "^1.4.2" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-filter@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== - dependencies: - p-map "^2.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-finally@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.0.0, p-locate@^4.1.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-reduce@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" - integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== - -p-retry@^4.0.0: - version "4.1.0" - resolved "https://npm-registry.prod.contently.systems/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6" - integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.12.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^4.0.0: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -pacote@^9.1.0, pacote@^9.2.3, pacote@^9.5.0: - version "9.5.1" - resolved "https://npm-registry.prod.contently.systems/pacote/-/pacote-9.5.1.tgz#adb0d23daeef6d0b813ab5891d0c6459ccec998d" - integrity sha512-Zqvczvf/zZ7QNosdE9uTC7SRuvSs9tFqRkF6cJl+2HH7COBnx4BRAGpeXJlrbN+mM0CMHpbi620xdEHhCflghA== - dependencies: - bluebird "^3.5.3" - cacache "^11.3.2" - figgy-pudding "^3.5.1" - get-stream "^4.1.0" - glob "^7.1.3" - lru-cache "^5.1.1" - make-fetch-happen "^4.0.1" - minimatch "^3.0.4" - minipass "^2.3.5" - mississippi "^3.0.0" - mkdirp "^0.5.1" - normalize-package-data "^2.4.0" - npm-package-arg "^6.1.0" - npm-packlist "^1.1.12" - npm-pick-manifest "^2.2.3" - npm-registry-fetch "^3.8.0" - osenv "^0.1.5" - promise-inflight "^1.0.1" - promise-retry "^1.1.1" - protoduck "^5.0.1" - rimraf "^2.6.2" - safe-buffer "^5.1.2" - semver "^5.6.0" - ssri "^6.0.1" - tar "^4.4.8" - unique-filename "^1.1.1" - which "^1.3.1" - -pako@~1.0.5: - version "1.0.10" - resolved "https://npm-registry.prod.contently.systems/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parents@^1.0.0, parents@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" - integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= - dependencies: - path-platform "~0.11.15" - -parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://npm-registry.prod.contently.systems/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-github-url@^1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" - integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://npm-registry.prod.contently.systems/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-headers@^2.0.0: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34" - integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg== - dependencies: - for-each "^0.3.3" - string.prototype.trim "^1.1.2" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -parseurl@~1.3.0, parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://npm-registry.prod.contently.systems/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@~0.0.0: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" - integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://npm-registry.prod.contently.systems/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-platform@~0.11.15: - version "0.11.15" - resolved "https://npm-registry.prod.contently.systems/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" - integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= - -path-root@^0.1.1: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= - dependencies: - path-root-regex "^0.1.0" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathval@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://npm-registry.prod.contently.systems/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= - dependencies: - through "~2.3" - -pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://npm-registry.prod.contently.systems/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.5: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" - integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://npm-registry.prod.contently.systems/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://npm-registry.prod.contently.systems/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkcs7@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/pkcs7/-/pkcs7-1.0.2.tgz#b6dba527528c2942bfc122ce2dafcdb5e59074e7" - integrity sha1-ttulJ1KMKUK/wSLOLa/NteWQdOc= - -pkg-conf@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= - dependencies: - find-up "^2.0.0" - load-json-file "^4.0.0" - -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" - -plugin-error@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" - integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== - dependencies: - ansi-colors "^1.0.1" - arr-diff "^4.0.0" - arr-union "^3.1.0" - extend-shallow "^3.0.2" - -plur@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" - integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= - -plur@^2.0.0: - version "2.1.2" - resolved "https://npm-registry.prod.contently.systems/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" - integrity sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo= - dependencies: - irregular-plurals "^1.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-value-parser@^3.2.3: - version "3.3.1" - resolved "https://npm-registry.prod.contently.systems/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss@^6.0.1, postcss@^6.0.17: - version "6.0.23" - resolved "https://npm-registry.prod.contently.systems/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://npm-registry.prod.contently.systems/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10, process@~0.11.0: - version "0.11.10" - resolved "https://npm-registry.prod.contently.systems/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -process@~0.5.1: - version "0.5.2" - resolved "https://npm-registry.prod.contently.systems/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= - -promise-inflight@^1.0.1, promise-inflight@~1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" - integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= - dependencies: - err-code "^1.0.0" - retry "^0.10.0" - -promzard@^0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= - dependencies: - read "1" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://npm-registry.prod.contently.systems/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - -protoduck@^5.0.1: - version "5.0.1" - resolved "https://npm-registry.prod.contently.systems/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" - integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== - dependencies: - genfun "^5.0.0" - -proxy-middleware@^0.5.0: - version "0.5.1" - resolved "https://npm-registry.prod.contently.systems/proxy-middleware/-/proxy-middleware-0.5.1.tgz#da24d5d58c1ddf13dad237c7eca503849eaea903" - integrity sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM= - -prr@~1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.24: - version "1.1.33" - resolved "https://npm-registry.prod.contently.systems/psl/-/psl-1.1.33.tgz#5533d9384ca7aab86425198e10e8053ebfeab661" - integrity sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://npm-registry.prod.contently.systems/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" - integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://npm-registry.prod.contently.systems/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://npm-registry.prod.contently.systems/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.3.2, punycode@^1.4.1: - version "1.4.1" - resolved "https://npm-registry.prod.contently.systems/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.5.1: - version "1.5.1" - resolved "https://npm-registry.prod.contently.systems/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://npm-registry.prod.contently.systems/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -qs@2.2.4: - version "2.2.4" - resolved "https://npm-registry.prod.contently.systems/qs/-/qs-2.2.4.tgz#2e9fbcd34b540e3421c924ecd01e90aa975319c8" - integrity sha1-Lp+800tUDjQhySTs0B6QqpdTGcg= - -qs@~2.2.3: - version "2.2.5" - resolved "https://npm-registry.prod.contently.systems/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" - integrity sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw= - -qs@~6.5.2: - version "6.5.2" - resolved "https://npm-registry.prod.contently.systems/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -query-string@^6.2.0: - version "6.8.1" - resolved "https://npm-registry.prod.contently.systems/query-string/-/query-string-6.8.1.tgz#62c54a7ef37d01b538c8fd56f95740c81d438a26" - integrity sha512-g6y0Lbq10a5pPQpjlFuojfMfV1Pd2Jw9h75ypiYPPia3Gcq2rgkKiIwbkS6JxH7c5f5u/B/sB+d13PU+g1eu4Q== - dependencies: - decode-uri-component "^0.2.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -querystring-es3@~0.2.0: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - -qw@~1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/qw/-/qw-1.0.1.tgz#efbfdc740f9ad054304426acb183412cc8b996d4" - integrity sha1-77/cdA+a0FQwRCassYNBLMi5ltQ= - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://npm-registry.prod.contently.systems/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://npm-registry.prod.contently.systems/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/raw-body/-/raw-body-1.3.0.tgz#978230a156a5548f42eef14de22d0f4f610083d1" - integrity sha1-l4IwoValVI9C7vFN4i0PT2EAg9E= - dependencies: - bytes "1" - iconv-lite "0.4.4" - -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: - version "1.2.8" - resolved "https://npm-registry.prod.contently.systems/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -rcfinder@^0.1.6: - version "0.1.9" - resolved "https://npm-registry.prod.contently.systems/rcfinder/-/rcfinder-0.1.9.tgz#f3e80f387ddf9ae80ae30a4100329642eae81115" - integrity sha1-8+gPOH3fmugK4wpBADKWQuroERU= - dependencies: - lodash.clonedeep "^4.3.2" - -rcloader@^0.2.2: - version "0.2.2" - resolved "https://npm-registry.prod.contently.systems/rcloader/-/rcloader-0.2.2.tgz#58d2298b462d0b9bfd2133d2a1ec74fbd705c717" - integrity sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc= - dependencies: - lodash.assign "^4.2.0" - lodash.isobject "^3.0.2" - lodash.merge "^4.6.0" - rcfinder "^0.1.6" - -read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" - integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs= - dependencies: - graceful-fs "^4.1.2" - -read-installed@~4.0.3: - version "4.0.3" - resolved "https://npm-registry.prod.contently.systems/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" - integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc= - dependencies: - debuglog "^1.0.1" - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - semver "2 || 3 || 4 || 5" - slide "~1.1.3" - util-extend "^1.0.1" - optionalDependencies: - graceful-fs "^4.1.2" - -read-only-stream@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" - integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= - dependencies: - readable-stream "^2.0.2" - -"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: - version "2.0.13" - resolved "https://npm-registry.prod.contently.systems/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" - integrity sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg== - dependencies: - glob "^7.1.1" - json-parse-better-errors "^1.0.1" - normalize-package-data "^2.0.0" - slash "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" - -read-package-tree@^5.2.2: - version "5.2.2" - resolved "https://npm-registry.prod.contently.systems/read-package-tree/-/read-package-tree-5.2.2.tgz#4b6a0ef2d943c1ea36a578214c9a7f6b7424f7a8" - integrity sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA== - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - once "^1.3.0" - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^6.0.0: - version "6.0.0" - resolved "https://npm-registry.prod.contently.systems/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" - integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== - dependencies: - find-up "^4.0.0" - read-pkg "^5.1.1" - type-fest "^0.5.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.0.0, read-pkg@^5.1.1: - version "5.1.1" - resolved "https://npm-registry.prod.contently.systems/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" - integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^4.0.0" - type-fest "^0.4.1" - -read@1, read@~1.0.1, read@~1.0.7: - version "1.0.7" - resolved "https://npm-registry.prod.contently.systems/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= - dependencies: - mute-stream "~0.0.4" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@1.1: - version "1.1.13" - resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" - integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: - version "1.0.34" - resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^1.0.26-2, readable-stream@^1.0.26-4, readable-stream@^1.0.33, readable-stream@~1.1.10, readable-stream@~1.1.8, readable-stream@~1.1.9: - version "1.1.14" - resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^3.0.6, readable-stream@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdir-scoped-modules@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" - integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://npm-registry.prod.contently.systems/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://npm-registry.prod.contently.systems/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -redeyed@~2.1.0: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= - dependencies: - esprima "~4.0.0" - -regenerate@^1.2.1: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://npm-registry.prod.contently.systems/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://npm-registry.prod.contently.systems/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://npm-registry.prod.contently.systems/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://npm-registry.prod.contently.systems/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -registry-auth-token@^3.0.1, registry-auth-token@^3.3.1: - version "3.4.0" - resolved "https://npm-registry.prod.contently.systems/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://npm-registry.prod.contently.systems/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://npm-registry.prod.contently.systems/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://npm-registry.prod.contently.systems/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= - -replace-ext@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= - -replacestream@^4.0.0: - version "4.0.3" - resolved "https://npm-registry.prod.contently.systems/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" - integrity sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA== - dependencies: - escape-string-regexp "^1.0.3" - object-assign "^4.0.1" - readable-stream "^2.0.2" - -request@^2.87.0, request@^2.88.0: - version "2.88.0" - resolved "https://npm-registry.prod.contently.systems/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7, resolve@~1.1.6: - version "1.1.7" - resolved "https://npm-registry.prod.contently.systems/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.4.0: - version "1.11.1" - resolved "https://npm-registry.prod.contently.systems/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== - dependencies: - path-parse "^1.0.6" - -ret@~0.1.10: - version "0.1.15" - resolved "https://npm-registry.prod.contently.systems/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.10.0: - version "0.10.1" - resolved "https://npm-registry.prod.contently.systems/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= - -retry@^0.12.0: - version "0.12.0" - resolved "https://npm-registry.prod.contently.systems/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -reusify@^1.0.0: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -right-align@^0.1.1: - version "0.1.3" - resolved "https://npm-registry.prod.contently.systems/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - -rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: - version "2.6.3" - resolved "https://npm-registry.prod.contently.systems/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-parallel@^1.1.9: - version "1.1.9" - resolved "https://npm-registry.prod.contently.systems/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rust-result@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72" - integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I= - dependencies: - individual "^2.0.0" - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://npm-registry.prod.contently.systems/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-json-parse@4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac" - integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw= - dependencies: - rust-result "^1.0.0" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://npm-registry.prod.contently.systems/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://npm-registry.prod.contently.systems/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - -sax@^1.2.4: - version "1.2.4" - resolved "https://npm-registry.prod.contently.systems/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://npm-registry.prod.contently.systems/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - -semantic-release@^15.13.21: - version "15.13.21" - resolved "https://npm-registry.prod.contently.systems/semantic-release/-/semantic-release-15.13.21.tgz#d021c75f889cff75ae3410736942bee6c4557da7" - integrity sha512-3S9thQas28iv3NeHUqQVsDnxMcBGQICdxabeNnJ8BnbRBvCkgqCg3v9zo/+O5a8GCyxrgjtwJ2iWozL8SiIq1w== - dependencies: - "@semantic-release/commit-analyzer" "^6.1.0" - "@semantic-release/error" "^2.2.0" - "@semantic-release/github" "^5.1.0" - "@semantic-release/npm" "^5.0.5" - "@semantic-release/release-notes-generator" "^7.1.2" - aggregate-error "^3.0.0" - cosmiconfig "^5.0.1" - debug "^4.0.0" - env-ci "^4.0.0" - execa "^1.0.0" - figures "^3.0.0" - find-versions "^3.0.0" - get-stream "^5.0.0" - git-log-parser "^1.2.0" - hook-std "^2.0.0" - hosted-git-info "^3.0.0" - lodash "^4.17.15" - marked "^0.7.0" - marked-terminal "^3.2.0" - p-locate "^4.0.0" - p-reduce "^2.0.0" - read-pkg-up "^6.0.0" - resolve-from "^5.0.0" - semver "^6.0.0" - signale "^1.2.1" - yargs "^13.1.0" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - dependencies: - semver "^5.0.3" - -semver-greatest-satisfied-range@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" - integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= - dependencies: - sver-compat "^1.5.0" - -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== - -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.0" - resolved "https://npm-registry.prod.contently.systems/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - -semver@^4.1.0: - version "4.3.6" - resolved "https://npm-registry.prod.contently.systems/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= - -semver@^5.7.0: - version "5.7.1" - resolved "https://npm-registry.prod.contently.systems/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0: - version "6.1.1" - resolved "https://npm-registry.prod.contently.systems/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" - integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== - -semver@~5.3.0: - version "5.3.0" - resolved "https://npm-registry.prod.contently.systems/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - -send@0.17.1: - version "0.17.1" - resolved "https://npm-registry.prod.contently.systems/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -sequencify@~0.0.7: - version "0.0.7" - resolved "https://npm-registry.prod.contently.systems/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= - -serve-index@^1.1.4: - version "1.9.1" - resolved "https://npm-registry.prod.contently.systems/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@^1.3.0: - version "1.14.1" - resolved "https://npm-registry.prod.contently.systems/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^0.4.3: - version "0.4.3" - resolved "https://npm-registry.prod.contently.systems/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: - version "2.4.11" - resolved "https://npm-registry.prod.contently.systems/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha@~2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" - integrity sha1-YDCCL70smCOUn49y7WQR7lzyWq4= - dependencies: - graceful-fs "^4.1.2" - readable-stream "^2.0.2" - -shasum@^1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" - integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= - dependencies: - json-stable-stringify "~0.0.0" - sha.js "~2.4.4" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.4.2, shell-quote@^1.6.1: - version "1.6.1" - resolved "https://npm-registry.prod.contently.systems/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -shelljs@0.3.x: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" - integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -signale@^1.2.1: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" - integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== - dependencies: - chalk "^2.3.2" - figures "^2.0.0" - pkg-conf "^2.1.0" - -simple-concat@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" - integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= - -slash@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -slash@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: - version "1.1.6" - resolved "https://npm-registry.prod.contently.systems/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - -smart-buffer@4.0.2: - version "4.0.2" - resolved "https://npm-registry.prod.contently.systems/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d" - integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://npm-registry.prod.contently.systems/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -socks-proxy-agent@^4.0.0: - version "4.0.2" - resolved "https://npm-registry.prod.contently.systems/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - dependencies: - agent-base "~4.2.1" - socks "~2.3.2" - -socks@~2.3.2: - version "2.3.2" - resolved "https://npm-registry.prod.contently.systems/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" - integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ== - dependencies: - ip "^1.1.5" - smart-buffer "4.0.2" - -sorted-object@~2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" - integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw= - -sorted-union-stream@~2.1.3: - version "2.1.3" - resolved "https://npm-registry.prod.contently.systems/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" - integrity sha1-x3lMfgd4gAUv9xqNSi27Sppjisc= - dependencies: - from2 "^1.3.0" - stream-iterate "^1.1.0" - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.2" - resolved "https://npm-registry.prod.contently.systems/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://npm-registry.prod.contently.systems/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://npm-registry.prod.contently.systems/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.1.40: - version "0.1.43" - resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.4.2: - version "0.4.4" - resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3: - version "0.5.7" - resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sparkles@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" - integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== - -spawn-error-forwarder@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" - integrity sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk= - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.4" - resolved "https://npm-registry.prod.contently.systems/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" - integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== - -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -split2@^2.0.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split2@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314" - integrity sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ= - dependencies: - through2 "~2.0.0" - -split@0.2: - version "0.2.10" - resolved "https://npm-registry.prod.contently.systems/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" - integrity sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc= - dependencies: - through "2" - -split@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://npm-registry.prod.contently.systems/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.0, ssri@^6.0.1: - version "6.0.1" - resolved "https://npm-registry.prod.contently.systems/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -stack-trace@0.0.9: - version "0.0.9" - resolved "https://npm-registry.prod.contently.systems/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" - integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://npm-registry.prod.contently.systems/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://npm-registry.prod.contently.systems/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - -stream-browserify@^2.0.0: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-combiner2@^1.1.1, stream-combiner2@~1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://npm-registry.prod.contently.systems/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= - dependencies: - duplexer "~0.1.1" - -stream-consume@~0.1.0: - version "0.1.1" - resolved "https://npm-registry.prod.contently.systems/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" - integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg== - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://npm-registry.prod.contently.systems/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.0.0: - version "2.8.3" - resolved "https://npm-registry.prod.contently.systems/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-http@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.0.tgz#22fb33fe9b4056b4eccf58bd8f400c4b993ffe57" - integrity sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^3.0.6" - xtend "^4.0.0" - -stream-iterate@^1.1.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" - integrity sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE= - dependencies: - readable-stream "^2.1.5" - stream-shift "^1.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= - -stream-splicer@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" - integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.2" - -streamqueue@0.0.6: - version "0.0.6" - resolved "https://npm-registry.prod.contently.systems/streamqueue/-/streamqueue-0.0.6.tgz#66f5f5ec94e9b8af249e4aec2dd1f741bfe94de3" - integrity sha1-ZvX17JTpuK8knkrsLdH3Qb/pTeM= - dependencies: - readable-stream "^1.0.26-2" - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= - -string-length@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" - integrity sha1-VpcPscOFWOnnC3KL894mmsRa36w= - dependencies: - strip-ansi "^3.0.0" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://npm-registry.prod.contently.systems/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trim@^1.1.2: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" - -string_decoder@^1.1.1: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://npm-registry.prod.contently.systems/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.0.0: - version "3.3.0" - resolved "https://npm-registry.prod.contently.systems/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -stringify-package@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" - integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g== - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= - dependencies: - ansi-regex "^0.2.1" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom-string@1.X: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= - -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-json-comments@1.0.x: - version "1.0.4" - resolved "https://npm-registry.prod.contently.systems/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" - integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= - -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -subarg@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" - integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= - dependencies: - minimist "^1.1.0" - -supports-color@3.1.2: - version "3.1.2" - resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= - dependencies: - has-flag "^1.0.0" - -supports-color@6.0.0: - version "6.0.0" - resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0: - version "5.5.0" - resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-hyperlinks@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" - integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== - dependencies: - has-flag "^2.0.0" - supports-color "^5.0.0" - -sver-compat@^1.5.0: - version "1.5.0" - resolved "https://npm-registry.prod.contently.systems/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" - integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= - dependencies: - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -syntax-error@^1.1.1: - version "1.4.0" - resolved "https://npm-registry.prod.contently.systems/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" - integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== - dependencies: - acorn-node "^1.2.0" - -tar@^2.0.0: - version "2.2.2" - resolved "https://npm-registry.prod.contently.systems/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - -tar@^4, tar@^4.4.8: - version "4.4.10" - resolved "https://npm-registry.prod.contently.systems/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" - integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.3.5" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://npm-registry.prod.contently.systems/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - -text-table@^0.2.0, text-table@~0.2.0: - version "0.2.0" - resolved "https://npm-registry.prod.contently.systems/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -textextensions@~1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" - integrity sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI= - -through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: - version "2.0.5" - resolved "https://npm-registry.prod.contently.systems/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@^0.4.1: - version "0.4.2" - resolved "https://npm-registry.prod.contently.systems/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" - integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= - dependencies: - readable-stream "~1.0.17" - xtend "~2.1.1" - -through2@^0.5.0, through2@^0.5.1: - version "0.5.1" - resolved "https://npm-registry.prod.contently.systems/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -through2@^0.6.1, through2@^0.6.3: - version "0.6.5" - resolved "https://npm-registry.prod.contently.systems/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through@2, "through@>=2.2.7 <3", through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://npm-registry.prod.contently.systems/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tildify@^1.0.0, tildify@^1.1.2: - version "1.2.0" - resolved "https://npm-registry.prod.contently.systems/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -timers-browserify@^1.0.1: - version "1.4.2" - resolved "https://npm-registry.prod.contently.systems/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" - integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= - dependencies: - process "~0.11.0" - -timers-ext@^0.1.5: - version "0.1.7" - resolved "https://npm-registry.prod.contently.systems/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - -tiny-lr@0.1.4: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/tiny-lr/-/tiny-lr-0.1.4.tgz#6e41d7e67dfd0878e5e0b37e37a06d67e309ff4d" - integrity sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00= - dependencies: - body-parser "~1.8.0" - debug "~0.8.1" - faye-websocket "~0.7.2" - parseurl "~1.3.0" - qs "~2.2.3" - -tiny-relative-date@^1.3.0: - version "1.3.0" - resolved "https://npm-registry.prod.contently.systems/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" - integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://npm-registry.prod.contently.systems/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://npm-registry.prod.contently.systems/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://npm-registry.prod.contently.systems/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://npm-registry.prod.contently.systems/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -traverse@~0.6.6: - version "0.6.6" - resolved "https://npm-registry.prod.contently.systems/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" - integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-off-newlines@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - integrity sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics= - -tsml@1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3" - integrity sha1-ifghi52eJX9H1/a1bQHFpNLGj8M= - -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://npm-registry.prod.contently.systems/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://npm-registry.prod.contently.systems/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://npm-registry.prod.contently.systems/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.4.1: - version "0.4.1" - resolved "https://npm-registry.prod.contently.systems/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" - integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== - -type-fest@^0.5.0: - version "0.5.2" - resolved "https://npm-registry.prod.contently.systems/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - -type-is@~1.5.1: - version "1.5.7" - resolved "https://npm-registry.prod.contently.systems/type-is/-/type-is-1.5.7.tgz#b9368a593cc6ef7d0645e78b2f4c64cbecd05e90" - integrity sha1-uTaKWTzG730GReeLL0xky+zQXpA= - dependencies: - media-typer "0.3.0" - mime-types "~2.0.9" - -type@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/type/-/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61" - integrity sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://npm-registry.prod.contently.systems/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -uglify-js@2.6.4: - version "2.6.4" - resolved "https://npm-registry.prod.contently.systems/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" - integrity sha1-ZeovswWck5RpLxX+2HwrNsFrmt8= - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-js@^2.6: - version "2.8.29" - resolved "https://npm-registry.prod.contently.systems/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-js@^3.1.4: - version "3.6.0" - resolved "https://npm-registry.prod.contently.systems/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== - dependencies: - commander "~2.20.0" - source-map "~0.6.1" - -uglify-save-license@^0.4.1: - version "0.4.1" - resolved "https://npm-registry.prod.contently.systems/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" - integrity sha1-lXJsF8xv0XHDYX479NjYKqjEzOE= - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - -uid-number@0.0.6: - version "0.0.6" - resolved "https://npm-registry.prod.contently.systems/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= - -umask@^1.1.0, umask@~1.1.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= - -umd@^3.0.0: - version "3.0.3" - resolved "https://npm-registry.prod.contently.systems/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" - integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= - -undeclared-identifiers@^1.1.2: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" - integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== - dependencies: - acorn-node "^1.3.0" - dash-ast "^1.0.0" - get-assigned-identifiers "^1.2.0" - simple-concat "^1.0.0" - xtend "^4.0.1" - -underscore@^1.9.1: - version "1.9.1" - resolved "https://npm-registry.prod.contently.systems/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - -union-value@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://npm-registry.prod.contently.systems/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - -universal-user-agent@^2.0.0, universal-user-agent@^2.1.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" - integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== - dependencies: - os-name "^3.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://npm-registry.prod.contently.systems/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - -upath@^1.1.1: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== - -update-notifier@^2.3.0, update-notifier@^2.5.0: - version "2.5.0" - resolved "https://npm-registry.prod.contently.systems/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://npm-registry.prod.contently.systems/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-join@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" - integrity sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -url-template@^2.0.8: - version "2.0.8" - resolved "https://npm-registry.prod.contently.systems/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= - -url-toolkit@^2.1.1, url-toolkit@^2.1.3: - version "2.1.6" - resolved "https://npm-registry.prod.contently.systems/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2" - integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw== - -url@~0.11.0: - version "0.11.0" - resolved "https://npm-registry.prod.contently.systems/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://npm-registry.prod.contently.systems/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -user-home@^1.1.1: - version "1.1.1" - resolved "https://npm-registry.prod.contently.systems/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util-extend@^1.0.1: - version "1.0.3" - resolved "https://npm-registry.prod.contently.systems/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" - integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= - -util@0.10.3: - version "0.10.3" - resolved "https://npm-registry.prod.contently.systems/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@~0.10.1: - version "0.10.4" - resolved "https://npm-registry.prod.contently.systems/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2: - version "3.3.2" - resolved "https://npm-registry.prod.contently.systems/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -v8flags@^2.0.2, v8flags@^2.0.9: - version "2.1.1" - resolved "https://npm-registry.prod.contently.systems/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://npm-registry.prod.contently.systems/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= - dependencies: - builtins "^1.0.3" - -verror@1.10.0: - version "1.10.0" - resolved "https://npm-registry.prod.contently.systems/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -"video.js@^6.8.0 || ^7.0.0": - version "7.6.0" - resolved "https://npm-registry.prod.contently.systems/video.js/-/video.js-7.6.0.tgz#556c151004e27d340be3a732a14bf7c1aaf7e8b4" - integrity sha512-A0HSKzAmcYkd1xyExqUlM6n8bkghcX54iCvW08bPvvl3UHt8d8zijuylfIWu8vo1Z8fYyk9HPOFs1i3Cldr/cw== - dependencies: - "@babel/runtime" "^7.4.5" - "@videojs/http-streaming" "1.10.3" - global "4.3.2" - keycode "^2.2.0" - safe-json-parse "4.0.0" - tsml "1.0.1" - videojs-font "3.2.0" - videojs-vtt.js "^0.14.1" - xhr "2.4.0" - -video.js@^7.6.5: - version "7.6.5" - resolved "https://npm-registry.prod.contently.systems/video.js/-/video.js-7.6.5.tgz#af66a71bc05fd79c581c1673ac5a78a6b31bc831" - integrity sha512-r0kC9SNJhXz9th/wwbRaLVOIZTvXkF+rhFq9/FWU+e+EJClwClRCgP8STGmfrPHDXrfWiJwH9YY21JZK61vGGQ== - dependencies: - "@babel/runtime" "^7.4.5" - "@videojs/http-streaming" "1.10.6" - global "4.3.2" - keycode "^2.2.0" - safe-json-parse "4.0.0" - videojs-font "3.2.0" - videojs-vtt.js "^0.14.1" - xhr "2.4.0" - -videojs-font@3.2.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/videojs-font/-/videojs-font-3.2.0.tgz#212c9d3f4e4ec3fa7345167d64316add35e92232" - integrity sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA== - -videojs-vtt.js@^0.14.1: - version "0.14.1" - resolved "https://npm-registry.prod.contently.systems/videojs-vtt.js/-/videojs-vtt.js-0.14.1.tgz#da583eb1fc9c81c826a9432b706040e8dea49911" - integrity sha512-YxOiywx6N9t3J5nqsE5WN2Sw4CSqVe3zV+AZm2T4syOc2buNJaD6ZoexSdeszx2sHLU/RRo2r4BJAXFDQ7Qo2Q== - dependencies: - global "^4.3.1" - -vinyl-buffer@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz#96c1a3479b8c5392542c612029013b5b27f88bbf" - integrity sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78= - dependencies: - bl "^1.2.1" - through2 "^2.0.3" - -vinyl-bufferstream@^1.0.1: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz#0537869f580effa4ca45acb47579e4b9fe63081a" - integrity sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo= - dependencies: - bufferstreams "1.0.1" - -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://npm-registry.prod.contently.systems/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY= - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-map@^1.0.1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/vinyl-map/-/vinyl-map-1.0.2.tgz#a8b296025f973fa7cad62817967a48f1d176bf7c" - integrity sha1-qLKWAl+XP6fK1igXlnpI8dF2v3w= - dependencies: - bl "^1.1.2" - new-from "0.0.3" - through2 "^0.4.1" - -vinyl-source-stream@^1.1.2: - version "1.1.2" - resolved "https://npm-registry.prod.contently.systems/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz#62b53a135610a896e98ca96bee3a87f008a8e780" - integrity sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A= - dependencies: - through2 "^2.0.3" - vinyl "^0.4.3" - -vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://npm-registry.prod.contently.systems/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= - dependencies: - source-map "^0.5.1" - -vinyl@^0.2.1: - version "0.2.3" - resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - integrity sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI= - dependencies: - clone-stats "~0.0.1" - -vinyl@^0.4.0, vinyl@^0.4.3: - version "0.4.6" - resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4= - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^2.0.0: - version "2.2.0" - resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -vm-browserify@^1.0.0: - version "1.1.0" - resolved "https://npm-registry.prod.contently.systems/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" - integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== - -watch@^0.11.0: - version "0.11.0" - resolved "https://npm-registry.prod.contently.systems/watch/-/watch-0.11.0.tgz#e8dba091b7456799a3af57978b986e77e1320406" - integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY= - -watchify@^3.11.0: - version "3.11.1" - resolved "https://npm-registry.prod.contently.systems/watchify/-/watchify-3.11.1.tgz#8e4665871fff1ef64c0430d1a2c9d084d9721881" - integrity sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog== - dependencies: - anymatch "^2.0.0" - browserify "^16.1.0" - chokidar "^2.1.1" - defined "^1.0.0" - outpipe "^1.1.0" - through2 "^2.0.0" - xtend "^4.0.0" - -wcwidth@^1.0.0: - version "1.0.1" - resolved "https://npm-registry.prod.contently.systems/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -websocket-driver@>=0.3.6: - version "0.7.3" - resolved "https://npm-registry.prod.contently.systems/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== - dependencies: - http-parser-js ">=0.4.0 <0.4.11" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://npm-registry.prod.contently.systems/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== - -which-module@^1.0.0: - version "1.0.0" - resolved "https://npm-registry.prod.contently.systems/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= - -which-module@^2.0.0: - version "2.0.0" - resolved "https://npm-registry.prod.contently.systems/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1, which@1.3.1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: - version "1.3.1" - resolved "https://npm-registry.prod.contently.systems/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" - integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3, wide-align@^1.1.0: - version "1.1.3" - resolved "https://npm-registry.prod.contently.systems/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://npm-registry.prod.contently.systems/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - -window-size@0.1.0: - version "0.1.0" - resolved "https://npm-registry.prod.contently.systems/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - -window-size@^0.1.4: - version "0.1.4" - resolved "https://npm-registry.prod.contently.systems/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - -windows-release@^3.1.0: - version "3.2.0" - resolved "https://npm-registry.prod.contently.systems/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== - dependencies: - execa "^1.0.0" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://npm-registry.prod.contently.systems/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://npm-registry.prod.contently.systems/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -worker-farm@^1.6.0: - version "1.7.0" - resolved "https://npm-registry.prod.contently.systems/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://npm-registry.prod.contently.systems/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://npm-registry.prod.contently.systems/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://npm-registry.prod.contently.systems/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -wreck@^6.3.0: - version "6.3.0" - resolved "https://npm-registry.prod.contently.systems/wreck/-/wreck-6.3.0.tgz#a1369769f07bbb62d6a378336a7871fc773c740b" - integrity sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs= - dependencies: - boom "2.x.x" - hoek "2.x.x" - -write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: - version "2.4.3" - resolved "https://npm-registry.prod.contently.systems/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - -xhr@2.4.0: - version "2.4.0" - resolved "https://npm-registry.prod.contently.systems/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993" - integrity sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM= - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: - version "4.0.1" - resolved "https://npm-registry.prod.contently.systems/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - -xtend@~2.1.1: - version "2.1.2" - resolved "https://npm-registry.prod.contently.systems/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= - dependencies: - object-keys "~0.4.0" - -xtend@~3.0.0: - version "3.0.0" - resolved "https://npm-registry.prod.contently.systems/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= - -y18n@^3.2.0, y18n@^3.2.1: - version "3.2.1" - resolved "https://npm-registry.prod.contently.systems/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://npm-registry.prod.contently.systems/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://npm-registry.prod.contently.systems/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: - version "3.0.3" - resolved "https://npm-registry.prod.contently.systems/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== - -yargs-parser@13.0.0: - version "13.0.0" - resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" - integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^13.0.0, yargs-parser@^13.1.0: - version "13.1.1" - resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= - dependencies: - camelcase "^3.0.0" - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - -yargs-unparser@1.5.0: - version "1.5.0" - resolved "https://npm-registry.prod.contently.systems/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" - integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== - dependencies: - flat "^4.1.0" - lodash "^4.17.11" - yargs "^12.0.5" - -yargs@13.2.2: - version "13.2.2" - resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" - integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== - dependencies: - cliui "^4.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.0.0" - -yargs@^11.0.0: - version "11.1.0" - resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - -yargs@^12.0.5: - version "12.0.5" - resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^13.1.0: - version "13.2.4" - resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" - -yargs@^3.28.0: - version "3.32.0" - resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" - -yargs@^7.0.0: - version "7.1.0" - resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" From 83476231c704d747ae4dbcee891184b621dc818d Mon Sep 17 00:00:00 2001 From: Jack Pope Date: Fri, 22 Nov 2019 16:28:48 -0500 Subject: [PATCH 3/3] chore(release): Upgrade videojs to v7 BREAKING CHANGE This reverts commit b7fb33dbd41c025bee9ac772ee6d3984ba2b4146. --- .circleci/config.yml | 23 +- .gitignore | 1 + .tool-versions | 1 + LICENSE.md | 18 +- README.md | 149 +- build/css/annotations.css | 474 - build/videojs-annotation-comments.cjs.js | 8476 -------- build/videojs-annotation-comments.cjs.js.map | 1 - build/videojs-annotation-comments.cjs.min.js | 5 - build/videojs-annotation-comments.js | 8482 -------- build/videojs-annotation-comments.js.map | 1 - build/videojs-annotation-comments.min.js | 5 - .../videojs-annotation-comments.cjs.min.js | 5 - gulpfile.js | 326 +- license.md | 13 - package-lock.json | 16798 ---------------- package.json | 49 +- src/js/annotation_comments.js | 7 +- src/js/lib/event_dispatcher.js | 24 +- .../mocha/components/event_dispatcher_test.js | 10 +- test/test_api.html | 8 +- yarn.lock | 10388 ++++++++++ 22 files changed, 10735 insertions(+), 34529 deletions(-) create mode 100644 .tool-versions delete mode 100644 build/css/annotations.css delete mode 100644 build/videojs-annotation-comments.cjs.js delete mode 100644 build/videojs-annotation-comments.cjs.js.map delete mode 100644 build/videojs-annotation-comments.cjs.min.js delete mode 100644 build/videojs-annotation-comments.js delete mode 100644 build/videojs-annotation-comments.js.map delete mode 100644 build/videojs-annotation-comments.min.js delete mode 100644 docs/build/videojs-annotation-comments.cjs.min.js delete mode 100644 license.md delete mode 100644 package-lock.json create mode 100644 yarn.lock diff --git a/.circleci/config.yml b/.circleci/config.yml index 392d353..7bcb1bf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ jobs: build_and_test: docker: # specify the version you desire here - - image: circleci/node:9.11.1 + - image: circleci/node:10.15.2 working_directory: ~/repo @@ -16,11 +16,11 @@ jobs: # Download and cache dependencies - restore_cache: keys: - - v1-dependencies-{{ checksum "package.json" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- - - run: npm install + - run: yarn - save_cache: paths: @@ -28,12 +28,12 @@ jobs: key: v1-dependencies-{{ checksum "package.json" }} # run tests! - - run: npm run test + - run: yarn test semantic_release: docker: # specify the version you desire here - - image: circleci/node:9.11.1 + - image: circleci/node:10.15.2 working_directory: ~/repo steps: - checkout @@ -41,16 +41,17 @@ jobs: # Download and cache dependencies - restore_cache: keys: - - v1-dependencies-{{ checksum "package.json" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- + - v1-dependencies-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- - - run: npm install + - run: yarn - save_cache: paths: - node_modules key: v1-dependencies-{{ checksum "package.json" }} + - run: yarn build - run: npx semantic-release workflows: diff --git a/.gitignore b/.gitignore index 3c5f369..fb40e3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules docs/.sass-cache +build diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..ec73d05 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +nodejs 10.15.2 diff --git a/LICENSE.md b/LICENSE.md index 4249b7d..e5a55dc 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,13 +1,13 @@ Copyright Contently, Inc. 2017 - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md index 865cf64..b4fc5f7 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,68 @@ [![CircleCI](https://circleci.com/gh/contently/videojs-annotation-comments/tree/master.svg?style=svg)](https://circleci.com/gh/contently/videojs-annotation-comments/tree/master) - # AnnotationComments : Collaborate in your VideoJS player +# AnnotationComments : Collaborate in your VideoJS player - ![AnnotationComments Screenshot1](test/screenshot.png) +![AnnotationComments Screenshot1](test/screenshot.png) - ### Background +>## Upgrading v1 -> v2 +>Please note that the event based API has changed. In version 1, you can subscribe to plugin events with `pluginInstance.on()`. In version 2, the same functionality is available with `pluginInstance.registerListener()`. The following docs are for the latest version. - Collaboration between videographers and clients can be tedious, with emails and phone calls that waste time trying to reference specific frames and areas of the screen. This plugin enables more efficient collaboration from the browser. +## About - This plugin was conceived and developed as a Hack Week project at [Contently](http://www.contently.com) by [Evan Carothers](http://www.github.com/ecaroth) and [Jack Pope](http://www.github.com/jackpope). Continuing our focus and commitment to multimedia support at Contently, the entire team productized and bulletproofed the plugin as a flexible solution to be used in our product and other open-source use cases. +### Background + +Collaboration between videographers and clients can be tedious, with emails and phone calls that waste time trying to reference specific frames and areas of the screen. This plugin enables more efficient collaboration from the browser. + +This plugin was conceived and developed as a Hack Week project at [Contently](http://www.contently.com) by [Evan Carothers](http://www.github.com/ecaroth) and [Jack Pope](http://www.github.com/jackpope). Continuing our focus and commitment to multimedia support at Contently, the entire team productized and bulletproofed the plugin as a flexible solution to be used in our product and other open-source use cases. ### Goals - - **Efficient for videographers and clients alike** - Provides useful collaboration features including annotations, comments/replies, ranged time markers, and more, with intuitive controls. +- **Efficient for videographers and clients alike** - Provides useful collaboration features including annotations, comments/replies, ranged time markers, and more, with intuitive controls. - **SIMPLE & LIGHTWEIGHT** - Everything is contained within the plugin and player element. There is no need to build additional UI components. Just install VideoJS, register the plugin, setup whatever backend storage you wish, and start collaborating. - **EXTENSIBLE** - The plugin can be integrated with existing commenting systems (as we did within Contently), and makes very few assumptions about how to store annotations. Custom events are available for communicating with external APIs, providing support for on-page interactions and data persistence. Simple CSS overrides can also allow for branding customizations with minimal effort, or completely custom UI/UX. - ### VideoJS Plugins +### VideoJS Plugins - [VideoJS](http://videojs.com/) is a popular open-source HTML5 video player library used by 400k+ sites. As of v6, there is an extendable plugin architecture which was used to create this plugin. This plugin is built and tested against [VideoJS v 6.2.0](https://www.npmjs.com/package/video.js/) +[VideoJS](http://videojs.com/) is a popular open-source HTML5 video player library used by 400k+ sites. As of v6, there is an extendable plugin architecture which was used to create this plugin. This plugin is built and tested against [VideoJS v7](https://www.npmjs.com/package/video.js/) - ### Add it to your VideoJS player +## Use it! - #### As a script from build +### Install - ```javascript +``` +yarn add @contently/videojs-annotation-comments +``` + +OR + +``` +npm install @contently/videojs-annotation-comments +``` +### Add it to your VideoJS player + +#### As a script from build + +```javascript // ...videojs & videojs-annotation-comments have been loaded in script tags... - var player = videojs('video-id'); +var player = videojs('video-id'); var plugin = player.annotationComments(pluginOptions) ``` - #### As a module +#### As a module - ```javascript +```javascript import videojs from 'video.js' -import AnnotationComments from 'videojs-annotation-comments' +import AnnotationComments from '@contently/videojs-annotation-comments' videojs.registerPlugin('annotationComments', AnnotationComments(videojs)) var player = videojs('video-id') var plugin = player.annotationComments(pluginOptions) ``` - ### Plugin options / configuration +### Plugin options / configuration - When initializing the plugin, you can pass in an options array to override default options. Any excluded options are set to their default values, listed below: +When initializing the plugin, you can pass in an options array to override default options. Any excluded options are set to their default values, listed below: - ```javascript +```javascript const pluginOptions = { // Collection of annotation data to initialize annotationsObjects: [], @@ -67,9 +85,9 @@ const pluginOptions = { }; ``` - ### Annotation Data Structure +### Annotation Data Structure - To initialize the plugin with the `annotationsObjects` collection, use the following structure: +To initialize the plugin with the `annotationsObjects` collection, use the following structure: ```javascript const annotationsObjects = [{ id: 1, @@ -95,25 +113,25 @@ const annotationsObjects = [{ }]; ``` - ### Programmatic Control +### Programmatic Control - If you'd like to drive the plugin or render plugin data through external UI elements, you can configure the plugin to hide the internal components and pass data through custom events. There are two kinds of AnnotationComments API events, _externally fired_ and _internally fired_. +If you'd like to drive the plugin or render plugin data through external UI elements, you can configure the plugin to hide the internal components and pass data through custom events. There are two kinds of AnnotationComments API events, _externally fired_ and _internally fired_. - ##### Waiting for Plugin Ready +#### Waiting for Plugin Ready - Before triggering any events on the plugin, you must wait for it to be ready. You can use the `onReady` function on the plugin: +Before triggering any events on the plugin, you must wait for it to be ready. You can use the `onReady` function on the plugin: - ```javascript -plugin.onReady(() => { +```javascript +plugin.registerListenerReady(() => { // do stuff with the plugin, such as fire events or setup listeners }); ``` - ##### Supported Externally Fired Events: +#### Supported Externally Fired Events: These events are external actions that can be called from your scripts to trigger events within the plugin: - ```javascript +```javascript // openAnnotation : Opens an annotation within the player given an ID plugin.fire('openAnnotation', { id: myAnnotationId }); // closeActiveAnnotation : Closes any active annotation @@ -144,12 +162,12 @@ plugin.fire('cancelAddingAnnotation'); plugin.fire('toggleAnnotations'); ``` - ##### Supported Internally Fired Events: -These are events that are triggered from within the running plugin and can be listened for by binding to `plugin.on` within your scripts: +#### Supported Internally Fired Events: +These are events that are triggered from within the running plugin and can be listened for by binding to `plugin.registerListener` within your scripts: ```javascript // annotationOpened : Fired whenever an annotation is opened -plugin.on('annotationOpened', (event) => { +plugin.registerListener('annotationOpened', (event) => { // event.detail = // { // annotation: (object) annotation data in format {id:.., comments:..., range:..., shape:...}, @@ -157,99 +175,98 @@ plugin.on('annotationOpened', (event) => { // } }); // annotationClosed : Fired whenever an annotation is closed -plugin.on('annotationClosed', (event) => { +plugin.registerListener('annotationClosed', (event) => { // event.detail = annotation (object) in format {id:.., comments:..., range:..., shape:...} }); // addingAnnotationDataChanged : Fired from adding annotation state if: // 1. the marker is dragged // 2. the start of the marker is moved via control buttons // 3. the shape is dragged -plugin.on('addingAnnotationDataChanged', (event) => { +plugin.registerListener('addingAnnotationDataChanged', (event) => { var newRange = event.detail.range; // returns range data if range was changed var newShape = event.detail.shape; // returns shape data if shape was changed // do something with the data }); // annotationDeleted : Fired when an annotation has been deleted via the UI -plugin.on('annotationDeleted', (event) => { +plugin.registerListener('annotationDeleted', (event) => { // annotationId = event.detail }); // enteredAnnotationMode : Fired when the plugin enters adding annotation mode // includes initial range data -plugin.on('enteredAddingAnnotation', (event) => { +plugin.registerListener('enteredAddingAnnotation', (event) => { var startTime = event.detail.range.start; // do something when adding annotation state begins }); // onStateChanged: Fired when plugin state has changed (annotation added, removed, etc) // This is a way to watch global plugin state, as an alternative to watching various annotation events -plugin.on('onStateChanged', (event) => { +plugin.registerListener('onStateChanged', (event) => { // event.detail = annotation state data }); // playerBoundsChanged : Fired when the player boundaries change due to window resize or fullscreen mode -plugin.on('playerBoundsChanged', (event) => { +plugin.registerListener('playerBoundsChanged', (event) => { var bounds = event.detail; // do something with the new boundaries }); // Entering annotation mode (annotation icon was clicked when previously 'off') -plugin.on('annotationModeEnabled', (event) => { +plugin.registerListener('annotationModeEnabled', (event) => { // do something }); // Exiting annotation mode (annotation icon was clicked when previously 'on') -plugin.on('annotationModeDisabled', (event) => { +plugin.registerListener('annotationModeDisabled', (event) => { // do something }); ``` - ### Develop and Build +## Develop and Build - We're using [npm](https://www.npmjs.com/) for package management and [gulp](https://github.com/gulpjs/gulp) as our build system. +We're using [yarn](https://yarnpkg.com/en/) for package management and [gulp](https://github.com/gulpjs/gulp) as our build system. - The fastest way to get started: +The fastest way to get started: - Clone the repo -- Run `npm install` -- Run `npm install -g gulp` -- Run `gulp build` -- Run `gulp watch` +- Run `yarn install` +- Run `yarn build` +- Run `yarn watch` - Visit `http://localhost:3004/test.html` to see the magic happen. - #### Templates +### Templates We're using the [Handlebars](http://handlebarsjs.com/) templating library to render various components within the plugin. For performance, the templates are pre-compiled into a JS file within the development environment. That way we only need to require the Handlebars runtime, saving nearly 100kb from the minified build! ⚡️ - The `gulp templates` task is used to precompile every template to `/src/js/compiled/templates.js`. This file should _not_ be modified directly, but rather the templates themselves in `/src/templates` should be modified if changes are needed. The templates task will run automatically within `gulp watch`. +The `gulp templates` task is used to precompile every template to `/src/js/compiled/templates.js`. This file should _not_ be modified directly, but rather the templates themselves in `/src/templates` should be modified if changes are needed. The templates task will run automatically within `gulp watch`. - #### UI / CSS Customization +### UI / CSS Customization - The plugin uses SASS and all styles are defined in [annotaitons.scss](src/css/annotations.scss). There is extenssive commenting on classes and styles in the file. The plugin uses a deep level of specificity to prevent styles from polluting elements on the page, and all classes are prefixed with `vac-` to prevent classname collisions in the global namespace. +The plugin uses SASS and all styles are defined in [annotaitons.scss](src/css/annotations.scss). There is extenssive commenting on classes and styles in the file. The plugin uses a deep level of specificity to prevent styles from polluting elements on the page, and all classes are prefixed with `vac-` to prevent classname collisions in the global namespace. - You can extend/modify colors and elements quite easily by writing an overrides stylesheet to address the specific elements that you wish to modify. You can also change the variable colors in the stylesheet and compile yourself for more customization. +You can extend/modify colors and elements quite easily by writing an overrides stylesheet to address the specific elements that you wish to modify. You can also change the variable colors in the stylesheet and compile yourself for more customization. - _NOTE_ - our gulp build tasks use an auto-prefixer to make the styles work cross-browser, so be sure to run that yourself if you compile the SASS files with changes. +_NOTE_ - our gulp build tasks use an auto-prefixer to make the styles work cross-browser, so be sure to run that yourself if you compile the SASS files with changes. - #### Testing +### Testing - ##### Feature tests +#### Feature tests - Feature tests are currently browser-based and run by visiting `http://localhost:3004/mocha/features/index.html`. Feature tests can be added as files in the `/test/mocha/features/` directory and then included within the `index.html` file as a external scripts. +Feature tests are currently browser-based and run by visiting `http://localhost:3004/mocha/features/index.html`. Feature tests can be added as files in the `/test/mocha/features/` directory and then included within the `index.html` file as a external scripts. - ##### Unit tests +#### Unit tests - Unit tests are run through the `gulp test` task. If the `tdd` task is included in `gulp watch`, the tests will run with every change to the test files. Each module should have a corresponding unit test file within the `/test/mocha/modules` directory. +Unit tests are run through the `gulp test` task. If the `tdd` task is included in `gulp watch`, the tests will run with every change to the test files. Each module should have a corresponding unit test file within the `/test/mocha/modules` directory. - #### Gulp commands +### Gulp commands - `gulp watch`: Fires up webserver @ `http://localhost:3004/test.html`, watches for any file changes in `/src`, including js, css (scss), and templates (.hbs), repackages, and transpiles to an unminified file in `/build` on change. +`gulp watch`: Fires up webserver @ `http://localhost:3004/test.html`, watches for any file changes in `/src`, including js, css (scss), and templates (.hbs), repackages, and transpiles to an unminified file in `/build` on change. - `gulp transpile`: Transpiles modules/files to build file in `/build` with JS maps +`gulp transpile`: Transpiles modules/files to build file in `/build` with JS maps - `gulp build`: Runs transpilation, browserify, sass, then minifies to distribution filename in `/build` with attribution +`gulp build`: Runs transpilation, browserify, sass, then minifies to distribution filename in `/build` with attribution - `gulp templates`: Uses Handlebars to pre-compile templates into a javascript file. See Templates section above. +`gulp templates`: Uses Handlebars to pre-compile templates into a javascript file. See Templates section above. - `gulp test`: Runs the mocha unit tests within the `/test/mocha/modules/` directory. +`gulp test`: Runs the mocha unit tests within the `/test/mocha/modules/` directory. - `gulp lint`: Runs jshint linter on javascript files in `/src` +`gulp lint`: Runs jshint linter on javascript files in `/src` - #### License +### License - This plugin is [licensed](license.md) under the Apache License, Version 2.0, which is the same license used by Video.js +This plugin is [licensed](license.md) under the Apache License, Version 2.0, which is the same license used by Video.js diff --git a/build/css/annotations.css b/build/css/annotations.css deleted file mode 100644 index a68585d..0000000 --- a/build/css/annotations.css +++ /dev/null @@ -1,474 +0,0 @@ -.video-js.vac-active .vjs-mouse-display, .video-js.vac-active .vjs-big-play-button { - display: none !important; } - -.video-js.vac-active .vac-marker-owrap, .video-js.vac-active .vac-control { - display: block; } - -.video-js.vac-active .vjs-control-bar { - z-index: 2; } - -.video-js.vac-active .vac-player-btn i.vac-player-icon svg { - fill: #00A6C2 !important; } - -.video-js.vac-active.vjs-has-started .vac-shape { - display: block; } - -.video-js.vac-disable-play .vjs-control { - cursor: default; } - -.video-js .vac-hidden { - display: none !important; } - -.video-js.vac-disable-fullscreen .vac-player-btn { - display: none; } - -.video-js.vac-disable-play .vac-marker { - display: none !important; } - -.video-js.vac-disable-play .vjs-play-control, .video-js.vac-disable-play .vjs-play-progress { - visibility: hidden !important; } - -.video-js .vac-button { - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; - margin: 10px; - line-height: 27px; - font-size: 13px; - padding: 0; - width: calc(100% - 20px); - text-align: center; - border-radius: 2px; - background: #00A6C2; - color: white; - display: block; - cursor: pointer; } - .video-js .vac-button:hover { - background-color: #10dcff; } - -.video-js .vac-video-cover { - z-index: 1; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(255, 0, 0, 0.15); - cursor: crosshair; } - .video-js .vac-video-cover .vac-video-cover-canvas { - width: 100%; - height: 100%; - position: relative; } - -.video-js .vac-video-write-new-wrap { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 11; - background-color: rgba(0, 0, 0, 0.7); } - .video-js .vac-video-write-new-wrap.vac-new-comment { - background-color: rgba(0, 0, 0, 0.4); } - .video-js .vac-video-write-new-wrap .vac-video-write-new { - width: 100%; - height: 100%; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; } - .video-js .vac-video-write-new-wrap .vac-video-write-new > div { - width: 80%; - max-width: 400px; - border-radius: 2px; - background: rgba(255, 255, 255, 0.85); - padding: 20px; } - .video-js .vac-video-write-new-wrap .vac-video-write-new > div h5 { - margin: 0; - padding: 0; - font-size: 15px; - color: #000; - font-weight: normal; } - .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox { - border-radius: 1px; - background-color: white; - margin-top: 20px; - width: 100%; - border-bottom: 2px solid #ee9828; } - .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox textarea { - border: none; - font-size: 13px; - color: #383838; - line-height: 16px; - padding: 8px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - min-height: 110px; - width: 100%; - resize: none; } - .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div { - padding: 10px; - -webkit-box-sizing: content-box; - box-sizing: content-box; - height: 27px; } - .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div button { - float: right; - width: auto; - padding: 0 40px; - margin: 0; } - .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div a { - float: right; - font-size: 12px; - text-decoration: underline; - line-height: 27px; - display: inline-block; - color: #383838; - cursor: pointer; - margin-right: 20px; } - .video-js .vac-video-write-new-wrap .vac-video-write-new .vac-comment-showbox > div a:hover { - color: #FF0000; } - .video-js .vac-video-write-new-wrap .vac-video-write-new.vac-is-comment { - display: block; } - .video-js .vac-video-write-new-wrap .vac-video-write-new.vac-is-comment .vac-comment-showbox { - position: absolute; - padding: 0; - margin: 0; - max-width: none; } - -.video-js .vac-shape { - position: absolute; - z-index: 1; - background-color: rgba(238, 152, 40, 0.65); - border: 2px dotted #ee9828; - display: none; } - -.video-js .vac-controls, .video-js .vac-add-controls { - z-index: 3; - position: absolute; - border-radius: 2px; - overflow: hidden; - background-color: rgba(0, 0, 0, 0.4); - top: 4px; - left: 4px; - padding: 4px 0 0 0; - font-size: 14px; - color: white; - width: 150px; - display: none; - text-align: center; } - .video-js .vac-controls i, .video-js .vac-add-controls i { - color: #dbdcdc; - font-size: 11px; - font-style: normal; - display: block; - padding: 4px 0 0; } - .video-js .vac-controls button, .video-js .vac-add-controls button { - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; - margin: 10px; - line-height: 27px; - font-size: 13px; - padding: 0; - width: calc(100% - 20px); - text-align: center; - border-radius: 2px; - background: #00A6C2; - color: white; - display: block; - cursor: pointer; } - .video-js .vac-controls button:hover, .video-js .vac-add-controls button:hover { - background-color: #10dcff; } - .video-js .vac-controls.vac-add-controls button, .video-js .vac-add-controls.vac-add-controls button { - background-color: #eed428; - color: #383838; } - .video-js .vac-controls.vac-add-controls button:hover, .video-js .vac-add-controls.vac-add-controls button:hover { - background-color: #f4e26f; } - .video-js .vac-controls.vac-add-controls a, .video-js .vac-add-controls.vac-add-controls a { - margin: 3px auto 8px; - text-transform: uppercase; - display: inline-block; - color: white; - cursor: pointer; - text-decoration: underline; - font-size: 10px; } - .video-js .vac-controls.vac-add-controls a:hover, .video-js .vac-add-controls.vac-add-controls a:hover { - color: #FF0000; } - .video-js .vac-controls .vac-annotation-nav, .video-js .vac-controls .vac-video-move, .video-js .vac-add-controls .vac-annotation-nav, .video-js .vac-add-controls .vac-video-move { - margin-top: 8px; - width: 100%; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; } - .video-js .vac-controls .vac-annotation-nav div, .video-js .vac-controls .vac-video-move div, .video-js .vac-add-controls .vac-annotation-nav div, .video-js .vac-add-controls .vac-video-move div { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - background-color: rgba(0, 0, 0, 0.8); - text-align: center; - line-height: 22px; - color: #eed428; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; - cursor: pointer; - font-size: 12px; } - .video-js .vac-controls .vac-annotation-nav div:hover, .video-js .vac-controls .vac-video-move div:hover, .video-js .vac-add-controls .vac-annotation-nav div:hover, .video-js .vac-add-controls .vac-video-move div:hover { - background-color: #eed428; - color: #000; } - .video-js .vac-controls .vac-annotation-nav div.vac-a-prev, .video-js .vac-controls .vac-video-move div.vac-a-prev, .video-js .vac-add-controls .vac-annotation-nav div.vac-a-prev, .video-js .vac-add-controls .vac-video-move div.vac-a-prev { - margin-right: 1px; } - -.video-js .vac-cursor-tool-tip { - position: absolute; - border-radius: 100%; - z-index: 999; - display: inline-block; - white-space: nowrap; } - -.video-js .vac-player-btn { - margin-right: 8px; - cursor: pointer; } - .video-js .vac-player-btn i.vac-player-icon svg { - fill: white; - -webkit-transition: fill .2s ease-in-out; - transition: fill .2s ease-in-out; } - .video-js .vac-player-btn i.vac-player-icon:hover svg { - fill: #5ce7ff; } - .video-js .vac-player-btn b { - position: absolute; - display: inline-block; - top: 3px; - right: 3px; - color: #FFF; - height: 14px; - line-height: 14px; - min-width: 14px; - text-align: center; - border-radius: 9px; - font-size: 10px; - font-weight: normal; - background-color: #FF0000; } - -.video-js .vac-marker-owrap { - display: none; - z-index: 10; - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; } - .video-js .vac-marker-owrap .vac-marker-wrap { - margin: 0 10px; - height: 100%; - position: relative; - -webkit-box-flex: 1; - -ms-flex: auto; - flex: auto; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable { - position: absolute; - width: 7px; - margin-left: 0px; - height: 30px; - bottom: 6px; - background: #00A6C2; - border-radius: 2px; - cursor: pointer; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-hovering, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-force-tooltip, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-hovering, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-force-tooltip { - opacity: 1 !important; - background: #eed428; - height: 35px; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-hovering > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-force-tooltip > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-hovering > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-force-tooltip > div { - display: block; - opacity: 1; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-hovering.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-force-tooltip.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-hovering.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-force-tooltip.vac-ranged-marker { - -webkit-box-shadow: 7px 0 0 0 #eed428 inset; - box-shadow: 7px 0 0 0 #eed428 inset; - background-color: rgba(238, 212, 40, 0.65); } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-active, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-active { - background-color: #eed428; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-active.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-active.vac-ranged-marker { - -webkit-box-shadow: 7px 0 0 0 #eed428 inset; - box-shadow: 7px 0 0 0 #eed428 inset; - background-color: rgba(238, 212, 40, 0.65); } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-ranged-marker, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-ranged-marker { - -webkit-box-shadow: 7px 0 0 0 #00A6C2 inset; - box-shadow: 7px 0 0 0 #00A6C2 inset; - background-color: rgba(0, 166, 194, 0.65); } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker.vac-marker-draggable, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable.vac-marker-draggable { - -webkit-box-shadow: 7px 0 0 0 #ee9828 inset; - box-shadow: 7px 0 0 0 #ee9828 inset; - background-color: rgba(238, 152, 40, 0.65); - cursor: ew-resize; - min-width: 7px !important; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div { - width: 100%; - position: relative; - display: none; - opacity: 0; - -webkit-transition: opacity .2s ease-in-out; - transition: opacity .2s ease-in-out; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div span, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div span { - text-overflow: ellipsis; - white-space: nowrap; - border-bottom: 1px solid #eed428; - display: block; - position: absolute; - max-width: 250px; - bottom: -1px; - line-height: 26px; - height: 28px; - overflow: hidden; - padding: 0 5px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border-radius: 1px; - background: rgba(0, 0, 0, 0.8); - color: white; - font-family: Arial; - font-size: 12px; - left: 0px; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div span b, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div span b { - color: #eed428; - display: inline-block; - margin-right: 5px; - font-weight: normal; } - .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker > div span.vac-right-side, .video-js .vac-marker-owrap .vac-marker-wrap .vac-marker-draggable > div span.vac-right-side { - left: auto; - right: 0px; } - .video-js .vac-marker-owrap .vac-marker-wrap.vac-dim-all .vac-marker { - height: 30px; - opacity: .4; } - .video-js .vac-marker-owrap .vac-marker-wrap.vac-dim-all .vac-marker.vac-force-tooltip > div { - display: none; } - -.video-js .vac-comments-container { - position: absolute; - right: 0; - top: 0; - width: 15%; - min-width: 225px; - z-index: 11; - background-color: rgba(255, 255, 255, 0.6); - height: calc(100% - 42px); - -webkit-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: all .15s linear; - transition: all .15s linear; } - .video-js .vac-comments-container:hover, .video-js .vac-comments-container.vac-active { - width: 60%; - max-width: 480px; } - .video-js .vac-comments-container:hover .vac-comments-wrap, .video-js .vac-comments-container.vac-active .vac-comments-wrap { - opacity: 1; } - .video-js .vac-comments-container:hover.vac-active .vac-add-new-shapebox, .video-js .vac-comments-container.vac-active.vac-active .vac-add-new-shapebox { - display: block; } - .video-js .vac-comments-container:hover.vac-active .vac-reply-btn, .video-js .vac-comments-container.vac-active.vac-active .vac-reply-btn { - display: none; } - .video-js .vac-comments-container .vac-comments-wrap { - opacity: .9; - height: calc(100% - 26px); - overflow-x: hidden; - overflow-y: auto; - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 10px; - border-left: 1px solid #dbdcdc; } - .video-js .vac-comments-container .vac-comments-wrap::-webkit-scrollbar { - width: 6px; - background-color: transparent; } - .video-js .vac-comments-container .vac-comments-wrap::-webkit-scrollbar-thumb { - border-radius: 5px; - -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); - background-color: #383838; } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment { - border-radius: 1px; - -webkit-box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.43); - box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.43); } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header { - width: 100%; - padding: 2px 5px; - color: #FFF; - background-color: #383838; - text-align: left; } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header:hover .vac-delete-comment { - display: inline; } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-author-name, .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-timestamp { - display: inline-block; - line-height: 16px; } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-author-name.vac-author-name, .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-timestamp.vac-author-name { - font-weight: bold; - text-align: left; - font-size: 11px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-author-name.vac-timestamp, .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-timestamp.vac-timestamp { - float: right; - text-align: right; - font-size: 10px; } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-header .vac-delete-comment { - display: none; - cursor: pointer; - color: #FF0000; } - .video-js .vac-comments-container .vac-comments-wrap .vac-comment .vac-comment-body { - width: 100%; - padding: 8px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 10px; - background-color: #fff; - color: #000; - font-size: 13px; - line-height: 16px; - text-align: left; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - border-bottom: 1px solid white; } - .video-js .vac-comments-container .vac-comments-wrap .vac-reply-btn { - margin: 10px 0 0 0; - width: 100%; } - .video-js .vac-comments-container .vac-comments-wrap .vac-add-new-shapebox { - margin: 10px 0 0 0; - border-radius: 2px; - height: 157px; - padding: 0; - color: orange; - display: none; } - .video-js .vac-comments-container .vac-comments-control-bar { - height: 26px; - border-bottom: 1px solid #eed428; - line-height: 26px; - padding: 0 10px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - background: #000; } - .video-js .vac-comments-container .vac-comments-control-bar .vac-range, .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons { - display: inline-block; - width: 49%; } - .video-js .vac-comments-container .vac-comments-control-bar .vac-range.vac-range, .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons.vac-range { - float: left; - text-align: left; - color: #eed428; } - .video-js .vac-comments-container .vac-comments-control-bar .vac-range.vac-range b, .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons.vac-range b { - color: white; } - .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons { - float: right; - text-align: right; - font-size: 10px; } - .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons a { - margin: 0 4px; - cursor: pointer; - color: red; } - .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons a.vac-close-comment-list { - color: white; } - .video-js .vac-comments-container .vac-comments-control-bar .vac-control-buttons a:hover { - text-decoration: underline; } diff --git a/build/videojs-annotation-comments.cjs.js b/build/videojs-annotation-comments.cjs.js deleted file mode 100644 index c122dc5..0000000 --- a/build/videojs-annotation-comments.cjs.js +++ /dev/null @@ -1,8476 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.AnnotationComments = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 2.0.0-beta.1', - 7: '>= 4.0.0' -}; - -exports.REVISION_CHANGES = REVISION_CHANGES; -var objectType = '[object Object]'; - -function HandlebarsEnvironment(helpers, partials, decorators) { - this.helpers = helpers || {}; - this.partials = partials || {}; - this.decorators = decorators || {}; - - _helpers.registerDefaultHelpers(this); - _decorators.registerDefaultDecorators(this); -} - -HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: _logger2['default'], - log: _logger2['default'].log, - - registerHelper: function registerHelper(name, fn) { - if (_utils.toString.call(name) === objectType) { - if (fn) { - throw new _exception2['default']('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (_utils.toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - }, - - registerDecorator: function registerDecorator(name, fn) { - if (_utils.toString.call(name) === objectType) { - if (fn) { - throw new _exception2['default']('Arg not supported with multiple decorators'); - } - _utils.extend(this.decorators, name); - } else { - this.decorators[name] = fn; - } - }, - unregisterDecorator: function unregisterDecorator(name) { - delete this.decorators[name]; - } -}; - -var log = _logger2['default'].log; - -exports.log = log; -exports.createFrame = _utils.createFrame; -exports.logger = _logger2['default']; - - -},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.registerDefaultDecorators = registerDefaultDecorators; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _decoratorsInline = require('./decorators/inline'); - -var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); - -function registerDefaultDecorators(instance) { - _decoratorsInline2['default'](instance); -} - - -},{"./decorators/inline":5}],5:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerDecorator('inline', function (fn, props, container, options) { - var ret = fn; - if (!props.partials) { - props.partials = {}; - ret = function (context, options) { - // Create a new partials stack frame prior to exec. - var original = container.partials; - container.partials = _utils.extend({}, original, props.partials); - var ret = fn(context, options); - container.partials = original; - return ret; - }; - } - - props.partials[options.args[0]] = options.fn; - - return ret; - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],6:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - -function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - /* istanbul ignore else */ - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - try { - if (loc) { - this.lineNumber = line; - - // Work around issue under safari where we can't directly set the column value - /* istanbul ignore next */ - if (Object.defineProperty) { - Object.defineProperty(this, 'column', { - value: column, - enumerable: true - }); - } else { - this.column = column; - } - } - } catch (nop) { - /* Ignore if the browser is very particular */ - } -} - -Exception.prototype = new Error(); - -exports['default'] = Exception; -module.exports = exports['default']; - - -},{}],7:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.registerDefaultHelpers = registerDefaultHelpers; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _helpersBlockHelperMissing = require('./helpers/block-helper-missing'); - -var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); - -var _helpersEach = require('./helpers/each'); - -var _helpersEach2 = _interopRequireDefault(_helpersEach); - -var _helpersHelperMissing = require('./helpers/helper-missing'); - -var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); - -var _helpersIf = require('./helpers/if'); - -var _helpersIf2 = _interopRequireDefault(_helpersIf); - -var _helpersLog = require('./helpers/log'); - -var _helpersLog2 = _interopRequireDefault(_helpersLog); - -var _helpersLookup = require('./helpers/lookup'); - -var _helpersLookup2 = _interopRequireDefault(_helpersLookup); - -var _helpersWith = require('./helpers/with'); - -var _helpersWith2 = _interopRequireDefault(_helpersWith); - -function registerDefaultHelpers(instance) { - _helpersBlockHelperMissing2['default'](instance); - _helpersEach2['default'](instance); - _helpersHelperMissing2['default'](instance); - _helpersIf2['default'](instance); - _helpersLog2['default'](instance); - _helpersLookup2['default'](instance); - _helpersWith2['default'](instance); -} - - -},{"./helpers/block-helper-missing":8,"./helpers/each":9,"./helpers/helper-missing":10,"./helpers/if":11,"./helpers/log":12,"./helpers/lookup":13,"./helpers/with":14}],8:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (_utils.isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = _utils.createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],9:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _utils = require('../utils'); - -var _exception = require('../exception'); - -var _exception2 = _interopRequireDefault(_exception); - -exports['default'] = function (instance) { - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (_utils.isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = _utils.createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (_utils.isArray(context)) { - for (var j = context.length; i < j; i++) { - if (i in context) { - execIteration(i, i, i === context.length - 1); - } - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey !== undefined) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey !== undefined) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); -}; - -module.exports = exports['default']; - - -},{"../exception":6,"../utils":19}],10:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _exception = require('../exception'); - -var _exception2 = _interopRequireDefault(_exception); - -exports['default'] = function (instance) { - instance.registerHelper('helperMissing', function () /* [args, ]options */{ - if (arguments.length === 1) { - // A missing field in a {{foo}} construct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); -}; - -module.exports = exports['default']; - - -},{"../exception":6}],11:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerHelper('if', function (conditional, options) { - if (_utils.isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],12:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -exports['default'] = function (instance) { - instance.registerHelper('log', function () /* message, options */{ - var args = [undefined], - options = arguments[arguments.length - 1]; - for (var i = 0; i < arguments.length - 1; i++) { - args.push(arguments[i]); - } - - var level = 1; - if (options.hash.level != null) { - level = options.hash.level; - } else if (options.data && options.data.level != null) { - level = options.data.level; - } - args[0] = level; - - instance.log.apply(instance, args); - }); -}; - -module.exports = exports['default']; - - -},{}],13:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -exports['default'] = function (instance) { - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); -}; - -module.exports = exports['default']; - - -},{}],14:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerHelper('with', function (context, options) { - if (_utils.isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - var data = options.data; - if (options.data && options.ids) { - data = _utils.createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - } - - return fn(context, { - data: data, - blockParams: _utils.blockParams([context], [data && data.contextPath]) - }); - } else { - return options.inverse(this); - } - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],15:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('./utils'); - -var logger = { - methodMap: ['debug', 'info', 'warn', 'error'], - level: 'info', - - // Maps a given level value to the `methodMap` indexes above. - lookupLevel: function lookupLevel(level) { - if (typeof level === 'string') { - var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); - if (levelMap >= 0) { - level = levelMap; - } else { - level = parseInt(level, 10); - } - } - - return level; - }, - - // Can be overridden in the host environment - log: function log(level) { - level = logger.lookupLevel(level); - - if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { - var method = logger.methodMap[level]; - if (!console[method]) { - // eslint-disable-line no-console - method = 'log'; - } - - for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - message[_key - 1] = arguments[_key]; - } - - console[method].apply(console, message); // eslint-disable-line no-console - } - } -}; - -exports['default'] = logger; -module.exports = exports['default']; - - -},{"./utils":19}],16:[function(require,module,exports){ -(function (global){ -/* global window */ -'use strict'; - -exports.__esModule = true; - -exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - return Handlebars; - }; -}; - -module.exports = exports['default']; - - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],17:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.checkRevision = checkRevision; -exports.template = template; -exports.wrapProgram = wrapProgram; -exports.resolvePartial = resolvePartial; -exports.invokePartial = invokePartial; -exports.noop = noop; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -// istanbul ignore next - -function _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; } } - -var _utils = require('./utils'); - -var Utils = _interopRequireWildcard(_utils); - -var _exception = require('./exception'); - -var _exception2 = _interopRequireDefault(_exception); - -var _base = require('./base'); - -function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } -} - -function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - templateSpec.main.decorator = templateSpec.main_d; - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - if (options.ids) { - options.ids[0] = true; - } - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - var ret = templateSpec[i]; - ret.decorator = templateSpec[i + '_d']; - return ret; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - // An empty object to use as replacement for null-contexts - nullContext: Object.seal({}), - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - if (options.depths) { - depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; - } else { - depths = [context]; - } - } - - function main(context /*, options*/) { - return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); - } - main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); - return main(context, options); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - if (templateSpec.usePartial || templateSpec.useDecorators) { - container.decorators = container.merge(options.decorators, env.decorators); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - container.decorators = options.decorators; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; -} - -function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - var currentDepths = depths; - if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { - currentDepths = [context].concat(depths); - } - - return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); - } - - prog = executeDecorators(fn, prog, container, depths, data, blockParams); - - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; -} - -function resolvePartial(partial, context, options) { - if (!partial) { - if (options.name === '@partial-block') { - partial = options.data['partial-block']; - } else { - partial = options.partials[options.name]; - } - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; -} - -function invokePartial(partial, context, options) { - // Use the current closure context to save the partial-block if this partial - var currentPartialBlock = options.data && options.data['partial-block']; - options.partial = true; - if (options.ids) { - options.data.contextPath = options.ids[0] || options.data.contextPath; - } - - var partialBlock = undefined; - if (options.fn && options.fn !== noop) { - (function () { - options.data = _base.createFrame(options.data); - // Wrapper function to get access to currentPartialBlock from the closure - var fn = options.fn; - partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - // Restore the partial-block from the closure for the execution of the block - // i.e. the part inside the block of the partial call. - options.data = _base.createFrame(options.data); - options.data['partial-block'] = currentPartialBlock; - return fn(context, options); - }; - if (fn.partials) { - options.partials = Utils.extend({}, options.partials, fn.partials); - } - })(); - } - - if (partial === undefined && partialBlock) { - partial = partialBlock; - } - - if (partial === undefined) { - throw new _exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } -} - -function noop() { - return ''; -} - -function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; -} - -function executeDecorators(fn, prog, container, depths, data, blockParams) { - if (fn.decorator) { - var props = {}; - prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); - Utils.extend(prog, props); - } - return prog; -} - - -},{"./base":3,"./exception":6,"./utils":19}],18:[function(require,module,exports){ -// Build out our basic SafeString type -'use strict'; - -exports.__esModule = true; -function SafeString(string) { - this.string = string; -} - -SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; -}; - -exports['default'] = SafeString; -module.exports = exports['default']; - - -},{}],19:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.extend = extend; -exports.indexOf = indexOf; -exports.escapeExpression = escapeExpression; -exports.isEmpty = isEmpty; -exports.createFrame = createFrame; -exports.blockParams = blockParams; -exports.appendContextPath = appendContextPath; -var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`', - '=': '=' -}; - -var badChars = /[&<>"'`=]/g, - possible = /[&<>"'`=]/; - -function escapeChar(chr) { - return escape[chr]; -} - -function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; -} - -var toString = Object.prototype.toString; - -exports.toString = toString; -// Sourced from lodash -// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt -/* eslint-disable func-style */ -var isFunction = function isFunction(value) { - return typeof value === 'function'; -}; -// fallback for older versions of Chrome and Safari -/* istanbul ignore next */ -if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; -} -exports.isFunction = isFunction; - -/* eslint-enable func-style */ - -/* istanbul ignore next */ -var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; -}; - -exports.isArray = isArray; -// Older IE versions do not directly support indexOf so we must implement our own, sadly. - -function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; -} - -function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); -} - -function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } -} - -function createFrame(object) { - var frame = extend({}, object); - frame._parent = object; - return frame; -} - -function blockParams(params, ids) { - params.path = ids; - return params; -} - -function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; -} - - -},{}],20:[function(require,module,exports){ -// Create a simple path alias to allow browserify to resolve -// the runtime on a supported path. -module.exports = require('./dist/cjs/handlebars.runtime')['default']; - -},{"./dist/cjs/handlebars.runtime":2}],21:[function(require,module,exports){ -'use strict'; -if (!Array.prototype.find) { - Object.defineProperty(Array.prototype, 'find', { - value: function (predicate) { - - if (this == null) { - throw new TypeError('this is null or not defined'); - } - - var obj = Object(this); - var len = obj.length >>> 0; - - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - - var thisArg = arguments[1]; - - var index = 0; - - while (index < len) { - var iValue = obj[index]; - if (predicate.call(thisArg, iValue, index, obj)) { - return iValue; - } - index++; - } - - return undefined; - } - }); -} -},{}],22:[function(require,module,exports){ -//! moment.js - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - global.moment = factory() -}(this, (function () { 'use strict'; - - var hookCallback; - - function hooks () { - return hookCallback.apply(null, arguments); - } - - // This is done to register the method called with moment() - // without creating circular dependencies. - function setHookCallback (callback) { - hookCallback = callback; - } - - function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; - } - - function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return input != null && Object.prototype.toString.call(input) === '[object Object]'; - } - - function isObjectEmpty(obj) { - if (Object.getOwnPropertyNames) { - return (Object.getOwnPropertyNames(obj).length === 0); - } else { - var k; - for (k in obj) { - if (obj.hasOwnProperty(k)) { - return false; - } - } - return true; - } - } - - function isUndefined(input) { - return input === void 0; - } - - function isNumber(input) { - return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; - } - - function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; - } - - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } - - function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); - } - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; - } - - function createUTC (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); - } - - function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso : false, - parsedDateParts : [], - meridiem : null, - rfc2822 : false, - weekdayMismatch : false - }; - } - - function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; - } - - var some; - if (Array.prototype.some) { - some = Array.prototype.some; - } else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; - - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } - - return false; - }; - } - - function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some.call(flags.parsedDateParts, function (i) { - return i != null; - }); - var isNowValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.weekdayMismatch && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); - - if (m._strict) { - isNowValid = isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } - - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } - else { - return isNowValid; - } - } - return m._isValid; - } - - function createInvalid (flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } - - return m; - } - - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - var momentProperties = hooks.momentProperties = []; - - function copyConfig(to, from) { - var i, prop, val; - - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } - - return to; - } - - var updateInProgress = false; - - // Moment prototype object - function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } - } - - function isMoment (obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); - } - - function absFloor (number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } - - return value; - } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } - - function warn(msg) { - if (hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } - } - - function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = []; - var arg; - for (var i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (var key in arguments[0]) { - arg += key + ': ' + arguments[0][key] + ', '; - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - var deprecations = {}; - - function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } - } - - hooks.suppressDeprecationWarnings = false; - hooks.deprecationHandler = null; - - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } - - function set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. - // TODO: Remove "ordinalParse" fallback in next major release. - this._dayOfMonthOrdinalParseLenient = new RegExp( - (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + - '|' + (/\d{1,2}/).source); - } - - function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } - } - for (prop in parentConfig) { - if (hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop])) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } - } - return res; - } - - function Locale(config) { - if (config != null) { - this.set(config); - } - } - - var keys; - - if (Object.keys) { - keys = Object.keys; - } else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } - } - return res; - }; - } - - var defaultCalendar = { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }; - - function calendar (key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; - } - - var defaultLongDateFormat = { - LTS : 'h:mm:ss A', - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }; - - function longDateFormat (key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; - - if (format || !formatUpper) { - return format; - } - - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; - } - - var defaultInvalidDate = 'Invalid date'; - - function invalidDate () { - return this._invalidDate; - } - - var defaultOrdinal = '%d'; - var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - - function ordinal (number) { - return this._ordinal.replace('%d', number); - } - - var defaultRelativeTime = { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }; - - function relativeTime (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - } - - function pastFuture (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); - } - - var aliases = {}; - - function addUnitAlias (unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; - } - - function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - var priorities = {}; - - function addUnitPriority(unit, priority) { - priorities[unit] = priority; - } - - function getPrioritizedUnits(unitsObj) { - var units = []; - for (var u in unitsObj) { - units.push({unit: u, priority: priorities[u]}); - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; - } - - function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; - } - - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - - var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; - - var formatFunctions = {}; - - var formatTokenFunctions = {}; - - // token: 'M' - // padded: ['MM', 2] - // ordinal: 'Mo' - // callback: function () { this.month() + 1 } - function addFormatToken (token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } - } - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } - - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); - - return formatFunctions[format](m); - } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - var match1 = /\d/; // 0 - 9 - var match2 = /\d\d/; // 00 - 99 - var match3 = /\d{3}/; // 000 - 999 - var match4 = /\d{4}/; // 0000 - 9999 - var match6 = /[+-]?\d{6}/; // -999999 - 999999 - var match1to2 = /\d\d?/; // 0 - 99 - var match3to4 = /\d\d\d\d?/; // 999 - 9999 - var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 - var match1to3 = /\d{1,3}/; // 0 - 999 - var match1to4 = /\d{1,4}/; // 0 - 9999 - var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - - var matchUnsigned = /\d+/; // 0 - inf - var matchSigned = /[+-]?\d+/; // -inf - inf - - var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z - var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - - var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - - // any word (or two) characters or numbers including two/three word month in arabic. - // includes scottish gaelic two word and hyphenated months - var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; - - var regexes = {}; - - function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; - } - - function getParseRegexForToken (token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); - } - - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); - } - - function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - - var tokens = {}; - - function addParseToken (token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; - } - } - - function addWeekParseToken (token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); - } - - function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); - } - } - - var YEAR = 0; - var MONTH = 1; - var DATE = 2; - var HOUR = 3; - var MINUTE = 4; - var SECOND = 5; - var MILLISECOND = 6; - var WEEK = 7; - var WEEKDAY = 8; - - // FORMATTING - - addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; - }); - - addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; - }); - - addFormatToken(0, ['YYYY', 4], 0, 'year'); - addFormatToken(0, ['YYYYY', 5], 0, 'year'); - addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - - // ALIASES - - addUnitAlias('year', 'y'); - - // PRIORITIES - - addUnitPriority('year', 1); - - // PARSING - - addRegexToken('Y', matchSigned); - addRegexToken('YY', match1to2, match2); - addRegexToken('YYYY', match1to4, match4); - addRegexToken('YYYYY', match1to6, match6); - addRegexToken('YYYYYY', match1to6, match6); - - addParseToken(['YYYYY', 'YYYYYY'], YEAR); - addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); - }); - addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); - }); - addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); - }); - - // HELPERS - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - - // HOOKS - - hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; - - // MOMENTS - - var getSetYear = makeGetSet('FullYear', true); - - function getIsLeapYear () { - return isLeapYear(this.year()); - } - - function makeGetSet (unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; - } - - function get (mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; - } - - function set$1 (mom, unit, value) { - if (mom.isValid() && !isNaN(value)) { - if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); - } - else { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } - } - - // MOMENTS - - function stringGet (units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); - } - return this; - } - - - function stringSet (units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units); - for (var i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; - } - - function mod(n, x) { - return ((n % x) + x) % x; - } - - var indexOf; - - if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; - } else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; - } - - function daysInMonth(year, month) { - if (isNaN(year) || isNaN(month)) { - return NaN; - } - var modMonth = mod(month, 12); - year += (month - modMonth) / 12; - return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); - } - - // FORMATTING - - addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; - }); - - addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); - }); - - addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); - }); - - // ALIASES - - addUnitAlias('month', 'M'); - - // PRIORITY - - addUnitPriority('month', 8); - - // PARSING - - addRegexToken('M', match1to2); - addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); - }); - addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); - }); - - addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; - }); - - addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } - }); - - // LOCALES - - var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - function localeMonths (m, format) { - if (!m) { - return isArray(this._months) ? this._months : - this._months['standalone']; - } - return isArray(this._months) ? this._months[m.month()] : - this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; - } - - var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - function localeMonthsShort (m, format) { - if (!m) { - return isArray(this._monthsShort) ? this._monthsShort : - this._monthsShort['standalone']; - } - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; - } - - function handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeMonthsParse (monthName, format, strict) { - var i, mom, regex; - - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - } - - // MOMENTS - - function setMonth (mom, value) { - var dayOfMonth; - - if (!mom.isValid()) { - // No op - return mom; - } - - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } - - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function getSetMonth (value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } - } - - function getDaysInMonth () { - return daysInMonth(this.year(), this.month()); - } - - var defaultMonthsShortRegex = matchWord; - function monthsShortRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } - } - - var defaultMonthsRegex = matchWord; - function monthsRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; - } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; - } - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; - } - } - - function computeMonthsParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - } - - function createDate (y, m, d, h, M, s, ms) { - // can't just apply() to create a date: - // https://stackoverflow.com/q/181348 - var date = new Date(y, m, d, h, M, s, ms); - - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { - date.setFullYear(y); - } - return date; - } - - function createUTCDate (y) { - var date = new Date(Date.UTC.apply(null, arguments)); - - // the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); - } - return date; - } - - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - - return -fwdlw + fwd - 1; - } - - // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; - - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } - - return { - year: resYear, - dayOfYear: resDayOfYear - }; - } - - function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; - } - - return { - week: resWeek, - year: resYear - }; - } - - function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; - } - - // FORMATTING - - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - - // ALIASES - - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); - - // PRIORITIES - - addUnitPriority('week', 5); - addUnitPriority('isoWeek', 5); - - // PARSING - - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); - - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - - // HELPERS - - // LOCALES - - function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } - - var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }; - - function localeFirstDayOfWeek () { - return this._week.dow; - } - - function localeFirstDayOfYear () { - return this._week.doy; - } - - // MOMENTS - - function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - // FORMATTING - - addFormatToken('d', 0, 'do', 'day'); - - addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); - }); - - addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); - }); - - addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); - }); - - addFormatToken('e', 0, 0, 'weekday'); - addFormatToken('E', 0, 0, 'isoWeekday'); - - // ALIASES - - addUnitAlias('day', 'd'); - addUnitAlias('weekday', 'e'); - addUnitAlias('isoWeekday', 'E'); - - // PRIORITY - addUnitPriority('day', 11); - addUnitPriority('weekday', 11); - addUnitPriority('isoWeekday', 11); - - // PARSING - - addRegexToken('d', match1to2); - addRegexToken('e', match1to2); - addRegexToken('E', match1to2); - addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); - }); - addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); - }); - addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); - }); - - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } - }); - - addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); - }); - - // HELPERS - - function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } - - if (!isNaN(input)) { - return parseInt(input, 10); - } - - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } - - return null; - } - - function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; - } - - // LOCALES - - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - function localeWeekdays (m, format) { - if (!m) { - return isArray(this._weekdays) ? this._weekdays : - this._weekdays['standalone']; - } - return isArray(this._weekdays) ? this._weekdays[m.day()] : - this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; - } - - var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); - function localeWeekdaysShort (m) { - return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; - } - - var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); - function localeWeekdaysMin (m) { - return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; - } - - function handleStrictParse$1(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; - - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeWeekdaysParse (weekdayName, format, strict) { - var i, mom, regex; - - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - } - - // MOMENTS - - function getSetDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - } - - function getSetLocaleDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - } - - function getSetISODayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } - } - - var defaultWeekdaysRegex = matchWord; - function weekdaysRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } - } - - var defaultWeekdaysShortRegex = matchWord; - function weekdaysShortRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; - } - } - - var defaultWeekdaysMinRegex = matchWord; - function weekdaysMinRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; - } else { - return this._weekdaysMinRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; - } - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } - } - - - function computeWeekdaysParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; - - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); - } - - // FORMATTING - - function hFormat() { - return this.hours() % 12 || 12; - } - - function kFormat() { - return this.hours() || 24; - } - - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, hFormat); - addFormatToken('k', ['kk', 2], 0, kFormat); - - addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); - }); - - addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); - }); - - addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - function meridiem (token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); - } - - meridiem('a', true); - meridiem('A', false); - - // ALIASES - - addUnitAlias('hour', 'h'); - - // PRIORITY - addUnitPriority('hour', 13); - - // PARSING - - function matchMeridiem (isStrict, locale) { - return locale._meridiemParse; - } - - addRegexToken('a', matchMeridiem); - addRegexToken('A', matchMeridiem); - addRegexToken('H', match1to2); - addRegexToken('h', match1to2); - addRegexToken('k', match1to2); - addRegexToken('HH', match1to2, match2); - addRegexToken('hh', match1to2, match2); - addRegexToken('kk', match1to2, match2); - - addRegexToken('hmm', match3to4); - addRegexToken('hmmss', match5to6); - addRegexToken('Hmm', match3to4); - addRegexToken('Hmmss', match5to6); - - addParseToken(['H', 'HH'], HOUR); - addParseToken(['k', 'kk'], function (input, array, config) { - var kInput = toInt(input); - array[HOUR] = kInput === 24 ? 0 : kInput; - }); - addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; - }); - addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - }); - addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - }); - - // LOCALES - - function localeIsPM (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - } - - var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; - function localeMeridiem (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - } - - - // MOMENTS - - // Setting the hour should keep the time, because the user explicitly - // specified which hour they want. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - var getSetHour = makeGetSet('Hours', true); - - var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, - relativeTime: defaultRelativeTime, - - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, - - week: defaultLocaleWeek, - - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - - meridiemParse: defaultLocaleMeridiemParse - }; - - // internal storage for locale config files - var locales = {}; - var localeFamilies = {}; - var globalLocale; - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return globalLocale; - } - - function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - var aliasedRequire = require; - aliasedRequire('./locale/' + name); - getSetGlobalLocale(oldLocale); - } catch (e) {} - } - return locales[name]; - } - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - function getSetGlobalLocale (key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } - else { - data = defineLocale(key, values); - } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; - } - else { - if ((typeof console !== 'undefined') && console.warn) { - //warn user if arguments are passed but the locale could not be set - console.warn('Locale ' + key + ' not found. Did you forget to load it?'); - } - } - } - - return globalLocale._abbr; - } - - function defineLocale (name, config) { - if (config !== null) { - var locale, parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - locale = loadLocale(config.parentLocale); - if (locale != null) { - parentConfig = locale._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; - } - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); - - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - } - - function updateLocale(name, config) { - if (config != null) { - var locale, tmpLocale, parentConfig = baseConfig; - // MERGE - tmpLocale = loadLocale(name); - if (tmpLocale != null) { - parentConfig = tmpLocale._config; - } - config = mergeConfigs(parentConfig, config); - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; - - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; - } - - // returns locale data - function getLocale (key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return globalLocale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); - } - - function listLocales() { - return keys(locales); - } - - function checkOverflow (m) { - var overflow; - var a = m._a; - - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } - - getParsingFlags(m).overflow = overflow; - } - - return m; - } - - // Pick the first defined of two or three arguments. - function defaults(a, b, c) { - if (a != null) { - return a; - } - if (b != null) { - return b; - } - return c; - } - - function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; - } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; - } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function configFromArray (config) { - var i, date, input = [], currentDate, expectedWeekday, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear != null) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); - - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - - // check for mismatching day of week - if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { - getParsingFlags(config).weekdayMismatch = true; - } - } - - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - var curWeek = weekOfYear(createLocal(), dow, doy); - - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); - - // Default to current week. - week = defaults(w.w, curWeek.week); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to begining of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - } - - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - - var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - - var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] - ]; - - // iso time formats and regexes - var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] - ]; - - var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; - - // date from iso format - function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; - - if (match) { - getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } - } - - // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; - - function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - var result = [ - untruncateYear(yearStr), - defaultLocaleMonthsShort.indexOf(monthStr), - parseInt(dayStr, 10), - parseInt(hourStr, 10), - parseInt(minuteStr, 10) - ]; - - if (secondStr) { - result.push(parseInt(secondStr, 10)); - } - - return result; - } - - function untruncateYear(yearStr) { - var year = parseInt(yearStr, 10); - if (year <= 49) { - return 2000 + year; - } else if (year <= 999) { - return 1900 + year; - } - return year; - } - - function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); - } - - function checkWeekday(weekdayStr, parsedInput, config) { - if (weekdayStr) { - // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. - var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), - weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); - if (weekdayProvided !== weekdayActual) { - getParsingFlags(config).weekdayMismatch = true; - config._isValid = false; - return false; - } - } - return true; - } - - var obsOffsets = { - UT: 0, - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60 - }; - - function calculateOffset(obsOffset, militaryOffset, numOffset) { - if (obsOffset) { - return obsOffsets[obsOffset]; - } else if (militaryOffset) { - // the only allowed military tz is Z - return 0; - } else { - var hm = parseInt(numOffset, 10); - var m = hm % 100, h = (hm - m) / 100; - return h * 60 + m; - } - } - - // date and time from ref 2822 format - function configFromRFC2822(config) { - var match = rfc2822.exec(preprocessRFC2822(config._i)); - if (match) { - var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); - if (!checkWeekday(match[1], parsedArray, config)) { - return; - } - - config._a = parsedArray; - config._tzm = calculateOffset(match[8], match[9], match[10]); - - config._d = createUTCDate.apply(null, config._a); - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - - getParsingFlags(config).rfc2822 = true; - } else { - config._isValid = false; - } - } - - // date from iso format or fallback - function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); - - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } - - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - configFromRFC2822(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); - } - - hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + - 'discouraged and will be removed in an upcoming major release. Please refer to ' + - 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); - - // constant that refers to the ISO standard - hooks.ISO_8601 = function () {}; - - // constant that refers to the RFC 2822 form - hooks.RFC_2822 = function () {}; - - // date from string and format string - function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { - configFromISO(config); - return; - } - if (config._f === hooks.RFC_2822) { - configFromRFC2822(config); - return; - } - config._a = []; - getParsingFlags(config).empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } - - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - - configFromArray(config); - checkOverflow(config); - } - - - function meridiemFixWrap (locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; - } - } - - // date from string and array of format strings - function configFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); - - if (!isValid(tempConfig)) { - continue; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; - - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - - getParsingFlags(tempConfig).score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); - } - - function configFromObject(config) { - if (config._d) { - return; - } - - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - - configFromArray(config); - } - - function createFromConfig (config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; - } - - function prepareConfig (config) { - var input = config._i, - format = config._f; - - config._locale = config._locale || getLocale(config._l); - - if (input === null || (format === undefined && input === '')) { - return createInvalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } - - if (!isValid(config)) { - config._d = null; - } - - return config; - } - - function configFromInput(config) { - var input = config._i; - if (isUndefined(input)) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (isObject(input)) { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { - hooks.createFromInputFallback(config); - } - } - - function createLocalOrUTC (input, format, locale, strict, isUTC) { - var c = {}; - - if (locale === true || locale === false) { - strict = locale; - locale = undefined; - } - - if ((isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0)) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - - return createFromConfig(c); - } - - function createLocal (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); - } - - var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return createInvalid(); - } - } - ); - - var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; - } else { - return createInvalid(); - } - } - ); - - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } - - // TODO: Use [].sort instead? - function min () { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); - } - - function max () { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); - } - - var now = function () { - return Date.now ? Date.now() : +(new Date()); - }; - - var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; - - function isDurationValid(m) { - for (var key in m) { - if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { - return false; - } - } - - var unitHasDecimal = false; - for (var i = 0; i < ordering.length; ++i) { - if (m[ordering[i]]) { - if (unitHasDecimal) { - return false; // only allow non-integers for smallest unit - } - if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { - unitHasDecimal = true; - } - } - } - - return true; - } - - function isValid$1() { - return this._isValid; - } - - function createInvalid$1() { - return createDuration(NaN); - } - - function Duration (duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - this._isValid = isDurationValid(normalizedInput); - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible to translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = getLocale(); - - this._bubble(); - } - - function isDuration (obj) { - return obj instanceof Duration; - } - - function absRound (number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); - } - } - - // FORMATTING - - function offset (token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); - } - - offset('Z', ':'); - offset('ZZ', ''); - - // PARSING - - addRegexToken('Z', matchShortOffset); - addRegexToken('ZZ', matchShortOffset); - addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); - }); - - // HELPERS - - // timezone chunker - // '+10:00' > ['10', '00'] - // '-1530' > ['-15', '30'] - var chunkOffset = /([\+\-]|\d\d)/gi; - - function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher); - - if (matches === null) { - return null; - } - - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); - - return minutes === 0 ? - 0 : - parts[0] === '+' ? minutes : -minutes; - } - - // Return a moment from input, that is local/utc/zone equivalent to model. - function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } - } - - function getDateOffset (m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; - } - - // HOOKS - - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - hooks.updateOffset = function () {}; - - // MOMENTS - - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - function getSetOffset (input, keepLocalTime, keepMinutes) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16 && !keepMinutes) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract(this, createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); - } - } - - function getSetZone (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } - } - - function setOffsetToUTC (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - } - - function setOffsetToLocal (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; - } - - function setOffsetToParsedOffset () { - if (this._tzm != null) { - this.utcOffset(this._tzm, false, true); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } - else { - this.utcOffset(0, true); - } - } - return this; - } - - function hasAlignedHourOffset (input) { - if (!this.isValid()) { - return false; - } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; - } - - function isDaylightSavingTime () { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); - } - - function isDaylightSavingTimeShifted () { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } - - var c = {}; - - copyConfig(c, this); - c = prepareConfig(c); - - if (c._a) { - var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } - - return this._isDSTShifted; - } - - function isLocal () { - return this.isValid() ? !this._isUTC : false; - } - - function isUtcOffset () { - return this.isValid() ? this._isUTC : false; - } - - function isUtc () { - return this.isValid() ? this._isUTC && this._offset === 0 : false; - } - - // ASP.NET json date format regex - var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; - - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - // and further modified to allow for strings containing both week and day - var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - - function createDuration (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; - - if (isDuration(input)) { - duration = { - ms : input._milliseconds, - d : input._days, - M : input._months - }; - } else if (isNumber(input)) { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match - }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; - duration = { - y : parseIso(match[2], sign), - M : parseIso(match[3], sign), - w : parseIso(match[4], sign), - d : parseIso(match[5], sign), - h : parseIso(match[6], sign), - m : parseIso(match[7], sign), - s : parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; - } - - createDuration.fn = Duration.prototype; - createDuration.invalid = createInvalid$1; - - function parseIso (inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - } - - function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; - } - - function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; - } - - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); - tmp = val; val = period; period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; - } - - function addSubtract (mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); - - if (!mom.isValid()) { - // No op - return; - } - - updateOffset = updateOffset == null ? true : updateOffset; - - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); - } - } - - var add = createAdder(1, 'add'); - var subtract = createAdder(-1, 'subtract'); - - function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - } - - function calendar$1 (time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse'; - - var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); - - return this.format(output || this.localeData().calendar(format, this, createLocal(now))); - } - - function clone () { - return new Moment(this); - } - - function isAfter (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } - } - - function isBefore (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } - } - - function isBetween (from, to, units, inclusivity) { - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && - (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); - } - - function isSame (input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); - } - } - - function isSameOrAfter (input, units) { - return this.isSame(input, units) || this.isAfter(input,units); - } - - function isSameOrBefore (input, units) { - return this.isSame(input, units) || this.isBefore(input,units); - } - - function diff (input, units, asFloat) { - var that, - zoneDelta, - output; - - if (!this.isValid()) { - return NaN; - } - - that = cloneWithOffset(input, this); - - if (!that.isValid()) { - return NaN; - } - - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - - units = normalizeUnits(units); - - switch (units) { - case 'year': output = monthDiff(this, that) / 12; break; - case 'month': output = monthDiff(this, that); break; - case 'quarter': output = monthDiff(this, that) / 3; break; - case 'second': output = (this - that) / 1e3; break; // 1000 - case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 - case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 - case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst - case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst - default: output = this - that; - } - - return asFloat ? output : absFloor(output); - } - - function monthDiff (a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; - } - - hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; - hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; - - function toString () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } - - function toISOString(keepOffset) { - if (!this.isValid()) { - return null; - } - var utc = keepOffset !== true; - var m = utc ? this.clone().utc() : this; - if (m.year() < 0 || m.year() > 9999) { - return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - if (utc) { - return this.toDate().toISOString(); - } else { - return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); - } - } - return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } - - /** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ - function inspect () { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment'; - var zone = ''; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - var prefix = '[' + func + '("]'; - var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; - var datetime = '-MM-DD[T]HH:mm:ss.SSS'; - var suffix = zone + '[")]'; - - return this.format(prefix + year + datetime + suffix); - } - - function format (inputString) { - if (!inputString) { - inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); - } - - function from (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function fromNow (withoutSuffix) { - return this.from(createLocal(), withoutSuffix); - } - - function to (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function toNow (withoutSuffix) { - return this.to(createLocal(), withoutSuffix); - } - - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - function locale (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - } - - var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ); - - function localeData () { - return this._locale; - } - - function startOf (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - case 'date': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } - if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; - } - - function endOf (units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - - // 'date' is an alias for 'day', so it should be considered as such. - if (units === 'date') { - units = 'day'; - } - - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); - } - - function valueOf () { - return this._d.valueOf() - ((this._offset || 0) * 60000); - } - - function unix () { - return Math.floor(this.valueOf() / 1000); - } - - function toDate () { - return new Date(this.valueOf()); - } - - function toArray () { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; - } - - function toObject () { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; - } - - function toJSON () { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; - } - - function isValid$2 () { - return isValid(this); - } - - function parsingFlags () { - return extend({}, getParsingFlags(this)); - } - - function invalidAt () { - return getParsingFlags(this).overflow; - } - - function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; - } - - // FORMATTING - - addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; - }); - - addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; - }); - - function addWeekYearFormatToken (token, getter) { - addFormatToken(0, [token, token.length], 0, getter); - } - - addWeekYearFormatToken('gggg', 'weekYear'); - addWeekYearFormatToken('ggggg', 'weekYear'); - addWeekYearFormatToken('GGGG', 'isoWeekYear'); - addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - - // ALIASES - - addUnitAlias('weekYear', 'gg'); - addUnitAlias('isoWeekYear', 'GG'); - - // PRIORITY - - addUnitPriority('weekYear', 1); - addUnitPriority('isoWeekYear', 1); - - - // PARSING - - addRegexToken('G', matchSigned); - addRegexToken('g', matchSigned); - addRegexToken('GG', match1to2, match2); - addRegexToken('gg', match1to2, match2); - addRegexToken('GGGG', match1to4, match4); - addRegexToken('gggg', match1to4, match4); - addRegexToken('GGGGG', match1to6, match6); - addRegexToken('ggggg', match1to6, match6); - - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); - }); - - addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); - }); - - // MOMENTS - - function getSetWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); - } - - function getSetISOWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); - } - - function getISOWeeksInYear () { - return weeksInYear(this.year(), 1, 4); - } - - function getWeeksInYear () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - } - - function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; - } - return setWeekAll.call(this, input, week, weekday, dow, doy); - } - } - - function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; - } - - // FORMATTING - - addFormatToken('Q', 0, 'Qo', 'quarter'); - - // ALIASES - - addUnitAlias('quarter', 'Q'); - - // PRIORITY - - addUnitPriority('quarter', 7); - - // PARSING - - addRegexToken('Q', match1); - addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; - }); - - // MOMENTS - - function getSetQuarter (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - } - - // FORMATTING - - addFormatToken('D', ['DD', 2], 'Do', 'date'); - - // ALIASES - - addUnitAlias('date', 'D'); - - // PRIORITY - addUnitPriority('date', 9); - - // PARSING - - addRegexToken('D', match1to2); - addRegexToken('DD', match1to2, match2); - addRegexToken('Do', function (isStrict, locale) { - // TODO: Remove "ordinalParse" fallback in next major release. - return isStrict ? - (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : - locale._dayOfMonthOrdinalParseLenient; - }); - - addParseToken(['D', 'DD'], DATE); - addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0]); - }); - - // MOMENTS - - var getSetDayOfMonth = makeGetSet('Date', true); - - // FORMATTING - - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - - // ALIASES - - addUnitAlias('dayOfYear', 'DDD'); - - // PRIORITY - addUnitPriority('dayOfYear', 4); - - // PARSING - - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); - }); - - // HELPERS - - // MOMENTS - - function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - } - - // FORMATTING - - addFormatToken('m', ['mm', 2], 0, 'minute'); - - // ALIASES - - addUnitAlias('minute', 'm'); - - // PRIORITY - - addUnitPriority('minute', 14); - - // PARSING - - addRegexToken('m', match1to2); - addRegexToken('mm', match1to2, match2); - addParseToken(['m', 'mm'], MINUTE); - - // MOMENTS - - var getSetMinute = makeGetSet('Minutes', false); - - // FORMATTING - - addFormatToken('s', ['ss', 2], 0, 'second'); - - // ALIASES - - addUnitAlias('second', 's'); - - // PRIORITY - - addUnitPriority('second', 15); - - // PARSING - - addRegexToken('s', match1to2); - addRegexToken('ss', match1to2, match2); - addParseToken(['s', 'ss'], SECOND); - - // MOMENTS - - var getSetSecond = makeGetSet('Seconds', false); - - // FORMATTING - - addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); - }); - - addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); - }); - - addFormatToken(0, ['SSS', 3], 0, 'millisecond'); - addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; - }); - addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; - }); - addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; - }); - addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; - }); - addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; - }); - addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; - }); - - - // ALIASES - - addUnitAlias('millisecond', 'ms'); - - // PRIORITY - - addUnitPriority('millisecond', 16); - - // PARSING - - addRegexToken('S', match1to3, match1); - addRegexToken('SS', match1to3, match2); - addRegexToken('SSS', match1to3, match3); - - var token; - for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); - } - - function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - } - - for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); - } - // MOMENTS - - var getSetMillisecond = makeGetSet('Milliseconds', false); - - // FORMATTING - - addFormatToken('z', 0, 0, 'zoneAbbr'); - addFormatToken('zz', 0, 0, 'zoneName'); - - // MOMENTS - - function getZoneAbbr () { - return this._isUTC ? 'UTC' : ''; - } - - function getZoneName () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - } - - var proto = Moment.prototype; - - proto.add = add; - proto.calendar = calendar$1; - proto.clone = clone; - proto.diff = diff; - proto.endOf = endOf; - proto.format = format; - proto.from = from; - proto.fromNow = fromNow; - proto.to = to; - proto.toNow = toNow; - proto.get = stringGet; - proto.invalidAt = invalidAt; - proto.isAfter = isAfter; - proto.isBefore = isBefore; - proto.isBetween = isBetween; - proto.isSame = isSame; - proto.isSameOrAfter = isSameOrAfter; - proto.isSameOrBefore = isSameOrBefore; - proto.isValid = isValid$2; - proto.lang = lang; - proto.locale = locale; - proto.localeData = localeData; - proto.max = prototypeMax; - proto.min = prototypeMin; - proto.parsingFlags = parsingFlags; - proto.set = stringSet; - proto.startOf = startOf; - proto.subtract = subtract; - proto.toArray = toArray; - proto.toObject = toObject; - proto.toDate = toDate; - proto.toISOString = toISOString; - proto.inspect = inspect; - proto.toJSON = toJSON; - proto.toString = toString; - proto.unix = unix; - proto.valueOf = valueOf; - proto.creationData = creationData; - proto.year = getSetYear; - proto.isLeapYear = getIsLeapYear; - proto.weekYear = getSetWeekYear; - proto.isoWeekYear = getSetISOWeekYear; - proto.quarter = proto.quarters = getSetQuarter; - proto.month = getSetMonth; - proto.daysInMonth = getDaysInMonth; - proto.week = proto.weeks = getSetWeek; - proto.isoWeek = proto.isoWeeks = getSetISOWeek; - proto.weeksInYear = getWeeksInYear; - proto.isoWeeksInYear = getISOWeeksInYear; - proto.date = getSetDayOfMonth; - proto.day = proto.days = getSetDayOfWeek; - proto.weekday = getSetLocaleDayOfWeek; - proto.isoWeekday = getSetISODayOfWeek; - proto.dayOfYear = getSetDayOfYear; - proto.hour = proto.hours = getSetHour; - proto.minute = proto.minutes = getSetMinute; - proto.second = proto.seconds = getSetSecond; - proto.millisecond = proto.milliseconds = getSetMillisecond; - proto.utcOffset = getSetOffset; - proto.utc = setOffsetToUTC; - proto.local = setOffsetToLocal; - proto.parseZone = setOffsetToParsedOffset; - proto.hasAlignedHourOffset = hasAlignedHourOffset; - proto.isDST = isDaylightSavingTime; - proto.isLocal = isLocal; - proto.isUtcOffset = isUtcOffset; - proto.isUtc = isUtc; - proto.isUTC = isUtc; - proto.zoneAbbr = getZoneAbbr; - proto.zoneName = getZoneName; - proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); - proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); - proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); - proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); - proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); - - function createUnix (input) { - return createLocal(input * 1000); - } - - function createInZone () { - return createLocal.apply(null, arguments).parseZone(); - } - - function preParsePostFormat (string) { - return string; - } - - var proto$1 = Locale.prototype; - - proto$1.calendar = calendar; - proto$1.longDateFormat = longDateFormat; - proto$1.invalidDate = invalidDate; - proto$1.ordinal = ordinal; - proto$1.preparse = preParsePostFormat; - proto$1.postformat = preParsePostFormat; - proto$1.relativeTime = relativeTime; - proto$1.pastFuture = pastFuture; - proto$1.set = set; - - proto$1.months = localeMonths; - proto$1.monthsShort = localeMonthsShort; - proto$1.monthsParse = localeMonthsParse; - proto$1.monthsRegex = monthsRegex; - proto$1.monthsShortRegex = monthsShortRegex; - proto$1.week = localeWeek; - proto$1.firstDayOfYear = localeFirstDayOfYear; - proto$1.firstDayOfWeek = localeFirstDayOfWeek; - - proto$1.weekdays = localeWeekdays; - proto$1.weekdaysMin = localeWeekdaysMin; - proto$1.weekdaysShort = localeWeekdaysShort; - proto$1.weekdaysParse = localeWeekdaysParse; - - proto$1.weekdaysRegex = weekdaysRegex; - proto$1.weekdaysShortRegex = weekdaysShortRegex; - proto$1.weekdaysMinRegex = weekdaysMinRegex; - - proto$1.isPM = localeIsPM; - proto$1.meridiem = localeMeridiem; - - function get$1 (format, index, field, setter) { - var locale = getLocale(); - var utc = createUTC().set(setter, index); - return locale[field](utc, format); - } - - function listMonthsImpl (format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - - if (index != null) { - return get$1(format, index, field, 'month'); - } - - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); - } - return out; - } - - // () - // (5) - // (fmt, 5) - // (fmt) - // (true) - // (true, 5) - // (true, fmt, 5) - // (true, fmt) - function listWeekdaysImpl (localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; - - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } - - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0; - - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); - } - - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; - } - - function listMonths (format, index) { - return listMonthsImpl(format, index, 'months'); - } - - function listMonthsShort (format, index) { - return listMonthsImpl(format, index, 'monthsShort'); - } - - function listWeekdays (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); - } - - function listWeekdaysShort (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); - } - - function listWeekdaysMin (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); - } - - getSetGlobalLocale('en', { - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - // Side effect imports - - hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); - hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - - var mathAbs = Math.abs; - - function abs () { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; - } - - function addSubtract$1 (duration, input, value, direction) { - var other = createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); - } - - // supports only 2.0-style add(1, 's') or add(duration) - function add$1 (input, value) { - return addSubtract$1(this, input, value, 1); - } - - // supports only 2.0-style subtract(1, 's') or subtract(duration) - function subtract$1 (input, value) { - return addSubtract$1(this, input, value, -1); - } - - function absCeil (number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } - } - - function bubble () { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; - - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; - } - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; - - days += absFloor(hours / 24); - - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - - return this; - } - - function daysToMonths (days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; - } - - function monthsToDays (months) { - // the reverse of daysToMonths - return months * 146097 / 4800; - } - - function as (units) { - if (!this.isValid()) { - return NaN; - } - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week' : return days / 7 + milliseconds / 6048e5; - case 'day' : return days + milliseconds / 864e5; - case 'hour' : return days * 24 + milliseconds / 36e5; - case 'minute' : return days * 1440 + milliseconds / 6e4; - case 'second' : return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 864e5) + milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - } - - // TODO: Use this.as('ms')? - function valueOf$1 () { - if (!this.isValid()) { - return NaN; - } - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); - } - - function makeAs (alias) { - return function () { - return this.as(alias); - }; - } - - var asMilliseconds = makeAs('ms'); - var asSeconds = makeAs('s'); - var asMinutes = makeAs('m'); - var asHours = makeAs('h'); - var asDays = makeAs('d'); - var asWeeks = makeAs('w'); - var asMonths = makeAs('M'); - var asYears = makeAs('y'); - - function clone$1 () { - return createDuration(this); - } - - function get$2 (units) { - units = normalizeUnits(units); - return this.isValid() ? this[units + 's']() : NaN; - } - - function makeGetter(name) { - return function () { - return this.isValid() ? this._data[name] : NaN; - }; - } - - var milliseconds = makeGetter('milliseconds'); - var seconds = makeGetter('seconds'); - var minutes = makeGetter('minutes'); - var hours = makeGetter('hours'); - var days = makeGetter('days'); - var months = makeGetter('months'); - var years = makeGetter('years'); - - function weeks () { - return absFloor(this.days() / 7); - } - - var round = Math.round; - var thresholds = { - ss: 44, // a few seconds to seconds - s : 45, // seconds to minute - m : 45, // minutes to hour - h : 22, // hours to day - d : 26, // days to month - M : 11 // months to year - }; - - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } - - function relativeTime$1 (posNegDuration, withoutSuffix, locale) { - var duration = createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); - - var a = seconds <= thresholds.ss && ['s', seconds] || - seconds < thresholds.s && ['ss', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; - - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); - } - - // This function allows you to set the rounding function for relative time strings - function getSetRelativeTimeRounding (roundingFunction) { - if (roundingFunction === undefined) { - return round; - } - if (typeof(roundingFunction) === 'function') { - round = roundingFunction; - return true; - } - return false; - } - - // This function allows you to set a threshold for relative time strings - function getSetRelativeTimeThreshold (threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - if (threshold === 's') { - thresholds.ss = limit - 1; - } - return true; - } - - function humanize (withSuffix) { - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var locale = this.localeData(); - var output = relativeTime$1(this, !withSuffix, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } - - return locale.postformat(output); - } - - var abs$1 = Math.abs; - - function sign(x) { - return ((x > 0) - (x < 0)) || +x; - } - - function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var seconds = abs$1(this._milliseconds) / 1000; - var days = abs$1(this._days); - var months = abs$1(this._months); - var minutes, hours, years; - - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; - var total = this.asSeconds(); - - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - var totalSign = total < 0 ? '-' : ''; - var ymSign = sign(this._months) !== sign(total) ? '-' : ''; - var daysSign = sign(this._days) !== sign(total) ? '-' : ''; - var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; - - return totalSign + 'P' + - (Y ? ymSign + Y + 'Y' : '') + - (M ? ymSign + M + 'M' : '') + - (D ? daysSign + D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? hmsSign + h + 'H' : '') + - (m ? hmsSign + m + 'M' : '') + - (s ? hmsSign + s + 'S' : ''); - } - - var proto$2 = Duration.prototype; - - proto$2.isValid = isValid$1; - proto$2.abs = abs; - proto$2.add = add$1; - proto$2.subtract = subtract$1; - proto$2.as = as; - proto$2.asMilliseconds = asMilliseconds; - proto$2.asSeconds = asSeconds; - proto$2.asMinutes = asMinutes; - proto$2.asHours = asHours; - proto$2.asDays = asDays; - proto$2.asWeeks = asWeeks; - proto$2.asMonths = asMonths; - proto$2.asYears = asYears; - proto$2.valueOf = valueOf$1; - proto$2._bubble = bubble; - proto$2.clone = clone$1; - proto$2.get = get$2; - proto$2.milliseconds = milliseconds; - proto$2.seconds = seconds; - proto$2.minutes = minutes; - proto$2.hours = hours; - proto$2.days = days; - proto$2.weeks = weeks; - proto$2.months = months; - proto$2.years = years; - proto$2.humanize = humanize; - proto$2.toISOString = toISOString$1; - proto$2.toString = toISOString$1; - proto$2.toJSON = toISOString$1; - proto$2.locale = locale; - proto$2.localeData = localeData; - - proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); - proto$2.lang = lang; - - // Side effect imports - - // FORMATTING - - addFormatToken('X', 0, 0, 'unix'); - addFormatToken('x', 0, 0, 'valueOf'); - - // PARSING - - addRegexToken('x', matchSigned); - addRegexToken('X', matchTimestamp); - addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); - }); - addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); - }); - - // Side effect imports - - - hooks.version = '2.22.1'; - - setHookCallback(createLocal); - - hooks.fn = proto; - hooks.min = min; - hooks.max = max; - hooks.now = now; - hooks.utc = createUTC; - hooks.unix = createUnix; - hooks.months = listMonths; - hooks.isDate = isDate; - hooks.locale = getSetGlobalLocale; - hooks.invalid = createInvalid; - hooks.duration = createDuration; - hooks.isMoment = isMoment; - hooks.weekdays = listWeekdays; - hooks.parseZone = createInZone; - hooks.localeData = getLocale; - hooks.isDuration = isDuration; - hooks.monthsShort = listMonthsShort; - hooks.weekdaysMin = listWeekdaysMin; - hooks.defineLocale = defineLocale; - hooks.updateLocale = updateLocale; - hooks.locales = listLocales; - hooks.weekdaysShort = listWeekdaysShort; - hooks.normalizeUnits = normalizeUnits; - hooks.relativeTimeRounding = getSetRelativeTimeRounding; - hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; - hooks.calendarFormat = getCalendarFormat; - hooks.prototype = proto; - - // currently HTML5 input type only supports 24-hour formats - hooks.HTML5_FMT = { - DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // - DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // - DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // - DATE: 'YYYY-MM-DD', // - TIME: 'HH:mm', // - TIME_SECONDS: 'HH:mm:ss', // - TIME_MS: 'HH:mm:ss.SSS', // - WEEK: 'YYYY-[W]WW', // - MONTH: 'YYYY-MM' // - }; - - return hooks; - -}))); - -},{}],23:[function(require,module,exports){ -"use strict"; -/* - Main function and entry point - Can be registered to a videojs instance as a plugin -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -module.exports = function (videojs) { - require('./lib/polyfills'); - - var Plugin = videojs.getPlugin('plugin'), - Utils = require('./lib/utils'), - Controls = require("./components/controls"), - AnnotationState = require("./components/annotation_state"), - EventDispatcher = require("./lib/event_dispatcher"); - - var DEFAULT_OPTIONS = Object.freeze({ - bindArrowKeys: true, - meta: { user_id: null, user_name: null }, - annotationsObjects: [], - showControls: true, - showCommentList: true, - showFullScreen: true, - showMarkerShapeAndTooltips: true, - internalCommenting: true, - startInAnnotationMode: false - }); - - return function (_Plugin) { - _inherits(AnnotationComments, _Plugin); - - function AnnotationComments(player, options) { - _classCallCheck(this, AnnotationComments); - - options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options); - - var _this = _possibleConstructorReturn(this, (AnnotationComments.__proto__ || Object.getPrototypeOf(AnnotationComments)).call(this, player, options)); - - _this.eventDispatcher = new EventDispatcher(_this); - _this.eventDispatcher.registerListenersFor(_this, 'AnnotationComments'); - - _this.player = player; - _this.meta = options.meta; - _this.options = options; - - _this._readyCallbacks = []; - - // Assign reference to this class to player for access later by components where needed - player.annotationComments = function () { - return _this; - }.bind(_this); - - // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration - // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3 - if (player.readyState() >= 3) { - _this.postLoadDataConstructor(); - } else { - player.on('loadeddata', _this.postLoadDataConstructor.bind(_this)); - } - return _this; - } - - // Additional init/setup after video data + metadata is available - - - _createClass(AnnotationComments, [{ - key: 'postLoadDataConstructor', - value: function postLoadDataConstructor() { - // setup initial state and render UI - this.annotationState = new AnnotationState(this.player); - this.annotationState.annotations = this.options.annotationsObjects; - - this.controls = new Controls(this.player, this.options.bindArrowKeys); - this.bindEvents(); - this.setBounds(false); - if (this.options.startInAnnotationMode) this.toggleAnnotationMode(); - - this.pluginReady(); - } - - // Bind needed events for interaction w/ components - - }, { - key: 'bindEvents', - value: function bindEvents() { - var _this2 = this; - - // Set player boundaries on window size change or fullscreen change - $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500)); - this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500)); - - // Remove annotation features on fullscreen if showFullScreen: false - if (!this.options.showFullScreen) { - this.player.on('fullscreenchange', function () { - if (_this2.player.isFullscreen_) { - _this2.preFullscreenAnnotationsEnabled = _this2.active; - $(_this2.player.el()).addClass('vac-disable-fullscreen'); - } else { - $(_this2.player.el()).removeClass('vac-disable-fullscreen'); - } - if (_this2.preFullscreenAnnotationsEnabled) { - // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are - // in annotation mode, toggle the mode - _this2.toggleAnnotationMode(); - } - }.bind(this)); - } - } - - // A wrapper func to make it easier to use EventDispatcher from the client - // Ex: plugin.fire(type, data); - - }, { - key: 'fire', - value: function fire(type) { - var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - this.eventDispatcher.fire(type, data); - } - - // Toggle annotations mode on/off - - }, { - key: 'toggleAnnotationMode', - value: function toggleAnnotationMode() { - this.active = !this.active; - this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements - this.annotationState.enabled = this.active; - - if (this.active) { - this.fire("annotationModeEnabled"); - } else { - this.fire("annotationModeDisabled"); - } - - // Handle control component UI if showControls: true - if (this.options.showControls) { - if (!this.active) { - this.controls.clear(true); - } else { - this.controls.render(); - } - } - } - - // Set player UI boundaries - - }, { - key: 'setBounds', - value: function setBounds() { - var triggerChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.bounds = {}; - var $player = $(this.player.el()), - $ctrls = $player.find('.vjs-control-bar'); - - this.bounds.left = $player.offset().left; - this.bounds.top = $player.offset().top; - this.bounds.right = this.bounds.left + $player.width(); - this.bounds.bottom = this.bounds.top + $player.height(); - this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height(); - - // fires an event when bounds have changed during resizing - if (triggerChange) this.fire('playerBoundsChanged', this.bounds); - } - - // Public function to register a callback for when plugin is ready - - }, { - key: 'onReady', - value: function onReady(callback) { - if (this.eventDispatcher.pluginReady) { - return callback(); - } - this._readyCallbacks.push(callback); - } - - // Mark plugin as ready and fire any pending callbacks - - }, { - key: 'pluginReady', - value: function pluginReady() { - this.eventDispatcher.pluginReady = true; - while (this._readyCallbacks.length) { - this._readyCallbacks.pop()(); - } - } - - // Teardown all components, remove all listeners, and remove elements from DOM - - }, { - key: 'dispose', - value: function dispose() { - this.controls = this.controls.teardown(); - this.annotationState = this.annotationState.teardown(); - this.eventDispatcher = this.eventDispatcher.teardown(); - this.teardown(); - if (this.player) { - this.player.annotationComments = null; - $(this.player.el()).removeClass('vac-active'); - $(this.player.el()).find("[class^='vac-']").remove(); - } - _get(AnnotationComments.prototype.__proto__ || Object.getPrototypeOf(AnnotationComments.prototype), 'dispose', this).call(this); - } - }, { - key: 'teardown', - value: function teardown() { - if (this.player) this.player.off('fullscreenchange'); - $(window).off('resize.vac-window-resize'); - } - }]); - - return AnnotationComments; - }(Plugin); -}; - -},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":35,"./lib/polyfills":39,"./lib/utils":40}],24:[function(require,module,exports){ -"use strict"; - -var _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; }; - -var Handlebars = require("handlebars/runtime"); -exports["comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n
\n
" + alias4(container.lambda((stack1 = depth0 != null ? depth0.meta : depth0) != null ? stack1.user_name : stack1, depth0)) + "
\n
" + alias4((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "timeSince", "hash": {}, "data": data }) : helper)) + "\n   X\n
\n
\n
\n " + alias4((helpers.breaklines || depth0 && depth0.breaklines || alias2).call(alias1, depth0 != null ? depth0.body : depth0, { "name": "breaklines", "hash": {}, "data": data })) + "\n
\n
\n"; - }, "useData": true }); -exports["comment_list"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data, blockParams) { - var stack1; - - return " " + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : "") + "\n"; - }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data, blockParams) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}; - - return "
\n"; - }, "useData": true, "useBlockParams": true }); -exports["controls"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { - var stack1; - - return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(2, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; - }, "2": function _(container, depth0, helpers, partials, data) { - var stack1; - - return "
\n \n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showNav : depth0, { "name": "if", "hash": {}, "fn": container.program(3, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; - }, "3": function _(container, depth0, helpers, partials, data) { - return "
\n
Prev
\n
Next
\n
\n"; - }, "5": function _(container, depth0, helpers, partials, data) { - var stack1, - alias1 = depth0 != null ? depth0 : container.nullContext || {}; - - return "
\n
\n
Click and drag to select
\n
\n
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.writingComment : depth0, { "name": "if", "hash": {}, "fn": container.program(9, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); - }, "6": function _(container, depth0, helpers, partials, data) { - var stack1; - - return "
\n Select shape + range\n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.internalCommenting : depth0, { "name": "if", "hash": {}, "fn": container.program(7, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n
-1 sec
\n
+1 sec
\n
\n
\n"; - }, "7": function _(container, depth0, helpers, partials, data) { - return " \n cancel\n"; - }, "9": function _(container, depth0, helpers, partials, data) { - var helper; - - return "
\n
\n
\n
New Annotation @ " + container.escapeExpression((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "rangeStr", "hash": {}, "data": data }) : helper)) + "
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n"; - }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var stack1, - alias1 = depth0 != null ? depth0 : container.nullContext || {}; - - return ((stack1 = helpers.unless.call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "unless", "hash": {}, "fn": container.program(1, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); - }, "useData": true }); -exports["draggable_marker"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n
\n"; - }, "useData": true }); -exports["marker"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { - return "vac-ranged-marker"; - }, "3": function _(container, depth0, helpers, partials, data) { - var helper; - - return "width:" + container.escapeExpression((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "width", "hash": {}, "data": data }) : helper)) + ";"; - }, "5": function _(container, depth0, helpers, partials, data) { - var stack1; - - return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.tooltipBody : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; - }, "6": function _(container, depth0, helpers, partials, data) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n \n " + alias4((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipTime", "hash": {}, "data": data }) : helper)) + " - " + alias4((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipBody", "hash": {}, "data": data }) : helper)) + "\n \n
\n"; - }, "7": function _(container, depth0, helpers, partials, data) { - return "vac-right-side"; - }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showTooltip : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; - }, "useData": true }); -exports["marker_wrap"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - return "
\n
\n
"; - }, "useData": true }); -exports["new_comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n"; - }, "useData": true }); -exports["player_button"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - return "\n\n \n \n \n \n"; - }, "useData": true }); - -},{"handlebars/runtime":20}],25:[function(require,module,exports){ -"use strict"; -/* - Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils.js"), - CommentList = require("./comment_list"), - Marker = require("./marker"), - Comment = require("./comment"), - Shape = require("./shape"); - -module.exports = function (_PlayerUIComponent) { - _inherits(Annotation, _PlayerUIComponent); - - function Annotation(data, player) { - _classCallCheck(this, Annotation); - - var _this = _possibleConstructorReturn(this, (Annotation.__proto__ || Object.getPrototypeOf(Annotation)).call(this, player)); - - _this.id = data.id || _this.componentId; - _this.range = data.range; - _this.shape = data.shape; - _this.secondsActive = _this.buildSecondsActiveArray(); - _this.buildComments(data); - _this.buildMarker(); - _this.buildShape(); - _this.bindEvents(); - - _this.isOpen = false; - return _this; - } - - _createClass(Annotation, [{ - key: "buildComments", - value: function buildComments(data) { - this.commentList = new CommentList({ "comments": data.comments, "annotation": this }, this.player); - } - }, { - key: "buildMarker", - value: function buildMarker() { - this.marker = new Marker(this.player, this.range, this.commentList.comments[0]); - this.marker.render(); - } - }, { - key: "buildShape", - value: function buildShape() { - this.annotationShape = new Shape(this.player, this.shape); - } - - // Serialize object - - }, { - key: "bindEvents", - value: function bindEvents() { - var _this2 = this; - - this.marker.$el.on('click.vac-marker', function (e) { - return _this2.plugin.annotationState.openAnnotation(_this2, true); - }); - } - - // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state - - }, { - key: "open", - value: function open() { - var withPause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - var _this3 = this; - - var previewOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var forceSnapToStart = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - this.isOpen = true; - var snapToStart = forceSnapToStart || !Utils.isWithinRange(this.range.start, this.range.end, Math.floor(this.currentTime)); - - var showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips; - this.marker.setActive(showTooltip); - if (!previewOnly && this.plugin.options.showCommentList) { - this.commentList.render(); - } - - if (!previewOnly || previewOnly && this.plugin.options.showMarkerShapeAndTooltips) { - this.annotationShape.render(); - - if (this.shape) { - this.annotationShape.$el.on("click.vac-annotation", function () { - _this3.plugin.annotationState.openAnnotation(_this3, false, false, false); - }); - } - } - - if (withPause) this.player.pause(); - if (snapToStart) this.currentTime = this.range.start; - - this.plugin.fire('annotationOpened', { - annotation: this.data, - triggered_by_timeline: previewOnly - }); - } - - // Closes the annotation. Handles marker, commendList, shape, and AnnotationState - - }, { - key: "close", - value: function close() { - var clearActive = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - if (!this.isOpen) return; - this.isOpen = false; - this.marker.deactivate(); - this.commentList.teardown(false); - if (this.annotationShape.$el) this.annotationShape.$el.off("click.vac-annotation"); - this.annotationShape.teardown(); - if (clearActive) this.plugin.annotationState.clearActive(); - this.plugin.fire('annotationClosed', this.data); - } - - // For preloading an array of seconds active on initialization - // Values used to build timeMap in AnnotationState - - }, { - key: "buildSecondsActiveArray", - value: function buildSecondsActiveArray() { - var seconds = []; - if (!!this.range.end) { - for (var i = this.range.start; i <= this.range.end; i++) { - seconds.push(i); - } - } else { - var start = this.range.start; - seconds.push(start); - if (start < this.duration) seconds.push(start + 1); - } - return seconds; - } - - // Tearsdown annotation and marker, removes object from AnnotationState - - }, { - key: "teardown", - value: function teardown() { - var removeFromCollection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.close(true); - this.marker.teardown(); - if (this.commentList) this.commentList.teardown(removeFromCollection); - if (removeFromCollection) this.plugin.annotationState.removeAnnotation(this); - if (this.annotationShape) this.annotationShape.teardown(); - if (removeFromCollection) _get(Annotation.prototype.__proto__ || Object.getPrototypeOf(Annotation.prototype), "teardown", this).call(this); - } - - // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref - - }, { - key: "data", - get: function get() { - return { - id: this.id, - range: this.range, - shape: this.shape, - comments: this.commentList.data - }; - } - }, { - key: "isActive", - get: function get() { - return this.plugin.annotationState.activeAnnotation === this; - } - }], [{ - key: "newFromData", - value: function newFromData(range, shape, commentStr, plugin) { - var id = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; - - var comment = Comment.dataObj(commentStr, plugin); - if (range) range = Utils.parseIntObj(range); - if (shape) shape = Utils.parseIntObj(shape); - var data = { - id: id, - range: range, - shape: shape, - comments: [comment] - }; - return new Annotation(data, plugin.player); - } - }]); - - return Annotation; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":38,"./../lib/utils.js":40,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(require,module,exports){ -"use strict"; -/* - Component for managing the state of annotations, including showing active annotation during playback, - toggling active states for annotations, navigating annotations forward/back, etc -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Utils = require('./../lib/utils'), - PlayerComponent = require("./../lib/player_component"), - Annotation = require("./annotation"); - -module.exports = function (_PlayerComponent) { - _inherits(AnnotationState, _PlayerComponent); - - function AnnotationState(player) { - _classCallCheck(this, AnnotationState); - - var _this = _possibleConstructorReturn(this, (AnnotationState.__proto__ || Object.getPrototypeOf(AnnotationState)).call(this, player)); - - _this.initAPI(_this, 'AnnotationState'); - _this.resetData(); - _this.bindEvents(); - return _this; - } - - // sets _enabled and closes or opens annotation as needed - - - _createClass(AnnotationState, [{ - key: "bindEvents", - - - // Bind events for setting liveAnnotation on video time change - value: function bindEvents() { - this.player.on("timeupdate", Utils.throttle(this.setLiveAnnotation.bind(this), 100)); - } - - // Sort annotations by range.start - - }, { - key: "sortAnnotations", - value: function sortAnnotations() { - this._annotations.sort(function (a, b) { - return a.range.start < b.range.start ? -1 : a.range.start > b.range.start ? 1 : 0; - }); - } - - // Add a new annotation - - }, { - key: "addNewAnnotation", - value: function addNewAnnotation(annotation) { - this._annotations.push(annotation); - this.openAnnotation(annotation, true, true, false, true); - this.stateChanged(); - } - - // Create and add a annotation - - }, { - key: "createAndAddAnnotation", - value: function createAndAddAnnotation(data) { - this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew(); - - var annotation = Annotation.newFromData(data.range, data.shape, data.commentStr || "", this.plugin, data.id); - this.addNewAnnotation(annotation); - } - - // Destroy an existing annotation - - }, { - key: "destroyAnnotationById", - value: function destroyAnnotationById(id) { - var annotation = this.findAnnotation(id); - if (annotation) annotation.teardown(); - } - - // Remove an annotation - - }, { - key: "removeAnnotation", - value: function removeAnnotation(annotation) { - var id = annotation.id, - i = this._annotations.indexOf(annotation); - this._annotations.splice(i, 1); - this.stateChanged(); - this.plugin.fire('annotationDeleted', { id: id }); - } - - // Set the live annotation based on current video time - - }, { - key: "setLiveAnnotation", - value: function setLiveAnnotation() { - if (!this.enabled) return; - var time = Math.floor(this.currentTime); - - if (this.skipLiveCheck) { - if (time !== this.lastVideoTime) this.skipLiveCheck = false; - return; - } - - var matches = this.activeAnnotationsForTime(time); - if (!matches.length) return this.activeAnnotation.close(); - - // Set live annotation as the last match - var liveAnnotation = this.annotations[matches[matches.length - 1]]; - - // Special cases if this or another annotation is active - if (this.activeAnnotation.range) { - if (liveAnnotation === this.activeAnnotation) return; - // Check if the active annotation and live annotation share a start time - // Is that start time at the current playhead? - // If so, don't switch which is active. - var liveStart = liveAnnotation.range.start, - activeStart = this.activeAnnotation.range.start; - if (liveStart === activeStart && liveStart === time) return; - } - - this.openAnnotation(liveAnnotation, false, false, true); - } - - // Get all active annotations for a time (in seconds) - - }, { - key: "activeAnnotationsForTime", - value: function activeAnnotationsForTime(time) { - if (!this.annotations.length) return []; - return this.annotationTimeMap[time] || []; - } - - /* - Rebuild the annotation time map - Example: this._annotations[1] and this._annotations[3] are active during second 4 - this.annotationTimeMap = { 4: [1, 3] } - */ - - }, { - key: "rebuildAnnotationTimeMap", - value: function rebuildAnnotationTimeMap() { - var _this2 = this; - - var timeMap = {}; - this.annotations.forEach(function (annotation) { - annotation.secondsActive.forEach(function (second) { - var val = timeMap[second] || []; - val.push(_this2.annotations.indexOf(annotation)); - timeMap[second] = val; - }); - }); - this.annotationTimeMap = timeMap; - } - - // Close active annotation and remove reference in state - - }, { - key: "clearActive", - value: function clearActive() { - this.activeAnnotation.close(false); - this._activeAnnotation = null; - } - - // Open annotation with options to pause and show preview - // skipLiveCheck will short circuit setLiveAnnotation() - - }, { - key: "openAnnotation", - value: function openAnnotation(annotation) { - var skipLiveCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var pause = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - var previewOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - var forceSnapToStart = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - - if (!this.plugin.active) this.plugin.toggleAnnotationMode(); - this.skipLiveCheck = skipLiveCheck; - this.clearActive(); - annotation.open(pause, previewOnly, forceSnapToStart); - this.activeAnnotation = annotation; - this.lastVideoTime = this.activeAnnotation.range.start; - } - - // Open an annotation by ID (if it exists) - - }, { - key: "openAnnotationById", - value: function openAnnotationById(id) { - var annotation = this.findAnnotation(id); - if (annotation) this.openAnnotation(annotation); - } - - // Returns annotation object given ID - - }, { - key: "findAnnotation", - value: function findAnnotation(id) { - return this.annotations.find(function (a) { - return a.id == id; - }); - } - - // Returns comment object given ID - - }, { - key: "findComment", - value: function findComment(id) { - var _ref; - - var comments = this.annotations.map(function (a) { - return a.commentList.comments; - }); - comments = (_ref = []).concat.apply(_ref, _toConsumableArray(comments)); // flatten 2d array - return comments.find(function (c) { - return c.id == id; - }); - } - - // Finds the next annotation in collection and opens it - - }, { - key: "nextAnnotation", - value: function nextAnnotation() { - if (this._activeAnnotation) { - var ind = this.annotations.indexOf(this._activeAnnotation), - nextInd = ind === this.annotations.length - 1 ? 0 : ind + 1; - return this.openAnnotation(this.annotations[nextInd], true); - } - var time = Math.floor(this.currentTime); - for (var i = 0; i < this.annotations.length; i++) { - if (this.annotations[i].range.start > time) return this.openAnnotation(this.annotations[i], true); - } - this.openAnnotation(this.annotations[0], true); - } - - // Finds the previous annotation in collection and opens it - - }, { - key: "prevAnnotation", - value: function prevAnnotation() { - if (this._activeAnnotation) { - var ind = this.annotations.indexOf(this._activeAnnotation), - nextInd = ind === 0 ? this.annotations.length - 1 : ind - 1; - return this.openAnnotation(this.annotations[nextInd], true); - } - var time = Math.floor(this.currentTime); - for (var i = this.annotations.length - 1; i >= 0; i--) { - if (this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true); - } - this.openAnnotation(this.annotations[this.annotations.length - 1], true); - } - - // Use anywhere the annotation data changes - // Cleans internal state data, updates player button, triggers configurable callback - - }, { - key: "stateChanged", - value: function stateChanged() { - this.sortAnnotations(); - this.rebuildAnnotationTimeMap(); - this.plugin.fire('onStateChanged', this.data); - } - - // Reset internal state properties - - }, { - key: "resetData", - value: function resetData() { - this.annotations = []; - this.annotationTimeMap = {}; - this.activeAnnotation = null; - this.enabled = false; - this.skipNextTimeCheck = false; - this.lastVideoTime = 0; - } - - // Remove UI and unbind events for this and child components - - }, { - key: "teardown", - value: function teardown() { - this.annotations.forEach(function (annotation) { - annotation.teardown(false); - }); - this.resetData(); - _get(AnnotationState.prototype.__proto__ || Object.getPrototypeOf(AnnotationState.prototype), "teardown", this).call(this); - } - }, { - key: "enabled", - set: function set(shouldBeEnabled) { - this._enabled = shouldBeEnabled; - if (!shouldBeEnabled) this.activeAnnotation.close(); - if (shouldBeEnabled) { - this.skipLiveCheck = false; - this.setLiveAnnotation(); - } - }, - get: function get() { - return this._enabled; - } - - // Sets _annotations w/Annoation objects from input array - - }, { - key: "annotations", - set: function set(annotationsData) { - var _this3 = this; - - this._annotations = annotationsData.map(function (a) { - return new Annotation(a, _this3.player); - }); - this.sortAnnotations(); - this.rebuildAnnotationTimeMap(); - }, - get: function get() { - return this._annotations; - } - }, { - key: "activeAnnotation", - set: function set() { - var annotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - - this._activeAnnotation = annotation; - } - - // Get current active annotation or a null object with .close() - , - get: function get() { - return this._activeAnnotation || { close: function close() {} }; - } - - // Serialize data - - }, { - key: "data", - get: function get() { - return this._annotations.map(function (a) { - return a.data; - }); - } - }]); - - return AnnotationState; -}(PlayerComponent); - -},{"./../lib/player_component":37,"./../lib/utils":40,"./annotation":25}],27:[function(require,module,exports){ -"use strict"; -/* - Component for an invidual comment -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - moment = require("moment"), - templateName = 'comment'; - -module.exports = function (_PlayerUIComponent) { - _inherits(Comment, _PlayerUIComponent); - - function Comment(data, player) { - _classCallCheck(this, Comment); - - var _this = _possibleConstructorReturn(this, (Comment.__proto__ || Object.getPrototypeOf(Comment)).call(this, player)); - - _this.commentList = data.commentList; - _this.id = data.id || _this.componentId; - _this.meta = data.meta; - _this.body = data.body; - _this.timestamp = moment(data.meta.datetime).unix(); - _this.timeSince = _this.timeSince(); - - _this.$el = $(_this.render()); - return _this; - } - - // Serialize data - - - _createClass(Comment, [{ - key: "render", - value: function render() { - return this.renderTemplate(templateName, { - id: this.id, - body: this.body, - meta: this.meta, - timeSince: this.timeSince - }); - } - - // Return time since comment timestamp - - }, { - key: "timeSince", - value: function timeSince() { - return moment(this.meta.datetime).fromNow(); - } - }, { - key: "teardown", - value: function teardown() { - var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - _get(Comment.prototype.__proto__ || Object.getPrototypeOf(Comment.prototype), "teardown", this).call(this, destroy); - } - - // Return a Comment obj given body content and plugin reference - - }, { - key: "data", - get: function get() { - return { - id: this.id, - meta: this.meta, - body: this.body - }; - } - }, { - key: "HTML", - get: function get() { - return this.$el[0].outerHTML; - } - }], [{ - key: "newFromData", - value: function newFromData(body, commentList, plugin) { - var data = this.dataObj(body, plugin); - return new Comment(data, plugin.player); - } - - // Return an object with plugin data, timestamp, unique id, and body content - - }, { - key: "dataObj", - value: function dataObj(body, plugin) { - return { - meta: Object.assign({ - datetime: moment().toISOString() - }, plugin.meta), - id: Utils.guid(), - body: body - }; - } - }]); - - return Comment; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":38,"./../lib/utils":40,"moment":22}],28:[function(require,module,exports){ -"use strict"; -/* - Component for a list of comments in a visible/active annotation -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - Comment = require("./comment"), - commentListTemplateName = 'comment_list', - newCommentTemplateName = 'new_comment'; - -module.exports = function (_PlayerUIComponent) { - _inherits(CommentList, _PlayerUIComponent); - - function CommentList(data, player) { - _classCallCheck(this, CommentList); - - var _this = _possibleConstructorReturn(this, (CommentList.__proto__ || Object.getPrototypeOf(CommentList)).call(this, player)); - - _this.annotation = data.annotation; - _this.comments = data.comments.map(function (commentData) { - commentData.commentList = _this; - return new Comment(commentData, player); - }); - _this.sortComments(); - return _this; - } - - // Serialize object - - - _createClass(CommentList, [{ - key: "bindListEvents", - - - // Bind all events needed for the comment list - value: function bindListEvents() { - var _this2 = this; - - this.$el.on("click.vac-comment", ".vac-close-comment-list", function () { - return _this2.annotation.close(); - }.bind(this)) // Hide CommentList UI with close button - .on("click.vac-comment", ".vac-reply-btn", this.addNewComment.bind(this)) // Open new reply UI with reply button - .on("click.vac-comment", ".vac-delete-annotation", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button - .on("click.vac-comment", ".vac-delete-comment", this.destroyComment.bind(this)) // Delete comment with delete comment button - .on("mousewheel.vac-comment DOMMouseScroll.vac-comment", ".vac-comments-wrap", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI - } - - // Bind event listeners for new comments form - - }, { - key: "bindCommentFormEvents", - value: function bindCommentFormEvents() { - this.$newCommentForm.on("click.vac-comment", ".vac-add-controls a, .vac-video-write-new.vac-is-comment a", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link - .on("click.vac-comment", ".vac-video-write-new.vac-is-comment button", this.saveNewComment.bind(this)); // Save new comment with save button - } - - // Render CommentList UI with all comments using template - - }, { - key: "render", - value: function render() { - this.$el = $(this.renderTemplate(commentListTemplateName, { - commentsHTML: this.comments.map(function (c) { - return c.HTML; - }), - rangeStr: Utils.humanTime(this.annotation.range) - })); - - this.$player.append(this.$el); - this.$wrap = this.$UI.commentsContainer; - this.bindListEvents(); - } - - // Re-render UI on state change - - }, { - key: "reRender", - value: function reRender() { - this.teardown(false); - this.render(); - } - - // Render new comment form - - }, { - key: "addNewComment", - value: function addNewComment() { - this.$wrap.addClass(this.UI_CLASSES.active).find(".vac-comments-wrap").scrollTop(999999); - var $shapebox = this.$wrap.find(".vac-add-new-shapebox"), - width = $shapebox.outerWidth(), - top = $shapebox.position().top + 10, - right = this.$wrap.outerWidth() - ($shapebox.position().left + width); - - this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, { width: width, top: top, right: right })); - this.bindCommentFormEvents(); - this.$player.append(this.$newCommentForm); - } - - // Save comment from new comment form, update state and re-render UI - - }, { - key: "saveNewComment", - value: function saveNewComment() { - this.$wrap.removeClass(this.UI_CLASSES.active); - - var user_id = 1, - body = this.$UI.newCommentTextarea.val(); - - if (!body) return; // empty comment - TODO add validation / err message - this.createComment(body); - } - }, { - key: "createComment", - value: function createComment(body) { - var comment = Comment.newFromData(body, this, this.plugin); - this.comments.push(comment); - this.sortComments(); - - // Don't mutate UI if comment is being created for an inactive annotation (via API) - if (this.annotation.isActive) { - this.reRender(false); - this.closeNewComment(); - } - - this.plugin.annotationState.stateChanged(); - } - - // Cancel comment adding process - - }, { - key: "closeNewComment", - value: function closeNewComment() { - this.unbindCommentFormEvents(); - if (this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active); - if (this.$newCommentForm) this.$newCommentForm.remove(); - } - - // Delete a comment. If it is the only comment, delete the annotation - // Update state and re-render UI - - }, { - key: "destroyComment", - value: function destroyComment(event) { - var annotationId = this.annotation.id; - if (this.comments.length == 1) { - this.annotation.teardown(); - } else { - var commentId = this.findCommentId(event), - comment = this.comments.find(function (c) { - return c.id == commentId; - }), - i = this.comments.indexOf(comment); - this.comments.splice(i, 1); - this.reRender(); - } - - this.plugin.annotationState.stateChanged(); - } - }, { - key: "findCommentId", - value: function findCommentId(event) { - var id = typeof event.detail.id === 'undefined' ? $(event.target).closest('.vac-comment').data('id') : event.detail.id; - return id; - } - - // Prevents outer page scroll when at the top or bottom of CommentList UI - // TODO: This might need to be fine-tuned? - - }, { - key: "disablePageScroll", - value: function disablePageScroll(event) { - var $target = $(event.currentTarget), - height = $target.height(), - ogEvent = event.originalEvent, - delta = ogEvent.wheelDelta || -ogEvent.detail, - dir = delta < 0 ? "down" : "up", - scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight); - - // if scrolling into top of div - if ($target.scrollTop() < 20 && dir == "up") { - $target.stop(); - $target.animate({ scrollTop: 0 }, 100); - event.preventDefault(); - } - - // if scrolling into bottom of div - if ($target.scrollTop() > scrollDiff - 10 && dir == "down") { - $target.stop(); - $target.animate({ scrollTop: height + 40 }, 100); - event.preventDefault(); - } - } - - // Sort comments by timestamp - - }, { - key: "sortComments", - value: function sortComments() { - this.comments.sort(function (a, b) { - return a.timestamp < b.timestamp ? -1 : a.timestamp > b.timestamp ? 1 : 0; - }); - } - - // Delete the annotation - - }, { - key: "handleDeleteAnnotationClick", - value: function handleDeleteAnnotationClick(e) { - var _this3 = this; - - var $confirmEl = $("").addClass("vac-delete-confirm").text("CONFIRM"); - $confirmEl.on("click.comment", function () { - $confirmEl.off("click.comment"); - _this3.annotation.teardown(); - }); - $(e.target).replaceWith($confirmEl); - } - - // Unbind listeners for new comments form - - }, { - key: "unbindCommentFormEvents", - value: function unbindCommentFormEvents() { - if (this.$newCommentForm) this.$newCommentForm.off("click.vac-comment"); - } - - // Teardown CommentList UI, unbind events - - }, { - key: "teardown", - value: function teardown() { - var destroyComments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - if (this.$el) { - this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"); - } - this.comments.forEach(function (c) { - return c.teardown(destroyComments); - }); - if (destroyComments) this.comments = []; - _get(CommentList.prototype.__proto__ || Object.getPrototypeOf(CommentList.prototype), "teardown", this).call(this); - } - }, { - key: "data", - get: function get() { - return this.comments.map(function (c) { - return c.data; - }); - } - }]); - - return CommentList; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./comment":27}],29:[function(require,module,exports){ -"use strict"; -/* - Component for managing annotation "control box" in upper left of video when in annotation mode, - including all functionality to add new annotations -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - DraggableMarker = require("./draggable_marker.js"), - SelectableShape = require("./selectable_shape.js"), - PlayerButton = require("./player_button"), - Annotation = require("./annotation"), - templateName = 'controls'; - -// Control uses a "ui state" to determine how UI is rendered - this object is the base state, containing a -// default value for each item in the state -var BASE_UI_STATE = Object.freeze({ - adding: false, // Are we currently adding a new annotation? (step 1 of flow) - writingComment: false // Are we currently writing the comment for annotation (step 2 of flow) -}); - -module.exports = function (_PlayerUIComponent) { - _inherits(Controls, _PlayerUIComponent); - - function Controls(player, bindArrowKeys) { - _classCallCheck(this, Controls); - - var _this = _possibleConstructorReturn(this, (Controls.__proto__ || Object.getPrototypeOf(Controls)).call(this, player)); - - _this.initAPI(_this, 'Controls'); - - _this.internalCommenting = _this.plugin.options.internalCommenting; - _this.showControls = _this.plugin.options.showControls; - _this.uiState = Utils.cloneObject(BASE_UI_STATE); - _this.bindEvents(bindArrowKeys); - - if (_this.showControls) { - // create player button in the control bar if controls are shown - _this.playerButton = new PlayerButton(_this.player); - } - - _this.render(); - return _this; - } - - // Bind all the events we need for UI interaction - - - _createClass(Controls, [{ - key: "bindEvents", - value: function bindEvents(bindArrowKeys) { - var _this2 = this; - - this.$player.on("click.vac-controls", ".vac-controls button", this.startAddNew.bind(this)) // Add new button click - .on("click.vac-controls", ".vac-annotation-nav .vac-a-next", function () { - return _this2.plugin.annotationState.nextAnnotation(); - }) // Click 'next' on annotation nav - .on("click.vac-controls", ".vac-annotation-nav .vac-a-prev", function () { - return _this2.plugin.annotationState.prevAnnotation(); - }) // Click 'prev' on annotation nav - .on("click.vac-controls", ".vac-video-move .vac-a-next", function () { - return _this2.marker.scrubStart(1); - }) // Click '+1 sec' on marker nav - .on("click.vac-controls", ".vac-video-move .vac-a-prev", function () { - return _this2.marker.scrubStart(-1); - }); // Click '-1 sec' on marker nav - - if (this.internalCommenting) { - this.$player.on("click.vac-controls", ".vac-add-controls button", this.writeComment.bind(this)) // 'Next' button click while adding - .on("click.vac-controls", ".vac-video-write-new.vac-is-annotation button", this.saveNew.bind(this)) // 'Save' button click while adding - .on("click.vac-controls", ".vac-add-controls a, .vac-video-write-new.vac-is-annotation a", this.cancelAddNew.bind(this)); // Cancel link click - } - if (bindArrowKeys) { - $(document).on("keyup.vac-nav-" + this.playerId, function (e) { - return _this2.handleArrowKeys(e); - }); // Use arrow keys to navigate annotations - } - } - - // Remove UI and unbind events for this and child components - - }, { - key: "teardown", - value: function teardown() { - this.clear(true); - this.$player.off('click.vac-controls'); - $(document).off("keyup.vac-nav-" + this.playerId + " mousemove.vac-tooltip-" + this.playerId); - if (this.playerButton) this.playerButton.teardown(); - _get(Controls.prototype.__proto__ || Object.getPrototypeOf(Controls.prototype), "teardown", this).call(this); - } - - // Clear existing UI (resetting components if need be) - - }, { - key: "clear", - value: function clear() { - var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (reset) { - if (this.uiState.adding) { - this.restoreNormalUI(); - this.marker.teardown(); - this.selectableShape.teardown(); - } - this.uiState = Utils.cloneObject(BASE_UI_STATE); - this.$player.find('.vac-video-cover-canvas').off('mousedown.vac-cursor-tooltip').off('mouseup.vac-cursor-tooltip'); - } - this.$tooltip_ = null; - this.$UI.controlElements.remove(); - } - - // Render the UI elements (based on uiState) - - }, { - key: "render", - value: function render() { - var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - this.clear(reset); - var data = Object.assign({ - rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null, - showNav: this.plugin.annotationState.annotations.length > 1 - }, this.uiState, { internalCommenting: this.internalCommenting, showControls: this.showControls }); - - var $ctrls = this.renderTemplate(templateName, data); - this.$player.append($ctrls); - - if (this.playerButton) this.playerButton.updateNumAnnotations(); - } - - // User clicked to cancel in-progress add - restore to normal state - - }, { - key: "cancelAddNew", - value: function cancelAddNew() { - if (!(this.uiState.adding || this.uiState.writingComment)) return; - this.render(true); - this.marker.teardown(); - this.marker = null; - } - - // User clicked 'add' button in the controls - setup UI and marker - - }, { - key: "startAddNew", - value: function startAddNew() { - if (!this.plugin.active) this.plugin.toggleAnnotationMode(); - - this.player.pause(); - this.setAddingUI(); - this.uiState.adding = true; - this.render(); - - // construct new range and create marker - var range = { - start: parseInt(this.currentTime, 10), - stop: parseInt(this.currentTime, 10) - }; - this.marker = new DraggableMarker(this.player, range); - this.selectableShape = new SelectableShape(this.player); - - // show cursor help text if controls are hidden - if (!this.showControls) this.bindCursorTooltip(); - - this.plugin.fire('enteredAddingAnnotation', { range: range }); - } - - // User clicked 'next' action - show UI to write comment - - }, { - key: "writeComment", - value: function writeComment() { - this.uiState.writingComment = true; - this.render(); - } - - // User clicked to save a new annotation/comment during add new flow - - }, { - key: "saveNew", - value: function saveNew() { - var comment = this.$UI.newCommentTextarea.val(); - if (!comment) return; // empty comment - TODO add validation / err message - - var a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin); - this.plugin.annotationState.addNewAnnotation(a); - - this.cancelAddNew(); - } - - // Change normal UI (hide markers, hide playback, etc) on init add state - - }, { - key: "setAddingUI", - value: function setAddingUI() { - this.plugin.annotationState.enabled = false; - this.disablePlayingAndControl(); - } - - // Restore normal UI after add state - - }, { - key: "restoreNormalUI", - value: function restoreNormalUI() { - this.plugin.annotationState.enabled = this.plugin.active; - this.enablePlayingAndControl(); - $(document).off("mousemove.vac-tooltip-" + this.playerId); - } - - // On arrow key press, navigate to next or prev Annotation - - }, { - key: "handleArrowKeys", - value: function handleArrowKeys(e) { - if (!this.plugin.active) return; - var keyId = e.which; - - if (keyId == 37) this.plugin.annotationState.prevAnnotation(); - if (keyId == 39) this.plugin.annotationState.nextAnnotation(); - } - - // Adds help text to cursor during annotation mode - - }, { - key: "bindCursorTooltip", - value: function bindCursorTooltip() { - var _this3 = this; - - this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden); - - // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct - this.plugin.setBounds(false); - $(document).on("mousemove.vac-tooltip-" + this.playerId, Utils.throttle(function (event) { - if (!_this3.plugin.bounds) return; - - var x = event.pageX, - y = event.pageY, - outOfBounds = x < _this3.plugin.bounds.left || x > _this3.plugin.bounds.right || y < _this3.plugin.bounds.top || y > _this3.plugin.bounds.bottom, - withinControls = !outOfBounds && y >= _this3.plugin.bounds.bottomWithoutControls, - markerHovered = _this3.$tooltip.hasClass('vac-marker-hover'); - - if (outOfBounds) { - _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); - return; - } - - var cursorX = x - _this3.plugin.bounds.left, - cursorY = y - _this3.plugin.bounds.top, - margin = 10, - rightEdge = _this3.$player.width(), - bottomEdge = _this3.$player.height() - _this3.$UI.controlBar.height(), - atRightEdge = cursorX + _this3.tooltipArea.width + margin * 2 >= rightEdge, - atBottomEdge = cursorY + _this3.tooltipArea.height + margin * 2 >= bottomEdge; - - // is the tooltip too close to the right or bottom edge? - var posX = atRightEdge ? rightEdge - _this3.tooltipArea.width - margin : cursorX + margin, - posY = atBottomEdge ? bottomEdge - _this3.tooltipArea.height - margin : cursorY + margin; - - // hide if the cursor is over the control bar but not hovering over the draggable marker - // also hide if mouse is down - if (withinControls && !markerHovered || _this3.$tooltip.hasClass('vac-cursor-dragging')) { - _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); - } else { - _this3.$tooltip.removeClass(_this3.UI_CLASSES.hidden); - } - - _this3.$tooltip.css({ - left: posX + "px", - top: posY + "px" - }); - }.bind(this), 50)); - } - }, { - key: "$tooltip", - get: function get() { - this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip'); - return this.$tooltip_; - } - }]); - - return Controls; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(require,module,exports){ -"use strict"; -/* - Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range - as drag occurs -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Marker = require("./marker"), - Utils = require('./../lib/utils'), - markerTemplateName = 'draggable_marker'; - -module.exports = function (_Marker) { - _inherits(DraggableMarker, _Marker); - - function DraggableMarker(player, range) { - _classCallCheck(this, DraggableMarker); - - var _this = _possibleConstructorReturn(this, (DraggableMarker.__proto__ || Object.getPrototypeOf(DraggableMarker)).call(this, player, range)); - - _this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10 - _this.templateName = markerTemplateName; // Change template from base Marker template - _this.dragging = false; // Is a drag action currently occring? - _this.rangePin = range.start; // What's the original pinned timeline point when marker was added - _this.render(); - _this.$parent = _this.$UI.markerWrap; // Set parent as marker wrap - return _this; - } - - // Bind needed evnets for UI interaction - - - _createClass(DraggableMarker, [{ - key: "bindMarkerEvents", - value: function bindMarkerEvents() { - var _this2 = this; - - // On mouse down init drag - this.$el.on('mousedown.vac-marker', function (e) { - e.preventDefault(); - _this2.dragging = true; - // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms - $(document).on("mousemove.vac-dmarker-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 250)); - - // Add drag class to cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging').removeClass('vac-marker-hover'); - } - }); - - // On mouse up end drag action and unbind mousemove event - $(document).on("mouseup.vac-dmarker-" + this.playerId, function (e) { - if (!_this2.dragging) return; - $(document).off("mousemove.vac-dmarker-" + _this2.playerId); - _this2.dragging = false; - - // Remove drag class and hover class from cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging').removeClass('vac-marker-hover'); - } - }); - - // On mouse mouse enter, show cursor tooltip if controls are not shown - // This adds the class which is picked up in Controls - if (!this.plugin.options.showControls) { - var self = this; - self.$el.on('mouseenter.vac-cursor-tool-tip', function () { - self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover'); - }).on('mouseleave.vac-cursor-tool-tip', function () { - self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover'); - }); - }; - } - - // On drag action, calculate new range and re-render marker - - }, { - key: "onDrag", - value: function onDrag(e) { - var dragPercent = this.percentValFromXpos(e.pageX), - secVal = parseInt(this.duration * dragPercent); - - if (secVal > this.rangePin) { - this.range = { - start: this.rangePin, - end: secVal - }; - } else { - this.range = { - start: secVal, - end: this.rangePin - }; - } - this.render(); - this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); - } - - // Cal percentage (of video) position for a pixel-based X position on the document - - }, { - key: "percentValFromXpos", - value: function percentValFromXpos(xpos) { - var x = Math.max(0, xpos - this.$parent.offset().left), - // px val - max = this.$parent.innerWidth(), - per = x / max; - if (per > 1) per = 1; - if (per < 0) per = 0; - return per; - } - - // Remove bound events on destructon - - }, { - key: "teardown", - value: function teardown() { - $(document).off("mousemove.vac-dmarker-" + this.playerId + " mouseup.vac-dmarker-" + this.playerId); - this.$el.off('mouseenter.vac-cursor-tool-tip'); - this.$el.off('mouseleave.vac-cursor-tool-tip'); - this.$el.off('mousedown.vac-marker'); - this.$el.remove(); - } - - // Move the video & marker start by some num seconds (pos or neg) - - }, { - key: "scrubStart", - value: function scrubStart(secondsChanged) { - var newStart = this.range.start + secondsChanged; - this.currentTime = newStart; - this.range.start = newStart; - this.rangePin = newStart; - this.teardown(); - this.render(); - - this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); - } - }]); - - return DraggableMarker; -}(Marker); - -},{"./../lib/utils":40,"./marker":31}],31:[function(require,module,exports){ -"use strict"; -/* - Component for a timeline marker with capabilities to render on timeline, including tooltip for comment -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - markerTemplateName = 'marker', - markerWrapTemplateName = 'marker_wrap'; - -module.exports = function (_PlayerUIComponent) { - _inherits(Marker, _PlayerUIComponent); - - function Marker(player, range) { - var comment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; - - _classCallCheck(this, Marker); - - var _this = _possibleConstructorReturn(this, (Marker.__proto__ || Object.getPrototypeOf(Marker)).call(this, player)); - - _this.range = range; - _this.comment = comment; - _this.templateName = markerTemplateName; - - if (!_this.$UI.markerWrap.length) { - _this.$UI.timeline.append(_this.renderTemplate(markerWrapTemplateName)); - } - return _this; - } - - // Set this marker as active (highlight) and optionally show tooltip also - - - _createClass(Marker, [{ - key: "setActive", - value: function setActive() { - var showTooltip = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - this.$el.addClass(this.UI_CLASSES.active); - if (showTooltip) this.$el.addClass('vac-force-tooltip'); - } - - // Deactivate this marker - - }, { - key: "deactivate", - value: function deactivate() { - this.$el.removeClass(this.UI_CLASSES.active + " vac-force-tooltip"); - } - - // Draw marker on timeline for this.range; - - }, { - key: "render", - value: function render() { - // clear existing marker if this one was already rendered - this.$UI.timeline.find("[data-marker-id=\"" + this.componentId + "\"]").remove(); - - // Bind to local instance var, add to DOM, and setup events - this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData)); - this.$UI.markerWrap.append(this.$el); - this.bindMarkerEvents(); - } - - // Bind needed events for this marker - - }, { - key: "bindMarkerEvents", - value: function bindMarkerEvents() { - var _this2 = this; - - // handle dimming other markers + highlighting this one on mouseenter/leave - this.$el.on("mouseenter.vac-marker", function () { - _this2.$el.addClass('vac-hovering').closest(".vac-marker-wrap").addClass('vac-dim-all'); - }).on("mouseleave.vac-marker", function () { - _this2.$el.removeClass('vac-hovering').closest(".vac-marker-wrap").removeClass('vac-dim-all'); - }); - } - - // Build object for template - - }, { - key: "teardown", - - - // Unbind event listeners on teardown and remove DOM nodes - value: function teardown() { - this.$el.off('mouseenter.vac-marker').off('mouseleave.vac-marker').off('click.vac-marker'); - _get(Marker.prototype.__proto__ || Object.getPrototypeOf(Marker.prototype), "teardown", this).call(this); - } - }, { - key: "markerTemplateData", - get: function get() { - // the smaller the width, the higher the z-index so overlaps are clickable - var left = this.range.start / this.duration * 100, - width = this.range.end / this.duration * 100 - left, - zIndex = 100 - Math.floor(width) || 100; - return { - left: left + '%', - width: width + '%', - zIndex: zIndex, - showTooltip: this.plugin.options.showMarkerShapeAndTooltips, - tooltipRight: left > 50, - tooltipTime: Utils.humanTime(this.range), - tooltipBody: !this.comment ? null : this.comment.body, - rangeShow: !!this.range.end, - id: this.componentId - }; - } - }]); - - return Marker; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":38,"./../lib/utils":40}],32:[function(require,module,exports){ -"use strict"; -/* - Component main 'annotation toggle' button in the player controls, including notifier for # annotations -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - templateName = "player_button"; - -module.exports = function (_PlayerUIComponent) { - _inherits(PlayerButton, _PlayerUIComponent); - - function PlayerButton(player) { - _classCallCheck(this, PlayerButton); - - var _this = _possibleConstructorReturn(this, (PlayerButton.__proto__ || Object.getPrototypeOf(PlayerButton)).call(this, player)); - - _this.render(); - - _this.initAPI(_this, 'PlayerButton'); - - _this.$el.on('click.vac-player-button', function () { - _this.plugin.toggleAnnotationMode(); - }); - return _this; - } - - // Add button to player - - - _createClass(PlayerButton, [{ - key: "render", - value: function render() { - var btn = this.player.getChild('controlBar').addChild('button', {}); - btn.controlText("Toggle Animations"); - this.$el = $(btn.el()); - this.$el.addClass('vac-player-btn').find(".vjs-icon-placeholder").html(this.renderTemplate(templateName)); - } - - // Update the number of annotations displayed in the bubble - - }, { - key: "updateNumAnnotations", - value: function updateNumAnnotations() { - var num = this.plugin.annotationState.annotations.length, - $bubble = this.$el.find("b"); - $bubble.text(num); - num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden); - } - - // Unbind event listeners on teardown and remove DOM nodes - - }, { - key: "teardown", - value: function teardown() { - this.$el.off('click.vac-player-button'); - _get(PlayerButton.prototype.__proto__ || Object.getPrototypeOf(PlayerButton.prototype), "teardown", this).call(this); - } - }]); - - return PlayerButton; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":38}],33:[function(require,module,exports){ -"use strict"; -/* - Component for a shape that can be drug/sized on top of the video while adding a new annotation -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Shape = require("./shape"), - Utils = require('./../lib/utils'); - -module.exports = function (_Shape) { - _inherits(SelectableShape, _Shape); - - function SelectableShape(player) { - _classCallCheck(this, SelectableShape); - - var _this = _possibleConstructorReturn(this, (SelectableShape.__proto__ || Object.getPrototypeOf(SelectableShape)).call(this, player)); - - _this.$parent = _this.$player.find(".vac-video-cover-canvas"); - _this.bindEvents(); - _this.dragging = false; - return _this; - } - - // Bind all needed events for drag action - - - _createClass(SelectableShape, [{ - key: "bindEvents", - value: function bindEvents() { - var _this2 = this; - - // On mousedown initialize drag - this.$parent.on("mousedown.vac-selectable-shape", function (e) { - // Check a few conditions to see if we should *not* start drag - if (!$(e.target).hasClass('vac-video-cover-canvas')) return; //didn't click on overlay - if ($(e.target).hasClass('vac-shape')) return; //user clicked on annotation - - // Remove old shape if one existed - if (_this2.$el) _this2.$el.remove(); - - // Define default starting shape (just x/y coords of where user clicked no width/height yet) - var shape = { - x1: _this2.xCoordToPercent(e.pageX), - y1: _this2.YCoordToPercent(e.pageY) - }; - shape.x2 = shape.x1; - shape.y2 = shape.y2; - _this2.shape = shape; - - // Save origin points for future use - _this2.originX = shape.x1; - _this2.originY = shape.y1; - - // Draw shape and start drag state - _this2.render(); - _this2.dragging = true; - _this2.dragMoved = false; // used to determine if user actually dragged or just clicked - - // Bind event on doc mousemove to track drag, throttled to once each 100ms - $(document).on("mousemove.vac-sshape-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 100)); - - // Add drag class to cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging'); - } - }); - - // On mouseup, if during drag cancel drag event listeners - $(document).on("mouseup.vac-sshape-" + this.playerId, function (e) { - if (!_this2.dragging) return; - - $(document).off("mousemove.vac-sshape-" + _this2.playerId); - - if (!_this2.dragMoved) { - //clear shape if it's just a click (and not a drag) - _this2.shape = null; - if (_this2.$el) _this2.$el.remove(); - } - - _this2.dragging = false; - - // Remove drag class from cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging'); - } - }); - } - - // On each interation of drag action (mouse movement), recalc position and redraw shape - - }, { - key: "onDrag", - value: function onDrag(e) { - this.dragMoved = true; - - var xPer = this.xCoordToPercent(e.pageX), - yPer = this.YCoordToPercent(e.pageY); - - if (xPer < this.originX) { - this.shape.x2 = this.originX; - this.shape.x1 = Math.max(0, xPer); - } else { - this.shape.x2 = Math.min(100, xPer); - this.shape.x1 = this.originX; - } - if (yPer < this.originY) { - this.shape.y2 = this.originY; - this.shape.y1 = Math.max(0, yPer); - } else { - this.shape.y2 = Math.min(100, yPer); - this.shape.y1 = this.originY; - } - this.setDimsFromShape(); - - this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape }); - } - - // Convert pixel-based x position (relative to document) to percentage in video - - }, { - key: "xCoordToPercent", - value: function xCoordToPercent(x) { - x = x - this.$parent.offset().left; //pixel position - var max = this.$parent.innerWidth(); - return Number((x / max * 100).toFixed(2)); //round to 2 decimal places - } - - // Convert pixel-based y position (relative to document) to percentage in video - - }, { - key: "YCoordToPercent", - value: function YCoordToPercent(y) { - y = y - this.$parent.offset().top; //pixel position - var max = this.$parent.innerHeight(); - return Number((y / max * 100).toFixed(2)); //round to 2 decimal places - } - - // Unbind events and remove element - - }, { - key: "teardown", - value: function teardown() { - this.$parent.off('mousedown.vac-selectable-shape'); - $(document).off("mouseup.vac-sshape-" + this.playerId + " mousemove.vac-sshape-" + this.playerId); - _get(SelectableShape.prototype.__proto__ || Object.getPrototypeOf(SelectableShape.prototype), "teardown", this).call(this); - } - }]); - - return SelectableShape; -}(Shape); - -},{"./../lib/utils":40,"./shape":34}],34:[function(require,module,exports){ -"use strict"; -/* - Component for managing a shape (i.e. box drawn on the player) for an annotation -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"); - -module.exports = function (_PlayerUIComponent) { - _inherits(Shape, _PlayerUIComponent); - - function Shape(player) { - var shape = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - _classCallCheck(this, Shape); - - var _this = _possibleConstructorReturn(this, (Shape.__proto__ || Object.getPrototypeOf(Shape)).call(this, player)); - - _this.shape = shape; - _this.$parent = _this.$player; - return _this; - } - - // Draw the shape element on the $parent - - - _createClass(Shape, [{ - key: "render", - value: function render() { - if (!this.shape) return; - if (this.$el) this.$el.remove(); - - this.$el = $("
").addClass("vac-shape"); - this.setDimsFromShape(); - this.$parent.append(this.$el); - } - - // Set/update the dimensions of the shape based on this.shape - - }, { - key: "setDimsFromShape", - value: function setDimsFromShape() { - this.$el.css({ - left: this.shape.x1 + "%", - top: this.shape.y1 + "%", - width: this.shape.x2 - this.shape.x1 + "%", - height: this.shape.y2 - this.shape.y1 + "%" - }); - } - }]); - - return Shape; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":38}],35:[function(require,module,exports){ -'use strict'; -/* - Classes for registering and handling custom events for external interaction support. - Will be bound to plugin object as a message gateway between external elements and the plugin. -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Logger = require("./logger"); - -/* - A centralized collection of event callbacks organized by component and name - Main reference for external event api - These events will be bound to the plugin on initialization of their respective components - NOTE - 'self' as second param in each function is a workaround for transpiler not properly - keeping this , so we pass in instance to use as this for each fn - can't rely on bind - because this is rewritten from symbol registry in transpiler and it's not present -*/ - -var EventRegistry = { - AnnotationState: { - openAnnotation: function openAnnotation(event, _this) { - _this.openAnnotationById(event.detail.id); - }, - closeActiveAnnotation: function closeActiveAnnotation(event, _this) { - _this.clearActive(); - }, - newAnnotation: function newAnnotation(event, _this) { - _this.createAndAddAnnotation(event.detail); - }, - destroyAnnotation: function destroyAnnotation(event, _this) { - _this.destroyAnnotationById(event.detail.id); - }, - newComment: function newComment(event, _this) { - var annotation = _this.findAnnotation(event.detail.annotationId); - if (annotation) annotation.commentList.createComment(event.detail.body); - }, - destroyComment: function destroyComment(event, _this) { - var comment = _this.findComment(event.detail.id); - if (comment) comment.commentList.destroyComment(event); - } - }, - Controls: { - addingAnnotation: function addingAnnotation(event, _this) { - _this.startAddNew(); - }, - cancelAddingAnnotation: function cancelAddingAnnotation(event, _this) { - _this.cancelAddNew(); - } - }, - PlayerButton: { - onStateChanged: function onStateChanged(event, _this) { - _this.updateNumAnnotations(); - } - }, - AnnotationComments: { - toggleAnnotationMode: function toggleAnnotationMode(event, _this) { - _this.toggleAnnotationMode(); - } - } -}; - -module.exports = function () { - function EventDispatcher(plugin) { - _classCallCheck(this, EventDispatcher); - - this.plugin = plugin; - this.pluginReady = false; - this.pendingEvts = []; - this.registeredListeners = []; - this.eventRegistry = EventRegistry; - } - - // Use the EventRegistry to mass register events on each component initialization - - - _createClass(EventDispatcher, [{ - key: "registerListenersFor", - value: function registerListenersFor(obj, className) { - var _this2 = this; - - var matchingEvents = this.eventRegistry[className]; - if (matchingEvents) { - Object.keys(matchingEvents).forEach(function (key) { - // Don't register again if already in cached collection - if (!~_this2.registeredListeners.indexOf(key)) { - var callback = matchingEvents[key].bind(obj); - _this2.registerListener(key, function (evt) { - if (!_this2.pluginReady) return; - _this2.logCallback(key, className, evt); - callback(evt, obj); - }.bind(_this2)); - } - }); - } - } - - // Bind a listener to the plugin - - }, { - key: "registerListener", - value: function registerListener(type, callback) { - this.plugin.on(type, callback); - this.registeredListeners.push(type); - } - - // Unbind a listener from the plugin - - }, { - key: "unregisterListener", - value: function unregisterListener(type) { - this.plugin.off(type); - var i = this.registeredListeners.indexOf(type); - this.registeredListeners.splice(i, 1); - } - - // Trigger an event on the plugin - - }, { - key: "fire", - value: function fire(type, data) { - if (!this.pluginReady) return; - Logger.log("evt-dispatch-FIRE", type, data); - var evt = new CustomEvent(type, { 'detail': data }); - this.plugin.trigger(evt); - } - }, { - key: "teardown", - value: function teardown() { - var _this3 = this; - - this.registeredListeners.forEach(function (type) { - _this3.unregisterListener(type); - }); - } - }, { - key: "logCallback", - value: function logCallback(eventName, className, event) { - Logger.log("evt-dispatch-RECEIVE", eventName + " (" + className + ")", event); - } - }]); - - return EventDispatcher; -}(); - -},{"./logger":36}],36:[function(require,module,exports){ -'use strict'; -/* - General logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging -*/ - -// Prefix for appending to all logger messages - -var LOG_PREFIX = "::VAC::"; - -// Are we in debug mode? -function debug() { - return !!window.VAC_DEBUG; -} - -// Build arguments for console fn, adding prefix -function buildArgs(args) { - return [LOG_PREFIX].concat(args); -} - -// Log message/data -module.exports.log = function () { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - if (!debug()) return; - console.log.apply(null, buildArgs(args)); -}; - -// Error message/data -module.exports.error = function () { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - if (!debug()) return; - console.error.apply(null, buildArgs(args)); -}; - -// Info message/data -module.exports.info = function () { - for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - if (!debug()) return; - console.info.apply(null, buildArgs(args)); -}; - -},{}],37:[function(require,module,exports){ -"use strict"; -/* - Base class all player components interit from - it includes lots of helper functions (to get reference to - the player, the plugin, video state, etc) -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -module.exports = function () { - function PlayerComponent(player) { - _classCallCheck(this, PlayerComponent); - - this._player = player; - } - - // attribute to get reference to the main plugin object (main.js instance) - - - _createClass(PlayerComponent, [{ - key: "initAPI", - - - // Register all events in the EventRegistry matching this className - value: function initAPI(obj, className) { - this.plugin.eventDispatcher.registerListenersFor(obj, className); - } - - // Nullify player reference so objects can be removed safely - // All components should call super.teardown() within their teardown funcs - - }, { - key: "teardown", - value: function teardown() { - var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (destroy) this._player = null; - } - }, { - key: "plugin", - get: function get() { - return this.player.annotationComments(); - } - - // attribute to get player javascript instance - - }, { - key: "player", - get: function get() { - return this._player; - } - - // attribute to get video duration (in seconds) - - }, { - key: "duration", - get: function get() { - return this.player.duration(); - } - - // attribute to get player current time - - }, { - key: "currentTime", - get: function get() { - return this.player.currentTime(); - } - - // set current time of player - , - set: function set(time) { - this.player.currentTime(time); - } - }]); - - return PlayerComponent; -}(); - -},{}],38:[function(require,module,exports){ -"use strict"; -/* - Base class all player UI components interit from - it includes lots of helper functions (to get reference to - the player $el, various classes/helpers, template rendering, etc) -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerComponent = require("./player_component"), - Handlebars = require('handlebars/runtime'), - Templates = require('./../compiled/templates'), - Utils = require('./../lib/utils'); - -module.exports = function (_PlayerComponent) { - _inherits(PlayerUIComponent, _PlayerComponent); - - function PlayerUIComponent(player) { - _classCallCheck(this, PlayerUIComponent); - - return _possibleConstructorReturn(this, (PlayerUIComponent.__proto__ || Object.getPrototypeOf(PlayerUIComponent)).call(this, player)); - } - - // helpers to get various UI components of the player quickly, keeping commonly reused class names - // consolidated in case of need to change in the future (and for quick access) - - - _createClass(PlayerUIComponent, [{ - key: "disablePlayingAndControl", - - - // Disable play/control actions on the current player - value: function disablePlayingAndControl() { - this.$player.addClass('vac-disable-play'); - //TODO - catch spacebar being hit - //TODO - prevent scrubbing and timeline click to seek - } - - // Enable play/control actions on the controller - - }, { - key: "enablePlayingAndControl", - value: function enablePlayingAndControl() { - this.$player.removeClass('vac-disable-play'); - } - - // Render a handlebars template with local data passed in via key/val in object - - }, { - key: "renderTemplate", - value: function renderTemplate(templateName) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - this.registerHandlebarsHelpers(); - return Templates[templateName](options); - } - - // Handle escaped breaklines in Handlebars - - }, { - key: "registerHandlebarsHelpers", - value: function registerHandlebarsHelpers() { - if ('breaklines' in Handlebars.helpers) return; - - Handlebars.registerHelper('breaklines', function (text) { - text = Handlebars.Utils.escapeExpression(text); - text = text.replace(/(\r\n|\n|\r)/gm, '
'); - return new Handlebars.SafeString(text); - }); - } - - // Provide basic teardown function to inherit - - }, { - key: "teardown", - value: function teardown() { - if (this.$el) this.$el.remove(); - _get(PlayerUIComponent.prototype.__proto__ || Object.getPrototypeOf(PlayerUIComponent.prototype), "teardown", this).call(this); - } - }, { - key: "$UI", - get: function get() { - return Object.freeze({ - commentsContainer: this.$player.find(".vac-comments-container"), // outer container for all comments - controlElements: this.$player.find(".vac-control"), // Each of multiple control elements in the control bar - newCommentTextarea: this.$player.find(".vac-video-write-new textarea"), // Textarea for writing a new comment - timeline: this.$player.find('.vjs-progress-control'), // Timeline element - markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline - controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs - markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline - coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state - }); - } - - // utility classes used in various components - - }, { - key: "UI_CLASSES", - get: function get() { - return Object.freeze({ - hidden: "vac-hidden", - active: "vac-active" - }); - } - - // attribute to get player jquery element - - }, { - key: "$player", - get: function get() { - return $(this.player.el()); - } - - // attribute to get player id from DOM - - }, { - key: "playerId", - get: function get() { - return this.$player.attr('id'); - } - - // Generate a pseudo-guid ID for this component, to use as an ID in the DOM - - }, { - key: "componentId", - get: function get() { - this.cid_ = this.cid_ || Utils.guid(); - return this.cid_; - } - }]); - - return PlayerUIComponent; -}(PlayerComponent); - -},{"./../compiled/templates":24,"./../lib/utils":40,"./player_component":37,"handlebars/runtime":20}],39:[function(require,module,exports){ -'use strict'; - -/* - Collection of polyfills neededf or IE10+ support -*/ - -// Array.prototype.find() for IE10+ -require('ie-array-find-polyfill'); -// Object.assign for IE10+ -require('es6-object-assign').polyfill(); - -// Allow use of object.constructor.staticFunc() in IE -// Not yet supported by babel -// https://gist.github.com/edoardocavazza/47246856759f2273e48b -(function () { - if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') { - var bindFunction = function bindFunction(ctx, fn) { - return function () { - return fn.apply(this, arguments); - }; - }; - - var bindProperty = function bindProperty(ctx, prop, parentDescriptor) { - if (!parentDescriptor) { - var defaultValue = ctx.__proto__[prop]; - parentDescriptor = { - get: function get() { - return ctx['__' + prop] || defaultValue; - }, - set: function set(val) { - ctx['__' + prop] = val; - } - }; - } - Object.defineProperty(ctx, prop, { - get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined, - set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined, - configurable: true - }); - }; - - var iterateProps = function iterateProps(subClass, superClass) { - var props = Object.getOwnPropertyNames(superClass), - proto; - - subClass.__proto__ = superClass; - for (var i = 0, len = props.length; i < len; i++) { - var prop = props[i]; - if (prop === '__proto__') { - proto = superClass[prop]; - } else if (_exclude.indexOf(i) === -1) { - var descriptor = Object.getOwnPropertyDescriptor(subClass, prop); - if (!descriptor) { - var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop); - if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') { - subClass[prop] = bindFunction(subClass, superClass[prop]); - } else if (typeof superDescriptor.get == 'function') { - bindProperty(subClass, prop, superDescriptor); - } else { - bindProperty(subClass, prop); - } - } - } - } - if (proto) { - iterateProps(subClass, proto); - } - }; - - var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype']; - - Object.setPrototypeOf = iterateProps; - } -})(); - -// Use CustomEvent in IE -(function () { - if (typeof window.CustomEvent === "function") return false; - - function CustomEvent(event, params) { - params = params || { bubbles: false, cancelable: false, detail: undefined }; - var evt = document.createEvent('CustomEvent'); - evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); - return evt; - } - - CustomEvent.prototype = window.Event.prototype; - - window.CustomEvent = CustomEvent; -})(); - -},{"es6-object-assign":1,"ie-array-find-polyfill":21}],40:[function(require,module,exports){ -"use strict"; -/* - Geneal utility functions, sourced from underscore & scratch built as needed -*/ - -module.exports = { - - // Clone an object - cloneObject: function cloneObject(obj) { - return Object.assign({}, obj); - }, - - // _throttle from underscore - throttle: function throttle(func, wait, options) { - var context, args, result; - var timeout = null; - var previous = 0; - if (!options) options = {}; - var later = function later() { - previous = options.leading === false ? 0 : Date.now(); - timeout = null; - result = func.apply(context, args); - if (!timeout) context = args = null; - }; - return function () { - var now = Date.now(); - if (!previous && options.leading === false) previous = now; - var remaining = wait - (now - previous); - context = this; - args = arguments; - if (remaining <= 0 || remaining > wait) { - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - previous = now; - result = func.apply(context, args); - if (!timeout) context = args = null; - } else if (!timeout && options.trailing !== false) { - timeout = setTimeout(later, remaining); - } - return result; - }; - }, - - // Parse all keys of an object to int - parseIntObj: function parseIntObj(obj) { - Object.keys(obj).forEach(function (key) { - if (parseInt(obj[key])) { - obj[key] = parseInt(obj[key]); - } - }); - return obj; - }, - - // Convert a range {start: int, (optional) end: int} to human readable time - humanTime: function humanTime(range) { - function readable(sec) { - var mins = Math.floor(sec / 60), - secs = String(sec % 60); - return mins + ":" + (secs.length == 1 ? "0" : "") + secs; - } - var time = [readable(range.start)]; - if (range.end) time.push(readable(range.end)); - return time.join("-"); - }, - - // Pseduo-random guid generator - guid: function guid() { - function s4() { - return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); - }, - - // Returns the height and width of an element that is not visible - // clones el and tricks DOM into rendering it w the correct size - // beware the container may be important for scoped styles - areaOfHiddenEl: function areaOfHiddenEl($el, $container) { - var hideClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - - var $clone = $el.clone(), - data = {}; - $clone.css({ - visibility: 'hidden', - display: 'inline-block' - }); - $clone.removeClass(hideClass); - $container.append($clone); - data.width = $clone.outerWidth(); - data.height = $clone.outerHeight(); - $clone.remove(); - - return data; - }, - - // Determine if a value (n) is within a range (start <= n <= end) - isWithinRange: function isWithinRange(start, end, n) { - end = end || start + 1; // for ranges with NO end defined, assume a 1s range - return n >= start && n <= end; - } -}; - -},{}]},{},[23])(23) -}); - -//# sourceMappingURL=videojs-annotation-comments.cjs.js.map diff --git a/build/videojs-annotation-comments.cjs.js.map b/build/videojs-annotation-comments.cjs.js.map deleted file mode 100644 index 4e01399..0000000 --- a/build/videojs-annotation-comments.cjs.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/es6-object-assign/index.js","node_modules/handlebars/lib/handlebars.runtime.js","node_modules/handlebars/lib/handlebars/base.js","node_modules/handlebars/lib/handlebars/decorators.js","node_modules/handlebars/lib/handlebars/decorators/inline.js","node_modules/handlebars/lib/handlebars/exception.js","node_modules/handlebars/lib/handlebars/helpers.js","node_modules/handlebars/lib/handlebars/helpers/block-helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/each.js","node_modules/handlebars/lib/handlebars/helpers/helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/if.js","node_modules/handlebars/lib/handlebars/helpers/log.js","node_modules/handlebars/lib/handlebars/helpers/lookup.js","node_modules/handlebars/lib/handlebars/helpers/with.js","node_modules/handlebars/lib/handlebars/logger.js","node_modules/handlebars/dist/cjs/handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js","node_modules/handlebars/lib/handlebars/runtime.js","node_modules/handlebars/lib/handlebars/safe-string.js","node_modules/handlebars/lib/handlebars/utils.js","node_modules/handlebars/runtime.js","node_modules/ie-array-find-polyfill/index.js","node_modules/moment/moment.js","src/js/annotation_comments.js","src/js/compiled/templates.js","src/js/components/annotation.js","src/js/components/annotation_state.js","src/js/components/comment.js","src/js/components/comment_list.js","src/js/components/controls.js","src/js/components/draggable_marker.js","src/js/components/marker.js","src/js/components/player_button.js","src/js/components/selectable_shape.js","src/js/components/shape.js","src/js/lib/event_dispatcher.js","src/js/lib/logger.js","src/js/lib/player_component.js","src/js/lib/player_ui_component.js","src/js/lib/polyfills.js","src/js/lib/utils.js"],"names":[],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC15IA;AACA;;;;;;;;;;;;;;;AAKA,OAAO,OAAP,GAAiB,UAAC,OAAD,EAAa;AAC1B,YAAQ,iBAAR;;AAEA,QAAM,SAAS,QAAQ,SAAR,CAAkB,QAAlB,CAAf;AAAA,QACM,QAAQ,QAAQ,aAAR,CADd;AAAA,QAEM,WAAW,QAAQ,uBAAR,CAFjB;AAAA,QAGM,kBAAkB,QAAQ,+BAAR,CAHxB;AAAA,QAIM,kBAAkB,QAAQ,wBAAR,CAJxB;;AAMA,QAAM,kBAAkB,OAAO,MAAP,CAAc;AAClC,uBAA4B,IADM;AAElC,cAA4B,EAAE,SAAS,IAAX,EAAiB,WAAW,IAA5B,EAFM;AAGlC,4BAA4B,EAHM;AAIlC,sBAA4B,IAJM;AAKlC,yBAA4B,IALM;AAMlC,wBAA4B,IANM;AAOlC,oCAA4B,IAPM;AAQlC,4BAA4B,IARM;AASlC,+BAA4B;AATM,KAAd,CAAxB;;AAYA;AAAA;;AAEI,oCAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC1B,sBAAU,OAAO,MAAP,CAAc,MAAM,WAAN,CAA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","file":"videojs-annotation-comments.cjs.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i= 2.0.0-beta.1',\n 7: '>= 4.0.0'\n};\n\nconst objectType = '[object Object]';\n\nexport function HandlebarsEnvironment(helpers, partials, decorators) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n this.decorators = decorators || {};\n\n registerDefaultHelpers(this);\n registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: logger,\n log: logger.log,\n\n registerHelper: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple helpers'); }\n extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function(name, partial) {\n if (toString.call(name) === objectType) {\n extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new Exception(`Attempting to register a partial called \"${name}\" as undefined`);\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function(name) {\n delete this.partials[name];\n },\n\n registerDecorator: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple decorators'); }\n extend(this.decorators, name);\n } else {\n this.decorators[name] = fn;\n }\n },\n unregisterDecorator: function(name) {\n delete this.decorators[name];\n }\n};\n\nexport let log = logger.log;\n\nexport {createFrame, logger};\n","import registerInline from './decorators/inline';\n\nexport function registerDefaultDecorators(instance) {\n registerInline(instance);\n}\n\n","import {extend} from '../utils';\n\nexport default function(instance) {\n instance.registerDecorator('inline', function(fn, props, container, options) {\n let ret = fn;\n if (!props.partials) {\n props.partials = {};\n ret = function(context, options) {\n // Create a new partials stack frame prior to exec.\n let original = container.partials;\n container.partials = extend({}, original, props.partials);\n let ret = fn(context, options);\n container.partials = original;\n return ret;\n };\n }\n\n props.partials[options.args[0]] = options.fn;\n\n return ret;\n });\n}\n","\nconst errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n let loc = node && node.loc,\n line,\n column;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n let tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (let idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n try {\n if (loc) {\n this.lineNumber = line;\n\n // Work around issue under safari where we can't directly set the column value\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(this, 'column', {\n value: column,\n enumerable: true\n });\n } else {\n this.column = column;\n }\n }\n } catch (nop) {\n /* Ignore if the browser is very particular */\n }\n}\n\nException.prototype = new Error();\n\nexport default Exception;\n","import registerBlockHelperMissing from './helpers/block-helper-missing';\nimport registerEach from './helpers/each';\nimport registerHelperMissing from './helpers/helper-missing';\nimport registerIf from './helpers/if';\nimport registerLog from './helpers/log';\nimport registerLookup from './helpers/lookup';\nimport registerWith from './helpers/with';\n\nexport function registerDefaultHelpers(instance) {\n registerBlockHelperMissing(instance);\n registerEach(instance);\n registerHelperMissing(instance);\n registerIf(instance);\n registerLog(instance);\n registerLookup(instance);\n registerWith(instance);\n}\n","import {appendContextPath, createFrame, isArray} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('blockHelperMissing', function(context, options) {\n let inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n let data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.name);\n options = {data: data};\n }\n\n return fn(context, options);\n }\n });\n}\n","import {appendContextPath, blockParams, createFrame, isArray, isFunction} from '../utils';\nimport Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('each', function(context, options) {\n if (!options) {\n throw new Exception('Must pass iterator to #each');\n }\n\n let fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data,\n contextPath;\n\n if (options.data && options.ids) {\n contextPath = appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (isFunction(context)) { context = context.call(this); }\n\n if (options.data) {\n data = createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (isArray(context)) {\n for (let j = context.length; i < j; i++) {\n if (i in context) {\n execIteration(i, i, i === context.length - 1);\n }\n }\n } else {\n let priorKey;\n\n for (let key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n}\n","import Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('helperMissing', function(/* [args, ]options */) {\n if (arguments.length === 1) {\n // A missing field in a {{foo}} construct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new Exception('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n}\n","import {isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('if', function(conditional, options) {\n if (isFunction(conditional)) { conditional = conditional.call(this); }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if ((!options.hash.includeZero && !conditional) || isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function(conditional, options) {\n return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});\n });\n}\n","export default function(instance) {\n instance.registerHelper('log', function(/* message, options */) {\n let args = [undefined],\n options = arguments[arguments.length - 1];\n for (let i = 0; i < arguments.length - 1; i++) {\n args.push(arguments[i]);\n }\n\n let level = 1;\n if (options.hash.level != null) {\n level = options.hash.level;\n } else if (options.data && options.data.level != null) {\n level = options.data.level;\n }\n args[0] = level;\n\n instance.log(... args);\n });\n}\n","export default function(instance) {\n instance.registerHelper('lookup', function(obj, field) {\n return obj && obj[field];\n });\n}\n","import {appendContextPath, blockParams, createFrame, isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('with', function(context, options) {\n if (isFunction(context)) { context = context.call(this); }\n\n let fn = options.fn;\n\n if (!isEmpty(context)) {\n let data = options.data;\n if (options.data && options.ids) {\n data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.ids[0]);\n }\n\n return fn(context, {\n data: data,\n blockParams: blockParams([context], [data && data.contextPath])\n });\n } else {\n return options.inverse(this);\n }\n });\n}\n","import {indexOf} from './utils';\n\nlet logger = {\n methodMap: ['debug', 'info', 'warn', 'error'],\n level: 'info',\n\n // Maps a given level value to the `methodMap` indexes above.\n lookupLevel: function(level) {\n if (typeof level === 'string') {\n let levelMap = indexOf(logger.methodMap, level.toLowerCase());\n if (levelMap >= 0) {\n level = levelMap;\n } else {\n level = parseInt(level, 10);\n }\n }\n\n return level;\n },\n\n // Can be overridden in the host environment\n log: function(level, ...message) {\n level = logger.lookupLevel(level);\n\n if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n let method = logger.methodMap[level];\n if (!console[method]) { // eslint-disable-line no-console\n method = 'log';\n }\n console[method](...message); // eslint-disable-line no-console\n }\n }\n};\n\nexport default logger;\n","/* global window */\nexport default function(Handlebars) {\n /* istanbul ignore next */\n let root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function() {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n return Handlebars;\n };\n}\n","import * as Utils from './utils';\nimport Exception from './exception';\nimport { COMPILER_REVISION, REVISION_CHANGES, createFrame } from './base';\n\nexport function checkRevision(compilerInfo) {\n const compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n const runtimeVersions = REVISION_CHANGES[currentRevision],\n compilerVersions = REVISION_CHANGES[compilerRevision];\n throw new Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' +\n 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' +\n 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nexport function template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new Exception('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new Exception('Unknown template object: ' + typeof templateSpec);\n }\n\n templateSpec.main.decorator = templateSpec.main_d;\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n if (options.ids) {\n options.ids[0] = true;\n }\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n let result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n let lines = result.split('\\n');\n for (let i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n let container = {\n strict: function(obj, name) {\n if (!(name in obj)) {\n throw new Exception('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function(depths, name) {\n const len = depths.length;\n for (let i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function(i) {\n let ret = templateSpec[i];\n ret.decorator = templateSpec[i + '_d'];\n return ret;\n },\n\n programs: [],\n program: function(i, data, declaredBlockParams, blockParams, depths) {\n let programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function(param, common) {\n let obj = param || common;\n\n if (param && common && (param !== common)) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n // An empty object to use as replacement for null-contexts\n nullContext: Object.seal({}),\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context, options = {}) {\n let data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n let depths,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n if (options.depths) {\n depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;\n } else {\n depths = [context];\n }\n }\n\n function main(context/*, options*/) {\n return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n return main(context, options);\n }\n ret.isTop = true;\n\n ret._setup = function(options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n if (templateSpec.usePartial || templateSpec.useDecorators) {\n container.decorators = container.merge(options.decorators, env.decorators);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n container.decorators = options.decorators;\n }\n };\n\n ret._child = function(i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new Exception('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new Exception('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nexport function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context, options = {}) {\n let currentDepths = depths;\n if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {\n currentDepths = [context].concat(depths);\n }\n\n return fn(container,\n context,\n container.helpers, container.partials,\n options.data || data,\n blockParams && [options.blockParams].concat(blockParams),\n currentDepths);\n }\n\n prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nexport function resolvePartial(partial, context, options) {\n if (!partial) {\n if (options.name === '@partial-block') {\n partial = options.data['partial-block'];\n } else {\n partial = options.partials[options.name];\n }\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nexport function invokePartial(partial, context, options) {\n // Use the current closure context to save the partial-block if this partial\n const currentPartialBlock = options.data && options.data['partial-block'];\n options.partial = true;\n if (options.ids) {\n options.data.contextPath = options.ids[0] || options.data.contextPath;\n }\n\n let partialBlock;\n if (options.fn && options.fn !== noop) {\n options.data = createFrame(options.data);\n // Wrapper function to get access to currentPartialBlock from the closure\n let fn = options.fn;\n partialBlock = options.data['partial-block'] = function partialBlockWrapper(context, options = {}) {\n\n // Restore the partial-block from the closure for the execution of the block\n // i.e. the part inside the block of the partial call.\n options.data = createFrame(options.data);\n options.data['partial-block'] = currentPartialBlock;\n return fn(context, options);\n };\n if (fn.partials) {\n options.partials = Utils.extend({}, options.partials, fn.partials);\n }\n }\n\n if (partial === undefined && partialBlock) {\n partial = partialBlock;\n }\n\n if (partial === undefined) {\n throw new Exception('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nexport function noop() { return ''; }\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n if (fn.decorator) {\n let props = {};\n prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n Utils.extend(prog, props);\n }\n return prog;\n}\n","// Build out our basic SafeString type\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function() {\n return '' + this.string;\n};\n\nexport default SafeString;\n","const escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '=': '='\n};\n\nconst badChars = /[&<>\"'`=]/g,\n possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nexport function extend(obj/* , ...source */) {\n for (let i = 1; i < arguments.length; i++) {\n for (let key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nexport let toString = Object.prototype.toString;\n\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nlet isFunction = function(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n isFunction = function(value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nexport {isFunction};\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nexport const isArray = Array.isArray || function(value) {\n return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;\n};\n\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\nexport function indexOf(array, value) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\n\nexport function escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) { return string; }\n return string.replace(badChars, escapeChar);\n}\n\nexport function isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nexport function createFrame(object) {\n let frame = extend({}, object);\n frame._parent = object;\n return frame;\n}\n\nexport function blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nexport function appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n","// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = require('./dist/cjs/handlebars.runtime')['default'];\n","'use strict';\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function (predicate) {\n\n if (this == null) {\n throw new TypeError('this is null or not defined');\n }\n\n var obj = Object(this);\n var len = obj.length >>> 0;\n\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n var thisArg = arguments[1];\n\n var index = 0;\n\n while (index < len) {\n var iValue = obj[index];\n if (predicate.call(thisArg, iValue, index, obj)) {\n return iValue;\n }\n index++;\n }\n\n return undefined;\n }\n });\n}","//! moment.js\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n}(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return (Object.getOwnPropertyNames(obj).length === 0);\n } else {\n var k;\n for (k in obj) {\n if (obj.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n }\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.weekdayMismatch &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n // Plugins that add properties should also add the key here (null value),\n // so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n // Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n // compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n // token: 'M'\n // padded: ['MM', 2]\n // ordinal: 'Mo'\n // callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n // format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n // any word (or two) characters or numbers including two/three word month in arabic.\n // includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n // ALIASES\n\n addUnitAlias('year', 'y');\n\n // PRIORITIES\n\n addUnitPriority('year', 1);\n\n // PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n // HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n // HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n // MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid() && !isNaN(value)) {\n if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n }\n else {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n }\n\n // MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function mod(n, x) {\n return ((n % x) + x) % x;\n }\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n function daysInMonth(year, month) {\n if (isNaN(year) || isNaN(month)) {\n return NaN;\n }\n var modMonth = mod(month, 12);\n year += (month - modMonth) / 12;\n return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n }\n\n // FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n // ALIASES\n\n addUnitAlias('month', 'M');\n\n // PRIORITY\n\n addUnitPriority('month', 8);\n\n // PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n // LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n // FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n // ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n // PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n // PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n // HELPERS\n\n // LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n // MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n // ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n // PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n // PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n // HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n // LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n // FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n // ALIASES\n\n addUnitAlias('hour', 'h');\n\n // PRIORITY\n addUnitPriority('hour', 13);\n\n // PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n // LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n // MOMENTS\n\n // Setting the hour should keep the time, because the user explicitly\n // specified which hour they want. So trying to maintain the same hour (in\n // a new timezone) makes sense. Adding/subtracting hours does not follow\n // this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n // internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n // pick the locale from the array\n // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return globalLocale;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n var aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {}\n }\n return locales[name];\n }\n\n // This function will load locale and then set the global locale. If\n // no arguments are passed in, it will simply return the current global\n // locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n else {\n if ((typeof console !== 'undefined') && console.warn) {\n //warn user if arguments are passed but the locale could not be set\n console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n }\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var locale, parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n locale = loadLocale(config.parentLocale);\n if (locale != null) {\n parentConfig = locale._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, tmpLocale, parentConfig = baseConfig;\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n // returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n // Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n // convert an array to a date.\n // the array should mirror the parameters below\n // note: all values past the year are optional and will default to the lowest possible value.\n // [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n\n // check for mismatching day of week\n if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n // iso 8601 regex\n // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n // iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n // date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\n function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n var result = [\n untruncateYear(yearStr),\n defaultLocaleMonthsShort.indexOf(monthStr),\n parseInt(dayStr, 10),\n parseInt(hourStr, 10),\n parseInt(minuteStr, 10)\n ];\n\n if (secondStr) {\n result.push(parseInt(secondStr, 10));\n }\n\n return result;\n }\n\n function untruncateYear(yearStr) {\n var year = parseInt(yearStr, 10);\n if (year <= 49) {\n return 2000 + year;\n } else if (year <= 999) {\n return 1900 + year;\n }\n return year;\n }\n\n function preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n }\n\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n }\n\n var obsOffsets = {\n UT: 0,\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60\n };\n\n function calculateOffset(obsOffset, militaryOffset, numOffset) {\n if (obsOffset) {\n return obsOffsets[obsOffset];\n } else if (militaryOffset) {\n // the only allowed military tz is Z\n return 0;\n } else {\n var hm = parseInt(numOffset, 10);\n var m = hm % 100, h = (hm - m) / 100;\n return h * 60 + m;\n }\n }\n\n // date and time from ref 2822 format\n function configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i));\n if (match) {\n var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n if (!checkWeekday(match[1], parsedArray, config)) {\n return;\n }\n\n config._a = parsedArray;\n config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n config._d = createUTCDate.apply(null, config._a);\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n // date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n // constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n // constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n // date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n // date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n // Pick a moment m from moments so that m[fn](other) is true for all\n // other. This relies on the function fn to be transitive.\n //\n // moments should either be an array of moment objects or an array, whose\n // first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n // TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible to translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n // FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n // PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n // HELPERS\n\n // timezone chunker\n // '+10:00' > ['10', '00']\n // '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n // Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n // HOOKS\n\n // This function will be called whenever a moment is mutated.\n // It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n // MOMENTS\n\n // keepLocalTime = true means only change the timezone, without\n // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n // +0200, so we adjust the time as needed, to be valid.\n //\n // Keeping the time actually adds/subtracts (one hour)\n // from the actual represented time. That is why we call updateOffset\n // a second time. In case it wants us to change the offset again\n // _changeInProgress == true case, then we have to adjust, because\n // there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n // ASP.NET json date format regex\n var aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n // and further modified to allow for strings containing both week and day\n var isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n // TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units || 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n switch (units) {\n case 'year': output = monthDiff(this, that) / 12; break;\n case 'month': output = monthDiff(this, that); break;\n case 'quarter': output = monthDiff(this, that) / 3; break;\n case 'second': output = (this - that) / 1e3; break; // 1000\n case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default: output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true;\n var m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n if (utc) {\n return this.toDate().toISOString();\n } else {\n return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n // If passed a locale key, it will set the locale for this\n // instance. Otherwise, it will return the locale configuration\n // variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n /* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n /* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n /* falls through */\n case 'hour':\n this.minutes(0);\n /* falls through */\n case 'minute':\n this.seconds(0);\n /* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n // FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n // ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n // PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n // PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n // MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n // FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n // ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n // PRIORITY\n\n addUnitPriority('quarter', 7);\n\n // PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n // MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // ALIASES\n\n addUnitAlias('date', 'D');\n\n // PRIORITY\n addUnitPriority('date', 9);\n\n // PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n });\n\n // MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n // FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n // ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n // PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n // PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n // HELPERS\n\n // MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n // FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n // ALIASES\n\n addUnitAlias('minute', 'm');\n\n // PRIORITY\n\n addUnitPriority('minute', 14);\n\n // PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n // MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n // FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n // ALIASES\n\n addUnitAlias('second', 's');\n\n // PRIORITY\n\n addUnitPriority('second', 15);\n\n // PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n // MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n // FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n // ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n // PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n // MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n // FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n // MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n proto.quarter = proto.quarters = getSetQuarter;\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n proto.hour = proto.hours = getSetHour;\n proto.minute = proto.minutes = getSetMinute;\n proto.second = proto.seconds = getSetSecond;\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n // ()\n // (5)\n // (fmt, 5)\n // (fmt)\n // (true)\n // (true, 5)\n // (true, fmt, 5)\n // (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n // Side effect imports\n\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n // supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n // TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function clone$1 () {\n return createDuration(this);\n }\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n // This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n // This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n }\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n var totalSign = total < 0 ? '-' : '';\n var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return totalSign + 'P' +\n (Y ? ymSign + Y + 'Y' : '') +\n (M ? ymSign + M + 'M' : '') +\n (D ? daysSign + D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? hmsSign + h + 'H' : '') +\n (m ? hmsSign + m + 'M' : '') +\n (s ? hmsSign + s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.clone = clone$1;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n // Side effect imports\n\n // FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n // PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n // Side effect imports\n\n\n hooks.version = '2.22.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n // currently HTML5 input type only supports 24-hour formats\n hooks.HTML5_FMT = {\n DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // \n DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // \n DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // \n DATE: 'YYYY-MM-DD', // \n TIME: 'HH:mm', // \n TIME_SECONDS: 'HH:mm:ss', // \n TIME_MS: 'HH:mm:ss.SSS', // \n WEEK: 'YYYY-[W]WW', // \n MONTH: 'YYYY-MM' // \n };\n\n return hooks;\n\n})));\n","\"use strict\";\n/*\n Main function and entry point\n Can be registered to a videojs instance as a plugin\n*/\n\nmodule.exports = (videojs) => {\n require('./lib/polyfills');\n\n const Plugin = videojs.getPlugin('plugin'),\n Utils = require('./lib/utils'),\n Controls = require(\"./components/controls\"),\n AnnotationState = require(\"./components/annotation_state\"),\n EventDispatcher = require(\"./lib/event_dispatcher\");\n\n const DEFAULT_OPTIONS = Object.freeze({\n bindArrowKeys: true,\n meta: { user_id: null, user_name: null },\n annotationsObjects: [],\n showControls: true,\n showCommentList: true,\n showFullScreen: true,\n showMarkerShapeAndTooltips: true,\n internalCommenting: true,\n startInAnnotationMode: false\n });\n\n return class AnnotationComments extends Plugin {\n\n constructor (player, options) {\n options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options);\n super(player, options);\n\n this.eventDispatcher = new EventDispatcher(this);\n this.eventDispatcher.registerListenersFor(this, 'AnnotationComments');\n\n this.player = player;\n this.meta = options.meta;\n this.options = options;\n\n this._readyCallbacks = [];\n\n // Assign reference to this class to player for access later by components where needed\n player.annotationComments = (() => { return this }).bind(this);\n\n // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration\n // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3\n if(player.readyState() >= 3){\n this.postLoadDataConstructor();\n }else{\n player.on('loadeddata', this.postLoadDataConstructor.bind(this));\n }\n }\n\n // Additional init/setup after video data + metadata is available\n postLoadDataConstructor () {\n // setup initial state and render UI\n this.annotationState = new AnnotationState(this.player);\n this.annotationState.annotations = this.options.annotationsObjects;\n\n this.controls = new Controls(this.player, this.options.bindArrowKeys);\n this.bindEvents();\n this.setBounds(false);\n if(this.options.startInAnnotationMode) this.toggleAnnotationMode();\n\n this.pluginReady();\n }\n\n // Bind needed events for interaction w/ components\n bindEvents () {\n // Set player boundaries on window size change or fullscreen change\n $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500));\n this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500));\n\n // Remove annotation features on fullscreen if showFullScreen: false\n if (!this.options.showFullScreen) {\n this.player.on('fullscreenchange', (() => {\n if (this.player.isFullscreen_) {\n this.preFullscreenAnnotationsEnabled = this.active;\n $(this.player.el()).addClass('vac-disable-fullscreen');\n } else {\n $(this.player.el()).removeClass('vac-disable-fullscreen');\n }\n if(this.preFullscreenAnnotationsEnabled){\n // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are\n // in annotation mode, toggle the mode\n this.toggleAnnotationMode();\n }\n }).bind(this));\n }\n }\n\n // A wrapper func to make it easier to use EventDispatcher from the client\n // Ex: plugin.fire(type, data);\n fire (type, data={}) {\n this.eventDispatcher.fire(type, data);\n }\n\n // Toggle annotations mode on/off\n toggleAnnotationMode() {\n this.active = !this.active;\n this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements\n this.annotationState.enabled = this.active;\n\n if(this.active){\n this.fire(\"annotationModeEnabled\");\n }else{\n this.fire(\"annotationModeDisabled\")\n }\n\n // Handle control component UI if showControls: true\n if(this.options.showControls){\n if(!this.active){\n this.controls.clear(true);\n }else{\n this.controls.render();\n }\n }\n }\n\n // Set player UI boundaries\n setBounds (triggerChange=true) {\n this.bounds = {};\n let $player = $(this.player.el()),\n $ctrls = $player.find('.vjs-control-bar');\n\n this.bounds.left = $player.offset().left;\n this.bounds.top = $player.offset().top;\n this.bounds.right = this.bounds.left + $player.width();\n this.bounds.bottom = this.bounds.top + $player.height();\n this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height();\n\n // fires an event when bounds have changed during resizing\n if(triggerChange) this.fire('playerBoundsChanged', this.bounds);\n }\n\n // Public function to register a callback for when plugin is ready\n onReady (callback) {\n if(this.eventDispatcher.pluginReady){\n return callback();\n }\n this._readyCallbacks.push(callback);\n }\n\n // Mark plugin as ready and fire any pending callbacks\n pluginReady () {\n this.eventDispatcher.pluginReady = true;\n while(this._readyCallbacks.length){\n this._readyCallbacks.pop()();\n }\n }\n\n // Teardown all components, remove all listeners, and remove elements from DOM\n dispose () {\n this.controls = this.controls.teardown();\n this.annotationState = this.annotationState.teardown();\n this.eventDispatcher = this.eventDispatcher.teardown();\n this.teardown();\n if(this.player) {\n this.player.annotationComments = null;\n $(this.player.el()).removeClass('vac-active');\n $(this.player.el()).find(\"[class^='vac-']\").remove();\n }\n super.dispose();\n }\n\n teardown () {\n if(this.player) this.player.off('fullscreenchange');\n $(window).off('resize.vac-window-resize');\n }\n }\n}\n","var Handlebars = require(\"handlebars/runtime\");\n exports[\"comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\"\n + alias4(container.lambda(((stack1 = (depth0 != null ? depth0.meta : depth0)) != null ? stack1.user_name : stack1), depth0))\n + \"
\\n
\"\n + alias4(((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"timeSince\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n   X\\n
\\n
\\n
\\n \"\n + alias4((helpers.breaklines || (depth0 && depth0.breaklines) || alias2).call(alias1,(depth0 != null ? depth0.body : depth0),{\"name\":\"breaklines\",\"hash\":{},\"data\":data}))\n + \"\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"comment_list\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1;\n\n return \" \"\n + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : \"\")\n + \"\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n\";\n},\"useData\":true,\"useBlockParams\":true});\nexports[\"controls\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n \\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showNav : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \"
\\n
Prev
\\n
Next
\\n
\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n
\\n
Click and drag to select
\\n
\\n
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.writingComment : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n Select shape + range\\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.internalCommenting : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n
-1 sec
\\n
+1 sec
\\n
\\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \" \\n cancel\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"
\\n
\\n
\\n
New Annotation @ \"\n + container.escapeExpression(((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"rangeStr\",\"hash\":{},\"data\":data}) : helper)))\n + \"
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n
\\n
\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\nexports[\"draggable_marker\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n\";\n},\"useData\":true});\nexports[\"marker\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n return \"vac-ranged-marker\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"width:\"\n + container.escapeExpression(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"width\",\"hash\":{},\"data\":data}) : helper)))\n + \";\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.tooltipBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n \\n \"\n + alias4(((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipTime\",\"hash\":{},\"data\":data}) : helper)))\n + \" - \"\n + alias4(((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipBody\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n \\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \"vac-right-side\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showTooltip : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"useData\":true});\nexports[\"marker_wrap\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"
\\n\t
\\n
\";\n},\"useData\":true});\nexports[\"new_comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"player_button\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"\\n\\n\t\\n\t \\n\t \\n\t\\n\";\n},\"useData\":true});","\"use strict\";\n/*\n Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils.js\"),\n CommentList = require(\"./comment_list\"),\n Marker = require(\"./marker\"),\n Comment = require(\"./comment\"),\n Shape = require(\"./shape\");\n\nmodule.exports = class Annotation extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.id = data.id || this.componentId;\n this.range = data.range;\n this.shape = data.shape;\n this.secondsActive = this.buildSecondsActiveArray();\n this.buildComments(data);\n this.buildMarker();\n this.buildShape();\n this.bindEvents();\n\n this.isOpen = false;\n }\n\n buildComments(data) {\n this.commentList = new CommentList(\n {\"comments\": data.comments, \"annotation\": this},\n this.player\n );\n }\n\n buildMarker () {\n this.marker = new Marker(this.player, this.range, this.commentList.comments[0]);\n this.marker.render();\n }\n\n buildShape() {\n this.annotationShape = new Shape(this.player, this.shape);\n }\n\n // Serialize object\n get data () {\n return {\n id: this.id,\n range: this.range,\n shape: this.shape,\n comments: this.commentList.data\n };\n }\n\n bindEvents () {\n this.marker.$el.on('click.vac-marker', (e) => this.plugin.annotationState.openAnnotation(this, true));\n }\n\n // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state\n open (withPause=true, previewOnly=false, forceSnapToStart=false) {\n this.isOpen = true;\n const snapToStart = forceSnapToStart || !Utils.isWithinRange(\n this.range.start,\n this.range.end,\n Math.floor(this.currentTime)\n );\n\n let showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips;\n this.marker.setActive(showTooltip);\n if(!previewOnly && this.plugin.options.showCommentList){\n this.commentList.render();\n }\n\n if(!previewOnly || (previewOnly && this.plugin.options.showMarkerShapeAndTooltips)){\n this.annotationShape.render();\n\n if(this.shape) {\n this.annotationShape.$el.on(\"click.vac-annotation\", () => {\n this.plugin.annotationState.openAnnotation(this, false, false, false);\n });\n }\n }\n\n if(withPause) this.player.pause();\n if(snapToStart) this.currentTime = this.range.start;\n\n this.plugin.fire('annotationOpened', {\n annotation: this.data,\n triggered_by_timeline: previewOnly\n });\n }\n\n // Closes the annotation. Handles marker, commendList, shape, and AnnotationState\n close (clearActive=true) {\n if(!this.isOpen) return;\n this.isOpen = false;\n this.marker.deactivate();\n this.commentList.teardown(false);\n if(this.annotationShape.$el) this.annotationShape.$el.off(\"click.vac-annotation\");\n this.annotationShape.teardown();\n if(clearActive) this.plugin.annotationState.clearActive();\n this.plugin.fire('annotationClosed', this.data);\n }\n\n // For preloading an array of seconds active on initialization\n // Values used to build timeMap in AnnotationState\n buildSecondsActiveArray () {\n let seconds = [];\n if(!!this.range.end) {\n for (let i = this.range.start; i <= this.range.end; i++) {\n seconds.push(i);\n }\n } else {\n let start = this.range.start;\n seconds.push(start);\n if(start < this.duration) seconds.push(start+1);\n }\n return seconds;\n }\n\n // Tearsdown annotation and marker, removes object from AnnotationState\n teardown (removeFromCollection=true) {\n this.close(true);\n this.marker.teardown();\n if(this.commentList) this.commentList.teardown(removeFromCollection);\n if(removeFromCollection) this.plugin.annotationState.removeAnnotation(this);\n if(this.annotationShape) this.annotationShape.teardown();\n if(removeFromCollection) super.teardown();\n }\n\n // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref\n static newFromData (range, shape, commentStr, plugin, id=null) {\n let comment = Comment.dataObj(commentStr, plugin);\n if(range) range = Utils.parseIntObj(range);\n if(shape) shape = Utils.parseIntObj(shape);\n let data = {\n id,\n range,\n shape,\n comments: [comment]\n };\n return new Annotation(data, plugin.player);\n }\n\n get isActive () {\n return this.plugin.annotationState.activeAnnotation === this;\n }\n}\n","\"use strict\";\n/*\n Component for managing the state of annotations, including showing active annotation during playback,\n toggling active states for annotations, navigating annotations forward/back, etc\n*/\n\nconst Utils = require('./../lib/utils'),\n PlayerComponent = require(\"./../lib/player_component\"),\n Annotation = require(\"./annotation\");\n\nmodule.exports = class AnnotationState extends PlayerComponent {\n\n constructor (player) {\n super(player);\n this.initAPI(this, 'AnnotationState');\n this.resetData();\n this.bindEvents();\n }\n\n // sets _enabled and closes or opens annotation as needed\n set enabled (shouldBeEnabled) {\n this._enabled = shouldBeEnabled;\n if(!shouldBeEnabled) this.activeAnnotation.close();\n if(shouldBeEnabled){\n this.skipLiveCheck = false;\n this.setLiveAnnotation();\n }\n }\n\n get enabled () {\n return this._enabled;\n }\n\n // Sets _annotations w/Annoation objects from input array\n set annotations (annotationsData) {\n this._annotations = annotationsData.map((a) => new Annotation(a, this.player));\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n }\n\n get annotations () {\n return this._annotations;\n }\n\n set activeAnnotation (annotation=null) {\n this._activeAnnotation = annotation;\n }\n\n // Get current active annotation or a null object with .close()\n get activeAnnotation () {\n return this._activeAnnotation || { close: (() => {}) };\n }\n\n // Serialize data\n get data () {\n return this._annotations.map((a) => a.data);\n }\n\n // Bind events for setting liveAnnotation on video time change\n bindEvents () {\n this.player.on(\"timeupdate\", Utils.throttle(this.setLiveAnnotation.bind(this), 100));\n }\n\n // Sort annotations by range.start\n sortAnnotations () {\n this._annotations.sort((a,b) => {\n return a.range.start < b.range.start ? -1 : (a.range.start > b.range.start ? 1 : 0);\n });\n }\n\n // Add a new annotation\n addNewAnnotation (annotation) {\n this._annotations.push(annotation);\n this.openAnnotation(annotation, true, true, false, true);\n this.stateChanged();\n }\n\n // Create and add a annotation\n createAndAddAnnotation (data) {\n this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew();\n\n let annotation = Annotation.newFromData(\n data.range,\n data.shape,\n data.commentStr || \"\",\n this.plugin,\n data.id\n )\n this.addNewAnnotation(annotation)\n }\n\n // Destroy an existing annotation\n destroyAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) annotation.teardown();\n }\n\n // Remove an annotation\n removeAnnotation (annotation) {\n let id = annotation.id,\n i = this._annotations.indexOf(annotation);\n this._annotations.splice(i, 1);\n this.stateChanged();\n this.plugin.fire('annotationDeleted', {id});\n }\n\n // Set the live annotation based on current video time\n setLiveAnnotation () {\n if(!this.enabled) return;\n let time = Math.floor(this.currentTime);\n\n if(this.skipLiveCheck) {\n if(time !== this.lastVideoTime) this.skipLiveCheck = false;\n return;\n }\n\n let matches = this.activeAnnotationsForTime(time);\n if(!matches.length) return this.activeAnnotation.close();\n\n // Set live annotation as the last match\n let liveAnnotation = this.annotations[matches[matches.length-1]];\n\n // Special cases if this or another annotation is active\n if(this.activeAnnotation.range) {\n if(liveAnnotation === this.activeAnnotation) return;\n // Check if the active annotation and live annotation share a start time\n // Is that start time at the current playhead?\n // If so, don't switch which is active.\n let liveStart = liveAnnotation.range.start,\n activeStart = this.activeAnnotation.range.start;\n if(liveStart === activeStart && liveStart === time) return;\n }\n\n this.openAnnotation(liveAnnotation, false, false, true);\n }\n\n // Get all active annotations for a time (in seconds)\n activeAnnotationsForTime (time) {\n if(!this.annotations.length) return [];\n return this.annotationTimeMap[time] || [];\n }\n\n /*\n Rebuild the annotation time map\n Example: this._annotations[1] and this._annotations[3] are active during second 4\n this.annotationTimeMap = { 4: [1, 3] }\n */\n rebuildAnnotationTimeMap () {\n let timeMap = {};\n this.annotations.forEach((annotation) => {\n annotation.secondsActive.forEach((second) => {\n let val = (timeMap[second] || []);\n val.push(this.annotations.indexOf(annotation));\n timeMap[second] = val;\n });\n });\n this.annotationTimeMap = timeMap;\n }\n\n // Close active annotation and remove reference in state\n clearActive () {\n this.activeAnnotation.close(false);\n this._activeAnnotation = null;\n }\n\n // Open annotation with options to pause and show preview\n // skipLiveCheck will short circuit setLiveAnnotation()\n openAnnotation (annotation, skipLiveCheck=false, pause=true, previewOnly=false, forceSnapToStart=false) {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n this.skipLiveCheck = skipLiveCheck;\n this.clearActive();\n annotation.open(pause, previewOnly, forceSnapToStart);\n this.activeAnnotation = annotation;\n this.lastVideoTime = this.activeAnnotation.range.start;\n }\n\n // Open an annotation by ID (if it exists)\n openAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) this.openAnnotation(annotation);\n }\n\n // Returns annotation object given ID\n findAnnotation (id) {\n return this.annotations.find((a) => a.id == id);\n }\n\n // Returns comment object given ID\n findComment (id) {\n let comments = this.annotations.map((a) => a.commentList.comments);\n comments = [].concat(...comments); // flatten 2d array\n return comments.find((c) => c.id == id);\n }\n\n // Finds the next annotation in collection and opens it\n nextAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === this.annotations.length-1 ? 0 : ind+1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=0; i time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[0], true);\n }\n\n // Finds the previous annotation in collection and opens it\n prevAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === 0 ? this.annotations.length-1 : ind-1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=this.annotations.length-1; i>=0; i--){\n if(this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[this.annotations.length-1], true);\n }\n\n // Use anywhere the annotation data changes\n // Cleans internal state data, updates player button, triggers configurable callback\n stateChanged () {\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n this.plugin.fire('onStateChanged', this.data);\n }\n\n // Reset internal state properties\n resetData () {\n this.annotations = [];\n this.annotationTimeMap = {};\n this.activeAnnotation = null;\n this.enabled = false;\n this.skipNextTimeCheck = false;\n this.lastVideoTime = 0;\n }\n\n // Remove UI and unbind events for this and child components\n teardown() {\n this.annotations.forEach((annotation) => { annotation.teardown(false); });\n this.resetData();\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for an invidual comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n moment = require(\"moment\"),\n templateName = 'comment';\n\nmodule.exports = class Comment extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.commentList = data.commentList;\n this.id = data.id || this.componentId;\n this.meta = data.meta;\n this.body = data.body;\n this.timestamp = moment(data.meta.datetime).unix();\n this.timeSince = this.timeSince();\n\n this.$el = $(this.render());\n }\n\n // Serialize data\n get data () {\n return {\n id: this.id,\n meta: this.meta,\n body: this.body\n };\n }\n\n get HTML () {\n return this.$el[0].outerHTML;\n }\n\n render () {\n return this.renderTemplate(\n templateName,\n {\n id: this.id,\n body: this.body,\n meta: this.meta,\n timeSince: this.timeSince\n }\n );\n }\n\n // Return time since comment timestamp\n timeSince () {\n return moment(this.meta.datetime).fromNow();\n }\n\n teardown (destroy=false) {\n super.teardown(destroy);\n }\n\n // Return a Comment obj given body content and plugin reference\n static newFromData (body, commentList, plugin) {\n let data = this.dataObj(body, plugin);\n return new Comment(data, plugin.player);\n }\n\n // Return an object with plugin data, timestamp, unique id, and body content\n static dataObj (body, plugin) {\n return {\n meta: Object.assign({\n datetime: moment().toISOString()\n }, plugin.meta),\n id: Utils.guid(),\n body\n };\n }\n}\n","\"use strict\";\n/*\n Component for a list of comments in a visible/active annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n Comment = require(\"./comment\"),\n commentListTemplateName = 'comment_list',\n newCommentTemplateName = 'new_comment';\n\nmodule.exports = class CommentList extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n\n this.annotation = data.annotation;\n this.comments = data.comments.map((commentData) => {\n commentData.commentList = this;\n return new Comment(commentData, player);\n });\n this.sortComments();\n }\n\n // Serialize object\n get data () {\n return this.comments.map((c) => c.data);\n }\n\n // Bind all events needed for the comment list\n bindListEvents () {\n this.$el\n .on(\"click.vac-comment\", \".vac-close-comment-list\", (() => this.annotation.close()).bind(this)) // Hide CommentList UI with close button\n .on(\"click.vac-comment\", \".vac-reply-btn\", this.addNewComment.bind(this)) // Open new reply UI with reply button\n .on(\"click.vac-comment\", \".vac-delete-annotation\", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button\n .on(\"click.vac-comment\", \".vac-delete-comment\", this.destroyComment.bind(this)) // Delete comment with delete comment button\n .on(\"mousewheel.vac-comment DOMMouseScroll.vac-comment\", \".vac-comments-wrap\", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI\n }\n\n // Bind event listeners for new comments form\n bindCommentFormEvents () {\n this.$newCommentForm\n .on(\"click.vac-comment\", \".vac-add-controls a, .vac-video-write-new.vac-is-comment a\", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link\n .on(\"click.vac-comment\", \".vac-video-write-new.vac-is-comment button\", this.saveNewComment.bind(this)); // Save new comment with save button\n }\n\n // Render CommentList UI with all comments using template\n render () {\n this.$el = $(this.renderTemplate(\n commentListTemplateName,\n {\n commentsHTML: this.comments.map((c) => c.HTML),\n rangeStr: Utils.humanTime(this.annotation.range)\n }\n ));\n\n this.$player.append(this.$el);\n this.$wrap = this.$UI.commentsContainer;\n this.bindListEvents();\n }\n\n // Re-render UI on state change\n reRender () {\n this.teardown(false);\n this.render();\n }\n\n // Render new comment form\n addNewComment () {\n this.$wrap.addClass(this.UI_CLASSES.active).find(\".vac-comments-wrap\").scrollTop(999999);\n var $shapebox = this.$wrap.find(\".vac-add-new-shapebox\"),\n width = $shapebox.outerWidth(),\n top = $shapebox.position().top + 10,\n right = this.$wrap.outerWidth() - ($shapebox.position().left + width);\n\n this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, {width, top, right}));\n this.bindCommentFormEvents();\n this.$player.append(this.$newCommentForm);\n }\n\n // Save comment from new comment form, update state and re-render UI\n saveNewComment () {\n this.$wrap.removeClass(this.UI_CLASSES.active);\n\n let user_id = 1,\n body = this.$UI.newCommentTextarea.val();\n\n if(!body) return; // empty comment - TODO add validation / err message\n this.createComment(body);\n }\n\n createComment (body) {\n let comment = Comment.newFromData(body, this, this.plugin);\n this.comments.push(comment);\n this.sortComments();\n\n // Don't mutate UI if comment is being created for an inactive annotation (via API)\n if(this.annotation.isActive) {\n this.reRender(false);\n this.closeNewComment();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n // Cancel comment adding process\n closeNewComment () {\n this.unbindCommentFormEvents();\n if(this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active);\n if(this.$newCommentForm) this.$newCommentForm.remove();\n }\n\n // Delete a comment. If it is the only comment, delete the annotation\n // Update state and re-render UI\n destroyComment (event) {\n let annotationId = this.annotation.id;\n if(this.comments.length == 1) {\n this.annotation.teardown();\n } else {\n let commentId = this.findCommentId(event),\n comment = this.comments.find((c) => c.id == commentId),\n i = this.comments.indexOf(comment);\n this.comments.splice(i, 1);\n this.reRender();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n findCommentId (event) {\n let id = typeof event.detail.id === 'undefined' ?\n $(event.target).closest('.vac-comment').data('id') :\n event.detail.id;\n return id;\n }\n\n // Prevents outer page scroll when at the top or bottom of CommentList UI\n // TODO: This might need to be fine-tuned?\n disablePageScroll (event) {\n let $target = $(event.currentTarget),\n height = $target.height(),\n ogEvent = event.originalEvent,\n delta = ogEvent.wheelDelta || -ogEvent.detail,\n dir = delta < 0 ? \"down\" : \"up\",\n scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight);\n\n // if scrolling into top of div\n if ($target.scrollTop() < 20 && dir == \"up\") {\n $target.stop();\n $target.animate({scrollTop: 0}, 100);\n event.preventDefault();\n }\n\n // if scrolling into bottom of div\n if ($target.scrollTop() > (scrollDiff - 10) && dir == \"down\") {\n $target.stop();\n $target.animate({scrollTop: height + 40}, 100);\n event.preventDefault();\n }\n }\n\n // Sort comments by timestamp\n sortComments () {\n this.comments.sort((a,b) => {\n return a.timestamp < b.timestamp ? -1 : (a.timestamp > b.timestamp ? 1 : 0);\n });\n }\n\n // Delete the annotation\n handleDeleteAnnotationClick (e) {\n let $confirmEl = $(\"\").addClass(\"vac-delete-confirm\").text(\"CONFIRM\");\n $confirmEl.on(\"click.comment\", () => {\n $confirmEl.off(\"click.comment\");\n this.annotation.teardown();\n });\n $(e.target).replaceWith($confirmEl);\n }\n\n // Unbind listeners for new comments form\n unbindCommentFormEvents () {\n if(this.$newCommentForm) this.$newCommentForm.off(\"click.vac-comment\");\n }\n\n // Teardown CommentList UI, unbind events\n teardown (destroyComments=true) {\n if(this.$el) {\n this.$el.off(\"click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment\");\n }\n this.comments.forEach((c) => c.teardown(destroyComments));\n if(destroyComments) this.comments = [];\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing annotation \"control box\" in upper left of video when in annotation mode,\n including all functionality to add new annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n DraggableMarker = require(\"./draggable_marker.js\"),\n SelectableShape = require(\"./selectable_shape.js\"),\n PlayerButton = require(\"./player_button\"),\n Annotation = require(\"./annotation\"),\n templateName = 'controls';\n\n// Control uses a \"ui state\" to determine how UI is rendered - this object is the base state, containing a\n// default value for each item in the state\nconst BASE_UI_STATE = Object.freeze({\n adding: false, // Are we currently adding a new annotation? (step 1 of flow)\n writingComment: false // Are we currently writing the comment for annotation (step 2 of flow)\n});\n\nmodule.exports = class Controls extends PlayerUIComponent {\n\n constructor (player, bindArrowKeys) {\n super(player);\n this.initAPI(this, 'Controls');\n\n this.internalCommenting = this.plugin.options.internalCommenting;\n this.showControls = this.plugin.options.showControls;\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.bindEvents(bindArrowKeys);\n\n if(this.showControls){\n // create player button in the control bar if controls are shown\n this.playerButton = new PlayerButton(this.player);\n }\n\n this.render();\n }\n\n // Bind all the events we need for UI interaction\n bindEvents (bindArrowKeys) {\n this.$player.on(\"click.vac-controls\", \".vac-controls button\", this.startAddNew.bind(this)) // Add new button click\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-next\", () => this.plugin.annotationState.nextAnnotation() ) // Click 'next' on annotation nav\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-prev\", () => this.plugin.annotationState.prevAnnotation() ) // Click 'prev' on annotation nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-next\", () => this.marker.scrubStart(1) ) // Click '+1 sec' on marker nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-prev\", () => this.marker.scrubStart(-1) ); // Click '-1 sec' on marker nav\n\n if(this.internalCommenting) {\n this.$player.on(\"click.vac-controls\", \".vac-add-controls button\", this.writeComment.bind(this)) // 'Next' button click while adding\n .on(\"click.vac-controls\", \".vac-video-write-new.vac-is-annotation button\", this.saveNew.bind(this)) // 'Save' button click while adding\n .on(\"click.vac-controls\", \".vac-add-controls a, .vac-video-write-new.vac-is-annotation a\", this.cancelAddNew.bind(this)) // Cancel link click\n }\n if(bindArrowKeys){\n $(document).on(`keyup.vac-nav-${this.playerId}`, (e) => this.handleArrowKeys(e)); // Use arrow keys to navigate annotations\n }\n }\n\n // Remove UI and unbind events for this and child components\n teardown () {\n this.clear(true);\n this.$player.off('click.vac-controls');\n $(document).off(`keyup.vac-nav-${this.playerId} mousemove.vac-tooltip-${this.playerId}`);\n if(this.playerButton) this.playerButton.teardown();\n super.teardown();\n }\n\n // Clear existing UI (resetting components if need be)\n clear (reset=false) {\n if(reset){\n if(this.uiState.adding){\n this.restoreNormalUI();\n this.marker.teardown();\n this.selectableShape.teardown();\n }\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.$player.find('.vac-video-cover-canvas')\n .off('mousedown.vac-cursor-tooltip')\n .off('mouseup.vac-cursor-tooltip');\n }\n this.$tooltip_ = null;\n this.$UI.controlElements.remove();\n }\n\n // Render the UI elements (based on uiState)\n render (reset=false) {\n this.clear(reset);\n let data = Object.assign(\n {\n rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null,\n showNav: this.plugin.annotationState.annotations.length > 1\n },\n this.uiState,\n { internalCommenting: this.internalCommenting, showControls: this.showControls }\n );\n\n let $ctrls = this.renderTemplate(templateName, data);\n this.$player.append($ctrls);\n\n if(this.playerButton) this.playerButton.updateNumAnnotations();\n }\n\n // User clicked to cancel in-progress add - restore to normal state\n cancelAddNew () {\n if(!(this.uiState.adding || this.uiState.writingComment)) return;\n this.render(true);\n this.marker.teardown();\n this.marker = null;\n }\n\n // User clicked 'add' button in the controls - setup UI and marker\n startAddNew () {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n\n this.player.pause();\n this.setAddingUI();\n this.uiState.adding = true;\n this.render();\n\n // construct new range and create marker\n let range = {\n start: parseInt(this.currentTime,10),\n stop: parseInt(this.currentTime,10)\n };\n this.marker = new DraggableMarker(this.player, range);\n this.selectableShape = new SelectableShape(this.player);\n\n // show cursor help text if controls are hidden\n if(!this.showControls) this.bindCursorTooltip();\n\n this.plugin.fire('enteredAddingAnnotation', { range: range });\n }\n\n // User clicked 'next' action - show UI to write comment\n writeComment () {\n this.uiState.writingComment = true;\n this.render();\n }\n\n // User clicked to save a new annotation/comment during add new flow\n saveNew () {\n let comment = this.$UI.newCommentTextarea.val();\n if(!comment) return; // empty comment - TODO add validation / err message\n\n let a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin);\n this.plugin.annotationState.addNewAnnotation(a);\n\n this.cancelAddNew();\n }\n\n // Change normal UI (hide markers, hide playback, etc) on init add state\n setAddingUI () {\n this.plugin.annotationState.enabled = false;\n this.disablePlayingAndControl();\n }\n\n // Restore normal UI after add state\n restoreNormalUI () {\n this.plugin.annotationState.enabled = this.plugin.active;\n this.enablePlayingAndControl();\n $(document).off(`mousemove.vac-tooltip-${this.playerId}`);\n }\n\n // On arrow key press, navigate to next or prev Annotation\n handleArrowKeys (e) {\n if(!this.plugin.active) return;\n let keyId = e.which;\n\n if(keyId == 37) this.plugin.annotationState.prevAnnotation();\n if(keyId == 39) this.plugin.annotationState.nextAnnotation();\n }\n\n // Adds help text to cursor during annotation mode\n bindCursorTooltip () {\n this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden);\n\n // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct\n this.plugin.setBounds(false);\n $(document).on(`mousemove.vac-tooltip-${this.playerId}`, Utils.throttle(((event) => {\n if(!this.plugin.bounds) return;\n\n let x = event.pageX,\n y = event.pageY,\n outOfBounds =\n (x < this.plugin.bounds.left || x > this.plugin.bounds.right) ||\n (y < this.plugin.bounds.top || y > this.plugin.bounds.bottom),\n withinControls = !outOfBounds && y >= this.plugin.bounds.bottomWithoutControls,\n markerHovered = this.$tooltip.hasClass('vac-marker-hover');\n\n if(outOfBounds) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n return\n }\n\n let cursorX = x - this.plugin.bounds.left,\n cursorY = y - this.plugin.bounds.top,\n margin = 10,\n rightEdge = this.$player.width(),\n bottomEdge = this.$player.height() - this.$UI.controlBar.height(),\n atRightEdge = (cursorX + this.tooltipArea.width + margin*2) >= rightEdge,\n atBottomEdge = (cursorY + this.tooltipArea.height + margin*2) >= bottomEdge;\n\n // is the tooltip too close to the right or bottom edge?\n let posX = atRightEdge ? (rightEdge - this.tooltipArea.width - margin) : (cursorX + margin),\n posY = atBottomEdge ? (bottomEdge - this.tooltipArea.height - margin) : (cursorY + margin);\n\n // hide if the cursor is over the control bar but not hovering over the draggable marker\n // also hide if mouse is down\n if((withinControls && !markerHovered) || this.$tooltip.hasClass('vac-cursor-dragging')) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n } else {\n this.$tooltip.removeClass(this.UI_CLASSES.hidden);\n }\n\n this.$tooltip.css({\n left: `${posX}px`,\n top: `${posY}px`\n });\n }).bind(this), 50));\n }\n\n get $tooltip () {\n this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip');\n return this.$tooltip_;\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range\n as drag occurs\n*/\n\nconst Marker = require(\"./marker\"),\n Utils = require('./../lib/utils'),\n markerTemplateName = 'draggable_marker';\n\nmodule.exports = class DraggableMarker extends Marker {\n\n constructor (player, range) {\n super(player, range);\n this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10\n this.templateName = markerTemplateName; // Change template from base Marker template\n this.dragging = false; // Is a drag action currently occring?\n this.rangePin = range.start; // What's the original pinned timeline point when marker was added\n this.render();\n this.$parent = this.$UI.markerWrap; // Set parent as marker wrap\n }\n\n // Bind needed evnets for UI interaction\n bindMarkerEvents () {\n // On mouse down init drag\n this.$el.on('mousedown.vac-marker', (e) => {\n e.preventDefault();\n this.dragging = true;\n // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms\n $(document).on(`mousemove.vac-dmarker-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 250) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .addClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse up end drag action and unbind mousemove event\n $(document).on(`mouseup.vac-dmarker-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n $(document).off(`mousemove.vac-dmarker-${this.playerId}`);\n this.dragging = false;\n\n // Remove drag class and hover class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .removeClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse mouse enter, show cursor tooltip if controls are not shown\n // This adds the class which is picked up in Controls\n if(!this.plugin.options.showControls) {\n var self = this;\n self.$el\n .on('mouseenter.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover');\n })\n .on('mouseleave.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover');\n });\n };\n }\n\n // On drag action, calculate new range and re-render marker\n onDrag (e) {\n var dragPercent = this.percentValFromXpos(e.pageX),\n secVal = parseInt(this.duration * dragPercent);\n\n if(secVal > this.rangePin){\n this.range = {\n start: this.rangePin,\n end: secVal\n };\n }else{\n this.range = {\n start: secVal,\n end: this.rangePin\n };\n }\n this.render();\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n\n // Cal percentage (of video) position for a pixel-based X position on the document\n percentValFromXpos (xpos) {\n var x = Math.max(0, xpos - this.$parent.offset().left), // px val\n max = this.$parent.innerWidth(),\n per = (x / max);\n if(per > 1) per = 1;\n if(per < 0) per = 0;\n return per;\n }\n\n // Remove bound events on destructon\n teardown () {\n $(document).off(`mousemove.vac-dmarker-${this.playerId} mouseup.vac-dmarker-${this.playerId}`);\n this.$el.off('mouseenter.vac-cursor-tool-tip');\n this.$el.off('mouseleave.vac-cursor-tool-tip');\n this.$el.off('mousedown.vac-marker');\n this.$el.remove();\n }\n\n // Move the video & marker start by some num seconds (pos or neg)\n scrubStart (secondsChanged) {\n let newStart = this.range.start + secondsChanged;\n this.currentTime = newStart;\n this.range.start = newStart;\n this.rangePin = newStart;\n this.teardown();\n this.render();\n\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker with capabilities to render on timeline, including tooltip for comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n markerTemplateName = 'marker',\n markerWrapTemplateName = 'marker_wrap';\n\nmodule.exports = class Marker extends PlayerUIComponent {\n\n constructor (player, range, comment=null) {\n super(player);\n this.range = range;\n this.comment = comment;\n this.templateName = markerTemplateName;\n\n if(!this.$UI.markerWrap.length){\n this.$UI.timeline.append(\n this.renderTemplate(markerWrapTemplateName)\n );\n }\n }\n\n // Set this marker as active (highlight) and optionally show tooltip also\n setActive (showTooltip=false) {\n this.$el.addClass(this.UI_CLASSES.active);\n if(showTooltip) this.$el.addClass('vac-force-tooltip');\n }\n\n // Deactivate this marker\n deactivate () {\n this.$el.removeClass(`${this.UI_CLASSES.active} vac-force-tooltip`);\n }\n\n // Draw marker on timeline for this.range;\n render () {\n // clear existing marker if this one was already rendered\n this.$UI.timeline.find(`[data-marker-id=\"${this.componentId}\"]`).remove();\n\n // Bind to local instance var, add to DOM, and setup events\n this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData));\n this.$UI.markerWrap.append(this.$el);\n this.bindMarkerEvents();\n }\n\n // Bind needed events for this marker\n bindMarkerEvents () {\n // handle dimming other markers + highlighting this one on mouseenter/leave\n this.$el.on(\"mouseenter.vac-marker\", () => {\n this.$el.addClass('vac-hovering').closest(\".vac-marker-wrap\").addClass('vac-dim-all');\n }).on(\"mouseleave.vac-marker\", () => {\n this.$el.removeClass('vac-hovering').closest(\".vac-marker-wrap\").removeClass('vac-dim-all');\n });\n }\n\n // Build object for template\n get markerTemplateData () {\n // the smaller the width, the higher the z-index so overlaps are clickable\n let left = (this.range.start / this.duration) * 100,\n width = ((this.range.end / this.duration) * 100) - left,\n zIndex = (100 - Math.floor(width)) || 100;\n return {\n left: left + '%',\n width: width + '%',\n zIndex: zIndex,\n showTooltip: this.plugin.options.showMarkerShapeAndTooltips,\n tooltipRight: left > 50,\n tooltipTime: Utils.humanTime(this.range),\n tooltipBody: !this.comment ? null : this.comment.body,\n rangeShow: !!this.range.end,\n id: this.componentId\n };\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el\n .off('mouseenter.vac-marker')\n .off('mouseleave.vac-marker')\n .off('click.vac-marker');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component main 'annotation toggle' button in the player controls, including notifier for # annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n templateName = \"player_button\";\n\nmodule.exports = class PlayerButton extends PlayerUIComponent {\n\n constructor (player) {\n super(player);\n this.render();\n\n this.initAPI(this, 'PlayerButton');\n\n this.$el.on('click.vac-player-button', () => {\n this.plugin.toggleAnnotationMode();\n });\n }\n\n // Add button to player\n render () {\n let btn = this.player.getChild('controlBar').addChild('button', {});\n btn.controlText(\"Toggle Animations\");\n this.$el = $(btn.el());\n this.$el.addClass('vac-player-btn').find(\".vjs-icon-placeholder\").html(this.renderTemplate(templateName));\n }\n\n // Update the number of annotations displayed in the bubble\n updateNumAnnotations () {\n let num = this.plugin.annotationState.annotations.length,\n $bubble = this.$el.find(\"b\");\n $bubble.text(num);\n num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden);\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el.off('click.vac-player-button');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for a shape that can be drug/sized on top of the video while adding a new annotation\n*/\n\nconst Shape = require(\"./shape\"),\n Utils = require('./../lib/utils');\n\nmodule.exports = class SelectableShape extends Shape {\n\n constructor (player) {\n super(player);\n this.$parent = this.$player.find(\".vac-video-cover-canvas\");\n this.bindEvents();\n this.dragging = false;\n }\n\n // Bind all needed events for drag action\n bindEvents () {\n // On mousedown initialize drag\n this.$parent.on(\"mousedown.vac-selectable-shape\", (e) => {\n // Check a few conditions to see if we should *not* start drag\n if( !($(e.target).hasClass('vac-video-cover-canvas')) ) return; //didn't click on overlay\n if( $(e.target).hasClass('vac-shape') ) return; //user clicked on annotation\n\n // Remove old shape if one existed\n if(this.$el) this.$el.remove();\n\n // Define default starting shape (just x/y coords of where user clicked no width/height yet)\n let shape = {\n x1: this.xCoordToPercent(e.pageX),\n y1: this.YCoordToPercent(e.pageY)\n };\n shape.x2 = shape.x1;\n shape.y2 = shape.y2;\n this.shape = shape;\n\n // Save origin points for future use\n this.originX = shape.x1;\n this.originY = shape.y1;\n\n // Draw shape and start drag state\n this.render();\n this.dragging = true;\n this.dragMoved = false; // used to determine if user actually dragged or just clicked\n\n // Bind event on doc mousemove to track drag, throttled to once each 100ms\n $(document).on(`mousemove.vac-sshape-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 100) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging');\n }\n });\n\n // On mouseup, if during drag cancel drag event listeners\n $(document).on(`mouseup.vac-sshape-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n\n $(document).off(`mousemove.vac-sshape-${this.playerId}`);\n\n if(!this.dragMoved){\n //clear shape if it's just a click (and not a drag)\n this.shape = null;\n if(this.$el) this.$el.remove();\n }\n\n this.dragging = false;\n\n // Remove drag class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging');\n }\n });\n }\n\n // On each interation of drag action (mouse movement), recalc position and redraw shape\n onDrag (e) {\n this.dragMoved = true;\n\n let xPer = this.xCoordToPercent(e.pageX),\n yPer = this.YCoordToPercent(e.pageY);\n\n if(xPer < this.originX){\n this.shape.x2 = this.originX;\n this.shape.x1 = Math.max(0, xPer);\n }else{\n this.shape.x2 = Math.min(100, xPer);\n this.shape.x1 = this.originX;\n }\n if(yPer < this.originY){\n this.shape.y2 = this.originY;\n this.shape.y1 = Math.max(0, yPer);\n }else{\n this.shape.y2 = Math.min(100, yPer);\n this.shape.y1 = this.originY;\n }\n this.setDimsFromShape();\n\n this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape });\n }\n\n // Convert pixel-based x position (relative to document) to percentage in video\n xCoordToPercent (x) {\n x = x - this.$parent.offset().left; //pixel position\n let max = this.$parent.innerWidth();\n return Number(((x / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Convert pixel-based y position (relative to document) to percentage in video\n YCoordToPercent (y) {\n y = y - this.$parent.offset().top; //pixel position\n let max = this.$parent.innerHeight();\n return Number(((y / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Unbind events and remove element\n teardown () {\n this.$parent.off('mousedown.vac-selectable-shape');\n $(document).off(`mouseup.vac-sshape-${this.playerId} mousemove.vac-sshape-${this.playerId}`);\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing a shape (i.e. box drawn on the player) for an annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\");\n\nmodule.exports = class Shape extends PlayerUIComponent {\n\n constructor (player, shape=null) {\n super(player);\n this.shape = shape;\n this.$parent = this.$player;\n }\n\n // Draw the shape element on the $parent\n render () {\n if(!this.shape) return;\n if(this.$el) this.$el.remove();\n\n this.$el = $(\"
\").addClass(\"vac-shape\");\n this.setDimsFromShape();\n this.$parent.append(this.$el);\n }\n\n // Set/update the dimensions of the shape based on this.shape\n setDimsFromShape () {\n this.$el.css({\n left: this.shape.x1 + \"%\",\n top: this.shape.y1 + \"%\",\n width: (this.shape.x2-this.shape.x1) + \"%\",\n height: (this.shape.y2-this.shape.y1) + \"%\"\n });\n }\n}\n","'use strict';\n/*\n Classes for registering and handling custom events for external interaction support.\n Will be bound to plugin object as a message gateway between external elements and the plugin.\n*/\n\nconst Logger = require(\"./logger\");\n\n/*\n A centralized collection of event callbacks organized by component and name\n Main reference for external event api\n These events will be bound to the plugin on initialization of their respective components\n NOTE - 'self' as second param in each function is a workaround for transpiler not properly\n keeping this , so we pass in instance to use as this for each fn - can't rely on bind\n because this is rewritten from symbol registry in transpiler and it's not present\n*/\n\nconst EventRegistry = {\n AnnotationState: {\n openAnnotation: (event, _this) => {\n _this.openAnnotationById(event.detail.id);\n },\n closeActiveAnnotation: (event, _this) => {\n _this.clearActive();\n },\n newAnnotation: (event, _this) => {\n _this.createAndAddAnnotation(event.detail);\n },\n destroyAnnotation: (event, _this) => {\n _this.destroyAnnotationById(event.detail.id);\n },\n newComment: (event, _this) => {\n let annotation = _this.findAnnotation(event.detail.annotationId);\n if(annotation) annotation.commentList.createComment(event.detail.body);\n },\n destroyComment: (event, _this) => {\n let comment = _this.findComment(event.detail.id);\n if(comment) comment.commentList.destroyComment(event);\n }\n },\n Controls: {\n addingAnnotation: (event, _this) => {\n _this.startAddNew();\n },\n cancelAddingAnnotation: (event, _this) => {\n _this.cancelAddNew();\n }\n },\n PlayerButton: {\n onStateChanged: (event, _this) => {\n _this.updateNumAnnotations();\n }\n },\n AnnotationComments: {\n toggleAnnotationMode: (event, _this) => {\n _this.toggleAnnotationMode();\n }\n }\n};\n\nmodule.exports = class EventDispatcher {\n\n constructor (plugin) {\n this.plugin = plugin;\n this.pluginReady = false;\n this.pendingEvts = [];\n this.registeredListeners = [];\n this.eventRegistry = EventRegistry;\n }\n\n // Use the EventRegistry to mass register events on each component initialization\n registerListenersFor (obj, className) {\n let matchingEvents = this.eventRegistry[className];\n if (matchingEvents) {\n Object.keys(matchingEvents).forEach((key) => {\n // Don't register again if already in cached collection\n if (!~this.registeredListeners.indexOf(key)) {\n let callback = matchingEvents[key].bind(obj);\n this.registerListener(key, ((evt) => {\n if(!this.pluginReady) return;\n this.logCallback(key, className, evt);\n callback(evt, obj);\n }).bind(this));\n }\n });\n }\n }\n\n // Bind a listener to the plugin\n registerListener (type, callback) {\n this.plugin.on(type, callback);\n this.registeredListeners.push(type);\n }\n\n // Unbind a listener from the plugin\n unregisterListener (type) {\n this.plugin.off(type);\n let i = this.registeredListeners.indexOf(type);\n this.registeredListeners.splice(i, 1);\n }\n\n // Trigger an event on the plugin\n fire (type, data) {\n if(!this.pluginReady) return;\n Logger.log(\"evt-dispatch-FIRE\", type, data);\n let evt = new CustomEvent(type, { 'detail': data });\n this.plugin.trigger(evt);\n }\n\n teardown () {\n this.registeredListeners.forEach((type) => { this.unregisterListener(type) });\n }\n\n logCallback (eventName, className, event) {\n Logger.log(\"evt-dispatch-RECEIVE\", `${eventName} (${className})`, event);\n }\n}\n","'use strict';\n/*\n\tGeneral logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging\n*/\n\n// Prefix for appending to all logger messages\nconst LOG_PREFIX = \"::VAC::\";\n\n// Are we in debug mode?\nfunction debug(){\n\treturn !!window.VAC_DEBUG;\n}\n\n// Build arguments for console fn, adding prefix\nfunction buildArgs(args){\n\treturn [LOG_PREFIX].concat(args);\n}\n\n// Log message/data\nmodule.exports.log = (...args) => {\n if(!debug()) return;\n console.log.apply(null, buildArgs(args));\n}\n\n// Error message/data\nmodule.exports.error = (...args) => {\n if(!debug()) return;\n console.error.apply(null, buildArgs(args));\n}\n\n// Info message/data\nmodule.exports.info = (...args) => {\n if(!debug()) return;\n console.info.apply(null, buildArgs(args));\n}\n","\"use strict\";\n/*\n Base class all player components interit from - it includes lots of helper functions (to get reference to\n the player, the plugin, video state, etc)\n*/\n\nmodule.exports = class PlayerComponent {\n\n constructor (player) {\n this._player = player;\n }\n\n // attribute to get reference to the main plugin object (main.js instance)\n get plugin () {\n return this.player.annotationComments();\n }\n\n // attribute to get player javascript instance\n get player () {\n return this._player;\n }\n\n // attribute to get video duration (in seconds)\n get duration () {\n return this.player.duration();\n }\n\n // attribute to get player current time\n get currentTime () {\n return this.player.currentTime();\n }\n\n // set current time of player\n set currentTime (time) {\n this.player.currentTime(time);\n }\n\n // Register all events in the EventRegistry matching this className\n initAPI (obj, className) {\n this.plugin.eventDispatcher.registerListenersFor(obj, className);\n }\n\n // Nullify player reference so objects can be removed safely\n // All components should call super.teardown() within their teardown funcs\n teardown (destroy=false) {\n if(destroy) this._player = null;\n }\n}\n","\"use strict\";\n/*\n Base class all player UI components interit from - it includes lots of helper functions (to get reference to\n the player $el, various classes/helpers, template rendering, etc)\n*/\n\nconst PlayerComponent = require(\"./player_component\"),\n Handlebars = require('handlebars/runtime'),\n Templates = require('./../compiled/templates'),\n Utils = require('./../lib/utils');\n\nmodule.exports = class PlayerUIComponent extends PlayerComponent {\n\n constructor (player) {\n super(player);\n }\n\n // helpers to get various UI components of the player quickly, keeping commonly reused class names\n // consolidated in case of need to change in the future (and for quick access)\n get $UI () {\n return Object.freeze({\n commentsContainer: this.$player.find(\".vac-comments-container\"), // outer container for all comments\n controlElements: this.$player.find(\".vac-control\"), // Each of multiple control elements in the control bar\n newCommentTextarea: this.$player.find(\".vac-video-write-new textarea\"), // Textarea for writing a new comment\n timeline: this.$player.find('.vjs-progress-control'), // Timeline element\n markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline\n controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs\n markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline\n coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state\n });\n }\n\n // utility classes used in various components\n get UI_CLASSES () {\n return Object.freeze({\n hidden: \"vac-hidden\",\n active: \"vac-active\"\n });\n }\n\n // attribute to get player jquery element\n get $player () {\n return $(this.player.el());\n }\n\n\n // attribute to get player id from DOM\n get playerId () {\n return this.$player.attr('id');\n }\n\n // Generate a pseudo-guid ID for this component, to use as an ID in the DOM\n get componentId () {\n this.cid_ = this.cid_ || Utils.guid()\n return this.cid_;\n }\n\n // Disable play/control actions on the current player\n disablePlayingAndControl () {\n this.$player.addClass('vac-disable-play');\n //TODO - catch spacebar being hit\n //TODO - prevent scrubbing and timeline click to seek\n }\n\n // Enable play/control actions on the controller\n enablePlayingAndControl () {\n this.$player.removeClass('vac-disable-play');\n }\n\n // Render a handlebars template with local data passed in via key/val in object\n renderTemplate (templateName, options = {}) {\n this.registerHandlebarsHelpers();\n return Templates[templateName](options);\n }\n\n // Handle escaped breaklines in Handlebars\n registerHandlebarsHelpers () {\n if('breaklines' in Handlebars.helpers) return;\n\n Handlebars.registerHelper('breaklines', (text) => {\n text = Handlebars.Utils.escapeExpression(text);\n text = text.replace(/(\\r\\n|\\n|\\r)/gm, '
');\n return new Handlebars.SafeString(text);\n });\n }\n\n // Provide basic teardown function to inherit\n teardown () {\n if(this.$el) this.$el.remove();\n super.teardown();\n }\n}\n","/*\n Collection of polyfills neededf or IE10+ support\n*/\n\n// Array.prototype.find() for IE10+\nrequire('ie-array-find-polyfill');\n// Object.assign for IE10+\nrequire('es6-object-assign').polyfill();\n\n// Allow use of object.constructor.staticFunc() in IE\n// Not yet supported by babel\n// https://gist.github.com/edoardocavazza/47246856759f2273e48b\n(function () {\n if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') {\n var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype'];\n\n function bindFunction(ctx, fn) {\n return function() {\n return fn.apply(this, arguments);\n }\n }\n\n function bindProperty(ctx, prop, parentDescriptor) {\n if (!parentDescriptor) {\n var defaultValue = ctx.__proto__[prop];\n parentDescriptor = {\n get: function () {\n return ctx['__' + prop] || defaultValue\n },\n set: function (val) {\n ctx['__' + prop] = val;\n }\n }\n }\n Object.defineProperty(ctx, prop, {\n get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined,\n set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined,\n configurable: true\n });\n\n }\n\n function iterateProps(subClass, superClass) {\n var props = Object.getOwnPropertyNames(superClass),\n proto;\n\n subClass.__proto__ = superClass;\n for (var i = 0, len = props.length; i < len; i++) {\n var prop = props[i];\n if (prop === '__proto__') {\n proto = superClass[prop];\n } else if (_exclude.indexOf(i) === -1) {\n var descriptor = Object.getOwnPropertyDescriptor(subClass, prop);\n if (!descriptor) {\n var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop);\n if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') {\n subClass[prop] = bindFunction(subClass, superClass[prop]);\n } else if (typeof superDescriptor.get == 'function') {\n bindProperty(subClass, prop, superDescriptor);\n } else {\n bindProperty(subClass, prop);\n }\n }\n }\n }\n if (proto) {\n iterateProps(subClass, proto);\n }\n }\n\n Object.setPrototypeOf = iterateProps;\n }\n})();\n\n// Use CustomEvent in IE\n(function () {\n if ( typeof window.CustomEvent === \"function\" ) return false;\n\n function CustomEvent ( event, params ) {\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n var evt = document.createEvent( 'CustomEvent' );\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\n return evt;\n }\n\n CustomEvent.prototype = window.Event.prototype;\n\n window.CustomEvent = CustomEvent;\n})();\n","\"use strict\";\n/*\n Geneal utility functions, sourced from underscore & scratch built as needed\n*/\n\nmodule.exports = {\n\n // Clone an object\n cloneObject: (obj) => Object.assign({}, obj),\n\n // _throttle from underscore\n throttle: (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function() {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function() {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n // Parse all keys of an object to int\n parseIntObj: (obj) => {\n Object.keys(obj).forEach((key) => {\n if(parseInt(obj[key])) {\n obj[key] = parseInt(obj[key]);\n }\n });\n return obj;\n },\n\n // Convert a range {start: int, (optional) end: int} to human readable time\n humanTime: (range) => {\n function readable(sec){\n let mins = Math.floor(sec/60),\n secs = String(sec % 60);\n return mins + \":\" + (secs.length==1 ? \"0\" : \"\") + secs;\n }\n let time = [readable(range.start)];\n if(range.end) time.push(readable(range.end));\n return time.join(\"-\");\n },\n\n // Pseduo-random guid generator\n guid: () => {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n },\n\n // Returns the height and width of an element that is not visible\n // clones el and tricks DOM into rendering it w the correct size\n // beware the container may be important for scoped styles\n areaOfHiddenEl: ($el, $container, hideClass='') => {\n let $clone = $el.clone(),\n data = {};\n $clone.css({\n visibility: 'hidden',\n display: 'inline-block'\n });\n $clone.removeClass(hideClass);\n $container.append($clone);\n data.width = $clone.outerWidth();\n data.height = $clone.outerHeight();\n $clone.remove();\n\n return data;\n },\n\n // Determine if a value (n) is within a range (start <= n <= end)\n isWithinRange: (start, end, n) => {\n end = end || start + 1; // for ranges with NO end defined, assume a 1s range\n return n >= start && n <= end;\n }\n};\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZXM2LW9iamVjdC1hc3NpZ24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy5ydW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9kZWNvcmF0b3JzL2lubGluZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2Jsb2NrLWhlbHBlci1taXNzaW5nLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9lYWNoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9oZWxwZXItbWlzc2luZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2xvZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy93aXRoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvbG9nZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9uby1jb25mbGljdC5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9zYWZlLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvcnVudGltZS5qcyIsIm5vZGVfbW9kdWxlcy9pZS1hcnJheS1maW5kLXBvbHlmaWxsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJzcmMvanMvYW5ub3RhdGlvbl9jb21tZW50cy5qcyIsInNyYy9qcy9jb21waWxlZC90ZW1wbGF0ZXMuanMiLCJzcmMvanMvY29tcG9uZW50cy9hbm5vdGF0aW9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYW5ub3RhdGlvbl9zdGF0ZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL2NvbW1lbnQuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb21tZW50X2xpc3QuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb250cm9scy5qcyIsInNyYy9qcy9jb21wb25lbnRzL2RyYWdnYWJsZV9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9wbGF5ZXJfYnV0dG9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvc2VsZWN0YWJsZV9zaGFwZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL3NoYXBlLmpzIiwic3JjL2pzL2xpYi9ldmVudF9kaXNwYXRjaGVyLmpzIiwic3JjL2pzL2xpYi9sb2dnZXIuanMiLCJzcmMvanMvbGliL3BsYXllcl9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BsYXllcl91aV9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BvbHlmaWxscy5qcyIsInNyYy9qcy9saWIvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OzhCQzlDc0IsbUJBQW1COztJQUE3QixJQUFJOzs7OztvQ0FJTywwQkFBMEI7Ozs7bUNBQzNCLHdCQUF3Qjs7OzsrQkFDdkIsb0JBQW9COztJQUEvQixLQUFLOztpQ0FDUSxzQkFBc0I7O0lBQW5DLE9BQU87O29DQUVJLDBCQUEwQjs7Ozs7QUFHakQsU0FBUyxNQUFNLEdBQUc7QUFDaEIsTUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7QUFFMUMsT0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkIsSUFBRSxDQUFDLFVBQVUsb0NBQWEsQ0FBQztBQUMzQixJQUFFLENBQUMsU0FBUyxtQ0FBWSxDQUFDO0FBQ3pCLElBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLElBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7O0FBRTdDLElBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ2hCLElBQUUsQ0FBQyxRQUFRLEdBQUcsVUFBUyxJQUFJLEVBQUU7QUFDM0IsV0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztHQUNuQyxDQUFDOztBQUVG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RTtBQUN2QyxRQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNsQixTQUFPLE1BQU0sQ0FBQztDQUNmOztBQUVNLFNBQVMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRTtBQUNqRCxTQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFBLEdBQUksRUFBRSxDQUFDO0NBQ3BEOzs7O0FDM0dEO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LENBQVA7QUFDSDtBQUNELGVBQU8sT0FBTyxJQUFQLEdBQWMsR0FBZCxHQUFvQixJQUFwQixHQUEyQixHQUEzQixHQUFpQyxJQUFqQyxHQUF3QyxHQUF4QyxHQUErQyxJQUEvQyxHQUFzRCxHQUF0RCxHQUE0RCxJQUE1RCxHQUFtRSxJQUFuRSxHQUEwRSxJQUFqRjtBQUNILEtBbEVZOztBQW9FYjtBQUNBO0FBQ0E7QUFDQSxvQkFBZ0Isd0JBQUMsR0FBRCxFQUFNLFVBQU4sRUFBbUM7QUFBQSxZQUFqQixTQUFpQix1RUFBUCxFQUFPOztBQUMvQyxZQUFJLFNBQVMsSUFBSSxLQUFKLEVBQWI7QUFBQSxZQUNJLE9BQU8sRUFEWDtBQUVBLGVBQU8sR0FBUCxDQUFXO0FBQ1Asd0JBQVksUUFETDtBQUVQLHFCQUFTO0FBRkYsU0FBWDtBQUlBLGVBQU8sV0FBUCxDQUFtQixTQUFuQjtBQUNBLG1CQUFXLE1BQVgsQ0FBa0IsTUFBbEI7QUFDQSxhQUFLLEtBQUwsR0FBYSxPQUFPLFVBQVAsRUFBYjtBQUNBLGFBQUssTUFBTCxHQUFjLE9BQU8sV0FBUCxFQUFkO0FBQ0EsZUFBTyxNQUFQOztBQUVBLGVBQU8sSUFBUDtBQUNILEtBckZZOztBQXVGYjtBQUNBLG1CQUFlLHVCQUFDLEtBQUQsRUFBUSxHQUFSLEVBQWEsQ0FBYixFQUFtQjtBQUM5QixjQUFNLE9BQU8sUUFBUSxDQUFyQixDQUQ4QixDQUNOO0FBQ3hCLGVBQU8sS0FBSyxLQUFMLElBQWMsS0FBSyxHQUExQjtBQUNIO0FBM0ZZLENBQWpCIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLyoqXG4gKiBDb2RlIHJlZmFjdG9yZWQgZnJvbSBNb3ppbGxhIERldmVsb3BlciBOZXR3b3JrOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgZmlyc3RTb3VyY2UpIHtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGZpcnN0IGFyZ3VtZW50IHRvIG9iamVjdCcpO1xuICB9XG5cbiAgdmFyIHRvID0gT2JqZWN0KHRhcmdldCk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5leHRTb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgaWYgKG5leHRTb3VyY2UgPT09IHVuZGVmaW5lZCB8fCBuZXh0U291cmNlID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5c0FycmF5ID0gT2JqZWN0LmtleXMoT2JqZWN0KG5leHRTb3VyY2UpKTtcbiAgICBmb3IgKHZhciBuZXh0SW5kZXggPSAwLCBsZW4gPSBrZXlzQXJyYXkubGVuZ3RoOyBuZXh0SW5kZXggPCBsZW47IG5leHRJbmRleCsrKSB7XG4gICAgICB2YXIgbmV4dEtleSA9IGtleXNBcnJheVtuZXh0SW5kZXhdO1xuICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5leHRTb3VyY2UsIG5leHRLZXkpO1xuICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCAmJiBkZXNjLmVudW1lcmFibGUpIHtcbiAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG87XG59XG5cbmZ1bmN0aW9uIHBvbHlmaWxsKCkge1xuICBpZiAoIU9iamVjdC5hc3NpZ24pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LCAnYXNzaWduJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBhc3NpZ25cbiAgICB9KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYXNzaWduOiBhc3NpZ24sXG4gIHBvbHlmaWxsOiBwb2x5ZmlsbFxufTtcbiIsImltcG9ydCAqIGFzIGJhc2UgZnJvbSAnLi9oYW5kbGViYXJzL2Jhc2UnO1xuXG4vLyBFYWNoIG9mIHRoZXNlIGF1Z21lbnQgdGhlIEhhbmRsZWJhcnMgb2JqZWN0LiBObyBuZWVkIHRvIHNldHVwIGhlcmUuXG4vLyAoVGhpcyBpcyBkb25lIHRvIGVhc2lseSBzaGFyZSBjb2RlIGJldHdlZW4gY29tbW9uanMgYW5kIGJyb3dzZSBlbnZzKVxuaW1wb3J0IFNhZmVTdHJpbmcgZnJvbSAnLi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9oYW5kbGViYXJzL2V4Y2VwdGlvbic7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL2hhbmRsZWJhcnMvdXRpbHMnO1xuaW1wb3J0ICogYXMgcnVudGltZSBmcm9tICcuL2hhbmRsZWJhcnMvcnVudGltZSc7XG5cbmltcG9ydCBub0NvbmZsaWN0IGZyb20gJy4vaGFuZGxlYmFycy9uby1jb25mbGljdCc7XG5cbi8vIEZvciBjb21wYXRpYmlsaXR5IGFuZCB1c2FnZSBvdXRzaWRlIG9mIG1vZHVsZSBzeXN0ZW1zLCBtYWtlIHRoZSBIYW5kbGViYXJzIG9iamVjdCBhIG5hbWVzcGFjZVxuZnVuY3Rpb24gY3JlYXRlKCkge1xuICBsZXQgaGIgPSBuZXcgYmFzZS5IYW5kbGViYXJzRW52aXJvbm1lbnQoKTtcblxuICBVdGlscy5leHRlbmQoaGIsIGJhc2UpO1xuICBoYi5TYWZlU3RyaW5nID0gU2FmZVN0cmluZztcbiAgaGIuRXhjZXB0aW9uID0gRXhjZXB0aW9uO1xuICBoYi5VdGlscyA9IFV0aWxzO1xuICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjtcblxuICBoYi5WTSA9IHJ1bnRpbWU7XG4gIGhiLnRlbXBsYXRlID0gZnVuY3Rpb24oc3BlYykge1xuICAgIHJldHVybiBydW50aW1lLnRlbXBsYXRlKHNwZWMsIGhiKTtcbiAgfTtcblxuICByZXR1cm4gaGI7XG59XG5cbmxldCBpbnN0ID0gY3JlYXRlKCk7XG5pbnN0LmNyZWF0ZSA9IGNyZWF0ZTtcblxubm9Db25mbGljdChpbnN0KTtcblxuaW5zdFsnZGVmYXVsdCddID0gaW5zdDtcblxuZXhwb3J0IGRlZmF1bHQgaW5zdDtcbiIsImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4wLjExJztcbmV4cG9ydCBjb25zdCBDT01QSUxFUl9SRVZJU0lPTiA9IDc7XG5cbmV4cG9ydCBjb25zdCBSRVZJU0lPTl9DSEFOR0VTID0ge1xuICAxOiAnPD0gMS4wLnJjLjInLCAvLyAxLjAucmMuMiBpcyBhY3R1YWxseSByZXYyIGJ1dCBkb2Vzbid0IHJlcG9ydCBpdFxuICAyOiAnPT0gMS4wLjAtcmMuMycsXG4gIDM6ICc9PSAxLjAuMC1yYy40JyxcbiAgNDogJz09IDEueC54JyxcbiAgNTogJz09IDIuMC4wLWFscGhhLngnLFxuICA2OiAnPj0gMi4wLjAtYmV0YS4xJyxcbiAgNzogJz49IDQuMC4wJ1xufTtcblxuY29uc3Qgb2JqZWN0VHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG5leHBvcnQgZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7XG4gIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307XG4gIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTtcbiAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTtcblxuICByZWdpc3RlckRlZmF1bHRIZWxwZXJzKHRoaXMpO1xuICByZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzKHRoaXMpO1xufVxuXG5IYW5kbGViYXJzRW52aXJvbm1lbnQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogSGFuZGxlYmFyc0Vudmlyb25tZW50LFxuXG4gIGxvZ2dlcjogbG9nZ2VyLFxuICBsb2c6IGxvZ2dlci5sb2csXG5cbiAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsgfVxuICAgICAgZXh0ZW5kKHRoaXMuaGVscGVycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVscGVyc1tuYW1lXSA9IGZuO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLmhlbHBlcnNbbmFtZV07XG4gIH0sXG5cbiAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lLCBwYXJ0aWFsKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGBBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGEgcGFydGlhbCBjYWxsZWQgXCIke25hbWV9XCIgYXMgdW5kZWZpbmVkYCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcnRpYWxzW25hbWVdID0gcGFydGlhbDtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMucGFydGlhbHNbbmFtZV07XG4gIH0sXG5cbiAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGRlY29yYXRvcnMnKTsgfVxuICAgICAgZXh0ZW5kKHRoaXMuZGVjb3JhdG9ycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVjb3JhdG9yc1tuYW1lXSA9IGZuO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07XG4gIH1cbn07XG5cbmV4cG9ydCBsZXQgbG9nID0gbG9nZ2VyLmxvZztcblxuZXhwb3J0IHtjcmVhdGVGcmFtZSwgbG9nZ2VyfTtcbiIsImltcG9ydCByZWdpc3RlcklubGluZSBmcm9tICcuL2RlY29yYXRvcnMvaW5saW5lJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMoaW5zdGFuY2UpIHtcbiAgcmVnaXN0ZXJJbmxpbmUoaW5zdGFuY2UpO1xufVxuXG4iLCJpbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckRlY29yYXRvcignaW5saW5lJywgZnVuY3Rpb24oZm4sIHByb3BzLCBjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgcmV0ID0gZm47XG4gICAgaWYgKCFwcm9wcy5wYXJ0aWFscykge1xuICAgICAgcHJvcHMucGFydGlhbHMgPSB7fTtcbiAgICAgIHJldCA9IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhcnRpYWxzIHN0YWNrIGZyYW1lIHByaW9yIHRvIGV4ZWMuXG4gICAgICAgIGxldCBvcmlnaW5hbCA9IGNvbnRhaW5lci5wYXJ0aWFscztcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gZXh0ZW5kKHt9LCBvcmlnaW5hbCwgcHJvcHMucGFydGlhbHMpO1xuICAgICAgICBsZXQgcmV0ID0gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9yaWdpbmFsO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm9wcy5wYXJ0aWFsc1tvcHRpb25zLmFyZ3NbMF1dID0gb3B0aW9ucy5mbjtcblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuIiwiXG5jb25zdCBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTtcblxuZnVuY3Rpb24gRXhjZXB0aW9uKG1lc3NhZ2UsIG5vZGUpIHtcbiAgbGV0IGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MsXG4gICAgICBsaW5lLFxuICAgICAgY29sdW1uO1xuICBpZiAobG9jKSB7XG4gICAgbGluZSA9IGxvYy5zdGFydC5saW5lO1xuICAgIGNvbHVtbiA9IGxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjtcbiAgfVxuXG4gIGxldCB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay5cbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAobG9jKSB7XG4gICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lO1xuXG4gICAgICAvLyBXb3JrIGFyb3VuZCBpc3N1ZSB1bmRlciBzYWZhcmkgd2hlcmUgd2UgY2FuJ3QgZGlyZWN0bHkgc2V0IHRoZSBjb2x1bW4gdmFsdWVcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29sdW1uJywge1xuICAgICAgICAgIHZhbHVlOiBjb2x1bW4sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAobm9wKSB7XG4gICAgLyogSWdub3JlIGlmIHRoZSBicm93c2VyIGlzIHZlcnkgcGFydGljdWxhciAqL1xuICB9XG59XG5cbkV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcblxuZXhwb3J0IGRlZmF1bHQgRXhjZXB0aW9uO1xuIiwiaW1wb3J0IHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9ibG9jay1oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJFYWNoIGZyb20gJy4vaGVscGVycy9lYWNoJztcbmltcG9ydCByZWdpc3RlckhlbHBlck1pc3NpbmcgZnJvbSAnLi9oZWxwZXJzL2hlbHBlci1taXNzaW5nJztcbmltcG9ydCByZWdpc3RlcklmIGZyb20gJy4vaGVscGVycy9pZic7XG5pbXBvcnQgcmVnaXN0ZXJMb2cgZnJvbSAnLi9oZWxwZXJzL2xvZyc7XG5pbXBvcnQgcmVnaXN0ZXJMb29rdXAgZnJvbSAnLi9oZWxwZXJzL2xvb2t1cCc7XG5pbXBvcnQgcmVnaXN0ZXJXaXRoIGZyb20gJy4vaGVscGVycy93aXRoJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMoaW5zdGFuY2UpIHtcbiAgcmVnaXN0ZXJCbG9ja0hlbHBlck1pc3NpbmcoaW5zdGFuY2UpO1xuICByZWdpc3RlckVhY2goaW5zdGFuY2UpO1xuICByZWdpc3RlckhlbHBlck1pc3NpbmcoaW5zdGFuY2UpO1xuICByZWdpc3RlcklmKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb2coaW5zdGFuY2UpO1xuICByZWdpc3Rlckxvb2t1cChpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyV2l0aChpbnN0YW5jZSk7XG59XG4iLCJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBjcmVhdGVGcmFtZSwgaXNBcnJheX0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignYmxvY2tIZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgIGxldCBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlLFxuICAgICAgICBmbiA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAoY29udGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZuKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PT0gZmFsc2UgfHwgY29udGV4dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzLmVhY2goY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICBsZXQgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBhcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMubmFtZSk7XG4gICAgICAgIG9wdGlvbnMgPSB7ZGF0YTogZGF0YX07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHthcHBlbmRDb250ZXh0UGF0aCwgYmxvY2tQYXJhbXMsIGNyZWF0ZUZyYW1lLCBpc0FycmF5LCBpc0Z1bmN0aW9ufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdlYWNoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignTXVzdCBwYXNzIGl0ZXJhdG9yIHRvICNlYWNoJyk7XG4gICAgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbixcbiAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIHJldCA9ICcnLFxuICAgICAgICBkYXRhLFxuICAgICAgICBjb250ZXh0UGF0aDtcblxuICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSkgKyAnLic7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhlY0l0ZXJhdGlvbihmaWVsZCwgaW5kZXgsIGxhc3QpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEua2V5ID0gZmllbGQ7XG4gICAgICAgIGRhdGEuaW5kZXggPSBpbmRleDtcbiAgICAgICAgZGF0YS5maXJzdCA9IGluZGV4ID09PSAwO1xuICAgICAgICBkYXRhLmxhc3QgPSAhIWxhc3Q7XG5cbiAgICAgICAgaWYgKGNvbnRleHRQYXRoKSB7XG4gICAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoICsgZmllbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zKFtjb250ZXh0W2ZpZWxkXSwgZmllbGRdLCBbY29udGV4dFBhdGggKyBmaWVsZCwgbnVsbF0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dCAmJiB0eXBlb2YgY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChpc0FycmF5KGNvbnRleHQpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBjb250ZXh0Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgIGlmIChpIGluIGNvbnRleHQpIHtcbiAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24oaSwgaSwgaSA9PT0gY29udGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwcmlvcktleTtcblxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS5cbiAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5O1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICByZXQgPSBpbnZlcnNlKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufVxuIiwiaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKC8qIFthcmdzLCBdb3B0aW9ucyAqLykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBBIG1pc3NpbmcgZmllbGQgaW4gYSB7e2Zvb319IGNvbnN0cnVjdC5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNvbWVvbmUgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvIGNhbGwgc29tZXRoaW5nLCBibG93IHVwLlxuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignTWlzc2luZyBoZWxwZXI6IFwiJyArIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0ubmFtZSArICdcIicpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQge2lzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2lmJywgZnVuY3Rpb24oY29uZGl0aW9uYWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihjb25kaXRpb25hbCkpIHsgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbC5jYWxsKHRoaXMpOyB9XG5cbiAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbmRlciB0aGUgcG9zaXRpdmUgcGF0aCBpZiB0aGUgdmFsdWUgaXMgdHJ1dGh5IGFuZCBub3QgZW1wdHkuXG4gICAgLy8gVGhlIGBpbmNsdWRlWmVyb2Agb3B0aW9uIG1heSBiZSBzZXQgdG8gdHJlYXQgdGhlIGNvbmR0aW9uYWwgYXMgcHVyZWx5IG5vdCBlbXB0eSBiYXNlZCBvbiB0aGVcbiAgICAvLyBiZWhhdmlvciBvZiBpc0VtcHR5LiBFZmZlY3RpdmVseSB0aGlzIGRldGVybWluZXMgaWYgMCBpcyBoYW5kbGVkIGJ5IHRoZSBwb3NpdGl2ZSBwYXRoIG9yIG5lZ2F0aXZlLlxuICAgIGlmICgoIW9wdGlvbnMuaGFzaC5pbmNsdWRlWmVybyAmJiAhY29uZGl0aW9uYWwpIHx8IGlzRW1wdHkoY29uZGl0aW9uYWwpKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5mbih0aGlzKTtcbiAgICB9XG4gIH0pO1xuXG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzWydpZiddLmNhbGwodGhpcywgY29uZGl0aW9uYWwsIHtmbjogb3B0aW9ucy5pbnZlcnNlLCBpbnZlcnNlOiBvcHRpb25zLmZuLCBoYXNoOiBvcHRpb25zLmhhc2h9KTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24oLyogbWVzc2FnZSwgb3B0aW9ucyAqLykge1xuICAgIGxldCBhcmdzID0gW3VuZGVmaW5lZF0sXG4gICAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgbGV0IGxldmVsID0gMTtcbiAgICBpZiAob3B0aW9ucy5oYXNoLmxldmVsICE9IG51bGwpIHtcbiAgICAgIGxldmVsID0gb3B0aW9ucy5oYXNoLmxldmVsO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuZGF0YS5sZXZlbDtcbiAgICB9XG4gICAgYXJnc1swXSA9IGxldmVsO1xuXG4gICAgaW5zdGFuY2UubG9nKC4uLiBhcmdzKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9va3VwJywgZnVuY3Rpb24ob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIG1ldGhvZCA9ICdsb2cnO1xuICAgICAgfVxuICAgICAgY29uc29sZVttZXRob2RdKC4uLm1lc3NhZ2UpOyAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbGV0IHJvb3QgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdyxcbiAgICAgICRIYW5kbGViYXJzID0gcm9vdC5IYW5kbGViYXJzO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBIYW5kbGViYXJzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAocm9vdC5IYW5kbGViYXJzID09PSBIYW5kbGViYXJzKSB7XG4gICAgICByb290LkhhbmRsZWJhcnMgPSAkSGFuZGxlYmFycztcbiAgICB9XG4gICAgcmV0dXJuIEhhbmRsZWJhcnM7XG4gIH07XG59XG4iLCJpbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9leGNlcHRpb24nO1xuaW1wb3J0IHsgQ09NUElMRVJfUkVWSVNJT04sIFJFVklTSU9OX0NIQU5HRVMsIGNyZWF0ZUZyYW1lIH0gZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7XG4gIGNvbnN0IGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8gJiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJyZW50UmV2aXNpb24pIHtcbiAgICBpZiAoY29tcGlsZXJSZXZpc2lvbiA8IGN1cnJlbnRSZXZpc2lvbikge1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICtcbiAgICAgICAgICAgICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXRcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMsIGVudikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWVudikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ05vIGVudmlyb25tZW50IHBhc3NlZCB0byB0ZW1wbGF0ZScpO1xuICB9XG4gIGlmICghdGVtcGxhdGVTcGVjIHx8ICF0ZW1wbGF0ZVNwZWMubWFpbikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICB0ZW1wbGF0ZVNwZWMubWFpbi5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWMubWFpbl9kO1xuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc3VlZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7XG4gICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgICBsZXQgcmVzdWx0ID0gZW52LlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gcmVzdWx0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5lc1tpXSA9IG9wdGlvbnMuaW5kZW50ICsgbGluZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgbGV0IGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uKG9iaiwgbmFtZSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBvYmopKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW25hbWVdO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbihkZXB0aHMsIG5hbWUpIHtcbiAgICAgIGNvbnN0IGxlbiA9IGRlcHRocy5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBsYW1iZGE6IGZ1bmN0aW9uKGN1cnJlbnQsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJyA/IGN1cnJlbnQuY2FsbChjb250ZXh0KSA6IGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sXG4gICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsXG5cbiAgICBmbjogZnVuY3Rpb24oaSkge1xuICAgICAgbGV0IHJldCA9IHRlbXBsYXRlU3BlY1tpXTtcbiAgICAgIHJldC5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWNbaSArICdfZCddO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuXG4gICAgcHJvZ3JhbXM6IFtdLFxuICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICAgIGxldCBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sXG4gICAgICAgICAgZm4gPSB0aGlzLmZuKGkpO1xuICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikge1xuICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7XG4gICAgfSxcblxuICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2U6IGZ1bmN0aW9uKHBhcmFtLCBjb21tb24pIHtcbiAgICAgIGxldCBvYmogPSBwYXJhbSB8fCBjb21tb247XG5cbiAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgKHBhcmFtICE9PSBjb21tb24pKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLmV4dGVuZCh7fSwgY29tbW9uLCBwYXJhbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICAvLyBBbiBlbXB0eSBvYmplY3QgdG8gdXNlIGFzIHJlcGxhY2VtZW50IGZvciBudWxsLWNvbnRleHRzXG4gICAgbnVsbENvbnRleHQ6IE9iamVjdC5zZWFsKHt9KSxcblxuICAgIG5vb3A6IGVudi5WTS5ub29wLFxuICAgIGNvbXBpbGVySW5mbzogdGVtcGxhdGVTcGVjLmNvbXBpbGVyXG4gIH07XG5cbiAgZnVuY3Rpb24gcmV0KGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgcmV0Ll9zZXR1cChvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCAmJiB0ZW1wbGF0ZVNwZWMudXNlRGF0YSkge1xuICAgICAgZGF0YSA9IGluaXREYXRhKGNvbnRleHQsIGRhdGEpO1xuICAgIH1cbiAgICBsZXQgZGVwdGhzLFxuICAgICAgICBibG9ja1BhcmFtcyA9IHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzKSB7XG4gICAgICBpZiAob3B0aW9ucy5kZXB0aHMpIHtcbiAgICAgICAgZGVwdGhzID0gY29udGV4dCAhPSBvcHRpb25zLmRlcHRoc1swXSA/IFtjb250ZXh0XS5jb25jYXQob3B0aW9ucy5kZXB0aHMpIDogb3B0aW9ucy5kZXB0aHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXB0aHMgPSBbY29udGV4dF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFpbihjb250ZXh0LyosIG9wdGlvbnMqLykge1xuICAgICAgcmV0dXJuICcnICsgdGVtcGxhdGVTcGVjLm1haW4oY29udGFpbmVyLCBjb250ZXh0LCBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICB9XG4gICAgbWFpbiA9IGV4ZWN1dGVEZWNvcmF0b3JzKHRlbXBsYXRlU3BlYy5tYWluLCBtYWluLCBjb250YWluZXIsIG9wdGlvbnMuZGVwdGhzIHx8IFtdLCBkYXRhLCBibG9ja1BhcmFtcyk7XG4gICAgcmV0dXJuIG1haW4oY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmhlbHBlcnMsIGVudi5oZWxwZXJzKTtcblxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLnBhcnRpYWxzLCBlbnYucGFydGlhbHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsIHx8IHRlbXBsYXRlU3BlYy51c2VEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuZGVjb3JhdG9ycywgZW52LmRlY29yYXRvcnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IG9wdGlvbnMuZGVjb3JhdG9ycztcbiAgICB9XG4gIH07XG5cbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zICYmICFibG9ja1BhcmFtcykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIHRlbXBsYXRlU3BlY1tpXSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGN1cnJlbnREZXB0aHMgPSBkZXB0aHM7XG4gICAgaWYgKGRlcHRocyAmJiBjb250ZXh0ICE9IGRlcHRoc1swXSAmJiAhKGNvbnRleHQgPT09IGNvbnRhaW5lci5udWxsQ29udGV4dCAmJiBkZXB0aHNbMF0gPT09IG51bGwpKSB7XG4gICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpO1xuICAgIH1cblxuICAgIHJldHVybiBmbihjb250YWluZXIsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsXG4gICAgICAgIG9wdGlvbnMuZGF0YSB8fCBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtcyAmJiBbb3B0aW9ucy5ibG9ja1BhcmFtc10uY29uY2F0KGJsb2NrUGFyYW1zKSxcbiAgICAgICAgY3VycmVudERlcHRocyk7XG4gIH1cblxuICBwcm9nID0gZXhlY3V0ZURlY29yYXRvcnMoZm4sIHByb2csIGNvbnRhaW5lciwgZGVwdGhzLCBkYXRhLCBibG9ja1BhcmFtcyk7XG5cbiAgcHJvZy5wcm9ncmFtID0gaTtcbiAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwO1xuICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwO1xuICByZXR1cm4gcHJvZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ0BwYXJ0aWFsLWJsb2NrJykge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICghcGFydGlhbC5jYWxsICYmICFvcHRpb25zLm5hbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBwYXJ0aWFsIHRoYXQgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICBvcHRpb25zLm5hbWUgPSBwYXJ0aWFsO1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW3BhcnRpYWxdO1xuICB9XG4gIHJldHVybiBwYXJ0aWFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIC8vIFVzZSB0aGUgY3VycmVudCBjbG9zdXJlIGNvbnRleHQgdG8gc2F2ZSB0aGUgcGFydGlhbC1ibG9jayBpZiB0aGlzIHBhcnRpYWxcbiAgY29uc3QgY3VycmVudFBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgbGV0IHBhcnRpYWxCbG9jaztcbiAgaWYgKG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gbm9vcCkge1xuICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0byBnZXQgYWNjZXNzIHRvIGN1cnJlbnRQYXJ0aWFsQmxvY2sgZnJvbSB0aGUgY2xvc3VyZVxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm47XG4gICAgcGFydGlhbEJsb2NrID0gb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBmdW5jdGlvbiBwYXJ0aWFsQmxvY2tXcmFwcGVyKGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuXG4gICAgICAvLyBSZXN0b3JlIHRoZSBwYXJ0aWFsLWJsb2NrIGZyb20gdGhlIGNsb3N1cmUgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICAvLyBpLmUuIHRoZSBwYXJ0IGluc2lkZSB0aGUgYmxvY2sgb2YgdGhlIHBhcnRpYWwgY2FsbC5cbiAgICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IGN1cnJlbnRQYXJ0aWFsQmxvY2s7XG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBpZiAoZm4ucGFydGlhbHMpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIGZuLnBhcnRpYWxzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykge1xuICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7XG4gIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7IHJldHVybiAnJzsgfVxuXG5mdW5jdGlvbiBpbml0RGF0YShjb250ZXh0LCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhKCdyb290JyBpbiBkYXRhKSkge1xuICAgIGRhdGEgPSBkYXRhID8gY3JlYXRlRnJhbWUoZGF0YSkgOiB7fTtcbiAgICBkYXRhLnJvb3QgPSBjb250ZXh0O1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7XG4gIGlmIChmbi5kZWNvcmF0b3IpIHtcbiAgICBsZXQgcHJvcHMgPSB7fTtcbiAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iLCIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiIsImNvbnN0IGVzY2FwZSA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnLFxuICBcIidcIjogJyYjeDI3OycsXG4gICdgJzogJyYjeDYwOycsXG4gICc9JzogJyYjeDNEOydcbn07XG5cbmNvbnN0IGJhZENoYXJzID0gL1smPD5cIidgPV0vZyxcbiAgICAgIHBvc3NpYmxlID0gL1smPD5cIidgPV0vO1xuXG5mdW5jdGlvbiBlc2NhcGVDaGFyKGNocikge1xuICByZXR1cm4gZXNjYXBlW2Nocl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQob2JqLyogLCAuLi5zb3VyY2UgKi8pIHtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gYXJndW1lbnRzW2ldKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3VtZW50c1tpXSwga2V5KSkge1xuICAgICAgICBvYmpba2V5XSA9IGFyZ3VtZW50c1tpXVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBsZXQgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vLyBTb3VyY2VkIGZyb20gbG9kYXNoXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmVzdGllanMvbG9kYXNoL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0XG4vKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5sZXQgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59O1xuLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKGlzRnVuY3Rpb24oL3gvKSkge1xuICBpc0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICB9O1xufVxuZXhwb3J0IHtpc0Z1bmN0aW9ufTtcbi8qIGVzbGludC1lbmFibGUgZnVuYy1zdHlsZSAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgPyB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJyA6IGZhbHNlO1xufTtcblxuLy8gT2xkZXIgSUUgdmVyc2lvbnMgZG8gbm90IGRpcmVjdGx5IHN1cHBvcnQgaW5kZXhPZiBzbyB3ZSBtdXN0IGltcGxlbWVudCBvdXIgb3duLCBzYWRseS5cbmV4cG9ydCBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoYXJyYXlbaV0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVFeHByZXNzaW9uKHN0cmluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBlc2NhcGUgU2FmZVN0cmluZ3MsIHNpbmNlIHRoZXkncmUgYWxyZWFkeSBzYWZlXG4gICAgaWYgKHN0cmluZyAmJiBzdHJpbmcudG9IVE1MKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLnRvSFRNTCgpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2UgaWYgKCFzdHJpbmcpIHtcbiAgICAgIHJldHVybiBzdHJpbmcgKyAnJztcbiAgICB9XG5cbiAgICAvLyBGb3JjZSBhIHN0cmluZyBjb252ZXJzaW9uIGFzIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBhcHBlbmQgcmVnYXJkbGVzcyBhbmRcbiAgICAvLyB0aGUgcmVnZXggdGVzdCB3aWxsIGRvIHRoaXMgdHJhbnNwYXJlbnRseSBiZWhpbmQgdGhlIHNjZW5lcywgY2F1c2luZyBpc3N1ZXMgaWZcbiAgICAvLyBhbiBvYmplY3QncyB0byBzdHJpbmcgaGFzIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBpdC5cbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZztcbiAgfVxuXG4gIGlmICghcG9zc2libGUudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJpbmc7IH1cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGJhZENoYXJzLCBlc2NhcGVDaGFyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJhbWUob2JqZWN0KSB7XG4gIGxldCBmcmFtZSA9IGV4dGVuZCh7fSwgb2JqZWN0KTtcbiAgZnJhbWUuX3BhcmVudCA9IG9iamVjdDtcbiAgcmV0dXJuIGZyYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tQYXJhbXMocGFyYW1zLCBpZHMpIHtcbiAgcGFyYW1zLnBhdGggPSBpZHM7XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRDb250ZXh0UGF0aChjb250ZXh0UGF0aCwgaWQpIHtcbiAgcmV0dXJuIChjb250ZXh0UGF0aCA/IGNvbnRleHRQYXRoICsgJy4nIDogJycpICsgaWQ7XG59XG4iLCIvLyBDcmVhdGUgYSBzaW1wbGUgcGF0aCBhbGlhcyB0byBhbGxvdyBicm93c2VyaWZ5IHRvIHJlc29sdmVcbi8vIHRoZSBydW50aW1lIG9uIGEgc3VwcG9ydGVkIHBhdGguXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGlzdC9janMvaGFuZGxlYmFycy5ydW50aW1lJylbJ2RlZmF1bHQnXTtcbiIsIid1c2Ugc3RyaWN0JztcbmlmICghQXJyYXkucHJvdG90eXBlLmZpbmQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnZmluZCcsIHtcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbnVsbCBvciBub3QgZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb2JqID0gT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGggPj4+IDA7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcblxuICAgICAgICAgICAgdmFyIGluZGV4ID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlWYWx1ZSA9IG9ialtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIGlWYWx1ZSwgaW5kZXgsIG9iaikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pO1xufSIsIi8vISBtb21lbnQuanNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgZ2xvYmFsLm1vbWVudCA9IGZhY3RvcnkoKVxufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgaG9va0NhbGxiYWNrO1xuXG4gICAgZnVuY3Rpb24gaG9va3MgKCkge1xuICAgICAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbiAgICAvLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICBmdW5jdGlvbiBzZXRIb29rQ2FsbGJhY2sgKGNhbGxiYWNrKSB7XG4gICAgICAgIGhvb2tDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgQXJyYXkgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdChpbnB1dCkge1xuICAgICAgICAvLyBJRTggd2lsbCB0cmVhdCB1bmRlZmluZWQgYW5kIG51bGwgYXMgb2JqZWN0IGlmIGl0IHdhc24ndCBmb3JcbiAgICAgICAgLy8gaW5wdXQgIT0gbnVsbFxuICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggPT09IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXMucHVzaChmbihhcnJbaV0sIGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZChhLCBiKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gYikge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoYiwgaSkpIHtcbiAgICAgICAgICAgICAgICBhW2ldID0gYltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd0b1N0cmluZycpKSB7XG4gICAgICAgICAgICBhLnRvU3RyaW5nID0gYi50b1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd2YWx1ZU9mJykpIHtcbiAgICAgICAgICAgIGEudmFsdWVPZiA9IGIudmFsdWVPZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtcHR5ICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgdW51c2VkVG9rZW5zICAgIDogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dCAgICAgOiBbXSxcbiAgICAgICAgICAgIG92ZXJmbG93ICAgICAgICA6IC0yLFxuICAgICAgICAgICAgY2hhcnNMZWZ0T3ZlciAgIDogMCxcbiAgICAgICAgICAgIG51bGxJbnB1dCAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgaW52YWxpZE1vbnRoICAgIDogbnVsbCxcbiAgICAgICAgICAgIGludmFsaWRGb3JtYXQgICA6IGZhbHNlLFxuICAgICAgICAgICAgdXNlckludmFsaWRhdGVkIDogZmFsc2UsXG4gICAgICAgICAgICBpc28gICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlZERhdGVQYXJ0cyA6IFtdLFxuICAgICAgICAgICAgbWVyaWRpZW0gICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHJmYzI4MjIgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgd2Vla2RheU1pc21hdGNoIDogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgICAgICBpZiAobS5fcGYgPT0gbnVsbCkge1xuICAgICAgICAgICAgbS5fcGYgPSBkZWZhdWx0UGFyc2luZ0ZsYWdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX3BmO1xuICAgIH1cblxuICAgIHZhciBzb21lO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuc29tZSkge1xuICAgICAgICBzb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc29tZSA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gdCAmJiBmdW4uY2FsbCh0aGlzLCB0W2ldLCBpLCB0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcbiAgICAgICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pO1xuICAgICAgICAgICAgdmFyIHBhcnNlZFBhcnRzID0gc29tZS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAhPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaXNOb3dWYWxpZCA9ICFpc05hTihtLl9kLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgICAgICBmbGFncy5vdmVyZmxvdyA8IDAgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuZW1wdHkgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRXZWVrZGF5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLndlZWtkYXlNaXNtYXRjaCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5udWxsSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy51c2VySW52YWxpZGF0ZWQgJiZcbiAgICAgICAgICAgICAgICAoIWZsYWdzLm1lcmlkaWVtIHx8IChmbGFncy5tZXJpZGllbSAmJiBwYXJzZWRQYXJ0cykpO1xuXG4gICAgICAgICAgICBpZiAobS5fc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgaXNOb3dWYWxpZCA9IGlzTm93VmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY2hhcnNMZWZ0T3ZlciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy51bnVzZWRUb2tlbnMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmJpZ0hvdXIgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbiA9PSBudWxsIHx8ICFPYmplY3QuaXNGcm96ZW4obSkpIHtcbiAgICAgICAgICAgICAgICBtLl9pc1ZhbGlkID0gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc05vd1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQgKGZsYWdzKSB7XG4gICAgICAgIHZhciBtID0gY3JlYXRlVVRDKE5hTik7XG4gICAgICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHRlbmQoZ2V0UGFyc2luZ0ZsYWdzKG0pLCBmbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIFBsdWdpbnMgdGhhdCBhZGQgcHJvcGVydGllcyBzaG91bGQgYWxzbyBhZGQgdGhlIGtleSBoZXJlIChudWxsIHZhbHVlKSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxuICAgIHZhciBtb21lbnRQcm9wZXJ0aWVzID0gaG9va3MubW9tZW50UHJvcGVydGllcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gY29weUNvbmZpZyh0bywgZnJvbSkge1xuICAgICAgICB2YXIgaSwgcHJvcCwgdmFsO1xuXG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faXNBTW9tZW50T2JqZWN0KSkge1xuICAgICAgICAgICAgdG8uX2lzQU1vbWVudE9iamVjdCA9IGZyb20uX2lzQU1vbWVudE9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2kpKSB7XG4gICAgICAgICAgICB0by5faSA9IGZyb20uX2k7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9mKSkge1xuICAgICAgICAgICAgdG8uX2YgPSBmcm9tLl9mO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbCkpIHtcbiAgICAgICAgICAgIHRvLl9sID0gZnJvbS5fbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3N0cmljdCkpIHtcbiAgICAgICAgICAgIHRvLl9zdHJpY3QgPSBmcm9tLl9zdHJpY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl90em0pKSB7XG4gICAgICAgICAgICB0by5fdHptID0gZnJvbS5fdHptO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faXNVVEMpKSB7XG4gICAgICAgICAgICB0by5faXNVVEMgPSBmcm9tLl9pc1VUQztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX29mZnNldCkpIHtcbiAgICAgICAgICAgIHRvLl9vZmZzZXQgPSBmcm9tLl9vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9wZikpIHtcbiAgICAgICAgICAgIHRvLl9wZiA9IGdldFBhcnNpbmdGbGFncyhmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2xvY2FsZSkpIHtcbiAgICAgICAgICAgIHRvLl9sb2NhbGUgPSBmcm9tLl9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9tZW50UHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbW9tZW50UHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhbCA9IGZyb21bcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG5cbiAgICB2YXIgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgLy8gTW9tZW50IHByb3RvdHlwZSBvYmplY3RcbiAgICBmdW5jdGlvbiBNb21lbnQoY29uZmlnKSB7XG4gICAgICAgIGNvcHlDb25maWcodGhpcywgY29uZmlnKTtcbiAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5fZCAhPSBudWxsID8gY29uZmlnLl9kLmdldFRpbWUoKSA6IE5hTik7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHVwZGF0ZU9mZnNldCBjcmVhdGVzIG5ldyBtb21lbnRcbiAgICAgICAgLy8gb2JqZWN0cy5cbiAgICAgICAgaWYgKHVwZGF0ZUluUHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTW9tZW50IChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE1vbWVudCB8fCAob2JqICE9IG51bGwgJiYgb2JqLl9pc0FNb21lbnRPYmplY3QgIT0gbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzRmxvb3IgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgLy8gLTAgLT4gMFxuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpIHx8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgICAgICB2YXIgY29lcmNlZE51bWJlciA9ICthcmd1bWVudEZvckNvZXJjaW9uLFxuICAgICAgICAgICAgdmFsdWUgPSAwO1xuXG4gICAgICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGFic0Zsb29yKGNvZXJjZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIGNvbXBhcmUgdHdvIGFycmF5cywgcmV0dXJuIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXNcbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBsZW5ndGhEaWZmID0gTWF0aC5hYnMoYXJyYXkxLmxlbmd0aCAtIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgICAgICghZG9udENvbnZlcnQgJiYgdG9JbnQoYXJyYXkxW2ldKSAhPT0gdG9JbnQoYXJyYXkyW2ldKSkpIHtcbiAgICAgICAgICAgICAgICBkaWZmcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWZmcyArIGxlbmd0aERpZmY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIGNvbnNvbGUgIT09ICAndW5kZWZpbmVkJykgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RlcHJlY2F0aW9uIHdhcm5pbmc6ICcgKyBtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlKG1zZywgZm4pIHtcbiAgICAgICAgdmFyIGZpcnN0VGltZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobnVsbCwgbXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBhcmc7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9ICdcXG5bJyArIGkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1swXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKDAsIC0yKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGFuZCBzcGFjZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YXJuKG1zZyArICdcXG5Bcmd1bWVudHM6ICcgKyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKS5qb2luKCcnKSArICdcXG4nICsgKG5ldyBFcnJvcigpKS5zdGFjayk7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgZm4pO1xuICAgIH1cblxuICAgIHZhciBkZXByZWNhdGlvbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobmFtZSwgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0IChjb25maWcpIHtcbiAgICAgICAgdmFyIHByb3AsIGk7XG4gICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIHByb3AgPSBjb25maWdbaV07XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAvLyBudW1iZXIgKyAocG9zc2libHkpIHN0dWZmIGNvbWluZyBmcm9tIF9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICh0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLnNvdXJjZSB8fCB0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKSArXG4gICAgICAgICAgICAgICAgJ3wnICsgKC9cXGR7MSwyfS8pLnNvdXJjZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY2hpbGRDb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IGV4dGVuZCh7fSwgcGFyZW50Q29uZmlnKSwgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIHBhcmVudENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkQ29uZmlnW3Byb3BdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gY2hpbGRDb25maWdbcHJvcF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChwcm9wIGluIHBhcmVudENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBleHRlbmQoe30sIHJlc1twcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgdmFyIGksIHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdENhbGVuZGFyID0ge1xuICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICBuZXh0RGF5IDogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgbGFzdFdlZWsgOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyIChrZXksIG1vbSwgbm93KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhcltrZXldIHx8IHRoaXMuX2NhbGVuZGFyWydzYW1lRWxzZSddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvdXRwdXQpID8gb3V0cHV0LmNhbGwobW9tLCBub3cpIDogb3V0cHV0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgICAgIExUUyAgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgTFQgICA6ICdoOm1tIEEnLFxuICAgICAgICBMICAgIDogJ01NL0REL1lZWVknLFxuICAgICAgICBMTCAgIDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgIExMTCAgOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIExMTEwgOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSdcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9uZ0RhdGVGb3JtYXQgKGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgICAgIGZvcm1hdFVwcGVyID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChmb3JtYXQgfHwgIWZvcm1hdFVwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IGZvcm1hdFVwcGVyLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnNsaWNlKDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdEludmFsaWREYXRlID0gJ0ludmFsaWQgZGF0ZSc7XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkRGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE9yZGluYWwgPSAnJWQnO1xuICAgIHZhciBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSA9IC9cXGR7MSwyfS87XG5cbiAgICBmdW5jdGlvbiBvcmRpbmFsIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZSgnJWQnLCBudW1iZXIpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UmVsYXRpdmVUaW1lID0ge1xuICAgICAgICBmdXR1cmUgOiAnaW4gJXMnLFxuICAgICAgICBwYXN0ICAgOiAnJXMgYWdvJyxcbiAgICAgICAgcyAgOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgIHNzIDogJyVkIHNlY29uZHMnLFxuICAgICAgICBtICA6ICdhIG1pbnV0ZScsXG4gICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICBoICA6ICdhbiBob3VyJyxcbiAgICAgICAgaGggOiAnJWQgaG91cnMnLFxuICAgICAgICBkICA6ICdhIGRheScsXG4gICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICBNICA6ICdhIG1vbnRoJyxcbiAgICAgICAgTU0gOiAnJWQgbW9udGhzJyxcbiAgICAgICAgeSAgOiAnYSB5ZWFyJyxcbiAgICAgICAgeXkgOiAnJWQgeWVhcnMnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZSAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbc3RyaW5nXTtcbiAgICAgICAgcmV0dXJuIChpc0Z1bmN0aW9uKG91dHB1dCkpID9cbiAgICAgICAgICAgIG91dHB1dChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIDpcbiAgICAgICAgICAgIG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhc3RGdXR1cmUgKGRpZmYsIG91dHB1dCkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW2RpZmYgPiAwID8gJ2Z1dHVyZScgOiAncGFzdCddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihmb3JtYXQpID8gZm9ybWF0KG91dHB1dCkgOiBmb3JtYXQucmVwbGFjZSgvJXMvaSwgb3V0cHV0KTtcbiAgICB9XG5cbiAgICB2YXIgYWxpYXNlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkVW5pdEFsaWFzICh1bml0LCBzaG9ydGhhbmQpIHtcbiAgICAgICAgdmFyIGxvd2VyQ2FzZSA9IHVuaXQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYWxpYXNlc1tsb3dlckNhc2VdID0gYWxpYXNlc1tsb3dlckNhc2UgKyAncyddID0gYWxpYXNlc1tzaG9ydGhhbmRdID0gdW5pdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJyA/IGFsaWFzZXNbdW5pdHNdIHx8IGFsaWFzZXNbdW5pdHMudG9Mb3dlckNhc2UoKV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0VW5pdHMoaW5wdXRPYmplY3QpIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICAgICAgbm9ybWFsaXplZFByb3AsXG4gICAgICAgICAgICBwcm9wO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoaW5wdXRPYmplY3QsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVVbml0cyhwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0W25vcm1hbGl6ZWRQcm9wXSA9IGlucHV0T2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub3JtYWxpemVkSW5wdXQ7XG4gICAgfVxuXG4gICAgdmFyIHByaW9yaXRpZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRQcmlvcml0eSh1bml0LCBwcmlvcml0eSkge1xuICAgICAgICBwcmlvcml0aWVzW3VuaXRdID0gcHJpb3JpdHk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0c09iaikge1xuICAgICAgICB2YXIgdW5pdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgdSBpbiB1bml0c09iaikge1xuICAgICAgICAgICAgdW5pdHMucHVzaCh7dW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV19KTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5pdHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gemVyb0ZpbGwobnVtYmVyLCB0YXJnZXRMZW5ndGgsIGZvcmNlU2lnbikge1xuICAgICAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICAgICAgemVyb3NUb0ZpbGwgPSB0YXJnZXRMZW5ndGggLSBhYnNOdW1iZXIubGVuZ3RoLFxuICAgICAgICAgICAgc2lnbiA9IG51bWJlciA+PSAwO1xuICAgICAgICByZXR1cm4gKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgICAgICBNYXRoLnBvdygxMCwgTWF0aC5tYXgoMCwgemVyb3NUb0ZpbGwpKS50b1N0cmluZygpLnN1YnN0cigxKSArIGFic051bWJlcjtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98WVlZWVlZfFlZWVlZfFlZWVl8WVl8Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2c7XG5cbiAgICB2YXIgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZztcblxuICAgIHZhciBmb3JtYXRGdW5jdGlvbnMgPSB7fTtcblxuICAgIHZhciBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgLy8gdG9rZW46ICAgICdNJ1xuICAgIC8vIHBhZGRlZDogICBbJ01NJywgMl1cbiAgICAvLyBvcmRpbmFsOiAgJ01vJ1xuICAgIC8vIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7IHRoaXMubW9udGgoKSArIDEgfVxuICAgIGZ1bmN0aW9uIGFkZEZvcm1hdFRva2VuICh0b2tlbiwgcGFkZGVkLCBvcmRpbmFsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tjYWxsYmFja10oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWRkZWQpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3BhZGRlZFswXV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9GaWxsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgcGFkZGVkWzFdLCBwYWRkZWRbMl0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkaW5hbCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbb3JkaW5hbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwoZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0b2tlbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIHZhciBhcnJheSA9IGZvcm1hdC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSwgaSwgbGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vbSkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9ICcnLCBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGlzRnVuY3Rpb24oYXJyYXlbaV0pID8gYXJyYXlbaV0uY2FsbChtb20sIGZvcm1hdCkgOiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IGRhdGUgdXNpbmcgbmF0aXZlIGRhdGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gZm9ybWF0TW9tZW50KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGV4cGFuZEZvcm1hdChmb3JtYXQsIG0ubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPSBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSB8fCBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KTtcblxuICAgICAgICByZXR1cm4gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0obSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhwYW5kRm9ybWF0KGZvcm1hdCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBpID0gNTtcblxuICAgICAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoaW5wdXQpIHx8IGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChpID49IDAgJiYgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UobG9jYWxGb3JtYXR0aW5nVG9rZW5zLCByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMpO1xuICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICBpIC09IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHZhciBtYXRjaDEgICAgICAgICA9IC9cXGQvOyAgICAgICAgICAgIC8vICAgICAgIDAgLSA5XG4gICAgdmFyIG1hdGNoMiAgICAgICAgID0gL1xcZFxcZC87ICAgICAgICAgIC8vICAgICAgMDAgLSA5OVxuICAgIHZhciBtYXRjaDMgICAgICAgICA9IC9cXGR7M30vOyAgICAgICAgIC8vICAgICAwMDAgLSA5OTlcbiAgICB2YXIgbWF0Y2g0ICAgICAgICAgPSAvXFxkezR9LzsgICAgICAgICAvLyAgICAwMDAwIC0gOTk5OVxuICAgIHZhciBtYXRjaDYgICAgICAgICA9IC9bKy1dP1xcZHs2fS87ICAgIC8vIC05OTk5OTkgLSA5OTk5OTlcbiAgICB2YXIgbWF0Y2gxdG8yICAgICAgPSAvXFxkXFxkPy87ICAgICAgICAgLy8gICAgICAgMCAtIDk5XG4gICAgdmFyIG1hdGNoM3RvNCAgICAgID0gL1xcZFxcZFxcZFxcZD8vOyAgICAgLy8gICAgIDk5OSAtIDk5OTlcbiAgICB2YXIgbWF0Y2g1dG82ICAgICAgPSAvXFxkXFxkXFxkXFxkXFxkXFxkPy87IC8vICAgOTk5OTkgLSA5OTk5OTlcbiAgICB2YXIgbWF0Y2gxdG8zICAgICAgPSAvXFxkezEsM30vOyAgICAgICAvLyAgICAgICAwIC0gOTk5XG4gICAgdmFyIG1hdGNoMXRvNCAgICAgID0gL1xcZHsxLDR9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2gxdG82ICAgICAgPSAvWystXT9cXGR7MSw2fS87ICAvLyAtOTk5OTk5IC0gOTk5OTk5XG5cbiAgICB2YXIgbWF0Y2hVbnNpZ25lZCAgPSAvXFxkKy87ICAgICAgICAgICAvLyAgICAgICAwIC0gaW5mXG4gICAgdmFyIG1hdGNoU2lnbmVkICAgID0gL1srLV0/XFxkKy87ICAgICAgLy8gICAgLWluZiAtIGluZlxuXG4gICAgdmFyIG1hdGNoT2Zmc2V0ICAgID0gL1p8WystXVxcZFxcZDo/XFxkXFxkL2dpOyAvLyArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICB2YXIgbWF0Y2hTaG9ydE9mZnNldCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/L2dpOyAvLyArMDAgLTAwICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuXG4gICAgdmFyIG1hdGNoVGltZXN0YW1wID0gL1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/LzsgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcblxuICAgIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuICAgIC8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbiAgICB2YXIgbWF0Y2hXb3JkID0gL1swLTldezAsMjU2fVsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRjA3XFx1RkYxMC1cXHVGRkVGXXsxLDI1Nn18W1xcdTA2MDAtXFx1MDZGRlxcL117MSwyNTZ9KFxccyo/W1xcdTA2MDAtXFx1MDZGRl17MSwyNTZ9KXsxLDJ9L2k7XG5cbiAgICB2YXIgcmVnZXhlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUmVnZXhUb2tlbiAodG9rZW4sIHJlZ2V4LCBzdHJpY3RSZWdleCkge1xuICAgICAgICByZWdleGVzW3Rva2VuXSA9IGlzRnVuY3Rpb24ocmVnZXgpID8gcmVnZXggOiBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZURhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiAoaXNTdHJpY3QgJiYgc3RyaWN0UmVnZXgpID8gc3RyaWN0UmVnZXggOiByZWdleDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4gKHRva2VuLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHJlZ2V4ZXMsIHRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodW5lc2NhcGVGb3JtYXQodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWdleGVzW3Rva2VuXShjb25maWcuX3N0cmljdCwgY29uZmlnLl9sb2NhbGUpO1xuICAgIH1cblxuICAgIC8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbiAgICBmdW5jdGlvbiB1bmVzY2FwZUZvcm1hdChzKSB7XG4gICAgICAgIHJldHVybiByZWdleEVzY2FwZShzLnJlcGxhY2UoJ1xcXFwnLCAnJykucmVwbGFjZSgvXFxcXChcXFspfFxcXFwoXFxdKXxcXFsoW15cXF1cXFtdKilcXF18XFxcXCguKS9nLCBmdW5jdGlvbiAobWF0Y2hlZCwgcDEsIHAyLCBwMywgcDQpIHtcbiAgICAgICAgICAgIHJldHVybiBwMSB8fCBwMiB8fCBwMyB8fCBwNDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4gICAgfVxuXG4gICAgdmFyIHRva2VucyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUGFyc2VUb2tlbiAodG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBpLCBmdW5jID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0b2tlbiA9IFt0b2tlbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTnVtYmVyKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtjYWxsYmFja10gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuW2ldXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrUGFyc2VUb2tlbiAodG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0LCBjb25maWcuX3csIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgaW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBoYXNPd25Qcm9wKHRva2VucywgdG9rZW4pKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5dKGlucHV0LCBjb25maWcuX2EsIGNvbmZpZywgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFlFQVIgPSAwO1xuICAgIHZhciBNT05USCA9IDE7XG4gICAgdmFyIERBVEUgPSAyO1xuICAgIHZhciBIT1VSID0gMztcbiAgICB2YXIgTUlOVVRFID0gNDtcbiAgICB2YXIgU0VDT05EID0gNTtcbiAgICB2YXIgTUlMTElTRUNPTkQgPSA2O1xuICAgIHZhciBXRUVLID0gNztcbiAgICB2YXIgV0VFS0RBWSA9IDg7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnllYXIoKTtcbiAgICAgICAgcmV0dXJuIHkgPD0gOTk5OSA/ICcnICsgeSA6ICcrJyArIHk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZJywgICA0XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZJywgIDVdLCAgICAgICAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3llYXInLCAneScpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd5ZWFyJywgMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdZJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVknLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVknLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZWScsICBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ1lZWVlZJywgJ1lZWVlZWSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9IGlucHV0Lmxlbmd0aCA9PT0gMiA/IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KSA6IHRvSW50KGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBwYXJzZUludChpbnB1dCwgMTApO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApIHx8IHllYXIgJSA0MDAgPT09IDA7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG4gICAgfTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGdldElzTGVhcFllYXIgKCkge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldFNldCAodW5pdCwga2VlcFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZXQkMSh0aGlzLCB1bml0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIGtlZXBUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQgKG1vbSwgdW5pdCkge1xuICAgICAgICByZXR1cm4gbW9tLmlzVmFsaWQoKSA/XG4gICAgICAgICAgICBtb20uX2RbJ2dldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0oKSA6IE5hTjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQkMSAobW9tLCB1bml0LCB2YWx1ZSkge1xuICAgICAgICBpZiAobW9tLmlzVmFsaWQoKSAmJiAhaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodW5pdCA9PT0gJ0Z1bGxZZWFyJyAmJiBpc0xlYXBZZWFyKG1vbS55ZWFyKCkpICYmIG1vbS5tb250aCgpID09PSAxICYmIG1vbS5kYXRlKCkgPT09IDI5KSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlLCBtb20ubW9udGgoKSwgZGF5c0luTW9udGgodmFsdWUsIG1vbS5tb250aCgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc3RyaW5nR2V0ICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1NldCAodW5pdHMsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIHZhciBwcmlvcml0aXplZCA9IGdldFByaW9yaXRpemVkVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmlvcml0aXplZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXNbcHJpb3JpdGl6ZWRbaV0udW5pdF0odW5pdHNbcHJpb3JpdGl6ZWRbaV0udW5pdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vZChuLCB4KSB7XG4gICAgICAgIHJldHVybiAoKG4gJSB4KSArIHgpICUgeDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXhPZjtcblxuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgICAgICBpbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXhPZiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAvLyBJIGtub3dcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1tpXSA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kTW9udGggPSBtb2QobW9udGgsIDEyKTtcbiAgICAgICAgeWVhciArPSAobW9udGggLSBtb2RNb250aCkgLyAxMjtcbiAgICAgICAgcmV0dXJuIG1vZE1vbnRoID09PSAxID8gKGlzTGVhcFllYXIoeWVhcikgPyAyOSA6IDI4KSA6ICgzMSAtIG1vZE1vbnRoICUgNyAlIDIpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNJywgWydNTScsIDJdLCAnTW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtb250aCcsICdNJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtb250aCcsIDgpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignTScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU0nLCAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU0nLCAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTScsICdNTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9IHRvSW50KGlucHV0KSAtIDE7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTU1NJywgJ01NTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbW9udGggPSBjb25maWcuX2xvY2FsZS5tb250aHNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXG4gICAgICAgIGlmIChtb250aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhcnJheVtNT05USF0gPSBtb250aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRNb250aCA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICB2YXIgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LztcbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRocyA9ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyAobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKSA/IHRoaXMuX21vbnRocyA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzWydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKSA/IHRoaXMuX21vbnRoc1ttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1sodGhpcy5fbW9udGhzLmlzRm9ybWF0IHx8IE1PTlRIU19JTl9GT1JNQVQpLnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQgPSAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzU2hvcnQgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KSA/IHRoaXMuX21vbnRoc1Nob3J0IDpcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFsnc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KSA/IHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV0gOlxuICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbTU9OVEhTX0lOX0ZPUk1BVC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBpaSwgbW9tLCBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1BhcnNlIChtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCBtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXJcbiAgICAgICAgLy8gc2VlIHNvcnRpbmcgaW4gY29tcHV0ZU1vbnRoc1BhcnNlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc3RyaWN0ICYmICF0aGlzLl9tb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykgKyAnfF4nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ01NTU0nICYmIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ01NTScgJiYgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl9tb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHNldE1vbnRoIChtb20sIHZhbHVlKSB7XG4gICAgICAgIHZhciBkYXlPZk1vbnRoO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybiBtb207XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKC9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogQW5vdGhlciBzaWxlbnQgZmFpbHVyZT9cbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRheU9mTW9udGggPSBNYXRoLm1pbihtb20uZGF0ZSgpLCBkYXlzSW5Nb250aChtb20ueWVhcigpLCB2YWx1ZSkpO1xuICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgJ01vbnRoJ10odmFsdWUsIGRheU9mTW9udGgpO1xuICAgICAgICByZXR1cm4gbW9tO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldE1vbnRoICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0TW9udGgodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsICdNb250aCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF5c0luTW9udGggKCkge1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIG1vbnRoc1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFJlZ2V4ID0gZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdE1vbnRoc1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIG1vbnRoc1JlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4IDogdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlTW9udGhzUGFyc2UgKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvcnRQaWVjZXMgPSBbXSwgbG9uZ1BpZWNlcyA9IFtdLCBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSwgbW9tO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGUgKHksIG0sIGQsIGgsIE0sIHMsIG1zKSB7XG4gICAgICAgIC8vIGNhbid0IGp1c3QgYXBwbHkoKSB0byBjcmVhdGUgYSBkYXRlOlxuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMTgxMzQ4XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xuXG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDAgJiYgaXNGaW5pdGUoZGF0ZS5nZXRGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVENEYXRlICh5KSB7XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG5cbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDAgJiYgaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuICAgIGZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgICAgICBmd2QgPSA3ICsgZG93IC0gZG95LFxuICAgICAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlaywgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1dXJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWsgKG1vbSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheScsICdkJyk7XG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrZGF5JywgJ2UnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtkYXknLCAnRScpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheScsIDExKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrZGF5JywgMTEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5cyA9ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyAobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fd2Vla2RheXMpID8gdGhpcy5fd2Vla2RheXMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzWydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fd2Vla2RheXMpID8gdGhpcy5fd2Vla2RheXNbbS5kYXkoKV0gOlxuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20uZGF5KCldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNTaG9ydCAobSkge1xuICAgICAgICByZXR1cm4gKG0pID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiA9ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbiAobSkge1xuICAgICAgICByZXR1cm4gKG0pID8gdGhpcy5fd2Vla2RheXNNaW5bbS5kYXkoKV0gOiB0aGlzLl93ZWVrZGF5c01pbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZSQxKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgaWksIG1vbSwgbGxjID0gd2Vla2RheU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkge1xuICAgICAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1BhcnNlICh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPSAnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZGRkJyAmJiB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkJyAmJiB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkJyAmJiB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheSA9IHRoaXMuX2lzVVRDID8gdGhpcy5fZC5nZXRVVENEYXkoKSA6IHRoaXMuX2QuZ2V0RGF5KCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGlucHV0IC0gZGF5LCAnZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRheTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldExvY2FsZURheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gKHRoaXMuZGF5KCkgKyA3IC0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93KSAlIDc7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09EYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJlaGF2ZXMgdGhlIHNhbWUgYXMgbW9tZW50I2RheSBleGNlcHRcbiAgICAgICAgLy8gYXMgYSBnZXR0ZXIsIHJldHVybnMgNyBpbnN0ZWFkIG9mIDAgKDEtNyByYW5nZSBpbnN0ZWFkIG9mIDAtNilcbiAgICAgICAgLy8gYXMgYSBzZXR0ZXIsIHN1bmRheSBzaG91bGQgYmVsb25nIHRvIHRoZSBwcmV2aW91cyB3ZWVrLlxuXG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgd2Vla2RheSA9IHBhcnNlSXNvV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KHRoaXMuZGF5KCkgJSA3ID8gd2Vla2RheSA6IHdlZWtkYXkgLSA3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpIHx8IDc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gd2Vla2RheXNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBkZWZhdWx0V2Vla2RheXNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzU2hvcnRSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG4gICAgZnVuY3Rpb24gd2Vla2RheXNNaW5SZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzTWluUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSBkZWZhdWx0V2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVdlZWtkYXlzUGFyc2UgKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluUGllY2VzID0gW10sIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbSwgbWlucCwgc2hvcnRwLCBsb25ncDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBtaW5wID0gdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgIHNob3J0cCA9IHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgIGxvbmdwID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKTtcbiAgICAgICAgICAgIG1pblBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIHdlZWtkYXkgKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBtaW5QaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIHNob3J0UGllY2VzW2ldID0gcmVnZXhFc2NhcGUoc2hvcnRQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbG9uZ1BpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKGxvbmdQaWVjZXNbaV0pO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1pblBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gaEZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgfHwgMjQ7XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0gnLCBbJ0hIJywgMl0sIDAsICdob3VyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2gnLCBbJ2hoJywgMl0sIDAsIGhGb3JtYXQpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdrJywgWydraycsIDJdLCAwLCBrRm9ybWF0KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyB0aGlzLmhvdXJzKCkgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW0gKHRva2VuLCBsb3dlcmNhc2UpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbSh0aGlzLmhvdXJzKCksIHRoaXMubWludXRlcygpLCBsb3dlcmNhc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBtZXJpZGllbSgnYScsIHRydWUpO1xuICAgIG1lcmlkaWVtKCdBJywgZmFsc2UpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdob3VyJywgJ2gnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdob3VyJywgMTMpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgZnVuY3Rpb24gbWF0Y2hNZXJpZGllbSAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9tZXJpZGllbVBhcnNlO1xuICAgIH1cblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignQScsICBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdIJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignaCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2snLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdISCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdoaCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdraycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignaG1tc3MnLCBtYXRjaDV0bzYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbScsIG1hdGNoM3RvNCk7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tc3MnLCBtYXRjaDV0bzYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0gnLCAnSEgnXSwgSE9VUik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2snLCAna2snXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBrSW5wdXQgPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGFycmF5W0hPVVJdID0ga0lucHV0ID09PSAyNCA/IDAgOiBrSW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2EnLCAnQSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9pc1BtID0gY29uZmlnLl9sb2NhbGUuaXNQTShpbnB1dCk7XG4gICAgICAgIGNvbmZpZy5fbWVyaWRpZW0gPSBpbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaCcsICdoaCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ2htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNDtcbiAgICAgICAgdmFyIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVJc1BNIChpbnB1dCkge1xuICAgICAgICAvLyBJRTggUXVpcmtzIE1vZGUgJiBJRTcgU3RhbmRhcmRzIE1vZGUgZG8gbm90IGFsbG93IGFjY2Vzc2luZyBzdHJpbmdzIGxpa2UgYXJyYXlzXG4gICAgICAgIC8vIFVzaW5nIGNoYXJBdCBzaG91bGQgYmUgbW9yZSBjb21wYXRpYmxlLlxuICAgICAgICByZXR1cm4gKChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UgPSAvW2FwXVxcLj9tP1xcLj8vaTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNZXJpZGllbSAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BtJyA6ICdQTSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdhbScgOiAnQU0nO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBTZXR0aW5nIHRoZSBob3VyIHNob3VsZCBrZWVwIHRoZSB0aW1lLCBiZWNhdXNlIHRoZSB1c2VyIGV4cGxpY2l0bHlcbiAgICAvLyBzcGVjaWZpZWQgd2hpY2ggaG91ciB0aGV5IHdhbnQuIFNvIHRyeWluZyB0byBtYWludGFpbiB0aGUgc2FtZSBob3VyIChpblxuICAgIC8vIGEgbmV3IHRpbWV6b25lKSBtYWtlcyBzZW5zZS4gQWRkaW5nL3N1YnRyYWN0aW5nIGhvdXJzIGRvZXMgbm90IGZvbGxvd1xuICAgIC8vIHRoaXMgcnVsZS5cbiAgICB2YXIgZ2V0U2V0SG91ciA9IG1ha2VHZXRTZXQoJ0hvdXJzJywgdHJ1ZSk7XG5cbiAgICB2YXIgYmFzZUNvbmZpZyA9IHtcbiAgICAgICAgY2FsZW5kYXI6IGRlZmF1bHRDYWxlbmRhcixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IGRlZmF1bHRMb25nRGF0ZUZvcm1hdCxcbiAgICAgICAgaW52YWxpZERhdGU6IGRlZmF1bHRJbnZhbGlkRGF0ZSxcbiAgICAgICAgb3JkaW5hbDogZGVmYXVsdE9yZGluYWwsXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlLFxuICAgICAgICByZWxhdGl2ZVRpbWU6IGRlZmF1bHRSZWxhdGl2ZVRpbWUsXG5cbiAgICAgICAgbW9udGhzOiBkZWZhdWx0TG9jYWxlTW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LFxuXG4gICAgICAgIHdlZWs6IGRlZmF1bHRMb2NhbGVXZWVrLFxuXG4gICAgICAgIHdlZWtkYXlzOiBkZWZhdWx0TG9jYWxlV2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlXG4gICAgfTtcblxuICAgIC8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxvY2FsZSBjb25maWcgZmlsZXNcbiAgICB2YXIgbG9jYWxlcyA9IHt9O1xuICAgIHZhciBsb2NhbGVGYW1pbGllcyA9IHt9O1xuICAgIHZhciBnbG9iYWxMb2NhbGU7XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVMb2NhbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgPyBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdfJywgJy0nKSA6IGtleTtcbiAgICB9XG5cbiAgICAvLyBwaWNrIHRoZSBsb2NhbGUgZnJvbSB0aGUgYXJyYXlcbiAgICAvLyB0cnkgWydlbi1hdScsICdlbi1nYiddIGFzICdlbi1hdScsICdlbi1nYicsICdlbicsIGFzIGluIG1vdmUgdGhyb3VnaCB0aGUgbGlzdCB0cnlpbmcgZWFjaFxuICAgIC8vIHN1YnN0cmluZyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3QsIGJ1dCBtb3ZlIHRvIHRoZSBuZXh0IGFycmF5IGl0ZW0gaWYgaXQncyBhIG1vcmUgc3BlY2lmaWMgdmFyaWFudCB0aGFuIHRoZSBjdXJyZW50IHJvb3RcbiAgICBmdW5jdGlvbiBjaG9vc2VMb2NhbGUobmFtZXMpIHtcbiAgICAgICAgdmFyIGkgPSAwLCBqLCBuZXh0LCBsb2NhbGUsIHNwbGl0O1xuXG4gICAgICAgIHdoaWxlIChpIDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzcGxpdCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpXSkuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGogPSBzcGxpdC5sZW5ndGg7XG4gICAgICAgICAgICBuZXh0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2kgKyAxXSk7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dCA/IG5leHQuc3BsaXQoJy0nKSA6IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKHNwbGl0LnNsaWNlKDAsIGopLmpvaW4oJy0nKSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0Lmxlbmd0aCA+PSBqICYmIGNvbXBhcmVBcnJheXMoc3BsaXQsIG5leHQsIHRydWUpID49IGogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobmFtZSkge1xuICAgICAgICB2YXIgb2xkTG9jYWxlID0gbnVsbDtcbiAgICAgICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gcmVnaXN0ZXIgYW5kIGxvYWQgYWxsIHRoZSBsb2NhbGVzIGluIE5vZGVcbiAgICAgICAgaWYgKCFsb2NhbGVzW25hbWVdICYmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb2xkTG9jYWxlID0gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhc2VkUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUoJy4vbG9jYWxlLycgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUob2xkTG9jYWxlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbG9jYWxlIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxvY2FsZS4gIElmXG4gICAgLy8gbm8gYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4sIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCBnbG9iYWxcbiAgICAvLyBsb2NhbGUga2V5LlxuICAgIGZ1bmN0aW9uIGdldFNldEdsb2JhbExvY2FsZSAoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRlZmluZUxvY2FsZShrZXksIHZhbHVlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9tZW50LmR1cmF0aW9uLl9sb2NhbGUgPSBtb21lbnQuX2xvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgZ2xvYmFsTG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIGNvbnNvbGUgIT09ICAndW5kZWZpbmVkJykgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vd2FybiB1c2VyIGlmIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ1dCB0aGUgbG9jYWxlIGNvdWxkIG5vdCBiZSBzZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdMb2NhbGUgJyArIGtleSArICAnIG5vdCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gbG9hZCBpdD8nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZSAobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICBjb25maWcuYWJiciA9IG5hbWU7XG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKCdkZWZpbmVMb2NhbGVPdmVycmlkZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAndXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYW4gZXhpc3RpbmcgbG9jYWxlLiBtb21lbnQuZGVmaW5lTG9jYWxlKGxvY2FsZU5hbWUsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uJyk7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tuYW1lXS5fY29uZmlnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0uX2NvbmZpZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGNvbmZpZy5wYXJlbnRMb2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IG5ldyBMb2NhbGUobWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKSk7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVGYW1pbGllc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lTG9jYWxlKHgubmFtZSwgeC5jb25maWcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGxvY2FsZSBBRlRFUiBhbGwgY2hpbGQgbG9jYWxlcyBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIGNyZWF0ZWQsIHNvIHdlIHdvbid0IGVuZCB1cCB3aXRoIHRoZSBjaGlsZCBsb2NhbGUgc2V0LlxuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuXG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsIHRtcExvY2FsZSwgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcbiAgICAgICAgICAgIC8vIE1FUkdFXG4gICAgICAgICAgICB0bXBMb2NhbGUgPSBsb2FkTG9jYWxlKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHRtcExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gdG1wTG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpO1xuICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShjb25maWcpO1xuICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlO1xuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3MgbnVsbCBmb3IgY29uZmlnIHRvIHVudXBkYXRlLCB1c2VmdWwgZm9yIHRlc3RzXG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGxvY2FsZSBkYXRhXG4gICAgZnVuY3Rpb24gZ2V0TG9jYWxlIChrZXkpIHtcbiAgICAgICAgdmFyIGxvY2FsZTtcblxuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cgKG0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93O1xuICAgICAgICB2YXIgYSA9IG0uX2E7XG5cbiAgICAgICAgaWYgKGEgJiYgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID09PSAtMikge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPVxuICAgICAgICAgICAgICAgIGFbTU9OVEhdICAgICAgIDwgMCB8fCBhW01PTlRIXSAgICAgICA+IDExICA/IE1PTlRIIDpcbiAgICAgICAgICAgICAgICBhW0RBVEVdICAgICAgICA8IDEgfHwgYVtEQVRFXSAgICAgICAgPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSkgPyBEQVRFIDpcbiAgICAgICAgICAgICAgICBhW0hPVVJdICAgICAgICA8IDAgfHwgYVtIT1VSXSAgICAgICAgPiAyNCB8fCAoYVtIT1VSXSA9PT0gMjQgJiYgKGFbTUlOVVRFXSAhPT0gMCB8fCBhW1NFQ09ORF0gIT09IDAgfHwgYVtNSUxMSVNFQ09ORF0gIT09IDApKSA/IEhPVVIgOlxuICAgICAgICAgICAgICAgIGFbTUlOVVRFXSAgICAgIDwgMCB8fCBhW01JTlVURV0gICAgICA+IDU5ICA/IE1JTlVURSA6XG4gICAgICAgICAgICAgICAgYVtTRUNPTkRdICAgICAgPCAwIHx8IGFbU0VDT05EXSAgICAgID4gNTkgID8gU0VDT05EIDpcbiAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSA8IDAgfHwgYVtNSUxMSVNFQ09ORF0gPiA5OTkgPyBNSUxMSVNFQ09ORCA6XG4gICAgICAgICAgICAgICAgLTE7XG5cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93RGF5T2ZZZWFyICYmIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla3MgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrZGF5ICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFS0RBWTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQaWNrIHRoZSBmaXJzdCBkZWZpbmVkIG9mIHR3byBvciB0aHJlZSBhcmd1bWVudHMuXG4gICAgZnVuY3Rpb24gZGVmYXVsdHMoYSwgYiwgYykge1xuICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZykge1xuICAgICAgICAvLyBob29rcyBpcyBhY3R1YWxseSB0aGUgZXhwb3J0ZWQgbW9tZW50IG9iamVjdFxuICAgICAgICB2YXIgbm93VmFsdWUgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIGlmIChjb25maWcuX3VzZVVUQykge1xuICAgICAgICAgICAgcmV0dXJuIFtub3dWYWx1ZS5nZXRVVENGdWxsWWVhcigpLCBub3dWYWx1ZS5nZXRVVENNb250aCgpLCBub3dWYWx1ZS5nZXRVVENEYXRlKCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheSAoY29uZmlnKSB7XG4gICAgICAgIHZhciBpLCBkYXRlLCBpbnB1dCA9IFtdLCBjdXJyZW50RGF0ZSwgZXhwZWN0ZWRXZWVrZGF5LCB5ZWFyVG9Vc2U7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZyk7XG5cbiAgICAgICAgLy9jb21wdXRlIGRheSBvZiB0aGUgeWVhciBmcm9tIHdlZWtzIGFuZCB3ZWVrZGF5c1xuICAgICAgICBpZiAoY29uZmlnLl93ICYmIGNvbmZpZy5fYVtEQVRFXSA9PSBudWxsICYmIGNvbmZpZy5fYVtNT05USF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSBkYXkgb2YgdGhlIHllYXIgaXMgc2V0LCBmaWd1cmUgb3V0IHdoYXQgaXQgaXNcbiAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHllYXJUb1VzZSA9IGRlZmF1bHRzKGNvbmZpZy5fYVtZRUFSXSwgY3VycmVudERhdGVbWUVBUl0pO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXJUb1VzZSkgfHwgY29uZmlnLl9kYXlPZlllYXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dEYXlPZlllYXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNT05USF0gPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgICAgICAgICBjb25maWcuX2FbREFURV0gPSBkYXRlLmdldFVUQ0RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCBkYXRlLlxuICAgICAgICAvLyAqIGlmIG5vIHllYXIsIG1vbnRoLCBkYXkgb2YgbW9udGggYXJlIGdpdmVuLCBkZWZhdWx0IHRvIHRvZGF5XG4gICAgICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgICAgIC8vICogaWYgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgb25seSB5ZWFyXG4gICAgICAgIC8vICogaWYgeWVhciBpcyBnaXZlbiwgZG9uJ3QgZGVmYXVsdCBhbnl0aGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IGN1cnJlbnREYXRlW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IChjb25maWcuX2FbaV0gPT0gbnVsbCkgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciAyNDowMDowMC4wMDBcbiAgICAgICAgaWYgKGNvbmZpZy5fYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtTRUNPTkRdID09PSAwICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTExJU0VDT05EXSA9PT0gMCkge1xuICAgICAgICAgICAgY29uZmlnLl9uZXh0RGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBjcmVhdGVVVENEYXRlIDogY3JlYXRlRGF0ZSkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgICAgICBleHBlY3RlZFdlZWtkYXkgPSBjb25maWcuX3VzZVVUQyA/IGNvbmZpZy5fZC5nZXRVVENEYXkoKSA6IGNvbmZpZy5fZC5nZXREYXkoKTtcblxuICAgICAgICAvLyBBcHBseSB0aW1lem9uZSBvZmZzZXQgZnJvbSBpbnB1dC4gVGhlIGFjdHVhbCB1dGNPZmZzZXQgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgLy8gd2l0aCBwYXJzZVpvbmUuXG4gICAgICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMjQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBmb3IgbWlzbWF0Y2hpbmcgZGF5IG9mIHdlZWtcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiB0eXBlb2YgY29uZmlnLl93LmQgIT09ICd1bmRlZmluZWQnICYmIGNvbmZpZy5fdy5kICE9PSBleHBlY3RlZFdlZWtkYXkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKSB7XG4gICAgICAgIHZhciB3LCB3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3ksIHRlbXAsIHdlZWtkYXlPdmVyZmxvdztcblxuICAgICAgICB3ID0gY29uZmlnLl93O1xuICAgICAgICBpZiAody5HRyAhPSBudWxsIHx8IHcuVyAhPSBudWxsIHx8IHcuRSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkb3cgPSAxO1xuICAgICAgICAgICAgZG95ID0gNDtcblxuICAgICAgICAgICAgLy8gVE9ETzogV2UgbmVlZCB0byB0YWtlIHRoZSBjdXJyZW50IGlzb1dlZWtZZWFyLCBidXQgdGhhdCBkZXBlbmRzIG9uXG4gICAgICAgICAgICAvLyBob3cgd2UgaW50ZXJwcmV0IG5vdyAobG9jYWwsIHV0YywgZml4ZWQgb2Zmc2V0KS4gU28gY3JlYXRlXG4gICAgICAgICAgICAvLyBhIG5vdyB2ZXJzaW9uIG9mIGN1cnJlbnQgY29uZmlnICh0YWtlIGxvY2FsL3V0Yy9vZmZzZXQgZmxhZ3MsIGFuZFxuICAgICAgICAgICAgLy8gY3JlYXRlIG5vdykuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuR0csIGNvbmZpZy5fYVtZRUFSXSwgd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCAxLCA0KS55ZWFyKTtcbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LlcsIDEpO1xuICAgICAgICAgICAgd2Vla2RheSA9IGRlZmF1bHRzKHcuRSwgMSk7XG4gICAgICAgICAgICBpZiAod2Vla2RheSA8IDEgfHwgd2Vla2RheSA+IDcpIHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICAgICAgZG95ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG95O1xuXG4gICAgICAgICAgICB2YXIgY3VyV2VlayA9IHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgZG93LCBkb3kpO1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHdlZWsuXG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody53LCBjdXJXZWVrLndlZWspO1xuXG4gICAgICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZWVrZGF5IC0tIGxvdyBkYXkgbnVtYmVycyBhcmUgY29uc2lkZXJlZCBuZXh0IHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5kO1xuICAgICAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2NhbCB3ZWVrZGF5IC0tIGNvdW50aW5nIHN0YXJ0cyBmcm9tIGJlZ2luaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5lICsgZG93O1xuICAgICAgICAgICAgICAgIGlmICh3LmUgPCAwIHx8IHcuZSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC87XG4gICAgdmFyIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuXG4gICAgdmFyIHR6UmVnZXggPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy87XG5cbiAgICB2YXIgaXNvRGF0ZXMgPSBbXG4gICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICBbJ1lZWVktTU0tREQnLCAvXFxkezR9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L10sXG4gICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgWydZWVlZTU1ERCcsIC9cXGR7OH0vXSxcbiAgICAgICAgLy8gWVlZWU1NIGlzIE5PVCBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZFxuICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICBbJ0dHR0dbV11XVycsIC9cXGR7NH1XXFxkezJ9LywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L11cbiAgICBdO1xuXG4gICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgIHZhciBpc29UaW1lcyA9IFtcbiAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISG1tc3MsU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICBbJ0hIJywgL1xcZFxcZC9dXG4gICAgXTtcblxuICAgIHZhciBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pO1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQsIHR6Rm9ybWF0O1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgdmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvO1xuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyh5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCAnICcpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja1dlZWtkYXkod2Vla2RheVN0ciwgcGFyc2VkSW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAod2Vla2RheVN0cikge1xuICAgICAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB0aGUgdmFuaWxsYSBKUyBEYXRlIG9iamVjdCB3aXRoIGFuIGluZGVwZW50ZW50IGRheS1vZi13ZWVrIGNoZWNrLlxuICAgICAgICAgICAgdmFyIHdlZWtkYXlQcm92aWRlZCA9IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0ciksXG4gICAgICAgICAgICAgICAgd2Vla2RheUFjdHVhbCA9IG5ldyBEYXRlKHBhcnNlZElucHV0WzBdLCBwYXJzZWRJbnB1dFsxXSwgcGFyc2VkSW5wdXRbMl0pLmdldERheSgpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXlQcm92aWRlZCAhPT0gd2Vla2RheUFjdHVhbCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBvYnNPZmZzZXRzID0ge1xuICAgICAgICBVVDogMCxcbiAgICAgICAgR01UOiAwLFxuICAgICAgICBFRFQ6IC00ICogNjAsXG4gICAgICAgIEVTVDogLTUgKiA2MCxcbiAgICAgICAgQ0RUOiAtNSAqIDYwLFxuICAgICAgICBDU1Q6IC02ICogNjAsXG4gICAgICAgIE1EVDogLTYgKiA2MCxcbiAgICAgICAgTVNUOiAtNyAqIDYwLFxuICAgICAgICBQRFQ6IC03ICogNjAsXG4gICAgICAgIFBTVDogLTggKiA2MFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVPZmZzZXQob2JzT2Zmc2V0LCBtaWxpdGFyeU9mZnNldCwgbnVtT2Zmc2V0KSB7XG4gICAgICAgIGlmIChvYnNPZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNPZmZzZXRzW29ic09mZnNldF07XG4gICAgICAgIH0gZWxzZSBpZiAobWlsaXRhcnlPZmZzZXQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBvbmx5IGFsbG93ZWQgbWlsaXRhcnkgdHogaXMgWlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBwYXJzZUludChudW1PZmZzZXQsIDEwKTtcbiAgICAgICAgICAgIHZhciBtID0gaG0gJSAxMDAsIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgdmFyIHBhcnNlZEFycmF5ID0gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhtYXRjaFs0XSwgbWF0Y2hbM10sIG1hdGNoWzJdLCBtYXRjaFs1XSwgbWF0Y2hbNl0sIG1hdGNoWzddKTtcbiAgICAgICAgICAgIGlmICghY2hlY2tXZWVrZGF5KG1hdGNoWzFdLCBwYXJzZWRBcnJheSwgY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uZmlnLl9hID0gcGFyc2VkQXJyYXk7XG4gICAgICAgICAgICBjb25maWcuX3R6bSA9IGNhbGN1bGF0ZU9mZnNldChtYXRjaFs4XSwgbWF0Y2hbOV0sIG1hdGNoWzEwXSk7XG5cbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGNyZWF0ZVVUQ0RhdGUuYXBwbHkobnVsbCwgY29uZmlnLl9hKTtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnJmYzI4MjIgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdCBvciBmYWxsYmFja1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaGVkID0gYXNwTmV0SnNvblJlZ2V4LmV4ZWMoY29uZmlnLl9pKTtcblxuICAgICAgICBpZiAobWF0Y2hlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK21hdGNoZWRbMV0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICd3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBSRkMyODIyL0lTTyBkYXRlIGZvcm1hdHMgYXJlICcgK1xuICAgICAgICAnZGlzY291cmFnZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyBtYWpvciByZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gJyArXG4gICAgICAgICdodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uJyxcbiAgICAgICAgZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoY29uZmlnLl9pICsgKGNvbmZpZy5fdXNlVVRDID8gJyBVVEMnIDogJycpKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgSVNPIHN0YW5kYXJkXG4gICAgaG9va3MuSVNPXzg2MDEgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBSRkMgMjgyMiBmb3JtXG4gICAgaG9va3MuUkZDXzI4MjIgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZykge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBjcmVhdGlvbiBmbG93IHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwc1xuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5JU09fODYwMSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLlJGQ18yODIyKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZy5fYSA9IFtdO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IHRydWU7XG5cbiAgICAgICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgY29uZmlnLl9pLFxuICAgICAgICAgICAgaSwgcGFyc2VkSW5wdXQsIHRva2VucywgdG9rZW4sIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDA7XG5cbiAgICAgICAgdG9rZW5zID0gZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgY29uZmlnLl9sb2NhbGUpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpIHx8IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHwgW10pWzBdO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rva2VuJywgdG9rZW4sICdwYXJzZWRJbnB1dCcsIHBhcnNlZElucHV0LFxuICAgICAgICAgICAgLy8gICAgICAgICAncmVnZXgnLCBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc2tpcHBlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmNoYXJzTGVmdE92ZXIgPSBzdHJpbmdMZW5ndGggLSB0b3RhbFBhcnNlZElucHV0TGVuZ3RoO1xuICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIF8xMmggZmxhZyBpZiBob3VyIGlzIDw9IDEyXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5wYXJzZWREYXRlUGFydHMgPSBjb25maWcuX2Euc2xpY2UoMCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLm1lcmlkaWVtID0gY29uZmlnLl9tZXJpZGllbTtcbiAgICAgICAgLy8gaGFuZGxlIG1lcmlkaWVtXG4gICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IG1lcmlkaWVtRml4V3JhcChjb25maWcuX2xvY2FsZSwgY29uZmlnLl9hW0hPVVJdLCBjb25maWcuX21lcmlkaWVtKTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgY2hlY2tPdmVyZmxvdyhjb25maWcpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwIChsb2NhbGUsIGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgIHZhciBpc1BtO1xuXG4gICAgICAgIGlmIChtZXJpZGllbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlLm1lcmlkaWVtSG91ciAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLm1lcmlkaWVtSG91cihob3VyLCBtZXJpZGllbSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxlLmlzUE0gIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgICAgIGlzUG0gPSBsb2NhbGUuaXNQTShtZXJpZGllbSk7XG4gICAgICAgICAgICBpZiAoaXNQbSAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1BtICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlblxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIHRlbXBDb25maWcsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWcuX2YubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gY29weUNvbmZpZyh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKHRlbXBDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFueSBpbnB1dCB0aGF0IHdhcyBub3QgcGFyc2VkIGFkZCBhIHBlbmFsdHkgZm9yIHRoYXQgZm9ybWF0XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLmNoYXJzTGVmdE92ZXI7XG5cbiAgICAgICAgICAgIC8vb3IgdG9rZW5zXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgKz0gZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnVudXNlZFRva2Vucy5sZW5ndGggKiAxMDtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKHRlbXBDb25maWcpLnNjb3JlID0gY3VycmVudFNjb3JlO1xuXG4gICAgICAgICAgICBpZiAoc2NvcmVUb0JlYXQgPT0gbnVsbCB8fCBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgIGJlc3RNb21lbnQgPSB0ZW1wQ29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSk7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChbaS55ZWFyLCBpLm1vbnRoLCBpLmRheSB8fCBpLmRhdGUsIGkuaG91ciwgaS5taW51dGUsIGkuc2Vjb25kLCBpLm1pbGxpc2Vjb25kXSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyAoY29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3cocHJlcGFyZUNvbmZpZyhjb25maWcpKSk7XG4gICAgICAgIGlmIChyZXMuX25leHREYXkpIHtcbiAgICAgICAgICAgIC8vIEFkZGluZyBpcyBzbWFydCBlbm91Z2ggYXJvdW5kIERTVFxuICAgICAgICAgICAgcmVzLmFkZCgxLCAnZCcpO1xuICAgICAgICAgICAgcmVzLl9uZXh0RGF5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVwYXJlQ29uZmlnIChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLl9mO1xuXG4gICAgICAgIGNvbmZpZy5fbG9jYWxlID0gY29uZmlnLl9sb2NhbGUgfHwgZ2V0TG9jYWxlKGNvbmZpZy5fbCk7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IChmb3JtYXQgPT09IHVuZGVmaW5lZCAmJiBpbnB1dCA9PT0gJycpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCh7bnVsbElucHV0OiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnLl9pID0gaW5wdXQgPSBjb25maWcuX2xvY2FsZS5wcmVwYXJzZShpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjaGVja092ZXJmbG93KGlucHV0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSAgZWxzZSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZChjb25maWcpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSW5wdXQoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZyhjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2EgPSBtYXAoaW5wdXQuc2xpY2UoMCksIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbU9iamVjdChjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgLy8gZnJvbSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbE9yVVRDIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgaXNVVEMpIHtcbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBpZiAobG9jYWxlID09PSB0cnVlIHx8IGxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoaXNPYmplY3QoaW5wdXQpICYmIGlzT2JqZWN0RW1wdHkoaW5wdXQpKSB8fFxuICAgICAgICAgICAgICAgIChpc0FycmF5KGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MjNcbiAgICAgICAgYy5faXNBTW9tZW50T2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgYy5fdXNlVVRDID0gYy5faXNVVEMgPSBpc1VUQztcbiAgICAgICAgYy5fbCA9IGxvY2FsZTtcbiAgICAgICAgYy5faSA9IGlucHV0O1xuICAgICAgICBjLl9mID0gZm9ybWF0O1xuICAgICAgICBjLl9zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21Db25maWcoYyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWwgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZU1pbiA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIHZhciBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyID4gdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBQaWNrIGEgbW9tZW50IG0gZnJvbSBtb21lbnRzIHNvIHRoYXQgbVtmbl0ob3RoZXIpIGlzIHRydWUgZm9yIGFsbFxuICAgIC8vIG90aGVyLiBUaGlzIHJlbGllcyBvbiB0aGUgZnVuY3Rpb24gZm4gdG8gYmUgdHJhbnNpdGl2ZS5cbiAgICAvL1xuICAgIC8vIG1vbWVudHMgc2hvdWxkIGVpdGhlciBiZSBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cyBvciBhbiBhcnJheSwgd2hvc2VcbiAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzLlxuICAgIGZ1bmN0aW9uIHBpY2tCeShmbiwgbW9tZW50cykge1xuICAgICAgICB2YXIgcmVzLCBpO1xuICAgICAgICBpZiAobW9tZW50cy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShtb21lbnRzWzBdKSkge1xuICAgICAgICAgICAgbW9tZW50cyA9IG1vbWVudHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gbW9tZW50c1swXTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG1vbWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50c1tpXS5pc1ZhbGlkKCkgfHwgbW9tZW50c1tpXVtmbl0ocmVzKSkge1xuICAgICAgICAgICAgICAgIHJlcyA9IG1vbWVudHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgW10uc29ydCBpbnN0ZWFkP1xuICAgIGZ1bmN0aW9uIG1pbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF4ICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xuICAgIH1cblxuICAgIHZhciBub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdyA/IERhdGUubm93KCkgOiArKG5ldyBEYXRlKCkpO1xuICAgIH07XG5cbiAgICB2YXIgb3JkZXJpbmcgPSBbJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCAnbWlsbGlzZWNvbmQnXTtcblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb25WYWxpZChtKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBtKSB7XG4gICAgICAgICAgICBpZiAoIShpbmRleE9mLmNhbGwob3JkZXJpbmcsIGtleSkgIT09IC0xICYmIChtW2tleV0gPT0gbnVsbCB8fCAhaXNOYU4obVtrZXldKSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVuaXRIYXNEZWNpbWFsID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtW29yZGVyaW5nW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9ubHkgYWxsb3cgbm9uLWludGVnZXJzIGZvciBzbWFsbGVzdCB1bml0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKE5hTik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24gKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBpc0R1cmF0aW9uVmFsaWQobm9ybWFsaXplZElucHV0KTtcblxuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZUFkZFJlbW92ZVxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSArbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDEwMDAgKiA2MCAqIDYwOyAvL3VzaW5nIDEwMDAgKiA2MCAqIDYwIGluc3RlYWQgb2YgMzZlNSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzI5NzhcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICtcbiAgICAgICAgICAgIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArXG4gICAgICAgICAgICBxdWFydGVycyAqIDMgK1xuICAgICAgICAgICAgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNSb3VuZCAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgtMSAqIG51bWJlcikgKiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBvZmZzZXQgKHRva2VuLCBzZXBhcmF0b3IpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICAgICAgdmFyIHNpZ24gPSAnKyc7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaWduICsgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArIHNlcGFyYXRvciArIHplcm9GaWxsKH5+KG9mZnNldCkgJSA2MCwgMik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCAgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUmVnZXhUb2tlbignWlonLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnWicsICdaWiddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjb25maWcuX3R6bSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gdGltZXpvbmUgY2h1bmtlclxuICAgIC8vICcrMTA6MDAnID4gWycxMCcsICAnMDAnXVxuICAgIC8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxuICAgIHZhciBjaHVua09mZnNldCA9IC8oW1xcK1xcLV18XFxkXFxkKS9naTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEZyb21TdHJpbmcobWF0Y2hlciwgc3RyaW5nKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlcik7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNodW5rICAgPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW107XG4gICAgICAgIHZhciBwYXJ0cyAgID0gKGNodW5rICsgJycpLm1hdGNoKGNodW5rT2Zmc2V0KSB8fCBbJy0nLCAwLCAwXTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBtaW51dGVzID09PSAwID9cbiAgICAgICAgICAwIDpcbiAgICAgICAgICBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vbWVudCBmcm9tIGlucHV0LCB0aGF0IGlzIGxvY2FsL3V0Yy96b25lIGVxdWl2YWxlbnQgdG8gbW9kZWwuXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgICAgICB2YXIgcmVzLCBkaWZmO1xuICAgICAgICBpZiAobW9kZWwuX2lzVVRDKSB7XG4gICAgICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICAgICAgZGlmZiA9IChpc01vbWVudChpbnB1dCkgfHwgaXNEYXRlKGlucHV0KSA/IGlucHV0LnZhbHVlT2YoKSA6IGNyZWF0ZUxvY2FsKGlucHV0KS52YWx1ZU9mKCkpIC0gcmVzLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIC8vIFVzZSBsb3ctbGV2ZWwgYXBpLCBiZWNhdXNlIHRoaXMgZm4gaXMgbG93LWxldmVsIGFwaS5cbiAgICAgICAgICAgIHJlcy5fZC5zZXRUaW1lKHJlcy5fZC52YWx1ZU9mKCkgKyBkaWZmKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChyZXMsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQpLmxvY2FsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRlT2Zmc2V0IChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpIC8gMTUpICogMTU7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICBob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIC8vIGtlZXBMb2NhbFRpbWUgPSB0cnVlIG1lYW5zIG9ubHkgY2hhbmdlIHRoZSB0aW1lem9uZSwgd2l0aG91dFxuICAgIC8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4gICAgLy8gNTozMToyNiArMDIwMCBJdCBpcyBwb3NzaWJsZSB0aGF0IDU6MzE6MjYgZG9lc24ndCBleGlzdCB3aXRoIG9mZnNldFxuICAgIC8vICswMjAwLCBzbyB3ZSBhZGp1c3QgdGhlIHRpbWUgYXMgbmVlZGVkLCB0byBiZSB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEtlZXBpbmcgdGhlIHRpbWUgYWN0dWFsbHkgYWRkcy9zdWJ0cmFjdHMgKG9uZSBob3VyKVxuICAgIC8vIGZyb20gdGhlIGFjdHVhbCByZXByZXNlbnRlZCB0aW1lLiBUaGF0IGlzIHdoeSB3ZSBjYWxsIHVwZGF0ZU9mZnNldFxuICAgIC8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbiAgICAvLyBfY2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlIGNhc2UsIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QsIGJlY2F1c2VcbiAgICAvLyB0aGVyZSBpcyBubyBzdWNoIHRpbWUgaW4gdGhlIGdpdmVuIHRpbWV6b25lLlxuICAgIGZ1bmN0aW9uIGdldFNldE9mZnNldCAoaW5wdXQsIGtlZXBMb2NhbFRpbWUsIGtlZXBNaW51dGVzKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgIGxvY2FsQWRqdXN0O1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNiAmJiAha2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVVRDICYmIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICBsb2NhbEFkanVzdCA9IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBpbnB1dDtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb2NhbEFkanVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQobG9jYWxBZGp1c3QsICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlmICgha2VlcExvY2FsVGltZSB8fCB0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGNyZWF0ZUR1cmF0aW9uKGlucHV0IC0gb2Zmc2V0LCAnbScpLCAxLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IG9mZnNldCA6IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRab25lIChpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvVVRDIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb0xvY2FsIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VidHJhY3QoZ2V0RGF0ZU9mZnNldCh0aGlzKSwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdFpvbmUgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoT2Zmc2V0LCB0aGlzLl9pKTtcbiAgICAgICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodFpvbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IGlucHV0ID8gY3JlYXRlTG9jYWwoaW5wdXQpLnV0Y09mZnNldCgpIDogMDtcblxuICAgICAgICByZXR1cm4gKHRoaXMudXRjT2Zmc2V0KCkgLSBpbnB1dCkgJSA2MCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZSAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkICgpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9pc0RTVFNoaWZ0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgICAgICBjID0gcHJlcGFyZUNvbmZpZyhjKTtcblxuICAgICAgICBpZiAoYy5fYSkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgY29tcGFyZUFycmF5cyhjLl9hLCBvdGhlci50b0FycmF5KCkpID4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGNPZmZzZXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgdmFyIGFzcE5ldFJlZ2V4ID0gL14oXFwtfFxcKyk/KD86KFxcZCopWy4gXSk/KFxcZCspXFw6KFxcZCspKD86XFw6KFxcZCspKFxcLlxcZCopPyk/JC87XG5cbiAgICAvLyBmcm9tIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX2RhdGVfZGF0ZS5qcy5zb3VyY2UuaHRtbFxuICAgIC8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbiAgICAvLyBhbmQgZnVydGhlciBtb2RpZmllZCB0byBhbGxvdyBmb3Igc3RyaW5ncyBjb250YWluaW5nIGJvdGggd2VlayBhbmQgZGF5XG4gICAgdmFyIGlzb1JlZ2V4ID0gL14oLXxcXCspP1AoPzooWy0rXT9bMC05LC5dKilZKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilXKT8oPzooWy0rXT9bMC05LC5dKilEKT8oPzpUKD86KFstK10/WzAtOSwuXSopSCk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopUyk/KT8kLztcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUR1cmF0aW9uIChpbnB1dCwga2V5KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGlucHV0LFxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgICAgIG1hdGNoID0gbnVsbCxcbiAgICAgICAgICAgIHNpZ24sXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBkaWZmUmVzO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbXMgOiBpbnB1dC5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgICAgIGQgIDogaW5wdXQuX2RheXMsXG4gICAgICAgICAgICAgICAgTSAgOiBpbnB1dC5fbW9udGhzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbltrZXldID0gaW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSAnLScpID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeSAgOiAwLFxuICAgICAgICAgICAgICAgIGQgIDogdG9JbnQobWF0Y2hbREFURV0pICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBoICA6IHRvSW50KG1hdGNoW0hPVVJdKSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbSAgOiB0b0ludChtYXRjaFtNSU5VVEVdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIHMgIDogdG9JbnQobWF0Y2hbU0VDT05EXSkgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBtcyA6IHRvSW50KGFic1JvdW5kKG1hdGNoW01JTExJU0VDT05EXSAqIDEwMDApKSAqIHNpZ24gLy8gdGhlIG1pbGxpc2Vjb25kIGRlY2ltYWwgcG9pbnQgaXMgaW5jbHVkZWQgaW4gdGhlIG1hdGNoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gaXNvUmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gKG1hdGNoWzFdID09PSAnLScpID8gLTEgOiAobWF0Y2hbMV0gPT09ICcrJykgPyAxIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHkgOiBwYXJzZUlzbyhtYXRjaFsyXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgTSA6IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgICAgICB3IDogcGFyc2VJc28obWF0Y2hbNF0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGQgOiBwYXJzZUlzbyhtYXRjaFs1XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgaCA6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBtIDogcGFyc2VJc28obWF0Y2hbN10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHMgOiBwYXJzZUlzbyhtYXRjaFs4XSwgc2lnbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZHVyYXRpb24gPT0gbnVsbCkgey8vIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJiAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pKSB7XG4gICAgICAgICAgICBkaWZmUmVzID0gbW9tZW50c0RpZmZlcmVuY2UoY3JlYXRlTG9jYWwoZHVyYXRpb24uZnJvbSksIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLnRvKSk7XG5cbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgZHVyYXRpb24uTSA9IGRpZmZSZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19sb2NhbGUnKSkge1xuICAgICAgICAgICAgcmV0Ll9sb2NhbGUgPSBpbnB1dC5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcbiAgICBjcmVhdGVEdXJhdGlvbi5pbnZhbGlkID0gY3JlYXRlSW52YWxpZCQxO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VJc28gKGlucCwgc2lnbikge1xuICAgICAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgICAgICAvLyBjb252ZXJ0cyBmbG9hdHMgdG8gaW50cy5cbiAgICAgICAgLy8gaW5wIG1heSBiZSB1bmRlZmluZWQsIHNvIGNhcmVmdWwgY2FsbGluZyByZXBsYWNlIG9uIGl0LlxuICAgICAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAgICAgLy8gYXBwbHkgc2lnbiB3aGlsZSB3ZSdyZSBhdCBpdFxuICAgICAgICByZXR1cm4gKGlzTmFOKHJlcykgPyAwIDogcmVzKSAqIHNpZ247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzID0ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcblxuICAgICAgICByZXMubW9udGhzID0gb3RoZXIubW9udGgoKSAtIGJhc2UubW9udGgoKSArXG4gICAgICAgICAgICAob3RoZXIueWVhcigpIC0gYmFzZS55ZWFyKCkpICogMTI7XG4gICAgICAgIGlmIChiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykuaXNBZnRlcihvdGhlcikpIHtcbiAgICAgICAgICAgIC0tcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSArb3RoZXIgLSArKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzO1xuICAgICAgICBpZiAoIShiYXNlLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge21pbGxpc2Vjb25kczogMCwgbW9udGhzOiAwfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyID0gY2xvbmVXaXRoT2Zmc2V0KG90aGVyLCBiYXNlKTtcbiAgICAgICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmVzLm1vbnRocyA9IC1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG4gICAgZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICAgICAgaWYgKHBlcmlvZCAhPT0gbnVsbCAmJiAhaXNOYU4oK3BlcmlvZCkpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUobmFtZSwgJ21vbWVudCgpLicgKyBuYW1lICArICcocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuJyArIG5hbWUgKyAnKG51bWJlciwgcGVyaW9kKS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4nKTtcbiAgICAgICAgICAgICAgICB0bXAgPSB2YWw7IHZhbCA9IHBlcmlvZDsgcGVyaW9kID0gdG1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/ICt2YWwgOiB2YWw7XG4gICAgICAgICAgICBkdXIgPSBjcmVhdGVEdXJhdGlvbih2YWwsIHBlcmlvZCk7XG4gICAgICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBkdXIsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCAobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIHVwZGF0ZU9mZnNldCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSBhYnNSb3VuZChkdXJhdGlvbi5fZGF5cyksXG4gICAgICAgICAgICBtb250aHMgPSBhYnNSb3VuZChkdXJhdGlvbi5fbW9udGhzKTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG1vbnRocykge1xuICAgICAgICAgICAgc2V0TW9udGgobW9tLCBnZXQobW9tLCAnTW9udGgnKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgc2V0JDEobW9tLCAnRGF0ZScsIGdldChtb20sICdEYXRlJykgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIG1vbS5fZC5zZXRUaW1lKG1vbS5fZC52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KG1vbSwgZGF5cyB8fCBtb250aHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFkZCAgICAgID0gY3JlYXRlQWRkZXIoMSwgJ2FkZCcpO1xuICAgIHZhciBzdWJ0cmFjdCA9IGNyZWF0ZUFkZGVyKC0xLCAnc3VidHJhY3QnKTtcblxuICAgIGZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICAgICAgdmFyIGRpZmYgPSBteU1vbWVudC5kaWZmKG5vdywgJ2RheXMnLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGRpZmYgPCAtNiA/ICdzYW1lRWxzZScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAtMSA/ICdsYXN0V2VlaycgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAwID8gJ2xhc3REYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMSA/ICdzYW1lRGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDIgPyAnbmV4dERheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCA3ID8gJ25leHRXZWVrJyA6ICdzYW1lRWxzZSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIkMSAodGltZSwgZm9ybWF0cykge1xuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgICAgIHNvZCA9IGNsb25lV2l0aE9mZnNldChub3csIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnO1xuXG4gICAgICAgIHZhciBvdXRwdXQgPSBmb3JtYXRzICYmIChpc0Z1bmN0aW9uKGZvcm1hdHNbZm9ybWF0XSkgPyBmb3JtYXRzW2Zvcm1hdF0uY2FsbCh0aGlzLCBub3cpIDogZm9ybWF0c1tmb3JtYXRdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQob3V0cHV0IHx8IHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKGZvcm1hdCwgdGhpcywgY3JlYXRlTG9jYWwobm93KSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHMoIWlzVW5kZWZpbmVkKHVuaXRzKSA/IHVuaXRzIDogJ21pbGxpc2Vjb25kJyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID4gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JldHdlZW4gKGZyb20sIHRvLCB1bml0cywgaW5jbHVzaXZpdHkpIHtcbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKGluY2x1c2l2aXR5WzBdID09PSAnKCcgPyB0aGlzLmlzQWZ0ZXIoZnJvbSwgdW5pdHMpIDogIXRoaXMuaXNCZWZvcmUoZnJvbSwgdW5pdHMpKSAmJlxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzFdID09PSAnKScgPyB0aGlzLmlzQmVmb3JlKHRvLCB1bml0cykgOiAhdGhpcy5pc0FmdGVyKHRvLCB1bml0cykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCksXG4gICAgICAgICAgICBpbnB1dE1zO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzIHx8ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dE1zID0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckFmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZmYgKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCxcbiAgICAgICAgICAgIHpvbmVEZWx0YSxcbiAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhhdCA9IGNsb25lV2l0aE9mZnNldChpbnB1dCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKCF0aGF0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvbmVEZWx0YSA9ICh0aGF0LnV0Y09mZnNldCgpIC0gdGhpcy51dGNPZmZzZXQoKSkgKiA2ZTQ7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDEyOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAzOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAxZTM7IGJyZWFrOyAvLyAxMDAwXG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gNmU0OyBicmVhazsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBjYXNlICdob3VyJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDM2ZTU7IGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnZGF5Jzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDg2NGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCwgbmVnYXRlIGRzdFxuICAgICAgICAgICAgY2FzZSAnd2Vlayc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA2MDQ4ZTU7IGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVmYXVsdDogb3V0cHV0ID0gdGhpcyAtIHRoYXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhEaWZmIChhLCBiKSB7XG4gICAgICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgICAgIHZhciB3aG9sZU1vbnRoRGlmZiA9ICgoYi55ZWFyKCkgLSBhLnllYXIoKSkgKiAxMikgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLCBhZGp1c3Q7XG5cbiAgICAgICAgaWYgKGIgLSBhbmNob3IgPCAwKSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiAtIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yIC0gYW5jaG9yMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiArIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yMiAtIGFuY2hvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGZvciBuZWdhdGl2ZSB6ZXJvLCByZXR1cm4gemVybyBpZiBuZWdhdGl2ZSB6ZXJvXG4gICAgICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KSB8fCAwO1xuICAgIH1cblxuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXQgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXRVdGMgPSAnWVlZWS1NTS1ERFRISDptbTpzc1taXSc7XG5cbiAgICBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyhrZWVwT2Zmc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1dGMgPSBrZWVwT2Zmc2V0ICE9PSB0cnVlO1xuICAgICAgICB2YXIgbSA9IHV0YyA/IHRoaXMuY2xvbmUoKS51dGMoKSA6IHRoaXM7XG4gICAgICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgICAgICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB+NTB4IGZhc3RlciwgdXNlIGl0IHdoZW4gd2UgY2FuXG4gICAgICAgICAgICBpZiAodXRjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpICsgdGhpcy51dGNPZmZzZXQoKSAqIDYwICogMTAwMCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKCdaJywgZm9ybWF0TW9tZW50KG0sICdaJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQobSwgdXRjID8gJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBtb21lbnQgdGhhdCBjYW5cbiAgICAgKiBhbHNvIGJlIGV2YWx1YXRlZCB0byBnZXQgYSBuZXcgbW9tZW50IHdoaWNoIGlzIHRoZSBzYW1lXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL25vZGVqcy5vcmcvZGlzdC9sYXRlc3QvZG9jcy9hcGkvdXRpbC5odG1sI3V0aWxfY3VzdG9tX2luc3BlY3RfZnVuY3Rpb25fb25fb2JqZWN0c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jID0gJ21vbWVudCc7XG4gICAgICAgIHZhciB6b25lID0gJyc7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2FsKCkpIHtcbiAgICAgICAgICAgIGZ1bmMgPSB0aGlzLnV0Y09mZnNldCgpID09PSAwID8gJ21vbWVudC51dGMnIDogJ21vbWVudC5wYXJzZVpvbmUnO1xuICAgICAgICAgICAgem9uZSA9ICdaJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJlZml4ID0gJ1snICsgZnVuYyArICcoXCJdJztcbiAgICAgICAgdmFyIHllYXIgPSAoMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5KSA/ICdZWVlZJyA6ICdZWVlZWVknO1xuICAgICAgICB2YXIgZGF0ZXRpbWUgPSAnLU1NLUREW1RdSEg6bW06c3MuU1NTJztcbiAgICAgICAgdmFyIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdCAoaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSB0aGlzLmlzVXRjKCkgPyBob29rcy5kZWZhdWx0Rm9ybWF0VXRjIDogaG9va3MuZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7dG86IHRoaXMsIGZyb206IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG8gKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHxcbiAgICAgICAgICAgICAgICAgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHtmcm9tOiB0aGlzLCB0bzogdGltZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIC8vIElmIHBhc3NlZCBhIGxvY2FsZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsb2NhbGUgZm9yIHRoaXNcbiAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxvY2FsZSBjb25maWd1cmF0aW9uXG4gICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGxvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBuZXdMb2NhbGVEYXRhO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGFydE9mICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggaW50ZW50aW9uYWxseSBvbWl0cyBicmVhayBrZXl3b3Jkc1xuICAgICAgICAvLyB0byB1dGlsaXplIGZhbGxpbmcgdGhyb3VnaCB0aGUgY2FzZXMuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRoaXMubW9udGgoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlKDEpO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygwKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlY29uZHMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlZWtzIGFyZSBhIHNwZWNpYWwgY2FzZVxuICAgICAgICBpZiAodW5pdHMgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgdGhpcy53ZWVrZGF5KDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ2lzb1dlZWsnKSB7XG4gICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWFydGVycyBhcmUgYWxzbyBzcGVjaWFsXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ3F1YXJ0ZXInKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRoKE1hdGguZmxvb3IodGhpcy5tb250aCgpIC8gMykgKiAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mICh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJ2RhdGUnIGlzIGFuIGFsaWFzIGZvciAnZGF5Jywgc28gaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgc3VjaC5cbiAgICAgICAgaWYgKHVuaXRzID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHVuaXRzID0gJ2RheSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXRzKS5hZGQoMSwgKHVuaXRzID09PSAnaXNvV2VlaycgPyAnd2VlaycgOiB1bml0cykpLnN1YnRyYWN0KDEsICdtcycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlT2YgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZC52YWx1ZU9mKCkgLSAoKHRoaXMuX29mZnNldCB8fCAwKSAqIDYwMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bml4ICgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy52YWx1ZU9mKCkgLyAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0RhdGUgKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvQXJyYXkgKCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbbS55ZWFyKCksIG0ubW9udGgoKSwgbS5kYXRlKCksIG0uaG91cigpLCBtLm1pbnV0ZSgpLCBtLnNlY29uZCgpLCBtLm1pbGxpc2Vjb25kKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvT2JqZWN0ICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMiAoKSB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNpbmdGbGFncyAoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIGdldFBhcnNpbmdGbGFncyh0aGlzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52YWxpZEF0ICgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNpbmdGbGFncyh0aGlzKS5vdmVyZmxvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3RcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ2dnJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnR0cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1llYXJGb3JtYXRUb2tlbiAodG9rZW4sIGdldHRlcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbigwLCBbdG9rZW4sIHRva2VuLmxlbmd0aF0sIDAsIGdldHRlcik7XG4gICAgfVxuXG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZycsICAgICAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnZycsICAgICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0cnLCAgJ2lzb1dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHR0cnLCAnaXNvV2Vla1llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2Vla1llYXInLCAnZ2cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtZZWFyJywgJ0dHJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrWWVhcicsIDEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla1llYXInLCAxKTtcblxuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRycsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2cnLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0cnLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2dnJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2dnZycsICdnZ2dnZycsICdHR0dHJywgJ0dHR0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMud2VlaygpLFxuICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheSgpLFxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLmlzb1dlZWsoKSwgdGhpcy5pc29XZWVrZGF5KCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldElTT1dlZWtzSW5ZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luWWVhciAoKSB7XG4gICAgICAgIHZhciB3ZWVrSW5mbyA9IHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrO1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhckhlbHBlcihpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIodGhpcywgZG93LCBkb3kpLnllYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgICAgICBpZiAod2VlayA+IHdlZWtzVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNldFdlZWtBbGwuY2FsbCh0aGlzLCBpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0V2Vla0FsbCh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgICAgIHRoaXMueWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdRJywgMCwgJ1FvJywgJ3F1YXJ0ZXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygncXVhcnRlcicsICdRJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdxdWFydGVyJywgNyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdRJywgbWF0Y2gxKTtcbiAgICBhZGRQYXJzZVRva2VuKCdRJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0UXVhcnRlciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBNYXRoLmNlaWwoKHRoaXMubW9udGgoKSArIDEpIC8gMykgOiB0aGlzLm1vbnRoKChpbnB1dCAtIDEpICogMyArIHRoaXMubW9udGgoKSAlIDMpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEJywgWydERCcsIDJdLCAnRG8nLCAnZGF0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXRlJywgJ0QnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXRlJywgOSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignREQnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignRG8nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/XG4gICAgICAgICAgKGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZSB8fCBsb2NhbGUuX29yZGluYWxQYXJzZSkgOlxuICAgICAgICAgIGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQ7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnRCcsICdERCddLCBEQVRFKTtcbiAgICBhZGRQYXJzZVRva2VuKCdEbycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbREFURV0gPSB0b0ludChpbnB1dC5tYXRjaChtYXRjaDF0bzIpWzBdKTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXREYXlPZk1vbnRoID0gbWFrZUdldFNldCgnRGF0ZScsIHRydWUpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0RERCcsIFsnRERERCcsIDNdLCAnREREbycsICdkYXlPZlllYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF5T2ZZZWFyJywgJ0RERCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheU9mWWVhcicsIDQpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgIG1hdGNoMXRvMyk7XG4gICAgYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mWWVhciAoaW5wdXQpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhciA9IE1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTUpICsgMTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZCgoaW5wdXQgLSBkYXlPZlllYXIpLCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdtJywgWydtbScsIDJdLCAwLCAnbWludXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbnV0ZScsICdtJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaW51dGUnLCAxNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdtJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignbW0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ20nLCAnbW0nXSwgTUlOVVRFKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaW51dGUgPSBtYWtlR2V0U2V0KCdNaW51dGVzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3MnLCBbJ3NzJywgMl0sIDAsICdzZWNvbmQnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnc2Vjb25kJywgJ3MnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3NlY29uZCcsIDE1KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3MnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTJywgM10sIDAsICdtaWxsaXNlY29uZCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xuICAgIH0pO1xuXG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21pbGxpc2Vjb25kJywgJ21zJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdtaWxsaXNlY29uZCcsIDE2KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1MnLCAgICBtYXRjaDF0bzMsIG1hdGNoMSk7XG4gICAgYWRkUmVnZXhUb2tlbignU1MnLCAgIG1hdGNoMXRvMywgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdTU1MnLCAgbWF0Y2gxdG8zLCBtYXRjaDMpO1xuXG4gICAgdmFyIHRva2VuO1xuICAgIGZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUmVnZXhUb2tlbih0b2tlbiwgbWF0Y2hVbnNpZ25lZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTUlMTElTRUNPTkRdID0gdG9JbnQoKCcwLicgKyBpbnB1dCkgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFBhcnNlVG9rZW4odG9rZW4sIHBhcnNlTXMpO1xuICAgIH1cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWlsbGlzZWNvbmQgPSBtYWtlR2V0U2V0KCdNaWxsaXNlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigneicsICAwLCAwLCAnem9uZUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignenonLCAwLCAwLCAnem9uZU5hbWUnKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFpvbmVBYmJyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRab25lTmFtZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZScgOiAnJztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8gPSBNb21lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8uYWRkICAgICAgICAgICAgICAgPSBhZGQ7XG4gICAgcHJvdG8uY2FsZW5kYXIgICAgICAgICAgPSBjYWxlbmRhciQxO1xuICAgIHByb3RvLmNsb25lICAgICAgICAgICAgID0gY2xvbmU7XG4gICAgcHJvdG8uZGlmZiAgICAgICAgICAgICAgPSBkaWZmO1xuICAgIHByb3RvLmVuZE9mICAgICAgICAgICAgID0gZW5kT2Y7XG4gICAgcHJvdG8uZm9ybWF0ICAgICAgICAgICAgPSBmb3JtYXQ7XG4gICAgcHJvdG8uZnJvbSAgICAgICAgICAgICAgPSBmcm9tO1xuICAgIHByb3RvLmZyb21Ob3cgICAgICAgICAgID0gZnJvbU5vdztcbiAgICBwcm90by50byAgICAgICAgICAgICAgICA9IHRvO1xuICAgIHByb3RvLnRvTm93ICAgICAgICAgICAgID0gdG9Ob3c7XG4gICAgcHJvdG8uZ2V0ICAgICAgICAgICAgICAgPSBzdHJpbmdHZXQ7XG4gICAgcHJvdG8uaW52YWxpZEF0ICAgICAgICAgPSBpbnZhbGlkQXQ7XG4gICAgcHJvdG8uaXNBZnRlciAgICAgICAgICAgPSBpc0FmdGVyO1xuICAgIHByb3RvLmlzQmVmb3JlICAgICAgICAgID0gaXNCZWZvcmU7XG4gICAgcHJvdG8uaXNCZXR3ZWVuICAgICAgICAgPSBpc0JldHdlZW47XG4gICAgcHJvdG8uaXNTYW1lICAgICAgICAgICAgPSBpc1NhbWU7XG4gICAgcHJvdG8uaXNTYW1lT3JBZnRlciAgICAgPSBpc1NhbWVPckFmdGVyO1xuICAgIHByb3RvLmlzU2FtZU9yQmVmb3JlICAgID0gaXNTYW1lT3JCZWZvcmU7XG4gICAgcHJvdG8uaXNWYWxpZCAgICAgICAgICAgPSBpc1ZhbGlkJDI7XG4gICAgcHJvdG8ubGFuZyAgICAgICAgICAgICAgPSBsYW5nO1xuICAgIHByb3RvLmxvY2FsZSAgICAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvLmxvY2FsZURhdGEgICAgICAgID0gbG9jYWxlRGF0YTtcbiAgICBwcm90by5tYXggICAgICAgICAgICAgICA9IHByb3RvdHlwZU1heDtcbiAgICBwcm90by5taW4gICAgICAgICAgICAgICA9IHByb3RvdHlwZU1pbjtcbiAgICBwcm90by5wYXJzaW5nRmxhZ3MgICAgICA9IHBhcnNpbmdGbGFncztcbiAgICBwcm90by5zZXQgICAgICAgICAgICAgICA9IHN0cmluZ1NldDtcbiAgICBwcm90by5zdGFydE9mICAgICAgICAgICA9IHN0YXJ0T2Y7XG4gICAgcHJvdG8uc3VidHJhY3QgICAgICAgICAgPSBzdWJ0cmFjdDtcbiAgICBwcm90by50b0FycmF5ICAgICAgICAgICA9IHRvQXJyYXk7XG4gICAgcHJvdG8udG9PYmplY3QgICAgICAgICAgPSB0b09iamVjdDtcbiAgICBwcm90by50b0RhdGUgICAgICAgICAgICA9IHRvRGF0ZTtcbiAgICBwcm90by50b0lTT1N0cmluZyAgICAgICA9IHRvSVNPU3RyaW5nO1xuICAgIHByb3RvLmluc3BlY3QgICAgICAgICAgID0gaW5zcGVjdDtcbiAgICBwcm90by50b0pTT04gICAgICAgICAgICA9IHRvSlNPTjtcbiAgICBwcm90by50b1N0cmluZyAgICAgICAgICA9IHRvU3RyaW5nO1xuICAgIHByb3RvLnVuaXggICAgICAgICAgICAgID0gdW5peDtcbiAgICBwcm90by52YWx1ZU9mICAgICAgICAgICA9IHZhbHVlT2Y7XG4gICAgcHJvdG8uY3JlYXRpb25EYXRhICAgICAgPSBjcmVhdGlvbkRhdGE7XG4gICAgcHJvdG8ueWVhciAgICAgICA9IGdldFNldFllYXI7XG4gICAgcHJvdG8uaXNMZWFwWWVhciA9IGdldElzTGVhcFllYXI7XG4gICAgcHJvdG8ud2Vla1llYXIgICAgPSBnZXRTZXRXZWVrWWVhcjtcbiAgICBwcm90by5pc29XZWVrWWVhciA9IGdldFNldElTT1dlZWtZZWFyO1xuICAgIHByb3RvLnF1YXJ0ZXIgPSBwcm90by5xdWFydGVycyA9IGdldFNldFF1YXJ0ZXI7XG4gICAgcHJvdG8ubW9udGggICAgICAgPSBnZXRTZXRNb250aDtcbiAgICBwcm90by5kYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoO1xuICAgIHByb3RvLndlZWsgICAgICAgICAgID0gcHJvdG8ud2Vla3MgICAgICAgID0gZ2V0U2V0V2VlaztcbiAgICBwcm90by5pc29XZWVrICAgICAgICA9IHByb3RvLmlzb1dlZWtzICAgICA9IGdldFNldElTT1dlZWs7XG4gICAgcHJvdG8ud2Vla3NJblllYXIgICAgPSBnZXRXZWVrc0luWWVhcjtcbiAgICBwcm90by5pc29XZWVrc0luWWVhciA9IGdldElTT1dlZWtzSW5ZZWFyO1xuICAgIHByb3RvLmRhdGUgICAgICAgPSBnZXRTZXREYXlPZk1vbnRoO1xuICAgIHByb3RvLmRheSAgICAgICAgPSBwcm90by5kYXlzICAgICAgICAgICAgID0gZ2V0U2V0RGF5T2ZXZWVrO1xuICAgIHByb3RvLndlZWtkYXkgICAgPSBnZXRTZXRMb2NhbGVEYXlPZldlZWs7XG4gICAgcHJvdG8uaXNvV2Vla2RheSA9IGdldFNldElTT0RheU9mV2VlaztcbiAgICBwcm90by5kYXlPZlllYXIgID0gZ2V0U2V0RGF5T2ZZZWFyO1xuICAgIHByb3RvLmhvdXIgPSBwcm90by5ob3VycyA9IGdldFNldEhvdXI7XG4gICAgcHJvdG8ubWludXRlID0gcHJvdG8ubWludXRlcyA9IGdldFNldE1pbnV0ZTtcbiAgICBwcm90by5zZWNvbmQgPSBwcm90by5zZWNvbmRzID0gZ2V0U2V0U2Vjb25kO1xuICAgIHByb3RvLm1pbGxpc2Vjb25kID0gcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgcHJvdG8udXRjT2Zmc2V0ICAgICAgICAgICAgPSBnZXRTZXRPZmZzZXQ7XG4gICAgcHJvdG8udXRjICAgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1VUQztcbiAgICBwcm90by5sb2NhbCAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvTG9jYWw7XG4gICAgcHJvdG8ucGFyc2Vab25lICAgICAgICAgICAgPSBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldDtcbiAgICBwcm90by5oYXNBbGlnbmVkSG91ck9mZnNldCA9IGhhc0FsaWduZWRIb3VyT2Zmc2V0O1xuICAgIHByb3RvLmlzRFNUICAgICAgICAgICAgICAgID0gaXNEYXlsaWdodFNhdmluZ1RpbWU7XG4gICAgcHJvdG8uaXNMb2NhbCAgICAgICAgICAgICAgPSBpc0xvY2FsO1xuICAgIHByb3RvLmlzVXRjT2Zmc2V0ICAgICAgICAgID0gaXNVdGNPZmZzZXQ7XG4gICAgcHJvdG8uaXNVdGMgICAgICAgICAgICAgICAgPSBpc1V0YztcbiAgICBwcm90by5pc1VUQyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuICAgIHByb3RvLnpvbmVBYmJyID0gZ2V0Wm9uZUFiYnI7XG4gICAgcHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcbiAgICBwcm90by5kYXRlcyAgPSBkZXByZWNhdGUoJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJywgZ2V0U2V0RGF5T2ZNb250aCk7XG4gICAgcHJvdG8ubW9udGhzID0gZGVwcmVjYXRlKCdtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQnLCBnZXRTZXRNb250aCk7XG4gICAgcHJvdG8ueWVhcnMgID0gZGVwcmVjYXRlKCd5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkJywgZ2V0U2V0WWVhcik7XG4gICAgcHJvdG8uem9uZSAgID0gZGVwcmVjYXRlKCdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsIGdldFNldFpvbmUpO1xuICAgIHByb3RvLmlzRFNUU2hpZnRlZCA9IGRlcHJlY2F0ZSgnaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVbml4IChpbnB1dCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJblpvbmUgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYXJzZVpvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVQYXJzZVBvc3RGb3JtYXQgKHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHZhciBwcm90byQxID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDEuY2FsZW5kYXIgICAgICAgID0gY2FsZW5kYXI7XG4gICAgcHJvdG8kMS5sb25nRGF0ZUZvcm1hdCAgPSBsb25nRGF0ZUZvcm1hdDtcbiAgICBwcm90byQxLmludmFsaWREYXRlICAgICA9IGludmFsaWREYXRlO1xuICAgIHByb3RvJDEub3JkaW5hbCAgICAgICAgID0gb3JkaW5hbDtcbiAgICBwcm90byQxLnByZXBhcnNlICAgICAgICA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnBvc3Rmb3JtYXQgICAgICA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnJlbGF0aXZlVGltZSAgICA9IHJlbGF0aXZlVGltZTtcbiAgICBwcm90byQxLnBhc3RGdXR1cmUgICAgICA9IHBhc3RGdXR1cmU7XG4gICAgcHJvdG8kMS5zZXQgICAgICAgICAgICAgPSBzZXQ7XG5cbiAgICBwcm90byQxLm1vbnRocyAgICAgICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRocztcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0ICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1Nob3J0O1xuICAgIHByb3RvJDEubW9udGhzUGFyc2UgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzUGFyc2U7XG4gICAgcHJvdG8kMS5tb250aHNSZWdleCAgICAgICA9IG1vbnRoc1JlZ2V4O1xuICAgIHByb3RvJDEubW9udGhzU2hvcnRSZWdleCAgPSBtb250aHNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2VlayA9IGxvY2FsZVdlZWs7XG4gICAgcHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZldlZWsgPSBsb2NhbGVGaXJzdERheU9mV2VlaztcblxuICAgIHByb3RvJDEud2Vla2RheXMgICAgICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXM7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pbiAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c01pbjtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnQgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzU2hvcnQ7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1BhcnNlICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1BhcnNlO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5c1JlZ2V4ICAgICAgID0gICAgICAgIHdlZWtkYXlzUmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0UmVnZXggID0gICAgICAgIHdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzTWluUmVnZXggICAgPSAgICAgICAgd2Vla2RheXNNaW5SZWdleDtcblxuICAgIHByb3RvJDEuaXNQTSA9IGxvY2FsZUlzUE07XG4gICAgcHJvdG8kMS5tZXJpZGllbSA9IGxvY2FsZU1lcmlkaWVtO1xuXG4gICAgZnVuY3Rpb24gZ2V0JDEgKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpO1xuICAgICAgICB2YXIgdXRjID0gY3JlYXRlVVRDKCkuc2V0KHNldHRlciwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbG9jYWxlW2ZpZWxkXSh1dGMsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc0ltcGwgKGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIGksIGZpZWxkLCAnbW9udGgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIC8vICgpXG4gICAgLy8gKDUpXG4gICAgLy8gKGZtdCwgNSlcbiAgICAvLyAoZm10KVxuICAgIC8vICh0cnVlKVxuICAgIC8vICh0cnVlLCA1KVxuICAgIC8vICh0cnVlLCBmbXQsIDUpXG4gICAgLy8gKHRydWUsIGZtdClcbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNJbXBsIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlU29ydGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBsb2NhbGVTb3J0ZWQ7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGxvY2FsZVNvcnRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgc2hpZnQgPSBsb2NhbGVTb3J0ZWQgPyBsb2NhbGUuX3dlZWsuZG93IDogMDtcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgKGluZGV4ICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgKGkgKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRocyAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRocycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNTaG9ydCAoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRoc1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNTaG9ydCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNNaW4gKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c01pbicpO1xuICAgIH1cblxuICAgIGdldFNldEdsb2JhbExvY2FsZSgnZW4nLCB7XG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSh0aHxzdHxuZHxyZCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodG9JbnQobnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgaG9va3MubGFuZyA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4nLCBnZXRTZXRHbG9iYWxMb2NhbGUpO1xuICAgIGhvb2tzLmxhbmdEYXRhID0gZGVwcmVjYXRlKCdtb21lbnQubGFuZ0RhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGVEYXRhIGluc3RlYWQuJywgZ2V0TG9jYWxlKTtcblxuICAgIHZhciBtYXRoQWJzID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBhYnMgKCkge1xuICAgICAgICB2YXIgZGF0YSAgICAgICAgICAgPSB0aGlzLl9kYXRhO1xuXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9IG1hdGhBYnModGhpcy5fbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgdGhpcy5fZGF5cyAgICAgICAgID0gbWF0aEFicyh0aGlzLl9kYXlzKTtcbiAgICAgICAgdGhpcy5fbW9udGhzICAgICAgID0gbWF0aEFicyh0aGlzLl9tb250aHMpO1xuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzICA9IG1hdGhBYnMoZGF0YS5taWxsaXNlY29uZHMpO1xuICAgICAgICBkYXRhLnNlY29uZHMgICAgICAgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgICAgIGRhdGEubWludXRlcyAgICAgICA9IG1hdGhBYnMoZGF0YS5taW51dGVzKTtcbiAgICAgICAgZGF0YS5ob3VycyAgICAgICAgID0gbWF0aEFicyhkYXRhLmhvdXJzKTtcbiAgICAgICAgZGF0YS5tb250aHMgICAgICAgID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgICAgIGRhdGEueWVhcnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS55ZWFycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QkMSAoZHVyYXRpb24sIGlucHV0LCB2YWx1ZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUR1cmF0aW9uKGlucHV0LCB2YWx1ZSk7XG5cbiAgICAgICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5fZGF5cyAgICAgICAgICs9IGRpcmVjdGlvbiAqIG90aGVyLl9kYXlzO1xuICAgICAgICBkdXJhdGlvbi5fbW9udGhzICAgICAgICs9IGRpcmVjdGlvbiAqIG90aGVyLl9tb250aHM7XG5cbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBhZGQoMSwgJ3MnKSBvciBhZGQoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gYWRkJDEgKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIDEpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gc3VidHJhY3QkMSAoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgLTEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0NlaWwgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1YmJsZSAoKSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSB0aGlzLl9kYXlzO1xuICAgICAgICB2YXIgbW9udGhzICAgICAgID0gdGhpcy5fbW9udGhzO1xuICAgICAgICB2YXIgZGF0YSAgICAgICAgID0gdGhpcy5fZGF0YTtcbiAgICAgICAgdmFyIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycywgbW9udGhzRnJvbURheXM7XG5cbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIG1peCBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdmFsdWVzLCBidWJibGUgZG93biBmaXJzdFxuICAgICAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICAgICAgaWYgKCEoKG1pbGxpc2Vjb25kcyA+PSAwICYmIGRheXMgPj0gMCAmJiBtb250aHMgPj0gMCkgfHxcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzIDw9IDAgJiYgZGF5cyA8PSAwICYmIG1vbnRocyA8PSAwKSkpIHtcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgICAgIGRheXMgPSAwO1xuICAgICAgICAgICAgbW9udGhzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBidWJibGVzIHVwIHZhbHVlcywgc2VlIHRoZSB0ZXN0cyBmb3JcbiAgICAgICAgLy8gZXhhbXBsZXMgb2Ygd2hhdCB0aGF0IG1lYW5zLlxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICAgICAgc2Vjb25kcyAgICAgICAgICAgPSBhYnNGbG9vcihtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzICAgICAgPSBzZWNvbmRzICUgNjA7XG5cbiAgICAgICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgICAgICA9IG1pbnV0ZXMgJSA2MDtcblxuICAgICAgICBob3VycyAgICAgICAgICAgICA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIGRhdGEuaG91cnMgICAgICAgID0gaG91cnMgJSAyNDtcblxuICAgICAgICBkYXlzICs9IGFic0Zsb29yKGhvdXJzIC8gMjQpO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgZGF5cyB0byBtb250aHNcbiAgICAgICAgbW9udGhzRnJvbURheXMgPSBhYnNGbG9vcihkYXlzVG9Nb250aHMoZGF5cykpO1xuICAgICAgICBtb250aHMgKz0gbW9udGhzRnJvbURheXM7XG4gICAgICAgIGRheXMgLT0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzRnJvbURheXMpKTtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cbiAgICAgICAgZGF0YS5kYXlzICAgPSBkYXlzO1xuICAgICAgICBkYXRhLm1vbnRocyA9IG1vbnRocztcbiAgICAgICAgZGF0YS55ZWFycyAgPSB5ZWFycztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzVG9Nb250aHMgKGRheXMpIHtcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxMiBtb250aHMgPT09IDQ4MDBcbiAgICAgICAgcmV0dXJuIGRheXMgKiA0ODAwIC8gMTQ2MDk3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1RvRGF5cyAobW9udGhzKSB7XG4gICAgICAgIC8vIHRoZSByZXZlcnNlIG9mIGRheXNUb01vbnRoc1xuICAgICAgICByZXR1cm4gbW9udGhzICogMTQ2MDk3IC8gNDgwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcyAodW5pdHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5cztcbiAgICAgICAgdmFyIG1vbnRocztcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcblxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgICAgICBpZiAodW5pdHMgPT09ICdtb250aCcgfHwgdW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgZGF5cyAgID0gdGhpcy5fZGF5cyAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICByZXR1cm4gdW5pdHMgPT09ICdtb250aCcgPyBtb250aHMgOiBtb250aHMgLyAxMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgTWF0aC5yb3VuZChtb250aHNUb0RheXModGhpcy5fbW9udGhzKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2VlaycgICA6IHJldHVybiBkYXlzIC8gNyAgICAgKyBtaWxsaXNlY29uZHMgLyA2MDQ4ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF5JyAgICA6IHJldHVybiBkYXlzICAgICAgICAgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdob3VyJyAgIDogcmV0dXJuIGRheXMgKiAyNCAgICArIG1pbGxpc2Vjb25kcyAvIDM2ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWludXRlJyA6IHJldHVybiBkYXlzICogMTQ0MCAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2Vjb25kJyA6IHJldHVybiBkYXlzICogODY0MDAgKyBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgICAgICAgICAgICAgIC8vIE1hdGguZmxvb3IgcHJldmVudHMgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgaGVyZVxuICAgICAgICAgICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzogcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAqIDg2NGU1KSArIG1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdW5pdCAnICsgdW5pdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIHRoaXMuYXMoJ21zJyk/XG4gICAgZnVuY3Rpb24gdmFsdWVPZiQxICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHRoaXMuX2RheXMgKiA4NjRlNSArXG4gICAgICAgICAgICAodGhpcy5fbW9udGhzICUgMTIpICogMjU5MmU2ICtcbiAgICAgICAgICAgIHRvSW50KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTZcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQXMgKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcyhhbGlhcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGFzTWlsbGlzZWNvbmRzID0gbWFrZUFzKCdtcycpO1xuICAgIHZhciBhc1NlY29uZHMgICAgICA9IG1ha2VBcygncycpO1xuICAgIHZhciBhc01pbnV0ZXMgICAgICA9IG1ha2VBcygnbScpO1xuICAgIHZhciBhc0hvdXJzICAgICAgICA9IG1ha2VBcygnaCcpO1xuICAgIHZhciBhc0RheXMgICAgICAgICA9IG1ha2VBcygnZCcpO1xuICAgIHZhciBhc1dlZWtzICAgICAgICA9IG1ha2VBcygndycpO1xuICAgIHZhciBhc01vbnRocyAgICAgICA9IG1ha2VBcygnTScpO1xuICAgIHZhciBhc1llYXJzICAgICAgICA9IG1ha2VBcygneScpO1xuXG4gICAgZnVuY3Rpb24gY2xvbmUkMSAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQkMiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXNbdW5pdHMgKyAncyddKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9kYXRhW25hbWVdIDogTmFOO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtYWtlR2V0dGVyKCdtaWxsaXNlY29uZHMnKTtcbiAgICB2YXIgc2Vjb25kcyAgICAgID0gbWFrZUdldHRlcignc2Vjb25kcycpO1xuICAgIHZhciBtaW51dGVzICAgICAgPSBtYWtlR2V0dGVyKCdtaW51dGVzJyk7XG4gICAgdmFyIGhvdXJzICAgICAgICA9IG1ha2VHZXR0ZXIoJ2hvdXJzJyk7XG4gICAgdmFyIGRheXMgICAgICAgICA9IG1ha2VHZXR0ZXIoJ2RheXMnKTtcbiAgICB2YXIgbW9udGhzICAgICAgID0gbWFrZUdldHRlcignbW9udGhzJyk7XG4gICAgdmFyIHllYXJzICAgICAgICA9IG1ha2VHZXR0ZXIoJ3llYXJzJyk7XG5cbiAgICBmdW5jdGlvbiB3ZWVrcyAoKSB7XG4gICAgICAgIHJldHVybiBhYnNGbG9vcih0aGlzLmRheXMoKSAvIDcpO1xuICAgIH1cblxuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQ7XG4gICAgdmFyIHRocmVzaG9sZHMgPSB7XG4gICAgICAgIHNzOiA0NCwgICAgICAgICAvLyBhIGZldyBzZWNvbmRzIHRvIHNlY29uZHNcbiAgICAgICAgcyA6IDQ1LCAgICAgICAgIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgIG0gOiA0NSwgICAgICAgICAvLyBtaW51dGVzIHRvIGhvdXJcbiAgICAgICAgaCA6IDIyLCAgICAgICAgIC8vIGhvdXJzIHRvIGRheVxuICAgICAgICBkIDogMjYsICAgICAgICAgLy8gZGF5cyB0byBtb250aFxuICAgICAgICBNIDogMTEgICAgICAgICAgLy8gbW9udGhzIHRvIHllYXJcbiAgICB9O1xuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBtb21lbnQuZm4uZnJvbSwgbW9tZW50LmZuLmZyb21Ob3csIGFuZCBtb21lbnQuZHVyYXRpb24uZm4uaHVtYW5pemVcbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlVGltZUFnbyhzdHJpbmcsIG51bWJlciwgd2l0aG91dFN1ZmZpeCwgaXNGdXR1cmUsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLnJlbGF0aXZlVGltZShudW1iZXIgfHwgMSwgISF3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUkMSAocG9zTmVnRHVyYXRpb24sIHdpdGhvdXRTdWZmaXgsIGxvY2FsZSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCk7XG4gICAgICAgIHZhciBzZWNvbmRzICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpO1xuICAgICAgICB2YXIgbWludXRlcyAgPSByb3VuZChkdXJhdGlvbi5hcygnbScpKTtcbiAgICAgICAgdmFyIGhvdXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ2gnKSk7XG4gICAgICAgIHZhciBkYXlzICAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpO1xuICAgICAgICB2YXIgbW9udGhzICAgPSByb3VuZChkdXJhdGlvbi5hcygnTScpKTtcbiAgICAgICAgdmFyIHllYXJzICAgID0gcm91bmQoZHVyYXRpb24uYXMoJ3knKSk7XG5cbiAgICAgICAgdmFyIGEgPSBzZWNvbmRzIDw9IHRocmVzaG9sZHMuc3MgJiYgWydzJywgc2Vjb25kc10gIHx8XG4gICAgICAgICAgICAgICAgc2Vjb25kcyA8IHRocmVzaG9sZHMucyAgICYmIFsnc3MnLCBzZWNvbmRzXSB8fFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMgPD0gMSAgICAgICAgICAgICAmJiBbJ20nXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDwgdGhyZXNob2xkcy5tICAgJiYgWydtbScsIG1pbnV0ZXNdIHx8XG4gICAgICAgICAgICAgICAgaG91cnMgICA8PSAxICAgICAgICAgICAgICYmIFsnaCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPCB0aHJlc2hvbGRzLmggICAmJiBbJ2hoJywgaG91cnNdICAgfHxcbiAgICAgICAgICAgICAgICBkYXlzICAgIDw9IDEgICAgICAgICAgICAgJiYgWydkJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8IHRocmVzaG9sZHMuZCAgICYmIFsnZGQnLCBkYXlzXSAgICB8fFxuICAgICAgICAgICAgICAgIG1vbnRocyAgPD0gMSAgICAgICAgICAgICAmJiBbJ00nXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDwgdGhyZXNob2xkcy5NICAgJiYgWydNTScsIG1vbnRoc10gIHx8XG4gICAgICAgICAgICAgICAgeWVhcnMgICA8PSAxICAgICAgICAgICAgICYmIFsneSddICAgICAgICAgICB8fCBbJ3l5JywgeWVhcnNdO1xuXG4gICAgICAgIGFbMl0gPSB3aXRob3V0U3VmZml4O1xuICAgICAgICBhWzNdID0gK3Bvc05lZ0R1cmF0aW9uID4gMDtcbiAgICAgICAgYVs0XSA9IGxvY2FsZTtcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGVUaW1lQWdvLmFwcGx5KG51bGwsIGEpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgdGhlIHJvdW5kaW5nIGZ1bmN0aW9uIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVSb3VuZGluZyAocm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZihyb3VuZGluZ0Z1bmN0aW9uKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZGluZ0Z1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZCAodGhyZXNob2xkLCBsaW1pdCkge1xuICAgICAgICBpZiAodGhyZXNob2xkc1t0aHJlc2hvbGRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZHNbdGhyZXNob2xkXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJlc2hvbGRzW3RocmVzaG9sZF0gPSBsaW1pdDtcbiAgICAgICAgaWYgKHRocmVzaG9sZCA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGRzLnNzID0gbGltaXQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGh1bWFuaXplICh3aXRoU3VmZml4KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICB2YXIgb3V0cHV0ID0gcmVsYXRpdmVUaW1lJDEodGhpcywgIXdpdGhTdWZmaXgsIGxvY2FsZSk7XG5cbiAgICAgICAgaWYgKHdpdGhTdWZmaXgpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGxvY2FsZS5wYXN0RnV0dXJlKCt0aGlzLCBvdXRwdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFicyQxID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBzaWduKHgpIHtcbiAgICAgICAgcmV0dXJuICgoeCA+IDApIC0gKHggPCAwKSkgfHwgK3g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAgICAgLy8gZm9yIElTTyBzdHJpbmdzIHdlIGRvIG5vdCB1c2UgdGhlIG5vcm1hbCBidWJibGluZyBydWxlczpcbiAgICAgICAgLy8gICogbWlsbGlzZWNvbmRzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSBob3Vyc1xuICAgICAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgICAgIC8vICAqIG1vbnRocyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgeWVhcnNcbiAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbnRleHQtZnJlZSBjb252ZXJzaW9uIGJldHdlZW4gaG91cnMgYW5kIGRheXNcbiAgICAgICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgICAgIC8vIGFuZCBhbHNvIG5vdCBiZXR3ZWVuIGRheXMgYW5kIG1vbnRocyAoMjgtMzEgZGF5cyBwZXIgbW9udGgpXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNlY29uZHMgPSBhYnMkMSh0aGlzLl9taWxsaXNlY29uZHMpIC8gMTAwMDtcbiAgICAgICAgdmFyIGRheXMgICAgICAgICA9IGFicyQxKHRoaXMuX2RheXMpO1xuICAgICAgICB2YXIgbW9udGhzICAgICAgID0gYWJzJDEodGhpcy5fbW9udGhzKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMsIGhvdXJzLCB5ZWFycztcblxuICAgICAgICAvLyAzNjAwIHNlY29uZHMgLT4gNjAgbWludXRlcyAtPiAxIGhvdXJcbiAgICAgICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBob3VycyAgICAgICAgICAgICA9IGFic0Zsb29yKG1pbnV0ZXMgLyA2MCk7XG4gICAgICAgIHNlY29uZHMgJT0gNjA7XG4gICAgICAgIG1pbnV0ZXMgJT0gNjA7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyAgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuXG4gICAgICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kb3JkaWxsZS9tb21lbnQtaXNvZHVyYXRpb24vYmxvYi9tYXN0ZXIvbW9tZW50Lmlzb2R1cmF0aW9uLmpzXG4gICAgICAgIHZhciBZID0geWVhcnM7XG4gICAgICAgIHZhciBNID0gbW9udGhzO1xuICAgICAgICB2YXIgRCA9IGRheXM7XG4gICAgICAgIHZhciBoID0gaG91cnM7XG4gICAgICAgIHZhciBtID0gbWludXRlcztcbiAgICAgICAgdmFyIHMgPSBzZWNvbmRzID8gc2Vjb25kcy50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLCAnJykgOiAnJztcbiAgICAgICAgdmFyIHRvdGFsID0gdGhpcy5hc1NlY29uZHMoKTtcblxuICAgICAgICBpZiAoIXRvdGFsKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzYW1lIGFzIEMjJ3MgKE5vZGEpIGFuZCBweXRob24gKGlzb2RhdGUpLi4uXG4gICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgICAgICByZXR1cm4gJ1AwRCc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG90YWxTaWduID0gdG90YWwgPCAwID8gJy0nIDogJyc7XG4gICAgICAgIHZhciB5bVNpZ24gPSBzaWduKHRoaXMuX21vbnRocykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIHZhciBkYXlzU2lnbiA9IHNpZ24odGhpcy5fZGF5cykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIHZhciBobXNTaWduID0gc2lnbih0aGlzLl9taWxsaXNlY29uZHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuXG4gICAgICAgIHJldHVybiB0b3RhbFNpZ24gKyAnUCcgK1xuICAgICAgICAgICAgKFkgPyB5bVNpZ24gKyBZICsgJ1knIDogJycpICtcbiAgICAgICAgICAgIChNID8geW1TaWduICsgTSArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoRCA/IGRheXNTaWduICsgRCArICdEJyA6ICcnKSArXG4gICAgICAgICAgICAoKGggfHwgbSB8fCBzKSA/ICdUJyA6ICcnKSArXG4gICAgICAgICAgICAoaCA/IGhtc1NpZ24gKyBoICsgJ0gnIDogJycpICtcbiAgICAgICAgICAgIChtID8gaG1zU2lnbiArIG0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKHMgPyBobXNTaWduICsgcyArICdTJyA6ICcnKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMiA9IER1cmF0aW9uLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDIuaXNWYWxpZCAgICAgICAgPSBpc1ZhbGlkJDE7XG4gICAgcHJvdG8kMi5hYnMgICAgICAgICAgICA9IGFicztcbiAgICBwcm90byQyLmFkZCAgICAgICAgICAgID0gYWRkJDE7XG4gICAgcHJvdG8kMi5zdWJ0cmFjdCAgICAgICA9IHN1YnRyYWN0JDE7XG4gICAgcHJvdG8kMi5hcyAgICAgICAgICAgICA9IGFzO1xuICAgIHByb3RvJDIuYXNNaWxsaXNlY29uZHMgPSBhc01pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLmFzU2Vjb25kcyAgICAgID0gYXNTZWNvbmRzO1xuICAgIHByb3RvJDIuYXNNaW51dGVzICAgICAgPSBhc01pbnV0ZXM7XG4gICAgcHJvdG8kMi5hc0hvdXJzICAgICAgICA9IGFzSG91cnM7XG4gICAgcHJvdG8kMi5hc0RheXMgICAgICAgICA9IGFzRGF5cztcbiAgICBwcm90byQyLmFzV2Vla3MgICAgICAgID0gYXNXZWVrcztcbiAgICBwcm90byQyLmFzTW9udGhzICAgICAgID0gYXNNb250aHM7XG4gICAgcHJvdG8kMi5hc1llYXJzICAgICAgICA9IGFzWWVhcnM7XG4gICAgcHJvdG8kMi52YWx1ZU9mICAgICAgICA9IHZhbHVlT2YkMTtcbiAgICBwcm90byQyLl9idWJibGUgICAgICAgID0gYnViYmxlO1xuICAgIHByb3RvJDIuY2xvbmUgICAgICAgICAgPSBjbG9uZSQxO1xuICAgIHByb3RvJDIuZ2V0ICAgICAgICAgICAgPSBnZXQkMjtcbiAgICBwcm90byQyLm1pbGxpc2Vjb25kcyAgID0gbWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuc2Vjb25kcyAgICAgICAgPSBzZWNvbmRzO1xuICAgIHByb3RvJDIubWludXRlcyAgICAgICAgPSBtaW51dGVzO1xuICAgIHByb3RvJDIuaG91cnMgICAgICAgICAgPSBob3VycztcbiAgICBwcm90byQyLmRheXMgICAgICAgICAgID0gZGF5cztcbiAgICBwcm90byQyLndlZWtzICAgICAgICAgID0gd2Vla3M7XG4gICAgcHJvdG8kMi5tb250aHMgICAgICAgICA9IG1vbnRocztcbiAgICBwcm90byQyLnllYXJzICAgICAgICAgID0geWVhcnM7XG4gICAgcHJvdG8kMi5odW1hbml6ZSAgICAgICA9IGh1bWFuaXplO1xuICAgIHByb3RvJDIudG9JU09TdHJpbmcgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9TdHJpbmcgICAgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9KU09OICAgICAgICAgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIubG9jYWxlICAgICAgICAgPSBsb2NhbGU7XG4gICAgcHJvdG8kMi5sb2NhbGVEYXRhICAgICA9IGxvY2FsZURhdGE7XG5cbiAgICBwcm90byQyLnRvSXNvU3RyaW5nID0gZGVwcmVjYXRlKCd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsIHRvSVNPU3RyaW5nJDEpO1xuICAgIHByb3RvJDIubGFuZyA9IGxhbmc7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWCcsIDAsIDAsICd1bml4Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3gnLCAwLCAwLCAndmFsdWVPZicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigneCcsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdYJywgbWF0Y2hUaW1lc3RhbXApO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUocGFyc2VGbG9hdChpbnB1dCwgMTApICogMTAwMCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbigneCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSh0b0ludChpbnB1dCkpO1xuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG5cbiAgICBob29rcy52ZXJzaW9uID0gJzIuMjIuMSc7XG5cbiAgICBzZXRIb29rQ2FsbGJhY2soY3JlYXRlTG9jYWwpO1xuXG4gICAgaG9va3MuZm4gICAgICAgICAgICAgICAgICAgID0gcHJvdG87XG4gICAgaG9va3MubWluICAgICAgICAgICAgICAgICAgID0gbWluO1xuICAgIGhvb2tzLm1heCAgICAgICAgICAgICAgICAgICA9IG1heDtcbiAgICBob29rcy5ub3cgICAgICAgICAgICAgICAgICAgPSBub3c7XG4gICAgaG9va3MudXRjICAgICAgICAgICAgICAgICAgID0gY3JlYXRlVVRDO1xuICAgIGhvb2tzLnVuaXggICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVuaXg7XG4gICAgaG9va3MubW9udGhzICAgICAgICAgICAgICAgID0gbGlzdE1vbnRocztcbiAgICBob29rcy5pc0RhdGUgICAgICAgICAgICAgICAgPSBpc0RhdGU7XG4gICAgaG9va3MubG9jYWxlICAgICAgICAgICAgICAgID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xuICAgIGhvb2tzLmludmFsaWQgICAgICAgICAgICAgICA9IGNyZWF0ZUludmFsaWQ7XG4gICAgaG9va3MuZHVyYXRpb24gICAgICAgICAgICAgID0gY3JlYXRlRHVyYXRpb247XG4gICAgaG9va3MuaXNNb21lbnQgICAgICAgICAgICAgID0gaXNNb21lbnQ7XG4gICAgaG9va3Mud2Vla2RheXMgICAgICAgICAgICAgID0gbGlzdFdlZWtkYXlzO1xuICAgIGhvb2tzLnBhcnNlWm9uZSAgICAgICAgICAgICA9IGNyZWF0ZUluWm9uZTtcbiAgICBob29rcy5sb2NhbGVEYXRhICAgICAgICAgICAgPSBnZXRMb2NhbGU7XG4gICAgaG9va3MuaXNEdXJhdGlvbiAgICAgICAgICAgID0gaXNEdXJhdGlvbjtcbiAgICBob29rcy5tb250aHNTaG9ydCAgICAgICAgICAgPSBsaXN0TW9udGhzU2hvcnQ7XG4gICAgaG9va3Mud2Vla2RheXNNaW4gICAgICAgICAgID0gbGlzdFdlZWtkYXlzTWluO1xuICAgIGhvb2tzLmRlZmluZUxvY2FsZSAgICAgICAgICA9IGRlZmluZUxvY2FsZTtcbiAgICBob29rcy51cGRhdGVMb2NhbGUgICAgICAgICAgPSB1cGRhdGVMb2NhbGU7XG4gICAgaG9va3MubG9jYWxlcyAgICAgICAgICAgICAgID0gbGlzdExvY2FsZXM7XG4gICAgaG9va3Mud2Vla2RheXNTaG9ydCAgICAgICAgID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG4gICAgaG9va3Mubm9ybWFsaXplVW5pdHMgICAgICAgID0gbm9ybWFsaXplVW5pdHM7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lUm91bmRpbmcgID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lVGhyZXNob2xkID0gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkO1xuICAgIGhvb2tzLmNhbGVuZGFyRm9ybWF0ICAgICAgICA9IGdldENhbGVuZGFyRm9ybWF0O1xuICAgIGhvb2tzLnByb3RvdHlwZSAgICAgICAgICAgICA9IHByb3RvO1xuXG4gICAgLy8gY3VycmVudGx5IEhUTUw1IGlucHV0IHR5cGUgb25seSBzdXBwb3J0cyAyNC1ob3VyIGZvcm1hdHNcbiAgICBob29rcy5IVE1MNV9GTVQgPSB7XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMOiAnWVlZWS1NTS1ERFRISDptbScsICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9TRUNPTkRTOiAnWVlZWS1NTS1ERFRISDptbTpzcycsICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9NUzogJ1lZWVktTU0tRERUSEg6bW06c3MuU1NTJywgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgREFURTogJ1lZWVktTU0tREQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJkYXRlXCIgLz5cbiAgICAgICAgVElNRTogJ0hIOm1tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgLz5cbiAgICAgICAgVElNRV9TRUNPTkRTOiAnSEg6bW06c3MnLCAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBUSU1FX01TOiAnSEg6bW06c3MuU1NTJywgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiBzdGVwPVwiMC4wMDFcIiAvPlxuICAgICAgICBXRUVLOiAnWVlZWS1bV11XVycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cIndlZWtcIiAvPlxuICAgICAgICBNT05USDogJ1lZWVktTU0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cIm1vbnRoXCIgLz5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGhvb2tzO1xuXG59KSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIE1haW4gZnVuY3Rpb24gYW5kIGVudHJ5IHBvaW50XG4gICAgQ2FuIGJlIHJlZ2lzdGVyZWQgdG8gYSB2aWRlb2pzIGluc3RhbmNlIGFzIGEgcGx1Z2luXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9ICh2aWRlb2pzKSA9PiB7XG4gICAgcmVxdWlyZSgnLi9saWIvcG9seWZpbGxzJyk7XG5cbiAgICBjb25zdCBQbHVnaW4gPSB2aWRlb2pzLmdldFBsdWdpbigncGx1Z2luJyksXG4gICAgICAgICAgVXRpbHMgPSByZXF1aXJlKCcuL2xpYi91dGlscycpLFxuICAgICAgICAgIENvbnRyb2xzID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9jb250cm9sc1wiKSxcbiAgICAgICAgICBBbm5vdGF0aW9uU3RhdGUgPSByZXF1aXJlKFwiLi9jb21wb25lbnRzL2Fubm90YXRpb25fc3RhdGVcIiksXG4gICAgICAgICAgRXZlbnREaXNwYXRjaGVyID0gcmVxdWlyZShcIi4vbGliL2V2ZW50X2Rpc3BhdGNoZXJcIik7XG5cbiAgICBjb25zdCBERUZBVUxUX09QVElPTlMgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYmluZEFycm93S2V5czogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIG1ldGE6ICAgICAgICAgICAgICAgICAgICAgICB7IHVzZXJfaWQ6IG51bGwsIHVzZXJfbmFtZTogbnVsbCB9LFxuICAgICAgICBhbm5vdGF0aW9uc09iamVjdHM6ICAgICAgICAgW10sXG4gICAgICAgIHNob3dDb250cm9sczogICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBzaG93Q29tbWVudExpc3Q6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc2hvd0Z1bGxTY3JlZW46ICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHNob3dNYXJrZXJTaGFwZUFuZFRvb2x0aXBzOiB0cnVlLFxuICAgICAgICBpbnRlcm5hbENvbW1lbnRpbmc6ICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc3RhcnRJbkFubm90YXRpb25Nb2RlOiAgICAgIGZhbHNlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2xhc3MgQW5ub3RhdGlvbkNvbW1lbnRzIGV4dGVuZHMgUGx1Z2luIHtcblxuICAgICAgICBjb25zdHJ1Y3RvciAocGxheWVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihVdGlscy5jbG9uZU9iamVjdChERUZBVUxUX09QVElPTlMpLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcih0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLnJlZ2lzdGVyTGlzdGVuZXJzRm9yKHRoaXMsICdBbm5vdGF0aW9uQ29tbWVudHMnKTtcblxuICAgICAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgICAgICAgICB0aGlzLm1ldGEgPSBvcHRpb25zLm1ldGE7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhbGxiYWNrcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBBc3NpZ24gcmVmZXJlbmNlIHRvIHRoaXMgY2xhc3MgdG8gcGxheWVyIGZvciBhY2Nlc3MgbGF0ZXIgYnkgY29tcG9uZW50cyB3aGVyZSBuZWVkZWRcbiAgICAgICAgICAgIHBsYXllci5hbm5vdGF0aW9uQ29tbWVudHMgPSAoKCkgPT4geyByZXR1cm4gdGhpcyB9KS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCBjb21wb25lbnRzIGFyZSBpbml0aWFsaXplZCBBRlRFUiBtZXRhZGF0YSArIHBsYXkgZGF0YSBpcyBsb2FkZWQgc28gd2UgbWV0YWRhdGEvZHVyYXRpb25cbiAgICAgICAgICAgIC8vIE5PVEUgLSB0aGlzIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgcGxheWVyIGxvYWRlZGRhdGEgZG9lc24ndCBhbHdheXMgZmlyZSBpZiByZWFkeXN0YXRlIGlzID4gM1xuICAgICAgICAgICAgaWYocGxheWVyLnJlYWR5U3RhdGUoKSA+PSAzKXtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3RMb2FkRGF0YUNvbnN0cnVjdG9yKCk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBwbGF5ZXIub24oJ2xvYWRlZGRhdGEnLCB0aGlzLnBvc3RMb2FkRGF0YUNvbnN0cnVjdG9yLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBpbml0L3NldHVwIGFmdGVyIHZpZGVvIGRhdGEgKyBtZXRhZGF0YSBpcyBhdmFpbGFibGVcbiAgICAgICAgcG9zdExvYWREYXRhQ29uc3RydWN0b3IgKCkge1xuICAgICAgICAgICAgLy8gc2V0dXAgaW5pdGlhbCBzdGF0ZSBhbmQgcmVuZGVyIFVJXG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdGF0ZSA9IG5ldyBBbm5vdGF0aW9uU3RhdGUodGhpcy5wbGF5ZXIpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RhdGUuYW5ub3RhdGlvbnMgPSB0aGlzLm9wdGlvbnMuYW5ub3RhdGlvbnNPYmplY3RzO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0gbmV3IENvbnRyb2xzKHRoaXMucGxheWVyLCB0aGlzLm9wdGlvbnMuYmluZEFycm93S2V5cyk7XG4gICAgICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Qm91bmRzKGZhbHNlKTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5zdGFydEluQW5ub3RhdGlvbk1vZGUpIHRoaXMudG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcblxuICAgICAgICAgICAgdGhpcy5wbHVnaW5SZWFkeSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCBuZWVkZWQgZXZlbnRzIGZvciBpbnRlcmFjdGlvbiB3LyBjb21wb25lbnRzXG4gICAgICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICAgICAgLy8gU2V0IHBsYXllciBib3VuZGFyaWVzIG9uIHdpbmRvdyBzaXplIGNoYW5nZSBvciBmdWxsc2NyZWVuIGNoYW5nZVxuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUudmFjLXdpbmRvdy1yZXNpemUnLCBVdGlscy50aHJvdHRsZSh0aGlzLnNldEJvdW5kcy5iaW5kKHRoaXMpLCA1MDApKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgVXRpbHMudGhyb3R0bGUodGhpcy5zZXRCb3VuZHMuYmluZCh0aGlzKSwgNTAwKSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uIGZlYXR1cmVzIG9uIGZ1bGxzY3JlZW4gaWYgc2hvd0Z1bGxTY3JlZW46IGZhbHNlXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zaG93RnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmlzRnVsbHNjcmVlbl8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlRnVsbHNjcmVlbkFubm90YXRpb25zRW5hYmxlZCA9IHRoaXMuYWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5hZGRDbGFzcygndmFjLWRpc2FibGUtZnVsbHNjcmVlbicpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5yZW1vdmVDbGFzcygndmFjLWRpc2FibGUtZnVsbHNjcmVlbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMucHJlRnVsbHNjcmVlbkFubm90YXRpb25zRW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZXZpb3VzbHkgaW4gYW5ub3RhdGlvbiBtb2RlIChwcmUtZnVsbHNjcmVlbikgb3IgZW50ZXJpbmcgZnVsbHNjcmVlZW4gYW5kIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYW5ub3RhdGlvbiBtb2RlLCB0b2dnbGUgdGhlIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSB3cmFwcGVyIGZ1bmMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdXNlIEV2ZW50RGlzcGF0Y2hlciBmcm9tIHRoZSBjbGllbnRcbiAgICAgICAgLy8gRXg6IHBsdWdpbi5maXJlKHR5cGUsIGRhdGEpO1xuICAgICAgICBmaXJlICh0eXBlLCBkYXRhPXt9KSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5maXJlKHR5cGUsIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG9nZ2xlIGFubm90YXRpb25zIG1vZGUgb24vb2ZmXG4gICAgICAgIHRvZ2dsZUFubm90YXRpb25Nb2RlKCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG4gICAgICAgICAgICB0aGlzLnBsYXllci50b2dnbGVDbGFzcygndmFjLWFjdGl2ZScpOyAvLyBUb2dnbGUgZ2xvYmFsIGNsYXNzIHRvIHBsYXllciB0byB0b2dnbGUgZGlzcGxheSBvZiBlbGVtZW50c1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RhdGUuZW5hYmxlZCA9IHRoaXMuYWN0aXZlO1xuXG4gICAgICAgICAgICBpZih0aGlzLmFjdGl2ZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKFwiYW5ub3RhdGlvbk1vZGVFbmFibGVkXCIpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKFwiYW5ub3RhdGlvbk1vZGVEaXNhYmxlZFwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgY29udHJvbCBjb21wb25lbnQgVUkgaWYgc2hvd0NvbnRyb2xzOiB0cnVlXG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuc2hvd0NvbnRyb2xzKXtcbiAgICAgICAgICAgICAgICBpZighdGhpcy5hY3RpdmUpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnJlbmRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBwbGF5ZXIgVUkgYm91bmRhcmllc1xuICAgICAgICBzZXRCb3VuZHMgKHRyaWdnZXJDaGFuZ2U9dHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSB7fTtcbiAgICAgICAgICAgIGxldCAkcGxheWVyID0gJCh0aGlzLnBsYXllci5lbCgpKSxcbiAgICAgICAgICAgICAgICAkY3RybHMgID0gJHBsYXllci5maW5kKCcudmpzLWNvbnRyb2wtYmFyJyk7XG5cbiAgICAgICAgICAgIHRoaXMuYm91bmRzLmxlZnQgPSAkcGxheWVyLm9mZnNldCgpLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy50b3AgPSAkcGxheWVyLm9mZnNldCgpLnRvcDtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzLnJpZ2h0ID0gdGhpcy5ib3VuZHMubGVmdCArICRwbGF5ZXIud2lkdGgoKTtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzLmJvdHRvbSA9IHRoaXMuYm91bmRzLnRvcCArICRwbGF5ZXIuaGVpZ2h0KCk7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5ib3R0b21XaXRob3V0Q29udHJvbHMgPSB0aGlzLmJvdW5kcy5ib3R0b20gLSAkY3RybHMuaGVpZ2h0KCk7XG5cbiAgICAgICAgICAgIC8vIGZpcmVzIGFuIGV2ZW50IHdoZW4gYm91bmRzIGhhdmUgY2hhbmdlZCBkdXJpbmcgcmVzaXppbmdcbiAgICAgICAgICAgIGlmKHRyaWdnZXJDaGFuZ2UpIHRoaXMuZmlyZSgncGxheWVyQm91bmRzQ2hhbmdlZCcsIHRoaXMuYm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFB1YmxpYyBmdW5jdGlvbiB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZvciB3aGVuIHBsdWdpbiBpcyByZWFkeVxuICAgICAgICBvblJlYWR5IChjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYodGhpcy5ldmVudERpc3BhdGNoZXIucGx1Z2luUmVhZHkpe1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVhZHlDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHBsdWdpbiBhcyByZWFkeSBhbmQgZmlyZSBhbnkgcGVuZGluZyBjYWxsYmFja3NcbiAgICAgICAgcGx1Z2luUmVhZHkgKCkge1xuICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIucGx1Z2luUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUodGhpcy5fcmVhZHlDYWxsYmFja3MubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkeUNhbGxiYWNrcy5wb3AoKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGVhcmRvd24gYWxsIGNvbXBvbmVudHMsIHJlbW92ZSBhbGwgbGlzdGVuZXJzLCBhbmQgcmVtb3ZlIGVsZW1lbnRzIGZyb20gRE9NXG4gICAgICAgIGRpc3Bvc2UgKCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scyA9IHRoaXMuY29udHJvbHMudGVhcmRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0YXRlID0gdGhpcy5hbm5vdGF0aW9uU3RhdGUudGVhcmRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gdGhpcy5ldmVudERpc3BhdGNoZXIudGVhcmRvd24oKTtcbiAgICAgICAgICAgIHRoaXMudGVhcmRvd24oKTtcbiAgICAgICAgICAgIGlmKHRoaXMucGxheWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIuYW5ub3RhdGlvbkNvbW1lbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAkKHRoaXMucGxheWVyLmVsKCkpLnJlbW92ZUNsYXNzKCd2YWMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5maW5kKFwiW2NsYXNzXj0ndmFjLSddXCIpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVhcmRvd24gKCkge1xuICAgICAgICAgICAgaWYodGhpcy5wbGF5ZXIpIHRoaXMucGxheWVyLm9mZignZnVsbHNjcmVlbmNoYW5nZScpO1xuICAgICAgICAgICAgJCh3aW5kb3cpLm9mZigncmVzaXplLnZhYy13aW5kb3ctcmVzaXplJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJ2YXIgSGFuZGxlYmFycyA9IHJlcXVpcmUoXCJoYW5kbGViYXJzL3J1bnRpbWVcIik7XG4gZXhwb3J0c1tcImNvbW1lbnRcIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHtcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudFxcXCIgZGF0YS1pZD1cXFwiXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiaWRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50LWhlYWRlclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hdXRob3ItbmFtZVxcXCI+XCJcbiAgICArIGFsaWFzNChjb250YWluZXIubGFtYmRhKCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm1ldGEgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnVzZXJfbmFtZSA6IHN0YWNrMSksIGRlcHRoMCkpXG4gICAgKyBcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdGltZXN0YW1wXFxcIj5cIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudGltZVNpbmNlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aW1lU2luY2UgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInRpbWVTaW5jZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwidmFjLWRlbGV0ZS1jb21tZW50XFxcIj4mbmJzcDsmbmJzcDtYPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnQtYm9keVxcXCI+XFxuICAgIFwiXG4gICAgKyBhbGlhczQoKGhlbHBlcnMuYnJlYWtsaW5lcyB8fCAoZGVwdGgwICYmIGRlcHRoMC5icmVha2xpbmVzKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5ib2R5IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJicmVha2xpbmVzXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKVxuICAgICsgXCJcXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wiY29tbWVudF9saXN0XCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IGNvbnRhaW5lci5sYW1iZGEoYmxvY2tQYXJhbXNbMF1bMF0sIGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEsYmxvY2tQYXJhbXMpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pO1xuXG4gIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50cy1jb250YWluZXJcXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnRzLXdyYXBcXFwiPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29tbWVudHNIVE1MIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlYWNoXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDEsIGJsb2NrUGFyYW1zKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhLFwiYmxvY2tQYXJhbXNcIjpibG9ja1BhcmFtc30pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgIDxkaXYgY2xhc3M9XFxcInZhYy1yZXBseS1idG4gdmFjLWJ1dHRvblxcXCI+QUREIFJFUExZPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hZGQtbmV3LXNoYXBlYm94XFxcIj48L2Rpdj5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnRzLWNvbnRyb2wtYmFyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLXJhbmdlXFxcIj48Yj5APC9iPiBcIlxuICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5yYW5nZVN0ciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTdHIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gXCJmdW5jdGlvblwiID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInJhbmdlU3RyXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YSxcImJsb2NrUGFyYW1zXCI6YmxvY2tQYXJhbXN9KSA6IGhlbHBlcikpKVxuICAgICsgXCI8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbnRyb2wtYnV0dG9uc1xcXCI+XFxuICAgICAgPGEgY2xhc3M9XFxcInZhYy1kZWxldGUtYW5ub3RhdGlvblxcXCI+REVMRVRFPC9hPiB8IDxhIGNsYXNzPVxcXCJ2YWMtY2xvc2UtY29tbWVudC1saXN0XFxcIj5DTE9TRTwvYT5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZSxcInVzZUJsb2NrUGFyYW1zXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcImNvbnRyb2xzXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dDb250cm9scyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIik7XG59LFwiMlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jb250cm9scyB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwidmFjLWJ1dHRvblxcXCI+KyBORVc8L2J1dHRvbj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93TmF2IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgICAgIDwvZGl2PlxcblwiO1xufSxcIjNcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYW5ub3RhdGlvbi1uYXZcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWEtcHJldlxcXCI+UHJldjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWEtbmV4dFxcXCI+TmV4dDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cIjtcbn0sXCI1XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KTtcblxuICByZXR1cm4gXCIgICAgPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLWNvdmVyIHZhYy1jb250cm9sXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby1jb3Zlci1jYW52YXNcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jdXJzb3ItdG9vbC10aXAgdmFjLWhpZGRlblxcXCI+Q2xpY2sgYW5kIGRyYWcgdG8gc2VsZWN0PC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93Q29udHJvbHMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud3JpdGluZ0NvbW1lbnQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjZcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYWRkLWNvbnRyb2xzIHZhYy1jb250cm9sXFxcIj5cXG4gICAgICAgICAgICA8aT5TZWxlY3Qgc2hhcGUgKyByYW5nZTwvaT5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbnRlcm5hbENvbW1lbnRpbmcgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby1tb3ZlXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWEtcHJldlxcXCI+LTEgc2VjPC9kaXY+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLW5leHRcXFwiPisxIHNlYzwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPkNPTlRJTlVFPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxhPmNhbmNlbDwvYT5cXG5cIjtcbn0sXCI5XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgaGVscGVyO1xuXG4gIHJldHVybiBcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLXdyaXRlLW5ldy13cmFwIHZhYy1jb250cm9sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8td3JpdGUtbmV3IHZhYy1pcy1hbm5vdGF0aW9uXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxoNT48Yj5OZXcgQW5ub3RhdGlvbjwvYj4gQCBcIlxuICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5yYW5nZVN0ciB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTdHIgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogaGVscGVycy5oZWxwZXJNaXNzaW5nKSwodHlwZW9mIGhlbHBlciA9PT0gXCJmdW5jdGlvblwiID8gaGVscGVyLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSx7XCJuYW1lXCI6XCJyYW5nZVN0clwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI8L2g1PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnQtc2hvd2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBjb21tZW50Li4uXFxcIj48L3RleHRhcmVhPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPlNBVkU8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+Q2FuY2VsPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSk7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy51bmxlc3MuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFkZGluZyA6IGRlcHRoMCkse1wibmFtZVwiOlwidW5sZXNzXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWRkaW5nIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcImRyYWdnYWJsZV9tYXJrZXJcIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHtcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBkYXRhLW1hcmtlci1pZD1cXFwiXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiaWRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIiBjbGFzcz1cXFwidmFjLW1hcmtlci1kcmFnZ2FibGUgdmFjLXJhbmdlZC1tYXJrZXJcXFwiIHN0eWxlPVxcXCJsZWZ0OiBcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGVmdCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGVmdCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwibGVmdFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI7IHdpZHRoOlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aWR0aCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2lkdGggOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcIndpZHRoXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIjtcXFwiPlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wibWFya2VyXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCJ2YWMtcmFuZ2VkLW1hcmtlclwiO1xufSxcIjNcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBoZWxwZXI7XG5cbiAgcmV0dXJuIFwid2lkdGg6XCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2lkdGggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpZHRoIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IFwiZnVuY3Rpb25cIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSkse1wibmFtZVwiOlwid2lkdGhcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiO1wiO1xufSxcIjVcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudG9vbHRpcEJvZHkgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjZcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCIgICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwidmFjLXRvb2x0aXAgXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b29sdGlwUmlnaHQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8Yj5cIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudG9vbHRpcFRpbWUgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2x0aXBUaW1lIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ0b29sdGlwVGltZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI8L2I+IC0gXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRvb2x0aXBCb2R5IHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b29sdGlwQm9keSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwidG9vbHRpcEJvZHlcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cIjtcbn0sXCI3XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCJ2YWMtcmlnaHQtc2lkZVwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCI8ZGl2IGRhdGEtbWFya2VyLWlkPVxcXCJcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMuaWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJpZFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJcXFwiIGNsYXNzPVxcXCJ2YWMtbWFya2VyIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTaG93IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiIHN0eWxlPVxcXCJsZWZ0OiBcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMubGVmdCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubGVmdCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwibGVmdFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI7IFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmFuZ2VTaG93IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgei1pbmRleDogXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnpJbmRleCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuekluZGV4IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ6SW5kZXhcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNob3dUb29sdGlwIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcIm1hcmtlcl93cmFwXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtbWFya2VyLW93cmFwXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcInZhYy1tYXJrZXItd3JhcFxcXCI+PC9kaXY+XFxuPC9kaXY+XCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJuZXdfY29tbWVudFwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGFsaWFzMz1cImZ1bmN0aW9uXCIsIGFsaWFzND1jb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbjtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8td3JpdGUtbmV3LXdyYXAgdmFjLW5ldy1jb21tZW50XFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby13cml0ZS1uZXcgdmFjLWlzLWNvbW1lbnRcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudC1zaG93Ym94XFxcIiBzdHlsZT1cXFwid2lkdGg6XCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLndpZHRoIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC53aWR0aCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwid2lkdGhcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwicHg7dG9wOlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b3AgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvcCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwidG9wXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcInB4O3JpZ2h0OlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5yaWdodCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmlnaHQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInJpZ2h0XCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcInB4XFxcIj5cXG4gICAgICA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9XFxcIkVudGVyIGNvbW1lbnQuLi5cXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgPGRpdj5cXG4gICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPlNBVkU8L2J1dHRvbj5cXG4gICAgICAgIDxhPkNhbmNlbDwvYT5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJwbGF5ZXJfYnV0dG9uXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCI8Yj48L2I+XFxuPGkgY2xhc3M9XFxcInZhYy1wbGF5ZXItaWNvblxcXCI+XFxuXHQ8c3ZnIGhlaWdodD1cXFwiMjRcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCIgd2lkdGg9XFxcIjI0XFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiPlxcblx0ICAgIDxwYXRoIGQ9XFxcIk0yMS45OSA0YzAtMS4xLS44OS0yLTEuOTktMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNC0uMDEtMTh6TTE4IDE0SDZ2LTJoMTJ2MnptMC0zSDZWOWgxMnYyem0wLTNINlY2aDEydjJ6XFxcIi8+XFxuXHQgICAgPHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCIvPlxcblx0PC9zdmc+XFxuPC9pPlwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYW4gYW5ub3RhdGlvbiwgd2hpY2ggaW5jbHVkZXMgY29udHJvbGxpbmcgdGhlIG1hcmtlci9zaGFwZSwgcmVuZGVyaW5nIGEgY29tbWVudExpc3QsIGV0Y1xuKi9cblxuY29uc3QgICBQbGF5ZXJVSUNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfdWlfY29tcG9uZW50XCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoXCIuLy4uL2xpYi91dGlscy5qc1wiKSxcbiAgICAgICAgQ29tbWVudExpc3QgPSByZXF1aXJlKFwiLi9jb21tZW50X2xpc3RcIiksXG4gICAgICAgIE1hcmtlciA9IHJlcXVpcmUoXCIuL21hcmtlclwiKSxcbiAgICAgICAgQ29tbWVudCA9IHJlcXVpcmUoXCIuL2NvbW1lbnRcIiksXG4gICAgICAgIFNoYXBlID0gcmVxdWlyZShcIi4vc2hhcGVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQW5ub3RhdGlvbiBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWQgfHwgdGhpcy5jb21wb25lbnRJZDtcbiAgICAgICAgdGhpcy5yYW5nZSA9IGRhdGEucmFuZ2U7XG4gICAgICAgIHRoaXMuc2hhcGUgPSBkYXRhLnNoYXBlO1xuICAgICAgICB0aGlzLnNlY29uZHNBY3RpdmUgPSB0aGlzLmJ1aWxkU2Vjb25kc0FjdGl2ZUFycmF5KCk7XG4gICAgICAgIHRoaXMuYnVpbGRDb21tZW50cyhkYXRhKTtcbiAgICAgICAgdGhpcy5idWlsZE1hcmtlcigpO1xuICAgICAgICB0aGlzLmJ1aWxkU2hhcGUoKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBidWlsZENvbW1lbnRzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jb21tZW50TGlzdCA9IG5ldyBDb21tZW50TGlzdChcbiAgICAgICAgICAgIHtcImNvbW1lbnRzXCI6IGRhdGEuY29tbWVudHMsIFwiYW5ub3RhdGlvblwiOiB0aGlzfSxcbiAgICAgICAgICAgIHRoaXMucGxheWVyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYnVpbGRNYXJrZXIgKCkge1xuICAgICAgICB0aGlzLm1hcmtlciA9IG5ldyBNYXJrZXIodGhpcy5wbGF5ZXIsIHRoaXMucmFuZ2UsIHRoaXMuY29tbWVudExpc3QuY29tbWVudHNbMF0pO1xuICAgICAgICB0aGlzLm1hcmtlci5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBidWlsZFNoYXBlKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TaGFwZSA9IG5ldyBTaGFwZSh0aGlzLnBsYXllciwgdGhpcy5zaGFwZSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG9iamVjdFxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiAgICAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICByYW5nZTogICAgICB0aGlzLnJhbmdlLFxuICAgICAgICAgICAgc2hhcGU6ICAgICAgdGhpcy5zaGFwZSxcbiAgICAgICAgICAgIGNvbW1lbnRzOiAgIHRoaXMuY29tbWVudExpc3QuZGF0YVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICB0aGlzLm1hcmtlci4kZWwub24oJ2NsaWNrLnZhYy1tYXJrZXInLCAoZSkgPT4gdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLm9wZW5Bbm5vdGF0aW9uKHRoaXMsIHRydWUpKTtcbiAgICB9XG5cbiAgICAvLyBPcGVucyB0aGUgYW5ub3RhdGlvbi4gSGFuZGxlcyBtYXJrZXIsIGNvbW1lbnRMaXN0LCBzaGFwZSwgQW5ub3RhdGlvbiBzdGF0ZSwgYW5kIHBsYXllciBzdGF0ZVxuICAgIG9wZW4gKHdpdGhQYXVzZT10cnVlLCBwcmV2aWV3T25seT1mYWxzZSwgZm9yY2VTbmFwVG9TdGFydD1mYWxzZSkge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNuYXBUb1N0YXJ0ID0gZm9yY2VTbmFwVG9TdGFydCB8fCAhVXRpbHMuaXNXaXRoaW5SYW5nZShcbiAgICAgICAgICAgIHRoaXMucmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICB0aGlzLnJhbmdlLmVuZCxcbiAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGltZSlcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgc2hvd1Rvb2x0aXAgPSBwcmV2aWV3T25seSAmJiB0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dNYXJrZXJTaGFwZUFuZFRvb2x0aXBzO1xuICAgICAgICB0aGlzLm1hcmtlci5zZXRBY3RpdmUoc2hvd1Rvb2x0aXApO1xuICAgICAgICBpZighcHJldmlld09ubHkgJiYgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29tbWVudExpc3Qpe1xuICAgICAgICAgICAgdGhpcy5jb21tZW50TGlzdC5yZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFwcmV2aWV3T25seSB8fCAocHJldmlld09ubHkgJiYgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93TWFya2VyU2hhcGVBbmRUb29sdGlwcykpe1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUucmVuZGVyKCk7XG5cbiAgICAgICAgICAgIGlmKHRoaXMuc2hhcGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TaGFwZS4kZWwub24oXCJjbGljay52YWMtYW5ub3RhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5vcGVuQW5ub3RhdGlvbih0aGlzLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHdpdGhQYXVzZSkgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgaWYoc25hcFRvU3RhcnQpIHRoaXMuY3VycmVudFRpbWUgPSB0aGlzLnJhbmdlLnN0YXJ0O1xuXG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2Fubm90YXRpb25PcGVuZWQnLCB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uOiB0aGlzLmRhdGEsXG4gICAgICAgICAgICB0cmlnZ2VyZWRfYnlfdGltZWxpbmU6IHByZXZpZXdPbmx5XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsb3NlcyB0aGUgYW5ub3RhdGlvbi4gSGFuZGxlcyBtYXJrZXIsIGNvbW1lbmRMaXN0LCBzaGFwZSwgYW5kIEFubm90YXRpb25TdGF0ZVxuICAgIGNsb3NlIChjbGVhckFjdGl2ZT10cnVlKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcmtlci5kZWFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMuY29tbWVudExpc3QudGVhcmRvd24oZmFsc2UpO1xuICAgICAgICBpZih0aGlzLmFubm90YXRpb25TaGFwZS4kZWwpIHRoaXMuYW5ub3RhdGlvblNoYXBlLiRlbC5vZmYoXCJjbGljay52YWMtYW5ub3RhdGlvblwiKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUudGVhcmRvd24oKTtcbiAgICAgICAgaWYoY2xlYXJBY3RpdmUpIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5jbGVhckFjdGl2ZSgpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhbm5vdGF0aW9uQ2xvc2VkJywgdGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgcHJlbG9hZGluZyBhbiBhcnJheSBvZiBzZWNvbmRzIGFjdGl2ZSBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFZhbHVlcyB1c2VkIHRvIGJ1aWxkIHRpbWVNYXAgaW4gQW5ub3RhdGlvblN0YXRlXG4gICAgYnVpbGRTZWNvbmRzQWN0aXZlQXJyYXkgKCkge1xuICAgICAgICBsZXQgc2Vjb25kcyA9IFtdO1xuICAgICAgICBpZighIXRoaXMucmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5yYW5nZS5zdGFydDsgaSA8PSB0aGlzLnJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2Vjb25kcy5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIHNlY29uZHMucHVzaChzdGFydCk7XG4gICAgICAgICAgICBpZihzdGFydCA8IHRoaXMuZHVyYXRpb24pIHNlY29uZHMucHVzaChzdGFydCsxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2Vjb25kcztcbiAgICB9XG5cbiAgICAvLyBUZWFyc2Rvd24gYW5ub3RhdGlvbiBhbmQgbWFya2VyLCByZW1vdmVzIG9iamVjdCBmcm9tIEFubm90YXRpb25TdGF0ZVxuICAgIHRlYXJkb3duIChyZW1vdmVGcm9tQ29sbGVjdGlvbj10cnVlKSB7XG4gICAgICAgIHRoaXMuY2xvc2UodHJ1ZSk7XG4gICAgICAgIHRoaXMubWFya2VyLnRlYXJkb3duKCk7XG4gICAgICAgIGlmKHRoaXMuY29tbWVudExpc3QpIHRoaXMuY29tbWVudExpc3QudGVhcmRvd24ocmVtb3ZlRnJvbUNvbGxlY3Rpb24pO1xuICAgICAgICBpZihyZW1vdmVGcm9tQ29sbGVjdGlvbikgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLnJlbW92ZUFubm90YXRpb24odGhpcyk7XG4gICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvblNoYXBlKSB0aGlzLmFubm90YXRpb25TaGFwZS50ZWFyZG93bigpO1xuICAgICAgICBpZihyZW1vdmVGcm9tQ29sbGVjdGlvbikgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBhIG5ldyBhbm5vdGF0aW9uIGluc3RhbmNlIGJ5IHBhc3NpbmcgaW4gZGF0YSBmb3IgcmFuZ2UsIHNoYXBlLCBjb21tZW50LCAmIHBsdWdpbiByZWZcbiAgICBzdGF0aWMgbmV3RnJvbURhdGEgKHJhbmdlLCBzaGFwZSwgY29tbWVudFN0ciwgcGx1Z2luLCBpZD1udWxsKSB7XG4gICAgICAgIGxldCBjb21tZW50ID0gQ29tbWVudC5kYXRhT2JqKGNvbW1lbnRTdHIsIHBsdWdpbik7XG4gICAgICAgIGlmKHJhbmdlKSByYW5nZSA9IFV0aWxzLnBhcnNlSW50T2JqKHJhbmdlKTtcbiAgICAgICAgaWYoc2hhcGUpIHNoYXBlID0gVXRpbHMucGFyc2VJbnRPYmooc2hhcGUpO1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgIGNvbW1lbnRzOiBbY29tbWVudF1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uKGRhdGEsIHBsdWdpbi5wbGF5ZXIpO1xuICAgIH1cblxuICAgIGdldCBpc0FjdGl2ZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuYWN0aXZlQW5ub3RhdGlvbiA9PT0gdGhpcztcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBtYW5hZ2luZyB0aGUgc3RhdGUgb2YgYW5ub3RhdGlvbnMsIGluY2x1ZGluZyBzaG93aW5nIGFjdGl2ZSBhbm5vdGF0aW9uIGR1cmluZyBwbGF5YmFjayxcbiAgICB0b2dnbGluZyBhY3RpdmUgc3RhdGVzIGZvciBhbm5vdGF0aW9ucywgbmF2aWdhdGluZyBhbm5vdGF0aW9ucyBmb3J3YXJkL2JhY2ssIGV0Y1xuKi9cblxuY29uc3QgICBVdGlscyA9IHJlcXVpcmUoJy4vLi4vbGliL3V0aWxzJyksXG4gICAgICAgIFBsYXllckNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfY29tcG9uZW50XCIpLFxuICAgICAgICBBbm5vdGF0aW9uID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBBbm5vdGF0aW9uU3RhdGUgZXh0ZW5kcyBQbGF5ZXJDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllcikge1xuICAgICAgICBzdXBlcihwbGF5ZXIpO1xuICAgICAgICB0aGlzLmluaXRBUEkodGhpcywgJ0Fubm90YXRpb25TdGF0ZScpO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICAvLyBzZXRzIF9lbmFibGVkIGFuZCBjbG9zZXMgb3Igb3BlbnMgYW5ub3RhdGlvbiBhcyBuZWVkZWRcbiAgICBzZXQgZW5hYmxlZCAoc2hvdWxkQmVFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBzaG91bGRCZUVuYWJsZWQ7XG4gICAgICAgIGlmKCFzaG91bGRCZUVuYWJsZWQpIHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5jbG9zZSgpO1xuICAgICAgICBpZihzaG91bGRCZUVuYWJsZWQpe1xuICAgICAgICAgICAgdGhpcy5za2lwTGl2ZUNoZWNrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldExpdmVBbm5vdGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZW5hYmxlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8vIFNldHMgX2Fubm90YXRpb25zIHcvQW5ub2F0aW9uIG9iamVjdHMgZnJvbSBpbnB1dCBhcnJheVxuICAgIHNldCBhbm5vdGF0aW9ucyAoYW5ub3RhdGlvbnNEYXRhKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnNEYXRhLm1hcCgoYSkgPT4gbmV3IEFubm90YXRpb24oYSwgdGhpcy5wbGF5ZXIpKTtcbiAgICAgICAgdGhpcy5zb3J0QW5ub3RhdGlvbnMoKTtcbiAgICAgICAgdGhpcy5yZWJ1aWxkQW5ub3RhdGlvblRpbWVNYXAoKTtcbiAgICB9XG5cbiAgICBnZXQgYW5ub3RhdGlvbnMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuXG4gICAgc2V0IGFjdGl2ZUFubm90YXRpb24gKGFubm90YXRpb249bnVsbCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBHZXQgY3VycmVudCBhY3RpdmUgYW5ub3RhdGlvbiBvciBhIG51bGwgb2JqZWN0IHdpdGggLmNsb3NlKClcbiAgICBnZXQgYWN0aXZlQW5ub3RhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVBbm5vdGF0aW9uIHx8IHsgY2xvc2U6ICgoKSA9PiB7fSkgfTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgZGF0YVxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zLm1hcCgoYSkgPT4gYS5kYXRhKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGV2ZW50cyBmb3Igc2V0dGluZyBsaXZlQW5ub3RhdGlvbiBvbiB2aWRlbyB0aW1lIGNoYW5nZVxuICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICB0aGlzLnBsYXllci5vbihcInRpbWV1cGRhdGVcIiwgVXRpbHMudGhyb3R0bGUodGhpcy5zZXRMaXZlQW5ub3RhdGlvbi5iaW5kKHRoaXMpLCAxMDApKTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGFubm90YXRpb25zIGJ5IHJhbmdlLnN0YXJ0XG4gICAgc29ydEFubm90YXRpb25zICgpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydCA8IGIucmFuZ2Uuc3RhcnQgPyAtMSA6IChhLnJhbmdlLnN0YXJ0ID4gYi5yYW5nZS5zdGFydCA/IDEgOiAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgbmV3IGFubm90YXRpb25cbiAgICBhZGROZXdBbm5vdGF0aW9uIChhbm5vdGF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7XG4gICAgICAgIHRoaXMub3BlbkFubm90YXRpb24oYW5ub3RhdGlvbiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbmQgYWRkIGEgYW5ub3RhdGlvblxuICAgIGNyZWF0ZUFuZEFkZEFubm90YXRpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4uY29udHJvbHMudWlTdGF0ZS5hZGRpbmcgJiYgdGhpcy5wbHVnaW4uY29udHJvbHMuY2FuY2VsQWRkTmV3KCk7XG5cbiAgICAgICAgbGV0IGFubm90YXRpb24gPSBBbm5vdGF0aW9uLm5ld0Zyb21EYXRhKFxuICAgICAgICAgICAgZGF0YS5yYW5nZSxcbiAgICAgICAgICAgIGRhdGEuc2hhcGUsXG4gICAgICAgICAgICBkYXRhLmNvbW1lbnRTdHIgfHwgXCJcIixcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLFxuICAgICAgICAgICAgZGF0YS5pZFxuICAgICAgICApXG4gICAgICAgIHRoaXMuYWRkTmV3QW5ub3RhdGlvbihhbm5vdGF0aW9uKVxuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYW4gZXhpc3RpbmcgYW5ub3RhdGlvblxuICAgIGRlc3Ryb3lBbm5vdGF0aW9uQnlJZCAoaWQpIHtcbiAgICAgICAgbGV0IGFubm90YXRpb24gPSB0aGlzLmZpbmRBbm5vdGF0aW9uKGlkKTtcbiAgICAgICAgaWYgKGFubm90YXRpb24pIGFubm90YXRpb24udGVhcmRvd24oKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW4gYW5ub3RhdGlvblxuICAgIHJlbW92ZUFubm90YXRpb24gKGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkID0gYW5ub3RhdGlvbi5pZCxcbiAgICAgICAgICAgIGkgPSB0aGlzLl9hbm5vdGF0aW9ucy5pbmRleE9mKGFubm90YXRpb24pO1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2Fubm90YXRpb25EZWxldGVkJywge2lkfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBsaXZlIGFubm90YXRpb24gYmFzZWQgb24gY3VycmVudCB2aWRlbyB0aW1lXG4gICAgc2V0TGl2ZUFubm90YXRpb24gKCkge1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XG4gICAgICAgIGxldCB0aW1lID0gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRUaW1lKTtcblxuICAgICAgICBpZih0aGlzLnNraXBMaXZlQ2hlY2spIHtcbiAgICAgICAgICAgIGlmKHRpbWUgIT09IHRoaXMubGFzdFZpZGVvVGltZSkgdGhpcy5za2lwTGl2ZUNoZWNrID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF0Y2hlcyA9IHRoaXMuYWN0aXZlQW5ub3RhdGlvbnNGb3JUaW1lKHRpbWUpO1xuICAgICAgICBpZighbWF0Y2hlcy5sZW5ndGgpIHJldHVybiB0aGlzLmFjdGl2ZUFubm90YXRpb24uY2xvc2UoKTtcblxuICAgICAgICAvLyBTZXQgbGl2ZSBhbm5vdGF0aW9uIGFzIHRoZSBsYXN0IG1hdGNoXG4gICAgICAgIGxldCBsaXZlQW5ub3RhdGlvbiA9IHRoaXMuYW5ub3RhdGlvbnNbbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aC0xXV07XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlcyBpZiB0aGlzIG9yIGFub3RoZXIgYW5ub3RhdGlvbiBpcyBhY3RpdmVcbiAgICAgICAgaWYodGhpcy5hY3RpdmVBbm5vdGF0aW9uLnJhbmdlKSB7XG4gICAgICAgICAgICBpZihsaXZlQW5ub3RhdGlvbiA9PT0gdGhpcy5hY3RpdmVBbm5vdGF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZlIGFubm90YXRpb24gYW5kIGxpdmUgYW5ub3RhdGlvbiBzaGFyZSBhIHN0YXJ0IHRpbWVcbiAgICAgICAgICAgIC8vIElzIHRoYXQgc3RhcnQgdGltZSBhdCB0aGUgY3VycmVudCBwbGF5aGVhZD9cbiAgICAgICAgICAgIC8vIElmIHNvLCBkb24ndCBzd2l0Y2ggd2hpY2ggaXMgYWN0aXZlLlxuICAgICAgICAgICAgbGV0IGxpdmVTdGFydCA9IGxpdmVBbm5vdGF0aW9uLnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGFjdGl2ZVN0YXJ0ID0gdGhpcy5hY3RpdmVBbm5vdGF0aW9uLnJhbmdlLnN0YXJ0O1xuICAgICAgICAgICAgaWYobGl2ZVN0YXJ0ID09PSBhY3RpdmVTdGFydCAmJiBsaXZlU3RhcnQgPT09IHRpbWUpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlbkFubm90YXRpb24obGl2ZUFubm90YXRpb24sIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCBhY3RpdmUgYW5ub3RhdGlvbnMgZm9yIGEgdGltZSAoaW4gc2Vjb25kcylcbiAgICBhY3RpdmVBbm5vdGF0aW9uc0ZvclRpbWUgKHRpbWUpIHtcbiAgICAgICAgaWYoIXRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoKSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25UaW1lTWFwW3RpbWVdIHx8IFtdO1xuICAgIH1cblxuICAgIC8qXG4gICAgICAgIFJlYnVpbGQgdGhlIGFubm90YXRpb24gdGltZSBtYXBcbiAgICAgICAgRXhhbXBsZTogdGhpcy5fYW5ub3RhdGlvbnNbMV0gYW5kIHRoaXMuX2Fubm90YXRpb25zWzNdIGFyZSBhY3RpdmUgZHVyaW5nIHNlY29uZCA0XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25UaW1lTWFwID0geyA0OiBbMSwgM10gfVxuICAgICovXG4gICAgcmVidWlsZEFubm90YXRpb25UaW1lTWFwICgpIHtcbiAgICAgICAgbGV0IHRpbWVNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uLnNlY29uZHNBY3RpdmUuZm9yRWFjaCgoc2Vjb25kKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9ICh0aW1lTWFwW3NlY29uZF0gfHwgW10pO1xuICAgICAgICAgICAgICAgIHZhbC5wdXNoKHRoaXMuYW5ub3RhdGlvbnMuaW5kZXhPZihhbm5vdGF0aW9uKSk7XG4gICAgICAgICAgICAgICAgdGltZU1hcFtzZWNvbmRdID0gdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFubm90YXRpb25UaW1lTWFwID0gdGltZU1hcDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBhY3RpdmUgYW5ub3RhdGlvbiBhbmQgcmVtb3ZlIHJlZmVyZW5jZSBpbiBzdGF0ZVxuICAgIGNsZWFyQWN0aXZlICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVBbm5vdGF0aW9uLmNsb3NlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlQW5ub3RhdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gT3BlbiBhbm5vdGF0aW9uIHdpdGggb3B0aW9ucyB0byBwYXVzZSBhbmQgc2hvdyBwcmV2aWV3XG4gICAgLy8gc2tpcExpdmVDaGVjayB3aWxsIHNob3J0IGNpcmN1aXQgc2V0TGl2ZUFubm90YXRpb24oKVxuICAgIG9wZW5Bbm5vdGF0aW9uIChhbm5vdGF0aW9uLCBza2lwTGl2ZUNoZWNrPWZhbHNlLCBwYXVzZT10cnVlLCBwcmV2aWV3T25seT1mYWxzZSwgZm9yY2VTbmFwVG9TdGFydD1mYWxzZSkge1xuICAgICAgICBpZighdGhpcy5wbHVnaW4uYWN0aXZlKSB0aGlzLnBsdWdpbi50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuICAgICAgICB0aGlzLnNraXBMaXZlQ2hlY2sgPSBza2lwTGl2ZUNoZWNrO1xuICAgICAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICAgIGFubm90YXRpb24ub3BlbihwYXVzZSwgcHJldmlld09ubHksIGZvcmNlU25hcFRvU3RhcnQpO1xuICAgICAgICB0aGlzLmFjdGl2ZUFubm90YXRpb24gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLmxhc3RWaWRlb1RpbWUgPSB0aGlzLmFjdGl2ZUFubm90YXRpb24ucmFuZ2Uuc3RhcnQ7XG4gICAgfVxuXG4gICAgLy8gT3BlbiBhbiBhbm5vdGF0aW9uIGJ5IElEIChpZiBpdCBleGlzdHMpXG4gICAgb3BlbkFubm90YXRpb25CeUlkIChpZCkge1xuICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IHRoaXMuZmluZEFubm90YXRpb24oaWQpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbikgdGhpcy5vcGVuQW5ub3RhdGlvbihhbm5vdGF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGFubm90YXRpb24gb2JqZWN0IGdpdmVuIElEXG4gICAgZmluZEFubm90YXRpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25zLmZpbmQoKGEpID0+IGEuaWQgPT0gaWQpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgY29tbWVudCBvYmplY3QgZ2l2ZW4gSURcbiAgICBmaW5kQ29tbWVudCAoaWQpIHtcbiAgICAgICAgbGV0IGNvbW1lbnRzID0gdGhpcy5hbm5vdGF0aW9ucy5tYXAoKGEpID0+IGEuY29tbWVudExpc3QuY29tbWVudHMpO1xuICAgICAgICBjb21tZW50cyA9IFtdLmNvbmNhdCguLi5jb21tZW50cyk7IC8vIGZsYXR0ZW4gMmQgYXJyYXlcbiAgICAgICAgcmV0dXJuIGNvbW1lbnRzLmZpbmQoKGMpID0+IGMuaWQgPT0gaWQpO1xuICAgIH1cblxuICAgIC8vIEZpbmRzIHRoZSBuZXh0IGFubm90YXRpb24gaW4gY29sbGVjdGlvbiBhbmQgb3BlbnMgaXRcbiAgICBuZXh0QW5ub3RhdGlvbiAoKSB7XG4gICAgICAgIGlmKHRoaXMuX2FjdGl2ZUFubm90YXRpb24pe1xuICAgICAgICAgICAgbGV0IGluZCA9IHRoaXMuYW5ub3RhdGlvbnMuaW5kZXhPZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKSxcbiAgICAgICAgICAgICAgICBuZXh0SW5kID0gKGluZCA9PT0gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMSA/IDAgOiBpbmQrMSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW25leHRJbmRdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGltZSA9IE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGltZSk7XG4gICAgICAgIGZvcihsZXQgaT0wOyBpPHRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgaWYodGhpcy5hbm5vdGF0aW9uc1tpXS5yYW5nZS5zdGFydCA+IHRpbWUpIHJldHVybiB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbaV0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1swXSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gRmluZHMgdGhlIHByZXZpb3VzIGFubm90YXRpb24gaW4gY29sbGVjdGlvbiBhbmQgb3BlbnMgaXRcbiAgICBwcmV2QW5ub3RhdGlvbiAoKSB7XG4gICAgICAgIGlmKHRoaXMuX2FjdGl2ZUFubm90YXRpb24pe1xuICAgICAgICAgICAgbGV0IGluZCA9IHRoaXMuYW5ub3RhdGlvbnMuaW5kZXhPZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgbmV4dEluZCA9IChpbmQgPT09IDAgPyB0aGlzLmFubm90YXRpb25zLmxlbmd0aC0xIDogaW5kLTEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1tuZXh0SW5kXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWUgPSBNYXRoLmZsb29yKHRoaXMuY3VycmVudFRpbWUpO1xuICAgICAgICBmb3IobGV0IGk9dGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMTsgaT49MDsgaS0tKXtcbiAgICAgICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvbnNbaV0ucmFuZ2Uuc3RhcnQgPCB0aW1lKSByZXR1cm4gdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW2ldLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMV0sIHRydWUpO1xuICAgIH1cblxuICAgIC8vIFVzZSBhbnl3aGVyZSB0aGUgYW5ub3RhdGlvbiBkYXRhIGNoYW5nZXNcbiAgICAvLyBDbGVhbnMgaW50ZXJuYWwgc3RhdGUgZGF0YSwgdXBkYXRlcyBwbGF5ZXIgYnV0dG9uLCB0cmlnZ2VycyBjb25maWd1cmFibGUgY2FsbGJhY2tcbiAgICBzdGF0ZUNoYW5nZWQgKCkge1xuICAgICAgICB0aGlzLnNvcnRBbm5vdGF0aW9ucygpO1xuICAgICAgICB0aGlzLnJlYnVpbGRBbm5vdGF0aW9uVGltZU1hcCgpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdvblN0YXRlQ2hhbmdlZCcsIHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgaW50ZXJuYWwgc3RhdGUgcHJvcGVydGllc1xuICAgIHJlc2V0RGF0YSAoKSB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uVGltZU1hcCA9IHt9O1xuICAgICAgICB0aGlzLmFjdGl2ZUFubm90YXRpb24gID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbmFibGVkICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNraXBOZXh0VGltZUNoZWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGFzdFZpZGVvVGltZSAgICAgPSAwO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBVSSBhbmQgdW5iaW5kIGV2ZW50cyBmb3IgdGhpcyBhbmQgY2hpbGQgY29tcG9uZW50c1xuICAgIHRlYXJkb3duKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb24pID0+IHsgYW5ub3RhdGlvbi50ZWFyZG93bihmYWxzZSk7IH0pO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgQ29tcG9uZW50IGZvciBhbiBpbnZpZHVhbCBjb21tZW50XG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpLFxuICAgICAgICB0ZW1wbGF0ZU5hbWUgPSAnY29tbWVudCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQ29tbWVudCBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5jb21tZW50TGlzdCA9IGRhdGEuY29tbWVudExpc3Q7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkIHx8IHRoaXMuY29tcG9uZW50SWQ7XG4gICAgICAgIHRoaXMubWV0YSA9IGRhdGEubWV0YTtcbiAgICAgICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG1vbWVudChkYXRhLm1ldGEuZGF0ZXRpbWUpLnVuaXgoKTtcbiAgICAgICAgdGhpcy50aW1lU2luY2UgPSB0aGlzLnRpbWVTaW5jZSgpO1xuXG4gICAgICAgIHRoaXMuJGVsID0gJCh0aGlzLnJlbmRlcigpKTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgZGF0YVxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgbWV0YTogdGhpcy5tZXRhLFxuICAgICAgICAgICAgYm9keTogdGhpcy5ib2R5XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IEhUTUwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kZWxbMF0ub3V0ZXJIVE1MO1xuICAgIH1cblxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlclRlbXBsYXRlKFxuICAgICAgICAgICAgdGVtcGxhdGVOYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAgICAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgYm9keTogICAgICAgdGhpcy5ib2R5LFxuICAgICAgICAgICAgICAgIG1ldGE6ICAgICAgIHRoaXMubWV0YSxcbiAgICAgICAgICAgICAgICB0aW1lU2luY2U6ICB0aGlzLnRpbWVTaW5jZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aW1lIHNpbmNlIGNvbW1lbnQgdGltZXN0YW1wXG4gICAgdGltZVNpbmNlICgpIHtcbiAgICAgICAgcmV0dXJuIG1vbWVudCh0aGlzLm1ldGEuZGF0ZXRpbWUpLmZyb21Ob3coKTtcbiAgICB9XG5cbiAgICB0ZWFyZG93biAoZGVzdHJveT1mYWxzZSkge1xuICAgICAgICBzdXBlci50ZWFyZG93bihkZXN0cm95KTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBDb21tZW50IG9iaiBnaXZlbiBib2R5IGNvbnRlbnQgYW5kIHBsdWdpbiByZWZlcmVuY2VcbiAgICBzdGF0aWMgbmV3RnJvbURhdGEgKGJvZHksIGNvbW1lbnRMaXN0LCBwbHVnaW4pIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGFPYmooYm9keSwgcGx1Z2luKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50KGRhdGEsIHBsdWdpbi5wbGF5ZXIpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBvYmplY3Qgd2l0aCBwbHVnaW4gZGF0YSwgdGltZXN0YW1wLCB1bmlxdWUgaWQsIGFuZCBib2R5IGNvbnRlbnRcbiAgICBzdGF0aWMgZGF0YU9iaiAoYm9keSwgcGx1Z2luKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXRhOiAgIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWU6IG1vbWVudCgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSwgcGx1Z2luLm1ldGEpLFxuICAgICAgICAgICAgaWQ6ICAgICBVdGlscy5ndWlkKCksXG4gICAgICAgICAgICBib2R5XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICBDb21wb25lbnQgZm9yIGEgbGlzdCBvZiBjb21tZW50cyBpbiBhIHZpc2libGUvYWN0aXZlIGFubm90YXRpb25cbiovXG5cbmNvbnN0ICAgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKFwiLi8uLi9saWIvdXRpbHNcIiksXG4gICAgICAgIENvbW1lbnQgPSByZXF1aXJlKFwiLi9jb21tZW50XCIpLFxuICAgICAgICBjb21tZW50TGlzdFRlbXBsYXRlTmFtZSA9ICdjb21tZW50X2xpc3QnLFxuICAgICAgICBuZXdDb21tZW50VGVtcGxhdGVOYW1lID0gJ25ld19jb21tZW50JztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBDb21tZW50TGlzdCBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcblxuICAgICAgICB0aGlzLmFubm90YXRpb24gPSBkYXRhLmFubm90YXRpb247XG4gICAgICAgIHRoaXMuY29tbWVudHMgPSBkYXRhLmNvbW1lbnRzLm1hcCgoY29tbWVudERhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbW1lbnREYXRhLmNvbW1lbnRMaXN0ID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbWVudChjb21tZW50RGF0YSwgcGxheWVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ydENvbW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG9iamVjdFxuICAgIGdldCBkYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudHMubWFwKChjKSA9PiBjLmRhdGEpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgYWxsIGV2ZW50cyBuZWVkZWQgZm9yIHRoZSBjb21tZW50IGxpc3RcbiAgICBiaW5kTGlzdEV2ZW50cyAoKSB7XG4gICAgICAgIHRoaXMuJGVsXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29tbWVudFwiLCBcIi52YWMtY2xvc2UtY29tbWVudC1saXN0XCIsICgoKSA9PiB0aGlzLmFubm90YXRpb24uY2xvc2UoKSkuYmluZCh0aGlzKSkgLy8gSGlkZSBDb21tZW50TGlzdCBVSSB3aXRoIGNsb3NlIGJ1dHRvblxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLXJlcGx5LWJ0blwiLCB0aGlzLmFkZE5ld0NvbW1lbnQuYmluZCh0aGlzKSkgLy8gT3BlbiBuZXcgcmVwbHkgVUkgd2l0aCByZXBseSBidXR0b25cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1kZWxldGUtYW5ub3RhdGlvblwiLCB0aGlzLmhhbmRsZURlbGV0ZUFubm90YXRpb25DbGljay5iaW5kKHRoaXMpKSAvLyBEZWxldGUgYW5ub3RhdGlvbiB3aXRoIG1haW4gZGVsZXRlIGJ1dHRvblxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLWRlbGV0ZS1jb21tZW50XCIsIHRoaXMuZGVzdHJveUNvbW1lbnQuYmluZCh0aGlzKSkgLy8gRGVsZXRlIGNvbW1lbnQgd2l0aCBkZWxldGUgY29tbWVudCBidXR0b25cbiAgICAgICAgICAgIC5vbihcIm1vdXNld2hlZWwudmFjLWNvbW1lbnQgRE9NTW91c2VTY3JvbGwudmFjLWNvbW1lbnRcIiwgXCIudmFjLWNvbW1lbnRzLXdyYXBcIiwgdGhpcy5kaXNhYmxlUGFnZVNjcm9sbC5iaW5kKHRoaXMpKTsgLy8gUHJldmVudCBvdXRlciBwYWdlIHNjcm9sbCB3aGVuIHNjcm9sbGluZyBpbnNpZGUgb2YgdGhlIENvbW1lbnRMaXN0IFVJXG4gICAgfVxuXG4gICAgLy8gQmluZCBldmVudCBsaXN0ZW5lcnMgZm9yIG5ldyBjb21tZW50cyBmb3JtXG4gICAgYmluZENvbW1lbnRGb3JtRXZlbnRzICgpIHtcbiAgICAgICAgdGhpcy4kbmV3Q29tbWVudEZvcm1cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1hZGQtY29udHJvbHMgYSwgLnZhYy12aWRlby13cml0ZS1uZXcudmFjLWlzLWNvbW1lbnQgYVwiLCB0aGlzLmNsb3NlTmV3Q29tbWVudC5iaW5kKHRoaXMpKSAvLyBDYW5jZWwgbmV3IGNvbW1lbnQgY3JlYXRpb24gd2l0aCBjYW5jZWwgbGlua1xuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLXZpZGVvLXdyaXRlLW5ldy52YWMtaXMtY29tbWVudCBidXR0b25cIiwgdGhpcy5zYXZlTmV3Q29tbWVudC5iaW5kKHRoaXMpKTsgLy8gU2F2ZSBuZXcgY29tbWVudCB3aXRoIHNhdmUgYnV0dG9uXG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIENvbW1lbnRMaXN0IFVJIHdpdGggYWxsIGNvbW1lbnRzIHVzaW5nIHRlbXBsYXRlXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgdGhpcy4kZWwgPSAkKHRoaXMucmVuZGVyVGVtcGxhdGUoXG4gICAgICAgICAgICBjb21tZW50TGlzdFRlbXBsYXRlTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tZW50c0hUTUw6IHRoaXMuY29tbWVudHMubWFwKChjKSA9PiBjLkhUTUwpLFxuICAgICAgICAgICAgICAgIHJhbmdlU3RyOiBVdGlscy5odW1hblRpbWUodGhpcy5hbm5vdGF0aW9uLnJhbmdlKVxuICAgICAgICAgICAgfVxuICAgICAgICApKTtcblxuICAgICAgICB0aGlzLiRwbGF5ZXIuYXBwZW5kKHRoaXMuJGVsKTtcbiAgICAgICAgdGhpcy4kd3JhcCA9IHRoaXMuJFVJLmNvbW1lbnRzQ29udGFpbmVyO1xuICAgICAgICB0aGlzLmJpbmRMaXN0RXZlbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gUmUtcmVuZGVyIFVJIG9uIHN0YXRlIGNoYW5nZVxuICAgIHJlUmVuZGVyICgpIHtcbiAgICAgICAgdGhpcy50ZWFyZG93bihmYWxzZSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIG5ldyBjb21tZW50IGZvcm1cbiAgICBhZGROZXdDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy4kd3JhcC5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKS5maW5kKFwiLnZhYy1jb21tZW50cy13cmFwXCIpLnNjcm9sbFRvcCg5OTk5OTkpO1xuICAgICAgICB2YXIgJHNoYXBlYm94ID0gdGhpcy4kd3JhcC5maW5kKFwiLnZhYy1hZGQtbmV3LXNoYXBlYm94XCIpLFxuICAgICAgICAgICAgd2lkdGggPSAkc2hhcGVib3gub3V0ZXJXaWR0aCgpLFxuICAgICAgICAgICAgdG9wID0gJHNoYXBlYm94LnBvc2l0aW9uKCkudG9wICsgMTAsXG4gICAgICAgICAgICByaWdodCA9IHRoaXMuJHdyYXAub3V0ZXJXaWR0aCgpIC0gKCRzaGFwZWJveC5wb3NpdGlvbigpLmxlZnQgKyB3aWR0aCk7XG5cbiAgICAgICAgdGhpcy4kbmV3Q29tbWVudEZvcm0gPSAkKHRoaXMucmVuZGVyVGVtcGxhdGUobmV3Q29tbWVudFRlbXBsYXRlTmFtZSwge3dpZHRoLCB0b3AsIHJpZ2h0fSkpO1xuICAgICAgICB0aGlzLmJpbmRDb21tZW50Rm9ybUV2ZW50cygpO1xuICAgICAgICB0aGlzLiRwbGF5ZXIuYXBwZW5kKHRoaXMuJG5ld0NvbW1lbnRGb3JtKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIGNvbW1lbnQgZnJvbSBuZXcgY29tbWVudCBmb3JtLCB1cGRhdGUgc3RhdGUgYW5kIHJlLXJlbmRlciBVSVxuICAgIHNhdmVOZXdDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy4kd3JhcC5yZW1vdmVDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKTtcblxuICAgICAgICBsZXQgdXNlcl9pZCA9IDEsXG4gICAgICAgICAgICBib2R5ID0gdGhpcy4kVUkubmV3Q29tbWVudFRleHRhcmVhLnZhbCgpO1xuXG4gICAgICAgIGlmKCFib2R5KSByZXR1cm47IC8vIGVtcHR5IGNvbW1lbnQgLSBUT0RPIGFkZCB2YWxpZGF0aW9uIC8gZXJyIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5jcmVhdGVDb21tZW50KGJvZHkpO1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbW1lbnQgKGJvZHkpIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBDb21tZW50Lm5ld0Zyb21EYXRhKGJvZHksIHRoaXMsIHRoaXMucGx1Z2luKTtcbiAgICAgICAgdGhpcy5jb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICB0aGlzLnNvcnRDb21tZW50cygpO1xuXG4gICAgICAgIC8vIERvbid0IG11dGF0ZSBVSSBpZiBjb21tZW50IGlzIGJlaW5nIGNyZWF0ZWQgZm9yIGFuIGluYWN0aXZlIGFubm90YXRpb24gKHZpYSBBUEkpXG4gICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvbi5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZVJlbmRlcihmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTmV3Q29tbWVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLnN0YXRlQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8vIENhbmNlbCBjb21tZW50IGFkZGluZyBwcm9jZXNzXG4gICAgY2xvc2VOZXdDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy51bmJpbmRDb21tZW50Rm9ybUV2ZW50cygpO1xuICAgICAgICBpZih0aGlzLiR3cmFwKSB0aGlzLiR3cmFwLnJlbW92ZUNsYXNzKHRoaXMuVUlfQ0xBU1NFUy5hY3RpdmUpO1xuICAgICAgICBpZih0aGlzLiRuZXdDb21tZW50Rm9ybSkgdGhpcy4kbmV3Q29tbWVudEZvcm0ucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGEgY29tbWVudC4gSWYgaXQgaXMgdGhlIG9ubHkgY29tbWVudCwgZGVsZXRlIHRoZSBhbm5vdGF0aW9uXG4gICAgLy8gVXBkYXRlIHN0YXRlIGFuZCByZS1yZW5kZXIgVUlcbiAgICBkZXN0cm95Q29tbWVudCAoZXZlbnQpIHtcbiAgICAgICAgbGV0IGFubm90YXRpb25JZCA9IHRoaXMuYW5ub3RhdGlvbi5pZDtcbiAgICAgICAgaWYodGhpcy5jb21tZW50cy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLnRlYXJkb3duKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbWVudElkICA9IHRoaXMuZmluZENvbW1lbnRJZChldmVudCksXG4gICAgICAgICAgICAgICAgY29tbWVudCA9IHRoaXMuY29tbWVudHMuZmluZCgoYykgPT4gYy5pZCA9PSBjb21tZW50SWQpLFxuICAgICAgICAgICAgICAgIGkgPSB0aGlzLmNvbW1lbnRzLmluZGV4T2YoY29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHRoaXMucmVSZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5zdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICBmaW5kQ29tbWVudElkIChldmVudCkge1xuICAgICAgICBsZXQgaWQgPSB0eXBlb2YgZXZlbnQuZGV0YWlsLmlkID09PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLnZhYy1jb21tZW50JykuZGF0YSgnaWQnKSA6XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuaWQ7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50cyBvdXRlciBwYWdlIHNjcm9sbCB3aGVuIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIENvbW1lbnRMaXN0IFVJXG4gICAgLy8gVE9ETzogVGhpcyBtaWdodCBuZWVkIHRvIGJlIGZpbmUtdHVuZWQ/XG4gICAgZGlzYWJsZVBhZ2VTY3JvbGwgKGV2ZW50KSB7XG4gICAgICAgIGxldCAkdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgICAgIGhlaWdodCAgPSAkdGFyZ2V0LmhlaWdodCgpLFxuICAgICAgICAgICAgb2dFdmVudCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgICBkZWx0YSAgID0gb2dFdmVudC53aGVlbERlbHRhIHx8IC1vZ0V2ZW50LmRldGFpbCxcbiAgICAgICAgICAgIGRpciAgICAgPSBkZWx0YSA8IDAgPyBcImRvd25cIiA6IFwidXBcIixcbiAgICAgICAgICAgIHNjcm9sbERpZmYgPSBNYXRoLmFicyhldmVudC5jdXJyZW50VGFyZ2V0LnNjcm9sbEhlaWdodCAtIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xpZW50SGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiBzY3JvbGxpbmcgaW50byB0b3Agb2YgZGl2XG4gICAgICAgIGlmICgkdGFyZ2V0LnNjcm9sbFRvcCgpIDwgMjAgJiYgZGlyID09IFwidXBcIikge1xuICAgICAgICAgICAgJHRhcmdldC5zdG9wKCk7XG4gICAgICAgICAgICAkdGFyZ2V0LmFuaW1hdGUoe3Njcm9sbFRvcDogMH0sIDEwMCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2Nyb2xsaW5nIGludG8gYm90dG9tIG9mIGRpdlxuICAgICAgICBpZiAoJHRhcmdldC5zY3JvbGxUb3AoKSA+IChzY3JvbGxEaWZmIC0gMTApICYmIGRpciA9PSBcImRvd25cIikge1xuICAgICAgICAgICAgJHRhcmdldC5zdG9wKCk7XG4gICAgICAgICAgICAkdGFyZ2V0LmFuaW1hdGUoe3Njcm9sbFRvcDogaGVpZ2h0ICsgNDB9LCAxMDApO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgY29tbWVudHMgYnkgdGltZXN0YW1wXG4gICAgc29ydENvbW1lbnRzICgpIHtcbiAgICAgICAgdGhpcy5jb21tZW50cy5zb3J0KChhLGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLnRpbWVzdGFtcCA8IGIudGltZXN0YW1wID8gLTEgOiAoYS50aW1lc3RhbXAgPiBiLnRpbWVzdGFtcCA/IDEgOiAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIHRoZSBhbm5vdGF0aW9uXG4gICAgaGFuZGxlRGVsZXRlQW5ub3RhdGlvbkNsaWNrIChlKSB7XG4gICAgICAgIGxldCAkY29uZmlybUVsID0gJChcIjxhLz5cIikuYWRkQ2xhc3MoXCJ2YWMtZGVsZXRlLWNvbmZpcm1cIikudGV4dChcIkNPTkZJUk1cIik7XG4gICAgICAgICRjb25maXJtRWwub24oXCJjbGljay5jb21tZW50XCIsICgpID0+IHtcbiAgICAgICAgICAgICRjb25maXJtRWwub2ZmKFwiY2xpY2suY29tbWVudFwiKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbi50ZWFyZG93bigpO1xuICAgICAgICB9KTtcbiAgICAgICAgJChlLnRhcmdldCkucmVwbGFjZVdpdGgoJGNvbmZpcm1FbCk7XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGxpc3RlbmVycyBmb3IgbmV3IGNvbW1lbnRzIGZvcm1cbiAgICB1bmJpbmRDb21tZW50Rm9ybUV2ZW50cyAoKSB7XG4gICAgICAgIGlmKHRoaXMuJG5ld0NvbW1lbnRGb3JtKSB0aGlzLiRuZXdDb21tZW50Rm9ybS5vZmYoXCJjbGljay52YWMtY29tbWVudFwiKTtcbiAgICB9XG5cbiAgICAvLyBUZWFyZG93biBDb21tZW50TGlzdCBVSSwgdW5iaW5kIGV2ZW50c1xuICAgIHRlYXJkb3duIChkZXN0cm95Q29tbWVudHM9dHJ1ZSkge1xuICAgICAgICBpZih0aGlzLiRlbCkge1xuICAgICAgICAgICAgdGhpcy4kZWwub2ZmKFwiY2xpY2sudmFjLWNvbW1lbnQgbW91c2V3aGVlbC52YWMtY29tbWVudCBET01Nb3VzZVNjcm9sbC52YWMtY29tbWVudFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1lbnRzLmZvckVhY2goKGMpID0+IGMudGVhcmRvd24oZGVzdHJveUNvbW1lbnRzKSk7XG4gICAgICAgIGlmKGRlc3Ryb3lDb21tZW50cykgdGhpcy5jb21tZW50cyA9IFtdO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIG1hbmFnaW5nIGFubm90YXRpb24gXCJjb250cm9sIGJveFwiIGluIHVwcGVyIGxlZnQgb2YgdmlkZW8gd2hlbiBpbiBhbm5vdGF0aW9uIG1vZGUsXG4gICAgaW5jbHVkaW5nIGFsbCBmdW5jdGlvbmFsaXR5IHRvIGFkZCBuZXcgYW5ub3RhdGlvbnNcbiovXG5cbmNvbnN0ICAgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKFwiLi8uLi9saWIvdXRpbHNcIiksXG4gICAgICAgIERyYWdnYWJsZU1hcmtlciA9IHJlcXVpcmUoXCIuL2RyYWdnYWJsZV9tYXJrZXIuanNcIiksXG4gICAgICAgIFNlbGVjdGFibGVTaGFwZSA9IHJlcXVpcmUoXCIuL3NlbGVjdGFibGVfc2hhcGUuanNcIiksXG4gICAgICAgIFBsYXllckJ1dHRvbiA9IHJlcXVpcmUoXCIuL3BsYXllcl9idXR0b25cIiksXG4gICAgICAgIEFubm90YXRpb24gPSByZXF1aXJlKFwiLi9hbm5vdGF0aW9uXCIpLFxuICAgICAgICB0ZW1wbGF0ZU5hbWUgPSAnY29udHJvbHMnO1xuXG4vLyBDb250cm9sIHVzZXMgYSBcInVpIHN0YXRlXCIgdG8gZGV0ZXJtaW5lIGhvdyBVSSBpcyByZW5kZXJlZCAtIHRoaXMgb2JqZWN0IGlzIHRoZSBiYXNlIHN0YXRlLCBjb250YWluaW5nIGFcbi8vIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgc3RhdGVcbmNvbnN0IEJBU0VfVUlfU1RBVEUgPSBPYmplY3QuZnJlZXplKHtcbiAgICBhZGRpbmc6IGZhbHNlLCAgICAgICAgICAvLyBBcmUgd2UgY3VycmVudGx5IGFkZGluZyBhIG5ldyBhbm5vdGF0aW9uPyAoc3RlcCAxIG9mIGZsb3cpXG4gICAgd3JpdGluZ0NvbW1lbnQ6IGZhbHNlICAgLy8gQXJlIHdlIGN1cnJlbnRseSB3cml0aW5nIHRoZSBjb21tZW50IGZvciBhbm5vdGF0aW9uIChzdGVwIDIgb2YgZmxvdylcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIENvbnRyb2xzIGV4dGVuZHMgUGxheWVyVUlDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllciwgYmluZEFycm93S2V5cykge1xuICAgICAgICBzdXBlcihwbGF5ZXIpO1xuICAgICAgICB0aGlzLmluaXRBUEkodGhpcywgJ0NvbnRyb2xzJyk7XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbENvbW1lbnRpbmcgPSB0aGlzLnBsdWdpbi5vcHRpb25zLmludGVybmFsQ29tbWVudGluZztcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSB0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scztcbiAgICAgICAgdGhpcy51aVN0YXRlID0gVXRpbHMuY2xvbmVPYmplY3QoQkFTRV9VSV9TVEFURSk7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cyhiaW5kQXJyb3dLZXlzKTtcblxuICAgICAgICBpZih0aGlzLnNob3dDb250cm9scyl7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcGxheWVyIGJ1dHRvbiBpbiB0aGUgY29udHJvbCBiYXIgaWYgY29udHJvbHMgYXJlIHNob3duXG4gICAgICAgICAgICB0aGlzLnBsYXllckJ1dHRvbiA9IG5ldyBQbGF5ZXJCdXR0b24odGhpcy5wbGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGFsbCB0aGUgZXZlbnRzIHdlIG5lZWQgZm9yIFVJIGludGVyYWN0aW9uXG4gICAgYmluZEV2ZW50cyAoYmluZEFycm93S2V5cykge1xuICAgICAgICB0aGlzLiRwbGF5ZXIub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWNvbnRyb2xzIGJ1dHRvblwiLCB0aGlzLnN0YXJ0QWRkTmV3LmJpbmQodGhpcykpIC8vIEFkZCBuZXcgYnV0dG9uIGNsaWNrXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFubm90YXRpb24tbmF2IC52YWMtYS1uZXh0XCIsICgpID0+IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5uZXh0QW5ub3RhdGlvbigpICkgLy8gQ2xpY2sgJ25leHQnIG9uIGFubm90YXRpb24gbmF2XG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFubm90YXRpb24tbmF2IC52YWMtYS1wcmV2XCIsICgpID0+IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5wcmV2QW5ub3RhdGlvbigpICkgLy8gQ2xpY2sgJ3ByZXYnIG9uIGFubm90YXRpb24gbmF2XG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLXZpZGVvLW1vdmUgLnZhYy1hLW5leHRcIiwgKCkgPT4gdGhpcy5tYXJrZXIuc2NydWJTdGFydCgxKSApIC8vIENsaWNrICcrMSBzZWMnIG9uIG1hcmtlciBuYXZcbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb250cm9sc1wiLCBcIi52YWMtdmlkZW8tbW92ZSAudmFjLWEtcHJldlwiLCAoKSA9PiB0aGlzLm1hcmtlci5zY3J1YlN0YXJ0KC0xKSApOyAvLyBDbGljayAnLTEgc2VjJyBvbiBtYXJrZXIgbmF2XG5cbiAgICAgICAgaWYodGhpcy5pbnRlcm5hbENvbW1lbnRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuJHBsYXllci5vbihcImNsaWNrLnZhYy1jb250cm9sc1wiLCBcIi52YWMtYWRkLWNvbnRyb2xzIGJ1dHRvblwiLCB0aGlzLndyaXRlQ29tbWVudC5iaW5kKHRoaXMpKSAvLyAnTmV4dCcgYnV0dG9uIGNsaWNrIHdoaWxlIGFkZGluZ1xuICAgICAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb250cm9sc1wiLCBcIi52YWMtdmlkZW8td3JpdGUtbmV3LnZhYy1pcy1hbm5vdGF0aW9uIGJ1dHRvblwiLCB0aGlzLnNhdmVOZXcuYmluZCh0aGlzKSkgLy8gJ1NhdmUnIGJ1dHRvbiBjbGljayB3aGlsZSBhZGRpbmdcbiAgICAgICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFkZC1jb250cm9scyBhLCAudmFjLXZpZGVvLXdyaXRlLW5ldy52YWMtaXMtYW5ub3RhdGlvbiBhXCIsIHRoaXMuY2FuY2VsQWRkTmV3LmJpbmQodGhpcykpIC8vIENhbmNlbCBsaW5rIGNsaWNrXG4gICAgICAgIH1cbiAgICAgICAgaWYoYmluZEFycm93S2V5cyl7XG4gICAgICAgICAgICAkKGRvY3VtZW50KS5vbihga2V5dXAudmFjLW5hdi0ke3RoaXMucGxheWVySWR9YCwgKGUpID0+IHRoaXMuaGFuZGxlQXJyb3dLZXlzKGUpKTsgLy8gVXNlIGFycm93IGtleXMgdG8gbmF2aWdhdGUgYW5ub3RhdGlvbnNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBVSSBhbmQgdW5iaW5kIGV2ZW50cyBmb3IgdGhpcyBhbmQgY2hpbGQgY29tcG9uZW50c1xuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgdGhpcy5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy4kcGxheWVyLm9mZignY2xpY2sudmFjLWNvbnRyb2xzJyk7XG4gICAgICAgICQoZG9jdW1lbnQpLm9mZihga2V5dXAudmFjLW5hdi0ke3RoaXMucGxheWVySWR9IG1vdXNlbW92ZS52YWMtdG9vbHRpcC0ke3RoaXMucGxheWVySWR9YCk7XG4gICAgICAgIGlmKHRoaXMucGxheWVyQnV0dG9uKSB0aGlzLnBsYXllckJ1dHRvbi50ZWFyZG93bigpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGV4aXN0aW5nIFVJIChyZXNldHRpbmcgY29tcG9uZW50cyBpZiBuZWVkIGJlKVxuICAgIGNsZWFyIChyZXNldD1mYWxzZSkge1xuICAgICAgICBpZihyZXNldCl7XG4gICAgICAgICAgICBpZih0aGlzLnVpU3RhdGUuYWRkaW5nKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVOb3JtYWxVSSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFya2VyLnRlYXJkb3duKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlU2hhcGUudGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudWlTdGF0ZSA9IFV0aWxzLmNsb25lT2JqZWN0KEJBU0VfVUlfU1RBVEUpO1xuICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtdmlkZW8tY292ZXItY2FudmFzJylcbiAgICAgICAgICAgICAgICAub2ZmKCdtb3VzZWRvd24udmFjLWN1cnNvci10b29sdGlwJylcbiAgICAgICAgICAgICAgICAub2ZmKCdtb3VzZXVwLnZhYy1jdXJzb3ItdG9vbHRpcCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuJHRvb2x0aXBfID0gbnVsbDtcbiAgICAgICAgdGhpcy4kVUkuY29udHJvbEVsZW1lbnRzLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciB0aGUgVUkgZWxlbWVudHMgKGJhc2VkIG9uIHVpU3RhdGUpXG4gICAgcmVuZGVyIChyZXNldD1mYWxzZSkge1xuICAgICAgICB0aGlzLmNsZWFyKHJlc2V0KTtcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJhbmdlU3RyOiB0aGlzLm1hcmtlciA/IFV0aWxzLmh1bWFuVGltZSh0aGlzLm1hcmtlci5yYW5nZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNob3dOYXY6IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5hbm5vdGF0aW9ucy5sZW5ndGggPiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy51aVN0YXRlLFxuICAgICAgICAgICAgeyBpbnRlcm5hbENvbW1lbnRpbmc6IHRoaXMuaW50ZXJuYWxDb21tZW50aW5nLCBzaG93Q29udHJvbHM6IHRoaXMuc2hvd0NvbnRyb2xzIH1cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgJGN0cmxzID0gdGhpcy5yZW5kZXJUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIGRhdGEpO1xuICAgICAgICB0aGlzLiRwbGF5ZXIuYXBwZW5kKCRjdHJscyk7XG5cbiAgICAgICAgaWYodGhpcy5wbGF5ZXJCdXR0b24pIHRoaXMucGxheWVyQnV0dG9uLnVwZGF0ZU51bUFubm90YXRpb25zKCk7XG4gICAgfVxuXG4gICAgLy8gVXNlciBjbGlja2VkIHRvIGNhbmNlbCBpbi1wcm9ncmVzcyBhZGQgLSByZXN0b3JlIHRvIG5vcm1hbCBzdGF0ZVxuICAgIGNhbmNlbEFkZE5ldyAoKSB7XG4gICAgICAgIGlmKCEodGhpcy51aVN0YXRlLmFkZGluZyB8fCB0aGlzLnVpU3RhdGUud3JpdGluZ0NvbW1lbnQpKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgICB0aGlzLm1hcmtlci50ZWFyZG93bigpO1xuICAgICAgICB0aGlzLm1hcmtlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlciBjbGlja2VkICdhZGQnIGJ1dHRvbiBpbiB0aGUgY29udHJvbHMgLSBzZXR1cCBVSSBhbmQgbWFya2VyXG4gICAgc3RhcnRBZGROZXcgKCkge1xuICAgICAgICBpZighdGhpcy5wbHVnaW4uYWN0aXZlKSB0aGlzLnBsdWdpbi50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuXG4gICAgICAgIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gICAgICAgIHRoaXMuc2V0QWRkaW5nVUkoKTtcbiAgICAgICAgdGhpcy51aVN0YXRlLmFkZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IG5ldyByYW5nZSBhbmQgY3JlYXRlIG1hcmtlclxuICAgICAgICBsZXQgcmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogcGFyc2VJbnQodGhpcy5jdXJyZW50VGltZSwxMCksXG4gICAgICAgICAgICBzdG9wOiBwYXJzZUludCh0aGlzLmN1cnJlbnRUaW1lLDEwKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcmtlciA9IG5ldyBEcmFnZ2FibGVNYXJrZXIodGhpcy5wbGF5ZXIsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlU2hhcGUgPSBuZXcgU2VsZWN0YWJsZVNoYXBlKHRoaXMucGxheWVyKTtcblxuICAgICAgICAvLyBzaG93IGN1cnNvciBoZWxwIHRleHQgaWYgY29udHJvbHMgYXJlIGhpZGRlblxuICAgICAgICBpZighdGhpcy5zaG93Q29udHJvbHMpIHRoaXMuYmluZEN1cnNvclRvb2x0aXAoKTtcblxuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdlbnRlcmVkQWRkaW5nQW5ub3RhdGlvbicsIHsgcmFuZ2U6IHJhbmdlIH0pO1xuICAgIH1cblxuICAgIC8vIFVzZXIgY2xpY2tlZCAnbmV4dCcgYWN0aW9uIC0gc2hvdyBVSSB0byB3cml0ZSBjb21tZW50XG4gICAgd3JpdGVDb21tZW50ICgpIHtcbiAgICAgICAgdGhpcy51aVN0YXRlLndyaXRpbmdDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvLyBVc2VyIGNsaWNrZWQgdG8gc2F2ZSBhIG5ldyBhbm5vdGF0aW9uL2NvbW1lbnQgZHVyaW5nIGFkZCBuZXcgZmxvd1xuICAgIHNhdmVOZXcgKCkge1xuICAgICAgICBsZXQgY29tbWVudCA9IHRoaXMuJFVJLm5ld0NvbW1lbnRUZXh0YXJlYS52YWwoKTtcbiAgICAgICAgaWYoIWNvbW1lbnQpIHJldHVybjsgLy8gZW1wdHkgY29tbWVudCAtIFRPRE8gYWRkIHZhbGlkYXRpb24gLyBlcnIgbWVzc2FnZVxuXG4gICAgICAgIGxldCBhID0gQW5ub3RhdGlvbi5uZXdGcm9tRGF0YSh0aGlzLm1hcmtlci5yYW5nZSwgdGhpcy5zZWxlY3RhYmxlU2hhcGUuc2hhcGUsIGNvbW1lbnQsIHRoaXMucGx1Z2luKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmFkZE5ld0Fubm90YXRpb24oYSk7XG5cbiAgICAgICAgdGhpcy5jYW5jZWxBZGROZXcoKTtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2Ugbm9ybWFsIFVJIChoaWRlIG1hcmtlcnMsIGhpZGUgcGxheWJhY2ssIGV0Yykgb24gaW5pdCBhZGQgc3RhdGVcbiAgICBzZXRBZGRpbmdVSSAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzYWJsZVBsYXlpbmdBbmRDb250cm9sKCk7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBub3JtYWwgVUkgYWZ0ZXIgYWRkIHN0YXRlXG4gICAgcmVzdG9yZU5vcm1hbFVJICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmVuYWJsZWQgPSB0aGlzLnBsdWdpbi5hY3RpdmU7XG4gICAgICAgIHRoaXMuZW5hYmxlUGxheWluZ0FuZENvbnRyb2woKTtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLXRvb2x0aXAtJHt0aGlzLnBsYXllcklkfWApO1xuICAgIH1cblxuICAgIC8vIE9uIGFycm93IGtleSBwcmVzcywgbmF2aWdhdGUgdG8gbmV4dCBvciBwcmV2IEFubm90YXRpb25cbiAgICBoYW5kbGVBcnJvd0tleXMgKGUpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLmFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBsZXQga2V5SWQgPSBlLndoaWNoO1xuXG4gICAgICAgIGlmKGtleUlkID09IDM3KSB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUucHJldkFubm90YXRpb24oKTtcbiAgICAgICAgaWYoa2V5SWQgPT0gMzkpIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5uZXh0QW5ub3RhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEFkZHMgaGVscCB0ZXh0IHRvIGN1cnNvciBkdXJpbmcgYW5ub3RhdGlvbiBtb2RlXG4gICAgYmluZEN1cnNvclRvb2x0aXAgKCkge1xuICAgICAgICB0aGlzLnRvb2x0aXBBcmVhID0gVXRpbHMuYXJlYU9mSGlkZGVuRWwodGhpcy4kdG9vbHRpcCwgdGhpcy4kVUkuY292ZXJDYW52YXMsIHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pO1xuXG4gICAgICAgIC8vIEFzc2VydCBib3VuZHMgYXJlIHVwZGF0ZWQgaW4gcGx1Z2luIGluIGNhc2UgcGFnZSB3YXMgbW9kaWZpZWQgc2luY2UgY3JlYXRpb24sIHNvIHRvb2x0aXAgbWF0aCBpcyBjb3JyZWN0XG4gICAgICAgIHRoaXMucGx1Z2luLnNldEJvdW5kcyhmYWxzZSk7XG4gICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZW1vdmUudmFjLXRvb2x0aXAtJHt0aGlzLnBsYXllcklkfWAsIFV0aWxzLnRocm90dGxlKCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5ib3VuZHMpIHJldHVybjtcblxuICAgICAgICAgICAgbGV0IHggPSBldmVudC5wYWdlWCxcbiAgICAgICAgICAgICAgICB5ID0gZXZlbnQucGFnZVksXG4gICAgICAgICAgICAgICAgb3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAgICAgICAoeCA8IHRoaXMucGx1Z2luLmJvdW5kcy5sZWZ0IHx8IHggPiB0aGlzLnBsdWdpbi5ib3VuZHMucmlnaHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh5IDwgdGhpcy5wbHVnaW4uYm91bmRzLnRvcCB8fCB5ID4gdGhpcy5wbHVnaW4uYm91bmRzLmJvdHRvbSksXG4gICAgICAgICAgICAgICAgd2l0aGluQ29udHJvbHMgPSAhb3V0T2ZCb3VuZHMgJiYgeSA+PSB0aGlzLnBsdWdpbi5ib3VuZHMuYm90dG9tV2l0aG91dENvbnRyb2xzLFxuICAgICAgICAgICAgICAgIG1hcmtlckhvdmVyZWQgPSB0aGlzLiR0b29sdGlwLmhhc0NsYXNzKCd2YWMtbWFya2VyLWhvdmVyJyk7XG5cbiAgICAgICAgICAgIGlmKG91dE9mQm91bmRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kdG9vbHRpcC5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKTtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGN1cnNvclggICAgICA9IHggLSB0aGlzLnBsdWdpbi5ib3VuZHMubGVmdCxcbiAgICAgICAgICAgICAgICBjdXJzb3JZICAgICAgPSB5IC0gdGhpcy5wbHVnaW4uYm91bmRzLnRvcCxcbiAgICAgICAgICAgICAgICBtYXJnaW4gICAgICAgPSAxMCxcbiAgICAgICAgICAgICAgICByaWdodEVkZ2UgICAgPSB0aGlzLiRwbGF5ZXIud2lkdGgoKSxcbiAgICAgICAgICAgICAgICBib3R0b21FZGdlICAgPSB0aGlzLiRwbGF5ZXIuaGVpZ2h0KCkgLSB0aGlzLiRVSS5jb250cm9sQmFyLmhlaWdodCgpLFxuICAgICAgICAgICAgICAgIGF0UmlnaHRFZGdlICA9IChjdXJzb3JYICsgdGhpcy50b29sdGlwQXJlYS53aWR0aCArIG1hcmdpbioyKSA+PSByaWdodEVkZ2UsXG4gICAgICAgICAgICAgICAgYXRCb3R0b21FZGdlID0gKGN1cnNvclkgKyB0aGlzLnRvb2x0aXBBcmVhLmhlaWdodCArIG1hcmdpbioyKSA+PSBib3R0b21FZGdlO1xuXG4gICAgICAgICAgICAvLyBpcyB0aGUgdG9vbHRpcCB0b28gY2xvc2UgdG8gdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlP1xuICAgICAgICAgICAgbGV0IHBvc1ggPSBhdFJpZ2h0RWRnZSA/IChyaWdodEVkZ2UgLSB0aGlzLnRvb2x0aXBBcmVhLndpZHRoIC0gbWFyZ2luKSA6IChjdXJzb3JYICsgbWFyZ2luKSxcbiAgICAgICAgICAgICAgICBwb3NZID0gYXRCb3R0b21FZGdlID8gKGJvdHRvbUVkZ2UgLSB0aGlzLnRvb2x0aXBBcmVhLmhlaWdodCAtIG1hcmdpbikgOiAoY3Vyc29yWSArIG1hcmdpbik7XG5cbiAgICAgICAgICAgIC8vIGhpZGUgaWYgdGhlIGN1cnNvciBpcyBvdmVyIHRoZSBjb250cm9sIGJhciBidXQgbm90IGhvdmVyaW5nIG92ZXIgdGhlIGRyYWdnYWJsZSBtYXJrZXJcbiAgICAgICAgICAgIC8vIGFsc28gaGlkZSBpZiBtb3VzZSBpcyBkb3duXG4gICAgICAgICAgICBpZigod2l0aGluQ29udHJvbHMgJiYgIW1hcmtlckhvdmVyZWQpIHx8IHRoaXMuJHRvb2x0aXAuaGFzQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAucmVtb3ZlQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAuY3NzKHtcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb3NYfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3Bvc1l9cHhgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuYmluZCh0aGlzKSwgNTApKTtcbiAgICB9XG5cbiAgICBnZXQgJHRvb2x0aXAgKCkge1xuICAgICAgICB0aGlzLiR0b29sdGlwXyA9IHRoaXMuJHRvb2x0aXBfIHx8IHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpO1xuICAgICAgICByZXR1cm4gdGhpcy4kdG9vbHRpcF87XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYSB0aW1lbGluZSBtYXJrZXIgdGhhdCBpcyBkcmFnZ2FibGUgd2hlbiB1c2VyIGNsaWNrcy9kcmFncyBvbiBpdCwgYW5kIHJlYnVpbGRzIHVuZGVybHlpbmcgcmFuZ2VcbiAgICBhcyBkcmFnIG9jY3Vyc1xuKi9cblxuY29uc3QgICBNYXJrZXIgPSByZXF1aXJlKFwiLi9tYXJrZXJcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi8uLi9saWIvdXRpbHMnKSxcbiAgICAgICAgbWFya2VyVGVtcGxhdGVOYW1lID0gJ2RyYWdnYWJsZV9tYXJrZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIERyYWdnYWJsZU1hcmtlciBleHRlbmRzIE1hcmtlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyLCByYW5nZSkge1xuICAgICAgICBzdXBlcihwbGF5ZXIsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URSAtIHRoaXMgc2hvdWxkbid0IGJlIHJlcXVpcmVkIGFuZCBpcyBhIEhBQ0sgZm9yIGhvdyB0cmFuc3BpbGF0aW9uIHdvcmtzIGluIElFMTBcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU5hbWUgPSBtYXJrZXJUZW1wbGF0ZU5hbWU7ICAgLy8gQ2hhbmdlIHRlbXBsYXRlIGZyb20gYmFzZSBNYXJrZXIgdGVtcGxhdGVcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgLy8gSXMgYSBkcmFnIGFjdGlvbiBjdXJyZW50bHkgb2NjcmluZz9cbiAgICAgICAgdGhpcy5yYW5nZVBpbiA9IHJhbmdlLnN0YXJ0OyAgICAgICAgICAgICAgLy8gV2hhdCdzIHRoZSBvcmlnaW5hbCBwaW5uZWQgdGltZWxpbmUgcG9pbnQgd2hlbiBtYXJrZXIgd2FzIGFkZGVkXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJFVJLm1hcmtlcldyYXA7ICAgICAgIC8vIFNldCBwYXJlbnQgYXMgbWFya2VyIHdyYXBcbiAgICB9XG5cbiAgICAvLyBCaW5kIG5lZWRlZCBldm5ldHMgZm9yIFVJIGludGVyYWN0aW9uXG4gICAgYmluZE1hcmtlckV2ZW50cyAoKSB7XG4gICAgICAgIC8vIE9uIG1vdXNlIGRvd24gaW5pdCBkcmFnXG4gICAgICAgIHRoaXMuJGVsLm9uKCdtb3VzZWRvd24udmFjLW1hcmtlcicsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIFdoZW4gbW91c2UgbW92ZXMgKHdpdGggbW91c2UgZG93bikgY2FsbCBvbkRyYWcsIHRocm90dGxpbmcgdG8gb25jZSBlYWNoIDI1MCBtc1xuICAgICAgICAgICAgJChkb2N1bWVudCkub24oYG1vdXNlbW92ZS52YWMtZG1hcmtlci0ke3RoaXMucGxheWVySWR9YCwgVXRpbHMudGhyb3R0bGUodGhpcy5vbkRyYWcuYmluZCh0aGlzKSwgMjUwKSApO1xuXG4gICAgICAgICAgICAvLyBBZGQgZHJhZyBjbGFzcyB0byBjdXJzb3IgdG9vbHRpcCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndmFjLWN1cnNvci1kcmFnZ2luZycpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBPbiBtb3VzZSB1cCBlbmQgZHJhZyBhY3Rpb24gYW5kIHVuYmluZCBtb3VzZW1vdmUgZXZlbnRcbiAgICAgICAgJChkb2N1bWVudCkub24oYG1vdXNldXAudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWAsIChlKSA9PiB7XG4gICAgICAgICAgICAgaWYoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNlbW92ZS52YWMtZG1hcmtlci0ke3RoaXMucGxheWVySWR9YCk7XG4gICAgICAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgLy8gUmVtb3ZlIGRyYWcgY2xhc3MgYW5kIGhvdmVyIGNsYXNzIGZyb20gY3Vyc29yIHRvb2x0aXAgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgaWYoIXRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndmFjLWN1cnNvci1kcmFnZ2luZycpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT24gbW91c2UgbW91c2UgZW50ZXIsIHNob3cgY3Vyc29yIHRvb2x0aXAgaWYgY29udHJvbHMgYXJlIG5vdCBzaG93blxuICAgICAgICAvLyBUaGlzIGFkZHMgdGhlIGNsYXNzIHdoaWNoIGlzIHBpY2tlZCB1cCBpbiBDb250cm9sc1xuICAgICAgICBpZighdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHMpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIHNlbGYuJGVsXG4gICAgICAgICAgICAgICAgLm9uKCdtb3VzZWVudGVyLnZhYy1jdXJzb3ItdG9vbC10aXAnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLmFkZENsYXNzKCd2YWMtbWFya2VyLWhvdmVyJyk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlbGVhdmUudmFjLWN1cnNvci10b29sLXRpcCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi4kcGxheWVyLmZpbmQoJy52YWMtY3Vyc29yLXRvb2wtdGlwJykucmVtb3ZlQ2xhc3MoJ3ZhYy1tYXJrZXItaG92ZXInKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPbiBkcmFnIGFjdGlvbiwgY2FsY3VsYXRlIG5ldyByYW5nZSBhbmQgcmUtcmVuZGVyIG1hcmtlclxuICAgIG9uRHJhZyAoZSkge1xuICAgICAgICB2YXIgZHJhZ1BlcmNlbnQgPSB0aGlzLnBlcmNlbnRWYWxGcm9tWHBvcyhlLnBhZ2VYKSxcbiAgICAgICAgICAgIHNlY1ZhbCA9IHBhcnNlSW50KHRoaXMuZHVyYXRpb24gKiBkcmFnUGVyY2VudCk7XG5cbiAgICAgICAgaWYoc2VjVmFsID4gdGhpcy5yYW5nZVBpbil7XG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiAgdGhpcy5yYW5nZVBpbixcbiAgICAgICAgICAgICAgICBlbmQ6ICAgIHNlY1ZhbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiAgc2VjVmFsLFxuICAgICAgICAgICAgICAgIGVuZDogICAgdGhpcy5yYW5nZVBpblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhZGRpbmdBbm5vdGF0aW9uRGF0YUNoYW5nZWQnLCB7IHJhbmdlOiB0aGlzLnJhbmdlIH0pO1xuICAgIH1cblxuICAgIC8vIENhbCBwZXJjZW50YWdlIChvZiB2aWRlbykgcG9zaXRpb24gZm9yIGEgcGl4ZWwtYmFzZWQgWCBwb3NpdGlvbiBvbiB0aGUgZG9jdW1lbnRcbiAgICBwZXJjZW50VmFsRnJvbVhwb3MgKHhwb3MpIHtcbiAgICAgICAgdmFyIHggPSBNYXRoLm1heCgwLCB4cG9zIC0gdGhpcy4kcGFyZW50Lm9mZnNldCgpLmxlZnQpLCAvLyBweCB2YWxcbiAgICAgICAgICAgIG1heCA9IHRoaXMuJHBhcmVudC5pbm5lcldpZHRoKCksXG4gICAgICAgICAgICBwZXIgPSAoeCAvIG1heCk7XG4gICAgICAgIGlmKHBlciA+IDEpIHBlciA9IDE7XG4gICAgICAgIGlmKHBlciA8IDApIHBlciA9IDA7XG4gICAgICAgIHJldHVybiBwZXI7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGJvdW5kIGV2ZW50cyBvbiBkZXN0cnVjdG9uXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNlbW92ZS52YWMtZG1hcmtlci0ke3RoaXMucGxheWVySWR9IG1vdXNldXAudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWApO1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ21vdXNlZW50ZXIudmFjLWN1cnNvci10b29sLXRpcCcpO1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ21vdXNlbGVhdmUudmFjLWN1cnNvci10b29sLXRpcCcpO1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ21vdXNlZG93bi52YWMtbWFya2VyJyk7XG4gICAgICAgIHRoaXMuJGVsLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdGhlIHZpZGVvICYgbWFya2VyIHN0YXJ0IGJ5IHNvbWUgbnVtIHNlY29uZHMgKHBvcyBvciBuZWcpXG4gICAgc2NydWJTdGFydCAoc2Vjb25kc0NoYW5nZWQpIHtcbiAgICAgICAgbGV0IG5ld1N0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydCArIHNlY29uZHNDaGFuZ2VkO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lID0gbmV3U3RhcnQ7XG4gICAgICAgIHRoaXMucmFuZ2Uuc3RhcnQgPSBuZXdTdGFydDtcbiAgICAgICAgdGhpcy5yYW5nZVBpbiA9IG5ld1N0YXJ0O1xuICAgICAgICB0aGlzLnRlYXJkb3duKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYWRkaW5nQW5ub3RhdGlvbkRhdGFDaGFuZ2VkJywgeyByYW5nZTogdGhpcy5yYW5nZSB9KTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBhIHRpbWVsaW5lIG1hcmtlciB3aXRoIGNhcGFiaWxpdGllcyB0byByZW5kZXIgb24gdGltZWxpbmUsIGluY2x1ZGluZyB0b29sdGlwIGZvciBjb21tZW50XG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBtYXJrZXJUZW1wbGF0ZU5hbWUgPSAnbWFya2VyJyxcbiAgICAgICAgbWFya2VyV3JhcFRlbXBsYXRlTmFtZSA9ICdtYXJrZXJfd3JhcCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgTWFya2VyIGV4dGVuZHMgUGxheWVyVUlDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllciwgcmFuZ2UsIGNvbW1lbnQ9bnVsbCkge1xuICAgICAgICBzdXBlcihwbGF5ZXIpO1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIHRoaXMudGVtcGxhdGVOYW1lID0gbWFya2VyVGVtcGxhdGVOYW1lO1xuXG4gICAgICAgIGlmKCF0aGlzLiRVSS5tYXJrZXJXcmFwLmxlbmd0aCl7XG4gICAgICAgICAgICB0aGlzLiRVSS50aW1lbGluZS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUZW1wbGF0ZShtYXJrZXJXcmFwVGVtcGxhdGVOYW1lKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0aGlzIG1hcmtlciBhcyBhY3RpdmUgKGhpZ2hsaWdodCkgYW5kIG9wdGlvbmFsbHkgc2hvdyB0b29sdGlwIGFsc29cbiAgICBzZXRBY3RpdmUgKHNob3dUb29sdGlwPWZhbHNlKSB7XG4gICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKHRoaXMuVUlfQ0xBU1NFUy5hY3RpdmUpO1xuICAgICAgICBpZihzaG93VG9vbHRpcCkgdGhpcy4kZWwuYWRkQ2xhc3MoJ3ZhYy1mb3JjZS10b29sdGlwJyk7XG4gICAgfVxuXG4gICAgLy8gRGVhY3RpdmF0ZSB0aGlzIG1hcmtlclxuICAgIGRlYWN0aXZhdGUgKCkge1xuICAgICAgICB0aGlzLiRlbC5yZW1vdmVDbGFzcyhgJHt0aGlzLlVJX0NMQVNTRVMuYWN0aXZlfSB2YWMtZm9yY2UtdG9vbHRpcGApO1xuICAgIH1cblxuICAgIC8vIERyYXcgbWFya2VyIG9uIHRpbWVsaW5lIGZvciB0aGlzLnJhbmdlO1xuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIC8vIGNsZWFyIGV4aXN0aW5nIG1hcmtlciBpZiB0aGlzIG9uZSB3YXMgYWxyZWFkeSByZW5kZXJlZFxuICAgICAgICB0aGlzLiRVSS50aW1lbGluZS5maW5kKGBbZGF0YS1tYXJrZXItaWQ9XCIke3RoaXMuY29tcG9uZW50SWR9XCJdYCkucmVtb3ZlKCk7XG5cbiAgICAgICAgLy8gQmluZCB0byBsb2NhbCBpbnN0YW5jZSB2YXIsIGFkZCB0byBET00sIGFuZCBzZXR1cCBldmVudHNcbiAgICAgICAgdGhpcy4kZWwgPSAkKHRoaXMucmVuZGVyVGVtcGxhdGUodGhpcy50ZW1wbGF0ZU5hbWUsIHRoaXMubWFya2VyVGVtcGxhdGVEYXRhKSk7XG4gICAgICAgIHRoaXMuJFVJLm1hcmtlcldyYXAuYXBwZW5kKHRoaXMuJGVsKTtcbiAgICAgICAgdGhpcy5iaW5kTWFya2VyRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gQmluZCBuZWVkZWQgZXZlbnRzIGZvciB0aGlzIG1hcmtlclxuICAgIGJpbmRNYXJrZXJFdmVudHMgKCkge1xuICAgICAgICAvLyBoYW5kbGUgZGltbWluZyBvdGhlciBtYXJrZXJzICsgaGlnaGxpZ2h0aW5nIHRoaXMgb25lIG9uIG1vdXNlZW50ZXIvbGVhdmVcbiAgICAgICAgdGhpcy4kZWwub24oXCJtb3VzZWVudGVyLnZhYy1tYXJrZXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kZWwuYWRkQ2xhc3MoJ3ZhYy1ob3ZlcmluZycpLmNsb3Nlc3QoXCIudmFjLW1hcmtlci13cmFwXCIpLmFkZENsYXNzKCd2YWMtZGltLWFsbCcpO1xuICAgICAgICB9KS5vbihcIm1vdXNlbGVhdmUudmFjLW1hcmtlclwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRlbC5yZW1vdmVDbGFzcygndmFjLWhvdmVyaW5nJykuY2xvc2VzdChcIi52YWMtbWFya2VyLXdyYXBcIikucmVtb3ZlQ2xhc3MoJ3ZhYy1kaW0tYWxsJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIG9iamVjdCBmb3IgdGVtcGxhdGVcbiAgICBnZXQgbWFya2VyVGVtcGxhdGVEYXRhICgpIHtcbiAgICAgICAgIC8vIHRoZSBzbWFsbGVyIHRoZSB3aWR0aCwgdGhlIGhpZ2hlciB0aGUgei1pbmRleCBzbyBvdmVybGFwcyBhcmUgY2xpY2thYmxlXG4gICAgICAgIGxldCBsZWZ0ID0gKHRoaXMucmFuZ2Uuc3RhcnQgLyB0aGlzLmR1cmF0aW9uKSAqIDEwMCxcbiAgICAgICAgICAgIHdpZHRoID0gKCh0aGlzLnJhbmdlLmVuZCAvIHRoaXMuZHVyYXRpb24pICogMTAwKSAtIGxlZnQsXG4gICAgICAgICAgICB6SW5kZXggPSAoMTAwIC0gTWF0aC5mbG9vcih3aWR0aCkpIHx8IDEwMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6ICAgICAgICAgbGVmdCArICclJyxcbiAgICAgICAgICAgIHdpZHRoOiAgICAgICAgd2lkdGggKyAnJScsXG4gICAgICAgICAgICB6SW5kZXg6ICAgICAgIHpJbmRleCxcbiAgICAgICAgICAgIHNob3dUb29sdGlwOiAgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93TWFya2VyU2hhcGVBbmRUb29sdGlwcyxcbiAgICAgICAgICAgIHRvb2x0aXBSaWdodDogbGVmdCA+IDUwLFxuICAgICAgICAgICAgdG9vbHRpcFRpbWU6ICBVdGlscy5odW1hblRpbWUodGhpcy5yYW5nZSksXG4gICAgICAgICAgICB0b29sdGlwQm9keTogICF0aGlzLmNvbW1lbnQgPyBudWxsIDogdGhpcy5jb21tZW50LmJvZHksXG4gICAgICAgICAgICByYW5nZVNob3c6ICAgICEhdGhpcy5yYW5nZS5lbmQsXG4gICAgICAgICAgICBpZDogICAgICAgICAgIHRoaXMuY29tcG9uZW50SWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgbGlzdGVuZXJzIG9uIHRlYXJkb3duIGFuZCByZW1vdmUgRE9NIG5vZGVzXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLiRlbFxuICAgICAgICAgICAgLm9mZignbW91c2VlbnRlci52YWMtbWFya2VyJylcbiAgICAgICAgICAgIC5vZmYoJ21vdXNlbGVhdmUudmFjLW1hcmtlcicpXG4gICAgICAgICAgICAub2ZmKCdjbGljay52YWMtbWFya2VyJyk7XG4gICAgICAgIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBtYWluICdhbm5vdGF0aW9uIHRvZ2dsZScgYnV0dG9uIGluIHRoZSBwbGF5ZXIgY29udHJvbHMsIGluY2x1ZGluZyBub3RpZmllciBmb3IgIyBhbm5vdGF0aW9uc1xuKi9cblxuY29uc3QgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgIHRlbXBsYXRlTmFtZSA9IFwicGxheWVyX2J1dHRvblwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFBsYXllckJ1dHRvbiBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgICAgICB0aGlzLmluaXRBUEkodGhpcywgJ1BsYXllckJ1dHRvbicpO1xuXG4gICAgICAgIHRoaXMuJGVsLm9uKCdjbGljay52YWMtcGxheWVyLWJ1dHRvbicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBidXR0b24gdG8gcGxheWVyXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgbGV0IGJ0biA9IHRoaXMucGxheWVyLmdldENoaWxkKCdjb250cm9sQmFyJykuYWRkQ2hpbGQoJ2J1dHRvbicsIHt9KTtcbiAgICAgICAgYnRuLmNvbnRyb2xUZXh0KFwiVG9nZ2xlIEFuaW1hdGlvbnNcIik7XG4gICAgICAgIHRoaXMuJGVsID0gJChidG4uZWwoKSk7XG4gICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKCd2YWMtcGxheWVyLWJ0bicpLmZpbmQoXCIudmpzLWljb24tcGxhY2Vob2xkZXJcIikuaHRtbCh0aGlzLnJlbmRlclRlbXBsYXRlKHRlbXBsYXRlTmFtZSkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zIGRpc3BsYXllZCBpbiB0aGUgYnViYmxlXG4gICAgdXBkYXRlTnVtQW5ub3RhdGlvbnMgKCkge1xuICAgICAgICBsZXQgbnVtID0gdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmFubm90YXRpb25zLmxlbmd0aCxcbiAgICAgICAgICAgICRidWJibGUgPSB0aGlzLiRlbC5maW5kKFwiYlwiKTtcbiAgICAgICAgJGJ1YmJsZS50ZXh0KG51bSk7XG4gICAgICAgIG51bSA+IDAgPyAkYnViYmxlLnJlbW92ZUNsYXNzKHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pIDogJGJ1YmJsZS5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKTtcbiAgICB9XG5cbiAgICAvLyBVbmJpbmQgZXZlbnQgbGlzdGVuZXJzIG9uIHRlYXJkb3duIGFuZCByZW1vdmUgRE9NIG5vZGVzXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ2NsaWNrLnZhYy1wbGF5ZXItYnV0dG9uJyk7XG4gICAgICAgIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYSBzaGFwZSB0aGF0IGNhbiBiZSBkcnVnL3NpemVkIG9uIHRvcCBvZiB0aGUgdmlkZW8gd2hpbGUgYWRkaW5nIGEgbmV3IGFubm90YXRpb25cbiovXG5cbmNvbnN0ICAgU2hhcGUgPSByZXF1aXJlKFwiLi9zaGFwZVwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKCcuLy4uL2xpYi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFNlbGVjdGFibGVTaGFwZSBleHRlbmRzIFNoYXBlIHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy4kcGFyZW50ID0gdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLXZpZGVvLWNvdmVyLWNhbnZhc1wiKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGFsbCBuZWVkZWQgZXZlbnRzIGZvciBkcmFnIGFjdGlvblxuICAgIGJpbmRFdmVudHMgKCkge1xuICAgICAgICAvLyBPbiBtb3VzZWRvd24gaW5pdGlhbGl6ZSBkcmFnXG4gICAgICAgIHRoaXMuJHBhcmVudC5vbihcIm1vdXNlZG93bi52YWMtc2VsZWN0YWJsZS1zaGFwZVwiLCAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgYSBmZXcgY29uZGl0aW9ucyB0byBzZWUgaWYgd2Ugc2hvdWxkICpub3QqIHN0YXJ0IGRyYWdcbiAgICAgICAgICAgIGlmKCAhKCQoZS50YXJnZXQpLmhhc0NsYXNzKCd2YWMtdmlkZW8tY292ZXItY2FudmFzJykpICkgcmV0dXJuOyAvL2RpZG4ndCBjbGljayBvbiBvdmVybGF5XG4gICAgICAgICAgICBpZiggJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3ZhYy1zaGFwZScpICkgcmV0dXJuOyAvL3VzZXIgY2xpY2tlZCBvbiBhbm5vdGF0aW9uXG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBvbGQgc2hhcGUgaWYgb25lIGV4aXN0ZWRcbiAgICAgICAgICAgIGlmKHRoaXMuJGVsKSB0aGlzLiRlbC5yZW1vdmUoKTtcblxuICAgICAgICAgICAgLy8gRGVmaW5lIGRlZmF1bHQgc3RhcnRpbmcgc2hhcGUgKGp1c3QgeC95IGNvb3JkcyBvZiB3aGVyZSB1c2VyIGNsaWNrZWQgbm8gd2lkdGgvaGVpZ2h0IHlldClcbiAgICAgICAgICAgIGxldCBzaGFwZSA9IHtcbiAgICAgICAgICAgICAgICB4MTogdGhpcy54Q29vcmRUb1BlcmNlbnQoZS5wYWdlWCksXG4gICAgICAgICAgICAgICAgeTE6IHRoaXMuWUNvb3JkVG9QZXJjZW50KGUucGFnZVkpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2hhcGUueDIgPSBzaGFwZS54MTtcbiAgICAgICAgICAgIHNoYXBlLnkyID0gc2hhcGUueTI7XG4gICAgICAgICAgICB0aGlzLnNoYXBlID0gc2hhcGU7XG5cbiAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luIHBvaW50cyBmb3IgZnV0dXJlIHVzZVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5YID0gc2hhcGUueDE7XG4gICAgICAgICAgICB0aGlzLm9yaWdpblkgPSBzaGFwZS55MTtcblxuICAgICAgICAgICAgLy8gRHJhdyBzaGFwZSBhbmQgc3RhcnQgZHJhZyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kcmFnTW92ZWQgPSBmYWxzZTsgLy8gdXNlZCB0byBkZXRlcm1pbmUgaWYgdXNlciBhY3R1YWxseSBkcmFnZ2VkIG9yIGp1c3QgY2xpY2tlZFxuXG4gICAgICAgICAgICAvLyBCaW5kIGV2ZW50IG9uIGRvYyBtb3VzZW1vdmUgdG8gdHJhY2sgZHJhZywgdGhyb3R0bGVkIHRvIG9uY2UgZWFjaCAxMDBtc1xuICAgICAgICAgICAgJChkb2N1bWVudCkub24oYG1vdXNlbW92ZS52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gLCBVdGlscy50aHJvdHRsZSh0aGlzLm9uRHJhZy5iaW5kKHRoaXMpLCAxMDApICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBkcmFnIGNsYXNzIHRvIGN1cnNvciB0b29sdGlwIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgaWYoIXRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtY3Vyc29yLXRvb2wtdGlwJykuYWRkQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT24gbW91c2V1cCwgaWYgZHVyaW5nIGRyYWcgY2FuY2VsIGRyYWcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZXVwLnZhYy1zc2hhcGUtJHt0aGlzLnBsYXllcklkfWAsIChlKSA9PiB7XG4gICAgICAgICAgICBpZighdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNlbW92ZS52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gKTtcblxuICAgICAgICAgICAgaWYoIXRoaXMuZHJhZ01vdmVkKXtcbiAgICAgICAgICAgICAgICAvL2NsZWFyIHNoYXBlIGlmIGl0J3MganVzdCBhIGNsaWNrIChhbmQgbm90IGEgZHJhZylcbiAgICAgICAgICAgICAgICB0aGlzLnNoYXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLiRlbCkgdGhpcy4kZWwucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGRyYWcgY2xhc3MgZnJvbSBjdXJzb3IgdG9vbHRpcCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLnJlbW92ZUNsYXNzKCd2YWMtY3Vyc29yLWRyYWdnaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE9uIGVhY2ggaW50ZXJhdGlvbiBvZiBkcmFnIGFjdGlvbiAobW91c2UgbW92ZW1lbnQpLCByZWNhbGMgcG9zaXRpb24gYW5kIHJlZHJhdyBzaGFwZVxuICAgIG9uRHJhZyAoZSkge1xuICAgICAgICB0aGlzLmRyYWdNb3ZlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IHhQZXIgPSB0aGlzLnhDb29yZFRvUGVyY2VudChlLnBhZ2VYKSxcbiAgICAgICAgICAgIHlQZXIgPSB0aGlzLllDb29yZFRvUGVyY2VudChlLnBhZ2VZKTtcblxuICAgICAgICBpZih4UGVyIDwgdGhpcy5vcmlnaW5YKXtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueDIgPSB0aGlzLm9yaWdpblg7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLngxID0gTWF0aC5tYXgoMCwgeFBlcik7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zaGFwZS54MiA9IE1hdGgubWluKDEwMCwgeFBlcik7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLngxID0gdGhpcy5vcmlnaW5YO1xuICAgICAgICB9XG4gICAgICAgIGlmKHlQZXIgPCB0aGlzLm9yaWdpblkpe1xuICAgICAgICAgICAgdGhpcy5zaGFwZS55MiA9IHRoaXMub3JpZ2luWTtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueTEgPSBNYXRoLm1heCgwLCB5UGVyKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLnkyID0gTWF0aC5taW4oMTAwLCB5UGVyKTtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueTEgPSB0aGlzLm9yaWdpblk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXREaW1zRnJvbVNoYXBlKCk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYWRkaW5nQW5ub3RhdGlvbkRhdGFDaGFuZ2VkJywgeyBzaGFwZTogdGhpcy5zaGFwZSB9KTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHBpeGVsLWJhc2VkIHggcG9zaXRpb24gKHJlbGF0aXZlIHRvIGRvY3VtZW50KSB0byBwZXJjZW50YWdlIGluIHZpZGVvXG4gICAgeENvb3JkVG9QZXJjZW50ICh4KSB7XG4gICAgICAgIHggPSB4IC0gdGhpcy4kcGFyZW50Lm9mZnNldCgpLmxlZnQ7IC8vcGl4ZWwgcG9zaXRpb25cbiAgICAgICAgbGV0IG1heCA9IHRoaXMuJHBhcmVudC5pbm5lcldpZHRoKCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIoKCh4IC8gbWF4KSAqIDEwMCkudG9GaXhlZCgyKSk7IC8vcm91bmQgdG8gMiBkZWNpbWFsIHBsYWNlc1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgcGl4ZWwtYmFzZWQgeSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gZG9jdW1lbnQpIHRvIHBlcmNlbnRhZ2UgaW4gdmlkZW9cbiAgICBZQ29vcmRUb1BlcmNlbnQgKHkpIHtcbiAgICAgICAgeSA9IHkgLSB0aGlzLiRwYXJlbnQub2Zmc2V0KCkudG9wOyAvL3BpeGVsIHBvc2l0aW9uXG4gICAgICAgIGxldCBtYXggPSB0aGlzLiRwYXJlbnQuaW5uZXJIZWlnaHQoKTtcbiAgICAgICAgcmV0dXJuIE51bWJlcigoKHkgLyBtYXgpICogMTAwKS50b0ZpeGVkKDIpKTsgLy9yb3VuZCB0byAyIGRlY2ltYWwgcGxhY2VzXG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGV2ZW50cyBhbmQgcmVtb3ZlIGVsZW1lbnRcbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIHRoaXMuJHBhcmVudC5vZmYoJ21vdXNlZG93bi52YWMtc2VsZWN0YWJsZS1zaGFwZScpO1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoYG1vdXNldXAudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9IG1vdXNlbW92ZS52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBtYW5hZ2luZyBhIHNoYXBlIChpLmUuIGJveCBkcmF3biBvbiB0aGUgcGxheWVyKSBmb3IgYW4gYW5ub3RhdGlvblxuKi9cblxuY29uc3QgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBTaGFwZSBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIsIHNoYXBlPW51bGwpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlO1xuICAgICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLiRwbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aGUgc2hhcGUgZWxlbWVudCBvbiB0aGUgJHBhcmVudFxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGlmKCF0aGlzLnNoYXBlKSByZXR1cm47XG4gICAgICAgIGlmKHRoaXMuJGVsKSB0aGlzLiRlbC5yZW1vdmUoKTtcblxuICAgICAgICB0aGlzLiRlbCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3MoXCJ2YWMtc2hhcGVcIik7XG4gICAgICAgIHRoaXMuc2V0RGltc0Zyb21TaGFwZSgpO1xuICAgICAgICB0aGlzLiRwYXJlbnQuYXBwZW5kKHRoaXMuJGVsKTtcbiAgICB9XG5cbiAgICAvLyBTZXQvdXBkYXRlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBzaGFwZSBiYXNlZCAgb24gdGhpcy5zaGFwZVxuICAgIHNldERpbXNGcm9tU2hhcGUgKCkge1xuICAgICAgICB0aGlzLiRlbC5jc3Moe1xuICAgICAgICAgICAgbGVmdDogICB0aGlzLnNoYXBlLngxICsgXCIlXCIsXG4gICAgICAgICAgICB0b3A6ICAgIHRoaXMuc2hhcGUueTEgKyBcIiVcIixcbiAgICAgICAgICAgIHdpZHRoOiAgKHRoaXMuc2hhcGUueDItdGhpcy5zaGFwZS54MSkgKyBcIiVcIixcbiAgICAgICAgICAgIGhlaWdodDogKHRoaXMuc2hhcGUueTItdGhpcy5zaGFwZS55MSkgKyBcIiVcIlxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG4vKlxuICAgIENsYXNzZXMgZm9yIHJlZ2lzdGVyaW5nIGFuZCBoYW5kbGluZyBjdXN0b20gZXZlbnRzIGZvciBleHRlcm5hbCBpbnRlcmFjdGlvbiBzdXBwb3J0LlxuICAgIFdpbGwgYmUgYm91bmQgdG8gcGx1Z2luIG9iamVjdCBhcyBhIG1lc3NhZ2UgZ2F0ZXdheSBiZXR3ZWVuIGV4dGVybmFsIGVsZW1lbnRzIGFuZCB0aGUgcGx1Z2luLlxuKi9cblxuY29uc3QgTG9nZ2VyID0gcmVxdWlyZShcIi4vbG9nZ2VyXCIpO1xuXG4vKlxuICAgIEEgY2VudHJhbGl6ZWQgY29sbGVjdGlvbiBvZiBldmVudCBjYWxsYmFja3Mgb3JnYW5pemVkIGJ5IGNvbXBvbmVudCBhbmQgbmFtZVxuICAgIE1haW4gcmVmZXJlbmNlIGZvciBleHRlcm5hbCBldmVudCBhcGlcbiAgICBUaGVzZSBldmVudHMgd2lsbCBiZSBib3VuZCB0byB0aGUgcGx1Z2luIG9uIGluaXRpYWxpemF0aW9uIG9mIHRoZWlyIHJlc3BlY3RpdmUgY29tcG9uZW50c1xuICAgIE5PVEUgLSAnc2VsZicgYXMgc2Vjb25kIHBhcmFtIGluIGVhY2ggZnVuY3Rpb24gaXMgYSB3b3JrYXJvdW5kIGZvciB0cmFuc3BpbGVyIG5vdCBwcm9wZXJseVxuICAgIGtlZXBpbmcgdGhpcyAsIHNvIHdlIHBhc3MgaW4gaW5zdGFuY2UgdG8gdXNlIGFzIHRoaXMgZm9yIGVhY2ggZm4gLSBjYW4ndCByZWx5IG9uIGJpbmRcbiAgICBiZWNhdXNlIHRoaXMgaXMgcmV3cml0dGVuIGZyb20gc3ltYm9sIHJlZ2lzdHJ5IGluIHRyYW5zcGlsZXIgYW5kIGl0J3Mgbm90IHByZXNlbnRcbiovXG5cbmNvbnN0IEV2ZW50UmVnaXN0cnkgPSB7XG4gICAgQW5ub3RhdGlvblN0YXRlOiB7XG4gICAgICAgIG9wZW5Bbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5vcGVuQW5ub3RhdGlvbkJ5SWQoZXZlbnQuZGV0YWlsLmlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VBY3RpdmVBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBuZXdBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5jcmVhdGVBbmRBZGRBbm5vdGF0aW9uKGV2ZW50LmRldGFpbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3lBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5kZXN0cm95QW5ub3RhdGlvbkJ5SWQoZXZlbnQuZGV0YWlsLmlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgbmV3Q29tbWVudDogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgbGV0IGFubm90YXRpb24gPSBfdGhpcy5maW5kQW5ub3RhdGlvbihldmVudC5kZXRhaWwuYW5ub3RhdGlvbklkKTtcbiAgICAgICAgICAgIGlmKGFubm90YXRpb24pIGFubm90YXRpb24uY29tbWVudExpc3QuY3JlYXRlQ29tbWVudChldmVudC5kZXRhaWwuYm9keSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3lDb21tZW50OiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tbWVudCA9IF90aGlzLmZpbmRDb21tZW50KGV2ZW50LmRldGFpbC5pZCk7XG4gICAgICAgICAgICBpZihjb21tZW50KSBjb21tZW50LmNvbW1lbnRMaXN0LmRlc3Ryb3lDb21tZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgQ29udHJvbHM6IHtcbiAgICAgICAgYWRkaW5nQW5ub3RhdGlvbjogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgX3RoaXMuc3RhcnRBZGROZXcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FuY2VsQWRkaW5nQW5ub3RhdGlvbjogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgX3RoaXMuY2FuY2VsQWRkTmV3KCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFBsYXllckJ1dHRvbjoge1xuICAgICAgICBvblN0YXRlQ2hhbmdlZDogKGV2ZW50LCBfdGhpcykgPT4ge1xuICAgICAgICAgICAgX3RoaXMudXBkYXRlTnVtQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgQW5ub3RhdGlvbkNvbW1lbnRzOiB7XG4gICAgICAgIHRvZ2dsZUFubm90YXRpb25Nb2RlOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBFdmVudERpc3BhdGNoZXIge1xuXG4gICAgY29uc3RydWN0b3IgKHBsdWdpbikge1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5wbHVnaW5SZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdFdnRzID0gW107XG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZExpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLmV2ZW50UmVnaXN0cnkgPSBFdmVudFJlZ2lzdHJ5O1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgRXZlbnRSZWdpc3RyeSB0byBtYXNzIHJlZ2lzdGVyIGV2ZW50cyBvbiBlYWNoIGNvbXBvbmVudCBpbml0aWFsaXphdGlvblxuICAgIHJlZ2lzdGVyTGlzdGVuZXJzRm9yIChvYmosIGNsYXNzTmFtZSkge1xuICAgICAgICBsZXQgbWF0Y2hpbmdFdmVudHMgPSB0aGlzLmV2ZW50UmVnaXN0cnlbY2xhc3NOYW1lXTtcbiAgICAgICAgaWYgKG1hdGNoaW5nRXZlbnRzKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtYXRjaGluZ0V2ZW50cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmVnaXN0ZXIgYWdhaW4gaWYgYWxyZWFkeSBpbiBjYWNoZWQgY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIGlmICghfnRoaXMucmVnaXN0ZXJlZExpc3RlbmVycy5pbmRleE9mKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gbWF0Y2hpbmdFdmVudHNba2V5XS5iaW5kKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcihrZXksICgoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5wbHVnaW5SZWFkeSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dDYWxsYmFjayhrZXksIGNsYXNzTmFtZSwgZXZ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2dCwgb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCaW5kIGEgbGlzdGVuZXIgdG8gdGhlIHBsdWdpblxuICAgIHJlZ2lzdGVyTGlzdGVuZXIgKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLm9uKHR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzLnB1c2godHlwZSk7XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGEgbGlzdGVuZXIgZnJvbSB0aGUgcGx1Z2luXG4gICAgdW5yZWdpc3Rlckxpc3RlbmVyICh0eXBlKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLm9mZih0eXBlKTtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50IG9uIHRoZSBwbHVnaW5cbiAgICBmaXJlICh0eXBlLCBkYXRhKSB7XG4gICAgICAgIGlmKCF0aGlzLnBsdWdpblJlYWR5KSByZXR1cm47XG4gICAgICAgIExvZ2dlci5sb2coXCJldnQtZGlzcGF0Y2gtRklSRVwiLCB0eXBlLCBkYXRhKTtcbiAgICAgICAgbGV0IGV2dCA9IG5ldyBDdXN0b21FdmVudCh0eXBlLCB7ICdkZXRhaWwnOiBkYXRhIH0pO1xuICAgICAgICB0aGlzLnBsdWdpbi50cmlnZ2VyKGV2dCk7XG4gICAgfVxuXG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMuZm9yRWFjaCgodHlwZSkgPT4geyB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcih0eXBlKSB9KTtcbiAgICB9XG5cbiAgICBsb2dDYWxsYmFjayAoZXZlbnROYW1lLCBjbGFzc05hbWUsIGV2ZW50KSB7XG4gICAgICAgIExvZ2dlci5sb2coXCJldnQtZGlzcGF0Y2gtUkVDRUlWRVwiLCBgJHtldmVudE5hbWV9ICgke2NsYXNzTmFtZX0pYCwgZXZlbnQpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8qXG5cdEdlbmVyYWwgbG9nZ2luZyBsaWJyYXJ5LCBjaGVja2luZyB0byBzZWUgaWYgd2luZG93LlZBQ19ERUJVRyBpcyBwcmVzZW50IGFuZCB0cnVlIHRvIGVuYWJsZSBkZWJ1Z2dpbmdcbiovXG5cbi8vIFByZWZpeCBmb3IgYXBwZW5kaW5nIHRvIGFsbCBsb2dnZXIgbWVzc2FnZXNcbmNvbnN0IExPR19QUkVGSVggPSBcIjo6VkFDOjpcIjtcblxuLy8gQXJlIHdlIGluIGRlYnVnIG1vZGU/XG5mdW5jdGlvbiBkZWJ1Zygpe1xuXHRyZXR1cm4gISF3aW5kb3cuVkFDX0RFQlVHO1xufVxuXG4vLyBCdWlsZCBhcmd1bWVudHMgZm9yIGNvbnNvbGUgZm4sIGFkZGluZyBwcmVmaXhcbmZ1bmN0aW9uIGJ1aWxkQXJncyhhcmdzKXtcblx0cmV0dXJuIFtMT0dfUFJFRklYXS5jb25jYXQoYXJncyk7XG59XG5cbi8vIExvZyBtZXNzYWdlL2RhdGFcbm1vZHVsZS5leHBvcnRzLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYoIWRlYnVnKCkpIHJldHVybjtcbiAgICBjb25zb2xlLmxvZy5hcHBseShudWxsLCBidWlsZEFyZ3MoYXJncykpO1xufVxuXG4vLyBFcnJvciBtZXNzYWdlL2RhdGFcbm1vZHVsZS5leHBvcnRzLmVycm9yID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZighZGVidWcoKSkgcmV0dXJuO1xuICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkobnVsbCwgYnVpbGRBcmdzKGFyZ3MpKTtcbn1cblxuLy8gSW5mbyBtZXNzYWdlL2RhdGFcbm1vZHVsZS5leHBvcnRzLmluZm8gPSAoLi4uYXJncykgPT4ge1xuICAgIGlmKCFkZWJ1ZygpKSByZXR1cm47XG4gICAgY29uc29sZS5pbmZvLmFwcGx5KG51bGwsIGJ1aWxkQXJncyhhcmdzKSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQmFzZSBjbGFzcyBhbGwgcGxheWVyIGNvbXBvbmVudHMgaW50ZXJpdCBmcm9tIC0gaXQgaW5jbHVkZXMgbG90cyBvZiBoZWxwZXIgZnVuY3Rpb25zICh0byBnZXQgcmVmZXJlbmNlIHRvXG4gICAgdGhlIHBsYXllciwgdGhlIHBsdWdpbiwgdmlkZW8gc3RhdGUsIGV0YylcbiovXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGxheWVyQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgdGhpcy5fcGxheWVyID0gcGxheWVyO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcmVmZXJlbmNlIHRvIHRoZSBtYWluIHBsdWdpbiBvYmplY3QgKG1haW4uanMgaW5zdGFuY2UpXG4gICAgZ2V0IHBsdWdpbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5hbm5vdGF0aW9uQ29tbWVudHMoKTtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBqYXZhc2NyaXB0IGluc3RhbmNlXG4gICAgZ2V0IHBsYXllciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gYXR0cmlidXRlIHRvIGdldCB2aWRlbyBkdXJhdGlvbiAoaW4gc2Vjb25kcylcbiAgICBnZXQgZHVyYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZHVyYXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBjdXJyZW50IHRpbWVcbiAgICBnZXQgY3VycmVudFRpbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuY3VycmVudFRpbWUoKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgY3VycmVudCB0aW1lIG9mIHBsYXllclxuICAgIHNldCBjdXJyZW50VGltZSAodGltZSkge1xuICAgICAgICB0aGlzLnBsYXllci5jdXJyZW50VGltZSh0aW1lKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBhbGwgZXZlbnRzIGluIHRoZSBFdmVudFJlZ2lzdHJ5IG1hdGNoaW5nIHRoaXMgY2xhc3NOYW1lXG4gICAgaW5pdEFQSSAob2JqLCBjbGFzc05hbWUpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4uZXZlbnREaXNwYXRjaGVyLnJlZ2lzdGVyTGlzdGVuZXJzRm9yKG9iaiwgY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBOdWxsaWZ5IHBsYXllciByZWZlcmVuY2Ugc28gb2JqZWN0cyBjYW4gYmUgcmVtb3ZlZCBzYWZlbHlcbiAgICAvLyBBbGwgY29tcG9uZW50cyBzaG91bGQgY2FsbCBzdXBlci50ZWFyZG93bigpIHdpdGhpbiB0aGVpciB0ZWFyZG93biBmdW5jc1xuICAgIHRlYXJkb3duIChkZXN0cm95PWZhbHNlKSB7XG4gICAgICAgIGlmKGRlc3Ryb3kpIHRoaXMuX3BsYXllciA9IG51bGw7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIEJhc2UgY2xhc3MgYWxsIHBsYXllciBVSSBjb21wb25lbnRzIGludGVyaXQgZnJvbSAtIGl0IGluY2x1ZGVzIGxvdHMgb2YgaGVscGVyIGZ1bmN0aW9ucyAodG8gZ2V0IHJlZmVyZW5jZSB0b1xuICAgIHRoZSBwbGF5ZXIgJGVsLCB2YXJpb3VzIGNsYXNzZXMvaGVscGVycywgdGVtcGxhdGUgcmVuZGVyaW5nLCBldGMpXG4qL1xuXG5jb25zdCBQbGF5ZXJDb21wb25lbnQgPSByZXF1aXJlKFwiLi9wbGF5ZXJfY29tcG9uZW50XCIpLFxuICAgICAgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMvcnVudGltZScpLFxuICAgICAgVGVtcGxhdGVzID0gcmVxdWlyZSgnLi8uLi9jb21waWxlZC90ZW1wbGF0ZXMnKSxcbiAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi8uLi9saWIvdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQbGF5ZXJVSUNvbXBvbmVudCBleHRlbmRzIFBsYXllckNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgfVxuXG4gICAgLy8gaGVscGVycyB0byBnZXQgdmFyaW91cyBVSSBjb21wb25lbnRzIG9mIHRoZSBwbGF5ZXIgcXVpY2tseSwga2VlcGluZyBjb21tb25seSByZXVzZWQgY2xhc3MgbmFtZXNcbiAgICAvLyBjb25zb2xpZGF0ZWQgaW4gY2FzZSBvZiBuZWVkIHRvIGNoYW5nZSBpbiB0aGUgZnV0dXJlIChhbmQgZm9yIHF1aWNrIGFjY2VzcylcbiAgICBnZXQgJFVJICgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgY29tbWVudHNDb250YWluZXI6ICAgICAgdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLWNvbW1lbnRzLWNvbnRhaW5lclwiKSwgICAgICAgLy8gb3V0ZXIgY29udGFpbmVyIGZvciBhbGwgY29tbWVudHNcbiAgICAgICAgICAgIGNvbnRyb2xFbGVtZW50czogICAgICAgIHRoaXMuJHBsYXllci5maW5kKFwiLnZhYy1jb250cm9sXCIpLCAgICAgICAgICAgICAgICAgIC8vIEVhY2ggb2YgbXVsdGlwbGUgY29udHJvbCBlbGVtZW50cyBpbiB0aGUgY29udHJvbCBiYXJcbiAgICAgICAgICAgIG5ld0NvbW1lbnRUZXh0YXJlYTogICAgIHRoaXMuJHBsYXllci5maW5kKFwiLnZhYy12aWRlby13cml0ZS1uZXcgdGV4dGFyZWFcIiksIC8vIFRleHRhcmVhIGZvciB3cml0aW5nIGEgbmV3IGNvbW1lbnRcbiAgICAgICAgICAgIHRpbWVsaW5lOiAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmpzLXByb2dyZXNzLWNvbnRyb2wnKSwgICAgICAgICAvLyBUaW1lbGluZSBlbGVtZW50XG4gICAgICAgICAgICBtYXJrZXJDdXJzb3JIZWxwVGV4dDogICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItaGVscC10ZXh0JyksICAgICAgICAgLy8gSGVscCB0ZXh0IHRoYXQgYXBwZWFycyB3aXRoICdjbGljay9kcmFnLi4nIG9uIHRpbWVsaW5lXG4gICAgICAgICAgICBjb250cm9sQmFyOiAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZqcy1jb250cm9sLWJhcicpLCAgICAgICAgICAgICAgLy8gQ29ucm9sIGJhciB3cmFwcGVyIGZvciB2anNcbiAgICAgICAgICAgIG1hcmtlcldyYXA6ICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLW1hcmtlci13cmFwJyksICAgICAgICAgICAgICAvLyB3cmFwcGVyIGVsZW1lbnQgdG8gcGxhY2UgbWFya2VycyBpbiBvbiB0aW1lbGluZVxuICAgICAgICAgICAgY292ZXJDYW52YXM6ICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtdmlkZW8tY292ZXItY2FudmFzJykgICAgICAgIC8vIFBsYXllciBjb3ZlciBkdXJpbmcgYWRkaW5nIGFubm90YXRpb24gc3RhdGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdXRpbGl0eSBjbGFzc2VzIHVzZWQgaW4gdmFyaW91cyBjb21wb25lbnRzXG4gICAgZ2V0IFVJX0NMQVNTRVMgKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBoaWRkZW46IFwidmFjLWhpZGRlblwiLFxuICAgICAgICAgICAgYWN0aXZlOiBcInZhYy1hY3RpdmVcIlxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBqcXVlcnkgZWxlbWVudFxuICAgIGdldCAkcGxheWVyICgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcy5wbGF5ZXIuZWwoKSk7XG4gICAgfVxuXG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHBsYXllciBpZCBmcm9tIERPTVxuICAgIGdldCBwbGF5ZXJJZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRwbGF5ZXIuYXR0cignaWQnKTtcbiAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYSBwc2V1ZG8tZ3VpZCBJRCBmb3IgdGhpcyBjb21wb25lbnQsIHRvIHVzZSBhcyBhbiBJRCBpbiB0aGUgRE9NXG4gICAgZ2V0IGNvbXBvbmVudElkICgpIHtcbiAgICAgICAgdGhpcy5jaWRfID0gdGhpcy5jaWRfIHx8IFV0aWxzLmd1aWQoKVxuICAgICAgICByZXR1cm4gdGhpcy5jaWRfO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgcGxheS9jb250cm9sIGFjdGlvbnMgb24gdGhlIGN1cnJlbnQgcGxheWVyXG4gICAgZGlzYWJsZVBsYXlpbmdBbmRDb250cm9sICgpIHtcbiAgICAgICAgdGhpcy4kcGxheWVyLmFkZENsYXNzKCd2YWMtZGlzYWJsZS1wbGF5Jyk7XG4gICAgICAgIC8vVE9ETyAtIGNhdGNoIHNwYWNlYmFyIGJlaW5nIGhpdFxuICAgICAgICAvL1RPRE8gLSBwcmV2ZW50IHNjcnViYmluZyBhbmQgdGltZWxpbmUgY2xpY2sgdG8gc2Vla1xuICAgIH1cblxuICAgIC8vIEVuYWJsZSBwbGF5L2NvbnRyb2wgYWN0aW9ucyBvbiB0aGUgY29udHJvbGxlclxuICAgIGVuYWJsZVBsYXlpbmdBbmRDb250cm9sICgpIHtcbiAgICAgICAgdGhpcy4kcGxheWVyLnJlbW92ZUNsYXNzKCd2YWMtZGlzYWJsZS1wbGF5Jyk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGEgaGFuZGxlYmFycyB0ZW1wbGF0ZSB3aXRoIGxvY2FsIGRhdGEgcGFzc2VkIGluIHZpYSBrZXkvdmFsIGluIG9iamVjdFxuICAgIHJlbmRlclRlbXBsYXRlICh0ZW1wbGF0ZU5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGFuZGxlYmFyc0hlbHBlcnMoKTtcbiAgICAgICAgcmV0dXJuIFRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlc2NhcGVkIGJyZWFrbGluZXMgaW4gSGFuZGxlYmFyc1xuICAgIHJlZ2lzdGVySGFuZGxlYmFyc0hlbHBlcnMgKCkge1xuICAgICAgICBpZignYnJlYWtsaW5lcycgaW4gSGFuZGxlYmFycy5oZWxwZXJzKSByZXR1cm47XG5cbiAgICAgICAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignYnJlYWtsaW5lcycsICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICB0ZXh0ID0gSGFuZGxlYmFycy5VdGlscy5lc2NhcGVFeHByZXNzaW9uKHRleHQpO1xuICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJzxicj4nKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHRleHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQcm92aWRlIGJhc2ljIHRlYXJkb3duIGZ1bmN0aW9uIHRvIGluaGVyaXRcbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIGlmKHRoaXMuJGVsKSB0aGlzLiRlbC5yZW1vdmUoKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCIvKlxuICAgIENvbGxlY3Rpb24gb2YgcG9seWZpbGxzIG5lZWRlZGYgb3IgSUUxMCsgc3VwcG9ydFxuKi9cblxuLy8gQXJyYXkucHJvdG90eXBlLmZpbmQoKSBmb3IgSUUxMCtcbnJlcXVpcmUoJ2llLWFycmF5LWZpbmQtcG9seWZpbGwnKTtcbi8vIE9iamVjdC5hc3NpZ24gZm9yIElFMTArXG5yZXF1aXJlKCdlczYtb2JqZWN0LWFzc2lnbicpLnBvbHlmaWxsKCk7XG5cbi8vIEFsbG93IHVzZSBvZiBvYmplY3QuY29uc3RydWN0b3Iuc3RhdGljRnVuYygpIGluIElFXG4vLyBOb3QgeWV0IHN1cHBvcnRlZCBieSBiYWJlbFxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZWRvYXJkb2NhdmF6emEvNDcyNDY4NTY3NTlmMjI3M2U0OGJcbihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgX2V4Y2x1ZGUgPSBbJ2xlbmd0aCcsICduYW1lJywgJ2FyZ3VtZW50cycsICdjYWxsZXInLCAncHJvdG90eXBlJ107XG5cbiAgICAgICAgZnVuY3Rpb24gYmluZEZ1bmN0aW9uKGN0eCwgZm4pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGJpbmRQcm9wZXJ0eShjdHgsIHByb3AsIHBhcmVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGlmICghcGFyZW50RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBjdHguX19wcm90b19fW3Byb3BdO1xuICAgICAgICAgICAgICAgIHBhcmVudERlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN0eFsnX18nICsgcHJvcF0gfHwgZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4WydfXycgKyBwcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIHByb3AsIHtcbiAgICAgICAgICAgICAgICBnZXQ6IHBhcmVudERlc2NyaXB0b3IuZ2V0ID8gcGFyZW50RGVzY3JpcHRvci5nZXQuYmluZChjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNldDogcGFyZW50RGVzY3JpcHRvci5zZXQgPyBwYXJlbnREZXNjcmlwdG9yLnNldC5iaW5kKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXRlcmF0ZVByb3BzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzdXBlckNsYXNzKSxcbiAgICAgICAgICAgICAgICBwcm90bztcblxuICAgICAgICAgICAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwcm9wcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvID0gc3VwZXJDbGFzc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9leGNsdWRlLmluZGV4T2YoaSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJDbGFzcywgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1cGVyRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3VwZXJDbGFzcywgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN1cGVyRGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHN1cGVyQ2xhc3NbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDbGFzc1twcm9wXSA9IGJpbmRGdW5jdGlvbihzdWJDbGFzcywgc3VwZXJDbGFzc1twcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdXBlckRlc2NyaXB0b3IuZ2V0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kUHJvcGVydHkoc3ViQ2xhc3MsIHByb3AsIHN1cGVyRGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRQcm9wZXJ0eShzdWJDbGFzcywgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRlUHJvcHMoc3ViQ2xhc3MsIHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZiA9IGl0ZXJhdGVQcm9wcztcbiAgICB9XG59KSgpO1xuXG4vLyBVc2UgQ3VzdG9tRXZlbnQgaW4gSUVcbihmdW5jdGlvbiAoKSB7XG4gIGlmICggdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiICkgcmV0dXJuIGZhbHNlO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICggZXZlbnQsIHBhcmFtcyApIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogZmFsc2UsIGRldGFpbDogdW5kZWZpbmVkIH07XG4gICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCAnQ3VzdG9tRXZlbnQnICk7XG4gICAgZXZ0LmluaXRDdXN0b21FdmVudCggZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCApO1xuICAgIHJldHVybiBldnQ7XG4gICB9XG5cbiAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcblxuICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbn0pKCk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgR2VuZWFsIHV0aWxpdHkgZnVuY3Rpb25zLCBzb3VyY2VkIGZyb20gdW5kZXJzY29yZSAmIHNjcmF0Y2ggYnVpbHQgYXMgbmVlZGVkXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAgIC8vIENsb25lIGFuIG9iamVjdFxuICAgIGNsb25lT2JqZWN0OiAob2JqKSA9PiBPYmplY3QuYXNzaWduKHt9LCBvYmopLFxuXG4gICAgLy8gX3Rocm90dGxlIGZyb20gdW5kZXJzY29yZVxuICAgIHRocm90dGxlOiAoZnVuYywgd2FpdCwgb3B0aW9ucykgPT4ge1xuICAgICAgICB2YXIgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICAgICAgICB2YXIgdGltZW91dCA9IG51bGw7XG4gICAgICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgICAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogRGF0ZS5ub3coKTtcbiAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgaWYgKCFwcmV2aW91cyAmJiBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlKSBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzID0gbm93O1xuICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhbGwga2V5cyBvZiBhbiBvYmplY3QgdG8gaW50XG4gICAgcGFyc2VJbnRPYmo6IChvYmopID0+IHtcbiAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmKHBhcnNlSW50KG9ialtrZXldKSkge1xuICAgICAgICAgICAgICAgIG9ialtrZXldID0gcGFyc2VJbnQob2JqW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuXG4gICAgLy8gQ29udmVydCBhIHJhbmdlIHtzdGFydDogaW50LCAob3B0aW9uYWwpIGVuZDogaW50fSB0byBodW1hbiByZWFkYWJsZSB0aW1lXG4gICAgaHVtYW5UaW1lOiAocmFuZ2UpID0+IHtcbiAgICAgICAgZnVuY3Rpb24gcmVhZGFibGUoc2VjKXtcbiAgICAgICAgICAgIGxldCBtaW5zID0gTWF0aC5mbG9vcihzZWMvNjApLFxuICAgICAgICAgICAgc2VjcyA9IFN0cmluZyhzZWMgJSA2MCk7XG4gICAgICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgKHNlY3MubGVuZ3RoPT0xID8gXCIwXCIgOiBcIlwiKSArIHNlY3M7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWUgPSBbcmVhZGFibGUocmFuZ2Uuc3RhcnQpXTtcbiAgICAgICAgaWYocmFuZ2UuZW5kKSB0aW1lLnB1c2gocmVhZGFibGUocmFuZ2UuZW5kKSk7XG4gICAgICAgIHJldHVybiB0aW1lLmpvaW4oXCItXCIpO1xuICAgIH0sXG5cbiAgICAvLyBQc2VkdW8tcmFuZG9tIGd1aWQgZ2VuZXJhdG9yXG4gICAgZ3VpZDogKCkgPT4ge1xuICAgICAgICBmdW5jdGlvbiBzNCgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzNCgpICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgIHM0KCkgKyAnLScgKyBzNCgpICsgczQoKSArIHM0KCk7XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgdGhlIGhlaWdodCBhbmQgd2lkdGggb2YgYW4gZWxlbWVudCB0aGF0IGlzIG5vdCB2aXNpYmxlXG4gICAgLy8gY2xvbmVzIGVsIGFuZCB0cmlja3MgRE9NIGludG8gcmVuZGVyaW5nIGl0IHcgdGhlIGNvcnJlY3Qgc2l6ZVxuICAgIC8vIGJld2FyZSB0aGUgY29udGFpbmVyIG1heSBiZSBpbXBvcnRhbnQgZm9yIHNjb3BlZCBzdHlsZXNcbiAgICBhcmVhT2ZIaWRkZW5FbDogKCRlbCwgJGNvbnRhaW5lciwgaGlkZUNsYXNzPScnKSA9PiB7XG4gICAgICAgIGxldCAkY2xvbmUgPSAkZWwuY2xvbmUoKSxcbiAgICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgJGNsb25lLmNzcyh7XG4gICAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICAgIH0pO1xuICAgICAgICAkY2xvbmUucmVtb3ZlQ2xhc3MoaGlkZUNsYXNzKTtcbiAgICAgICAgJGNvbnRhaW5lci5hcHBlbmQoJGNsb25lKTtcbiAgICAgICAgZGF0YS53aWR0aCA9ICRjbG9uZS5vdXRlcldpZHRoKCk7XG4gICAgICAgIGRhdGEuaGVpZ2h0ID0gJGNsb25lLm91dGVySGVpZ2h0KCk7XG4gICAgICAgICRjbG9uZS5yZW1vdmUoKTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgdmFsdWUgKG4pIGlzIHdpdGhpbiBhIHJhbmdlIChzdGFydCA8PSBuIDw9IGVuZClcbiAgICBpc1dpdGhpblJhbmdlOiAoc3RhcnQsIGVuZCwgbikgPT4ge1xuICAgICAgICBlbmQgPSBlbmQgfHwgc3RhcnQgKyAxOyAvLyBmb3IgcmFuZ2VzIHdpdGggTk8gZW5kIGRlZmluZWQsIGFzc3VtZSBhIDFzIHJhbmdlXG4gICAgICAgIHJldHVybiBuID49IHN0YXJ0ICYmIG4gPD0gZW5kO1xuICAgIH1cbn07XG4iXX0="} \ No newline at end of file diff --git a/build/videojs-annotation-comments.cjs.min.js b/build/videojs-annotation-comments.cjs.min.js deleted file mode 100644 index 6a6aa40..0000000 --- a/build/videojs-annotation-comments.cjs.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.AnnotationComments=t()}}(function(){var t;return function(){function t(e,n,i){function r(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n||t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a= 2.0.0-beta.1",7:">= 4.0.0"};n.REVISION_CHANGES=p;var m="[object Object]";r.prototype={constructor:r,logger:d["default"],log:d["default"].log,registerHelper:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple helpers");o.extend(this.helpers,t)}else this.helpers[t]=e},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,e){if(o.toString.call(t)===m)o.extend(this.partials,t);else{if("undefined"==typeof e)throw new s["default"]('Attempting to register a partial called "'+t+'" as undefined');this.partials[t]=e}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple decorators");o.extend(this.decorators,t)}else this.decorators[t]=e},unregisterDecorator:function(t){delete this.decorators[t]}};var v=d["default"].log;n.log=v,n.createFrame=o.createFrame,n.logger=d["default"]},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t){a["default"](t)}n.__esModule=!0,n.registerDefaultDecorators=r;var o=t("./decorators/inline"),a=i(o)},{"./decorators/inline":5}],5:[function(t,e,n){"use strict";n.__esModule=!0;var i=t("../utils");n["default"]=function(t){t.registerDecorator("inline",function(t,e,n,r){var o=t;return e.partials||(e.partials={},o=function(r,o){var a=n.partials;n.partials=i.extend({},a,e.partials);var s=t(r,o);return n.partials=a,s}),e.partials[r.args[0]]=r.fn,o})},e.exports=n["default"]},{"../utils":19}],6:[function(t,e,n){"use strict";function i(t,e){var n=e&&e.loc,o=void 0,a=void 0;n&&(o=n.start.line,a=n.start.column,t+=" - "+o+":"+a);for(var s=Error.prototype.constructor.call(this,t),l=0;l0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var a=i.createFrame(n.data);a.contextPath=i.appendContextPath(n.data.contextPath,n.name),n={data:a}}return o(e,n)})},e.exports=n["default"]},{"../utils":19}],9:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}n.__esModule=!0;var r=t("../utils"),o=t("../exception"),a=i(o);n["default"]=function(t){t.registerHelper("each",function(t,e){function n(e,n,o){u&&(u.key=e,u.index=n,u.first=0===n,u.last=!!o,c&&(u.contextPath=c+e)),l+=i(t[e],{data:u,blockParams:r.blockParams([t[e],e],[c+e,null])})}if(!e)throw new a["default"]("Must pass iterator to #each");var i=e.fn,o=e.inverse,s=0,l="",u=void 0,c=void 0;if(e.data&&e.ids&&(c=r.appendContextPath(e.data.contextPath,e.ids[0])+"."),r.isFunction(t)&&(t=t.call(this)),e.data&&(u=r.createFrame(e.data)),t&&"object"==typeof t)if(r.isArray(t))for(var d=t.length;s=0?e:parseInt(t,10)}return t},log:function(t){if(t=r.lookupLevel(t),"undefined"!=typeof console&&r.lookupLevel(r.level)<=t){var e=r.methodMap[t];console[e]||(e="log");for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o":">",'"':""","'":"'","`":"`","=":"="},h=/[&<>"'`=]/g,f=/[&<>"'`=]/,p=Object.prototype.toString;n.toString=p;var m=function(t){return"function"==typeof t};m(/x/)&&(n.isFunction=m=function(t){return"function"==typeof t&&"[object Function]"===p.call(t)}),n.isFunction=m;var v=Array.isArray||function(t){return!(!t||"object"!=typeof t)&&"[object Array]"===p.call(t)};n.isArray=v},{}],20:[function(t,e,n){e.exports=t("./dist/cjs/handlebars.runtime")["default"]},{"./dist/cjs/handlebars.runtime":2}],21:[function(t,e,n){"use strict";Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError("this is null or not defined");var e=Object(this),n=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r0)for(n=0;n0?"future":"past"];return x(n)?n(e):n.replace(/%s/i,e)}function L(t,e){var n=t.toLowerCase();Ri[n]=Ri[n+"s"]=Ri[e]=t}function F(t){return"string"==typeof t?Ri[t]||Ri[t.toLowerCase()]:void 0}function H(t){var e,n,i={};for(n in t)d(t,n)&&(e=F(n),e&&(i[e]=t[n]));return i}function N(t,e){Wi[t]=e}function R(t){var e=[];for(var n in t)e.push({unit:n,priority:Wi[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function W(t,e,n){var i=""+Math.abs(t),r=e-i.length,o=t>=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+i}function U(t,e,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),t&&(zi[t]=r),e&&(zi[e[0]]=function(){return W(r.apply(this,arguments),e[1],e[2])}),n&&(zi[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function V(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,n,i=t.match(Ui);for(e=0,n=i.length;e=0&&Vi.test(t);)t=t.replace(Vi,n),Vi.lastIndex=0,i-=1;return t}function Z(t,e,n){cr[t]=x(e)?e:function(t,i){return t&&n?n:e}}function q(t,e){return d(cr,t)?cr[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return J(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,r){return e||n||i||r}))}function J(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function kt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function St(t,e,n){var i=7+e-n,r=(7+kt(t,0,i).getUTCDay()-e)%7;return-r+i-1}function Ot(t,e,n,i,r){var o,a,s=(7+n-i)%7,l=St(t,i,r),u=1+7*(e-1)+s+l;return u<=0?(o=t-1,a=et(o)+u):u>et(t)?(o=t+1,a=u-et(t)):(o=t,a=u),{year:o,dayOfYear:a}}function Mt(t,e,n){var i,r,o=St(t.year(),e,n),a=Math.floor((t.dayOfYear()-o-1)/7)+1;return a<1?(r=t.year()-1,i=a+Dt(r,e,n)):a>Dt(t.year(),e,n)?(i=a-Dt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function Dt(t,e,n){var i=St(t,e,n),r=St(t+1,e,n);return(et(t)-i+r)/7}function xt(t){return Mt(t,this._week.dow,this._week.doy).week}function Ct(){return this._week.dow}function Pt(){return this._week.doy}function Tt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Yt(t){var e=Mt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function At(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function jt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Et(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone}function $t(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function It(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Lt(t,e,n){var i,r,o,a=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)o=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:null):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null):"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null)))}function Ft(t,e,n){var i,r,o;if(this._weekdaysParseExact)return Lt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Ht(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=At(t,this.localeData()),this.add(t-e,"d")):e}function Nt(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Rt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=jt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Ar),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ut(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=jr),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Vt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Er),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Gt(){function t(t,e){return e.length-t.length}var e,n,i,r,o,a=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(i),s.push(r),l.push(o),u.push(i),u.push(r),u.push(o);for(a.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=J(s[e]),l[e]=J(l[e]),u[e]=J(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"), -this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function zt(){return this.hours()%12||12}function Bt(){return this.hours()||24}function Zt(t,e){U(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Jt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Qt(t){return t?t.toLowerCase().replace("_","-"):t}function Kt(t){for(var e,n,i,r,o=0;o0;){if(i=te(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&S(r,n,!0)>=e-1)break;e--}o++}return $r}function te(t){var i=null;if(!Hr[t]&&"undefined"!=typeof n&&n&&n.exports)try{i=$r._abbr;var r=e;r("./locale/"+t),ee(i)}catch(o){}return Hr[t]}function ee(t,e){var n;return t&&(n=s(e)?re(t):ne(t,e),n?$r=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),$r._abbr}function ne(t,e){if(null!==e){var n,i=Fr;if(e.abbr=t,null!=Hr[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=Hr[t]._config;else if(null!=e.parentLocale)if(null!=Hr[e.parentLocale])i=Hr[e.parentLocale]._config;else{if(n=te(e.parentLocale),null==n)return Nr[e.parentLocale]||(Nr[e.parentLocale]=[]),Nr[e.parentLocale].push({name:t,config:e}),null;i=n._config}return Hr[t]=new T(P(i,e)),Nr[t]&&Nr[t].forEach(function(t){ne(t.name,t.config)}),ee(t),Hr[t]}return delete Hr[t],null}function ie(t,e){if(null!=e){var n,i,r=Fr;i=te(t),null!=i&&(r=i._config),e=P(r,e),n=new T(e),n.parentLocale=Hr[t],Hr[t]=n,ee(t)}else null!=Hr[t]&&(null!=Hr[t].parentLocale?Hr[t]=Hr[t].parentLocale:null!=Hr[t]&&delete Hr[t]);return Hr[t]}function re(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return $r;if(!r(t)){if(e=te(t))return e;t=[t]}return Kt(t)}function oe(){return Ei(Hr)}function ae(t){var e,n=t._a;return n&&m(t).overflow===-2&&(e=n[fr]<0||n[fr]>11?fr:n[pr]<1||n[pr]>ct(n[hr],n[fr])?pr:n[mr]<0||n[mr]>24||24===n[mr]&&(0!==n[vr]||0!==n[yr]||0!==n[gr])?mr:n[vr]<0||n[vr]>59?vr:n[yr]<0||n[yr]>59?yr:n[gr]<0||n[gr]>999?gr:-1,m(t)._overflowDayOfYear&&(epr)&&(e=pr),m(t)._overflowWeeks&&e===-1&&(e=_r),m(t)._overflowWeekday&&e===-1&&(e=br),m(t).overflow=e),t}function se(t,e,n){return null!=t?t:null!=e?e:n}function le(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function ue(t){var e,n,i,r,o,a=[];if(!t._d){for(i=le(t),t._w&&null==t._a[pr]&&null==t._a[fr]&&ce(t),null!=t._dayOfYear&&(o=se(t._a[hr],i[hr]),(t._dayOfYear>et(o)||0===t._dayOfYear)&&(m(t)._overflowDayOfYear=!0),n=kt(o,0,t._dayOfYear),t._a[fr]=n.getUTCMonth(),t._a[pr]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=i[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[mr]&&0===t._a[vr]&&0===t._a[yr]&&0===t._a[gr]&&(t._nextDay=!0,t._a[mr]=0),t._d=(t._useUTC?kt:wt).apply(null,a),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[mr]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==r&&(m(t).weekdayMismatch=!0)}}function ce(t){var e,n,i,r,o,a,s,l;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)o=1,a=4,n=se(e.GG,t._a[hr],Mt(xe(),1,4).year),i=se(e.W,1),r=se(e.E,1),(r<1||r>7)&&(l=!0);else{o=t._locale._week.dow,a=t._locale._week.doy;var u=Mt(xe(),o,a);n=se(e.gg,t._a[hr],u.year),i=se(e.w,u.week),null!=e.d?(r=e.d,(r<0||r>6)&&(l=!0)):null!=e.e?(r=e.e+o,(e.e<0||e.e>6)&&(l=!0)):r=o}i<1||i>Dt(n,o,a)?m(t)._overflowWeeks=!0:null!=l?m(t)._overflowWeekday=!0:(s=Ot(n,i,r,o,a),t._a[hr]=s.year,t._dayOfYear=s.dayOfYear)}function de(t){var e,n,i,r,o,a,s=t._i,l=Rr.exec(s)||Wr.exec(s);if(l){for(m(t).iso=!0,e=0,n=Vr.length;e0&&m(e).unusedInput.push(a),s=s.slice(s.indexOf(i)+i.length),u+=i.length),zi[o]?(i?m(e).empty=!1:m(e).unusedTokens.push(o),tt(o,i,e)):e._strict&&!i&&m(e).unusedTokens.push(o);m(e).charsLeftOver=l-u,s.length>0&&m(e).unusedInput.push(s),e._a[mr]<=12&&m(e).bigHour===!0&&e._a[mr]>0&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[mr]=be(e._locale,e._a[mr],e._meridiem),ue(e),ae(e)}function be(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function we(t){var e,n,i,r,o;if(0===t._f.length)return m(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ze(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(g(t,this),t=Oe(t),t._a){var e=t._isUTC?f(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&S(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Je(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Qe(t,e){var n,i,r,o=t,a=null;return $e(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(o={},e?o[e]=t:o.milliseconds=t):(a=to.exec(t))?(n="-"===a[1]?-1:1,o={y:0,d:k(a[pr])*n,h:k(a[mr])*n,m:k(a[vr])*n,s:k(a[yr])*n,ms:k(Ie(1e3*a[gr]))*n}):(a=eo.exec(t))?(n="-"===a[1]?-1:("+"===a[1],1),o={y:Ke(a[2],n),M:Ke(a[3],n),w:Ke(a[4],n),d:Ke(a[5],n),h:Ke(a[6],n),m:Ke(a[7],n),s:Ke(a[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(r=en(xe(o.from),xe(o.to)),o={},o.ms=r.milliseconds,o.M=r.months),i=new Ee(o),$e(t)&&d(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function tn(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function en(t,e){var n;return t.isValid()&&e.isValid()?(e=He(e,t),t.isBefore(e)?n=tn(t,e):(n=tn(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(t,e){return function(n,i){var r,o;return null===i||isNaN(+i)||(D(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=i,i=o),n="string"==typeof n?+n:n,r=Qe(n,i),rn(this,r,t),this}}function rn(e,n,i,r){var o=n._milliseconds,a=Ie(n._days),s=Ie(n._months);e.isValid()&&(r=null==r||r,s&&mt(e,ot(e,"Month")+s*i),a&&at(e,"Date",ot(e,"Date")+a*i),o&&e._d.setTime(e._d.valueOf()+o*i),r&&t.updateOffset(e,a||s))}function on(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(e,n){var i=e||xe(),r=He(i,this).startOf("day"),o=t.calendarFormat(this,r)||"sameElse",a=n&&(x(n[o])?n[o].call(this,i):n[o]);return this.format(a||this.localeData().calendar(o,this,xe(i)))}function sn(){return new _(this)}function ln(t,e){var n=b(t)?t:xe(t);return!(!this.isValid()||!n.isValid())&&(e=F(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()9999?z(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",z(n,"Z")):z(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function gn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",r="-MM-DD[T]HH:mm:ss.SSS",o=e+'[")]';return this.format(n+i+r+o)}function _n(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=z(this,e);return this.localeData().postformat(n)}function bn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function wn(t){return this.from(xe(),t)}function kn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Sn(t){return this.to(xe(),t)}function On(t){var e;return void 0===t?this._locale._abbr:(e=re(t),null!=e&&(this._locale=e),this)}function Mn(){return this._locale}function Dn(t){switch(t=F(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function xn(t){return t=F(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Cn(){return this._d.valueOf()-6e4*(this._offset||0)}function Pn(){return Math.floor(this.valueOf()/1e3)}function Tn(){return new Date(this.valueOf())}function Yn(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function An(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function jn(){return this.isValid()?this.toISOString():null}function En(){return v(this)}function $n(){return h({},m(this))}function In(){return m(this).overflow}function Ln(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Fn(t,e){U(0,[t,t.length],0,e)}function Hn(t){return Un.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Nn(t){return Un.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Rn(){return Dt(this.year(),1,4)}function Wn(){var t=this.localeData()._week;return Dt(this.year(),t.dow,t.doy)}function Un(t,e,n,i,r){var o;return null==t?Mt(this,i,r).year:(o=Dt(t,i,r),e>o&&(e=o),Vn.call(this,t,e,n,i,r))}function Vn(t,e,n,i,r){var o=Ot(t,e,n,i,r),a=kt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Gn(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function zn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Bn(t,e){e[gr]=k(1e3*("0."+t))}function Zn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Xn(t){return xe(1e3*t)}function Jn(){return xe.apply(null,arguments).parseZone()}function Qn(t){return t}function Kn(t,e,n,i){var r=re(),o=f().set(i,e);return r[n](o,t)}function ti(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Kn(t,e,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=Kn(t,i,n,"month");return r}function ei(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var r=re(),o=t?r._week.dow:0;if(null!=n)return Kn(e,(n+o)%7,i,"day");var a,s=[];for(a=0;a<7;a++)s[a]=Kn(e,(a+o)%7,i,"day");return s}function ni(t,e){return ti(t,e,"months")}function ii(t,e){return ti(t,e,"monthsShort")}function ri(t,e,n){return ei(t,e,n,"weekdays")}function oi(t,e,n){return ei(t,e,n,"weekdaysShort")}function ai(t,e,n){return ei(t,e,n,"weekdaysMin")}function si(){var t=this._data;return this._milliseconds=fo(this._milliseconds),this._days=fo(this._days),this._months=fo(this._months),t.milliseconds=fo(t.milliseconds),t.seconds=fo(t.seconds),t.minutes=fo(t.minutes),t.hours=fo(t.hours),t.months=fo(t.months),t.years=fo(t.years),this}function li(t,e,n,i){var r=Qe(e,n);return t._milliseconds+=i*r._milliseconds,t._days+=i*r._days,t._months+=i*r._months,t._bubble()}function ui(t,e){return li(this,t,e,1)}function ci(t,e){return li(this,t,e,-1)}function di(t){return t<0?Math.floor(t):Math.ceil(t)}function hi(){var t,e,n,i,r,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*di(pi(s)+a),a=0,s=0),l.milliseconds=o%1e3,t=w(o/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,a+=w(n/24),r=w(fi(a)),s+=r,a-=di(pi(r)),i=w(s/12),s%=12,l.days=a,l.months=s,l.years=i,this}function fi(t){return 4800*t/146097}function pi(t){return 146097*t/4800}function mi(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(t=F(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+fi(e),"month"===t?n:n/12;switch(e=this._days+Math.round(pi(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function vi(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN}function yi(t){return function(){return this.as(t)}}function gi(){return Qe(this)}function _i(t){return t=F(t),this.isValid()?this[t+"s"]():NaN}function bi(t){return function(){return this.isValid()?this._data[t]:NaN}}function wi(){return w(this.days()/7)}function ki(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}function Si(t,e,n){var i=Qe(t).abs(),r=Po(i.as("s")),o=Po(i.as("m")),a=Po(i.as("h")),s=Po(i.as("d")),l=Po(i.as("M")),u=Po(i.as("y")),c=r<=To.ss&&["s",r]||r0,c[4]=n,ki.apply(null,c)}function Oi(t){return void 0===t?Po:"function"==typeof t&&(Po=t,!0)}function Mi(t,e){return void 0!==To[t]&&(void 0===e?To[t]:(To[t]=e,"s"===t&&(To.ss=e-1),!0))}function Di(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=Si(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function xi(t){return(t>0)-(t<0)||+t}function Ci(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=Yo(this._milliseconds)/1e3,r=Yo(this._days),o=Yo(this._months);t=w(i/60),e=w(t/60),i%=60,t%=60,n=w(o/12),o%=12;var a=n,s=o,l=r,u=e,c=t,d=i?i.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var f=h<0?"-":"",p=xi(this._months)!==xi(h)?"-":"",m=xi(this._days)!==xi(h)?"-":"",v=xi(this._milliseconds)!==xi(h)?"-":"";return f+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?m+l+"D":"")+(u||c||d?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(d?v+d+"S":"")}var Pi,Ti;Ti=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var wr,kr=rt("FullYear",!0);wr=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:y()}),Jr=function(){return Date.now?Date.now():+new Date},Qr=["year","quarter","month","week","day","hour","minute","second","millisecond"];Le("Z",":"),Le("ZZ",""),Z("Z",sr),Z("ZZ",sr),Q(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Fe(sr,t)});var Kr=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var to=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,eo=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Qe.fn=Ee.prototype,Qe.invalid=je;var no=nn(1,"add"),io=nn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ro=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Fn("gggg","weekYear"),Fn("ggggg","weekYear"),Fn("GGGG","isoWeekYear"),Fn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),Z("G",or),Z("g",or),Z("GG",Qi,Zi),Z("gg",Qi,Zi),Z("GGGG",nr,Xi),Z("gggg",nr,Xi),Z("GGGGG",ir,Ji),Z("ggggg",ir,Ji),K(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=k(t)}),K(["gg","GG"],function(e,n,i,r){n[r]=t.parseTwoDigitYear(e)}),U("Q",0,"Qo","quarter"),L("quarter","Q"),N("quarter",7),Z("Q",Bi),Q("Q",function(t,e){e[fr]=3*(k(t)-1)}),U("D",["DD",2],"Do","date"),L("date","D"),N("date",9),Z("D",Qi),Z("DD",Qi,Zi),Z("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),Q(["D","DD"],pr),Q("Do",function(t,e){e[pr]=k(t.match(Qi)[0])});var oo=rt("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),N("dayOfYear",4),Z("DDD",er),Z("DDDD",qi),Q(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),U("m",["mm",2],0,"minute"),L("minute","m"),N("minute",14),Z("m",Qi),Z("mm",Qi,Zi),Q(["m","mm"],vr);var ao=rt("Minutes",!1);U("s",["ss",2],0,"second"),L("second","s"),N("second",15),Z("s",Qi),Z("ss",Qi,Zi),Q(["s","ss"],yr);var so=rt("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100); -}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),N("millisecond",16),Z("S",er,Bi),Z("SS",er,Zi),Z("SSS",er,qi);var lo;for(lo="SSSS";lo.length<=9;lo+="S")Z(lo,rr);for(lo="S";lo.length<=9;lo+="S")Q(lo,Bn);var uo=rt("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var co=_.prototype;co.add=no,co.calendar=an,co.clone=sn,co.diff=pn,co.endOf=xn,co.format=_n,co.from=bn,co.fromNow=wn,co.to=kn,co.toNow=Sn,co.get=st,co.invalidAt=In,co.isAfter=ln,co.isBefore=un,co.isBetween=cn,co.isSame=dn,co.isSameOrAfter=hn,co.isSameOrBefore=fn,co.isValid=En,co.lang=ro,co.locale=On,co.localeData=Mn,co.max=Xr,co.min=qr,co.parsingFlags=$n,co.set=lt,co.startOf=Dn,co.subtract=io,co.toArray=Yn,co.toObject=An,co.toDate=Tn,co.toISOString=yn,co.inspect=gn,co.toJSON=jn,co.toString=vn,co.unix=Pn,co.valueOf=Cn,co.creationData=Ln,co.year=kr,co.isLeapYear=it,co.weekYear=Hn,co.isoWeekYear=Nn,co.quarter=co.quarters=Gn,co.month=vt,co.daysInMonth=yt,co.week=co.weeks=Tt,co.isoWeek=co.isoWeeks=Yt,co.weeksInYear=Wn,co.isoWeeksInYear=Rn,co.date=oo,co.day=co.days=Ht,co.weekday=Nt,co.isoWeekday=Rt,co.dayOfYear=zn,co.hour=co.hours=Lr,co.minute=co.minutes=ao,co.second=co.seconds=so,co.millisecond=co.milliseconds=uo,co.utcOffset=Re,co.utc=Ue,co.local=Ve,co.parseZone=Ge,co.hasAlignedHourOffset=ze,co.isDST=Be,co.isLocal=qe,co.isUtcOffset=Xe,co.isUtc=Je,co.isUTC=Je,co.zoneAbbr=Zn,co.zoneName=qn,co.dates=M("dates accessor is deprecated. Use date instead.",oo),co.months=M("months accessor is deprecated. Use month instead",vt),co.years=M("years accessor is deprecated. Use year instead",kr),co.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",We),co.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ze);var ho=T.prototype;ho.calendar=Y,ho.longDateFormat=A,ho.invalidDate=j,ho.ordinal=E,ho.preparse=Qn,ho.postformat=Qn,ho.relativeTime=$,ho.pastFuture=I,ho.set=C,ho.months=dt,ho.monthsShort=ht,ho.monthsParse=pt,ho.monthsRegex=_t,ho.monthsShortRegex=gt,ho.week=xt,ho.firstDayOfYear=Pt,ho.firstDayOfWeek=Ct,ho.weekdays=Et,ho.weekdaysMin=It,ho.weekdaysShort=$t,ho.weekdaysParse=Ft,ho.weekdaysRegex=Wt,ho.weekdaysShortRegex=Ut,ho.weekdaysMinRegex=Vt,ho.isPM=Xt,ho.meridiem=Jt,ee("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=M("moment.lang is deprecated. Use moment.locale instead.",ee),t.langData=M("moment.langData is deprecated. Use moment.localeData instead.",re);var fo=Math.abs,po=yi("ms"),mo=yi("s"),vo=yi("m"),yo=yi("h"),go=yi("d"),_o=yi("w"),bo=yi("M"),wo=yi("y"),ko=bi("milliseconds"),So=bi("seconds"),Oo=bi("minutes"),Mo=bi("hours"),Do=bi("days"),xo=bi("months"),Co=bi("years"),Po=Math.round,To={ss:44,s:45,m:45,h:22,d:26,M:11},Yo=Math.abs,Ao=Ee.prototype;return Ao.isValid=Ae,Ao.abs=si,Ao.add=ui,Ao.subtract=ci,Ao.as=mi,Ao.asMilliseconds=po,Ao.asSeconds=mo,Ao.asMinutes=vo,Ao.asHours=yo,Ao.asDays=go,Ao.asWeeks=_o,Ao.asMonths=bo,Ao.asYears=wo,Ao.valueOf=vi,Ao._bubble=hi,Ao.clone=gi,Ao.get=_i,Ao.milliseconds=ko,Ao.seconds=So,Ao.minutes=Oo,Ao.hours=Mo,Ao.days=Do,Ao.weeks=wi,Ao.months=xo,Ao.years=Co,Ao.humanize=Di,Ao.toISOString=Ci,Ao.toString=Ci,Ao.toJSON=Ci,Ao.locale=On,Ao.localeData=Mn,Ao.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ci),Ao.lang=ro,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",or),Z("X",lr),Q("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),Q("x",function(t,e,n){n._d=new Date(k(t))}),t.version="2.22.1",i(xe),t.fn=co,t.min=Pe,t.max=Te,t.now=Jr,t.utc=f,t.unix=Xn,t.months=ni,t.isDate=u,t.locale=ee,t.invalid=y,t.duration=Qe,t.isMoment=b,t.weekdays=ri,t.parseZone=Jn,t.localeData=re,t.isDuration=$e,t.monthsShort=ii,t.weekdaysMin=ai,t.defineLocale=ne,t.updateLocale=ie,t.locales=oe,t.weekdaysShort=oi,t.normalizeUnits=F,t.relativeTimeRounding=Oi,t.relativeTimeThreshold=Mi,t.calendarFormat=on,t.prototype=co,t.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},t})},{}],23:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n=3?o.postLoadDataConstructor():t.on("loadeddata",o.postLoadDataConstructor.bind(o)),o}return o(e,t),a(e,[{key:"postLoadDataConstructor",value:function(){this.annotationState=new c(this.player),this.annotationState.annotations=this.options.annotationsObjects,this.controls=new u(this.player,this.options.bindArrowKeys),this.bindEvents(),this.setBounds(!1),this.options.startInAnnotationMode&&this.toggleAnnotationMode(),this.pluginReady()}},{key:"bindEvents",value:function(){var t=this;$(window).on("resize.vac-window-resize",l.throttle(this.setBounds.bind(this),500)),this.player.on("fullscreenchange",l.throttle(this.setBounds.bind(this),500)),this.options.showFullScreen||this.player.on("fullscreenchange",function(){t.player.isFullscreen_?(t.preFullscreenAnnotationsEnabled=t.active,$(t.player.el()).addClass("vac-disable-fullscreen")):$(t.player.el()).removeClass("vac-disable-fullscreen"),t.preFullscreenAnnotationsEnabled&&t.toggleAnnotationMode()}.bind(this))}},{key:"fire",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.eventDispatcher.fire(t,e)}},{key:"toggleAnnotationMode",value:function(){this.active=!this.active,this.player.toggleClass("vac-active"),this.annotationState.enabled=this.active,this.active?this.fire("annotationModeEnabled"):this.fire("annotationModeDisabled"),this.options.showControls&&(this.active?this.controls.render():this.controls.clear(!0))}},{key:"setBounds",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.bounds={};var e=$(this.player.el()),n=e.find(".vjs-control-bar");this.bounds.left=e.offset().left,this.bounds.top=e.offset().top,this.bounds.right=this.bounds.left+e.width(),this.bounds.bottom=this.bounds.top+e.height(),this.bounds.bottomWithoutControls=this.bounds.bottom-n.height(),t&&this.fire("playerBoundsChanged",this.bounds)}},{key:"onReady",value:function(t){return this.eventDispatcher.pluginReady?t():void this._readyCallbacks.push(t)}},{key:"pluginReady",value:function(){for(this.eventDispatcher.pluginReady=!0;this._readyCallbacks.length;)this._readyCallbacks.pop()()}},{key:"dispose",value:function(){this.controls=this.controls.teardown(),this.annotationState=this.annotationState.teardown(),this.eventDispatcher=this.eventDispatcher.teardown(),this.teardown(),this.player&&(this.player.annotationComments=null,$(this.player.el()).removeClass("vac-active"),$(this.player.el()).find("[class^='vac-']").remove()),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"dispose",this).call(this)}},{key:"teardown",value:function(){this.player&&this.player.off("fullscreenchange"),$(window).off("resize.vac-window-resize")}}]),e}(n)}},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":35,"./lib/polyfills":39,"./lib/utils":40}],24:[function(t,e,n){"use strict";var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=t("handlebars/runtime");n.comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n
\n
'+d(t.lambda(null!=(a=null!=e?e.meta:e)?a.user_name:a,e))+'
\n
'+d((s=null!=(s=n.timeSince||(null!=e?e.timeSince:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"timeSince",hash:{},data:o}):s))+'\n   X\n
\n
\n
\n '+d((n.breaklines||e&&e.breaklines||u).call(l,null!=e?e.body:e,{name:"breaklines",hash:{},data:o}))+"\n
\n
\n"},useData:!0}),n.comment_list=r.template({1:function(t,e,n,i,r,o){var a;return" "+(null!=(a=t.lambda(o[0][0],e))?a:"")+"\n"},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r,o){var a,s,l=null!=e?e:t.nullContext||{};return'
\n'},useData:!0,useBlockParams:!0}),n.controls=r.template({1:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(2,r,0),inverse:t.noop,data:r}))?o:""},2:function(t,e,n,i,r){var o;return'
\n \n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showNav:e,{name:"if",hash:{},fn:t.program(3,r,0),inverse:t.noop,data:r}))?o:"")+"
\n"},3:function(t,e,n,i,r){return'
\n
Prev
\n
Next
\n
\n'},5:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return'
\n
\n
Click and drag to select
\n
\n
\n'+(null!=(o=n["if"].call(a,null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.writingComment:e,{name:"if",hash:{},fn:t.program(9,r,0),inverse:t.noop,data:r}))?o:"")},6:function(t,e,n,i,r){var o;return'
\n Select shape + range\n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.internalCommenting:e,{name:"if",hash:{},fn:t.program(7,r,0),inverse:t.noop,data:r}))?o:"")+'
\n
-1 sec
\n
+1 sec
\n
\n
\n'},7:function(t,e,n,i,r){return' \n cancel\n'},9:function(t,e,n,i,r){var o;return'
\n
\n
\n
New Annotation @ '+t.escapeExpression((o=null!=(o=n.rangeStr||(null!=e?e.rangeStr:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"rangeStr",hash:{},data:r}):o))+'
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n'},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return(null!=(o=n.unless.call(a,null!=e?e.adding:e,{name:"unless",hash:{},fn:t.program(1,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.adding:e,{name:"if",hash:{},fn:t.program(5,r,0),inverse:t.noop,data:r}))?o:"")},useData:!0}),n.draggable_marker=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n'},useData:!0}),n.marker=r.template({1:function(t,e,n,i,r){return"vac-ranged-marker"},3:function(t,e,n,i,r){var o;return"width:"+t.escapeExpression((o=null!=(o=n.width||(null!=e?e.width:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"width",hash:{},data:r}):o))+";"},5:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.tooltipBody:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:""},6:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n \n '+d((s=null!=(s=n.tooltipTime||(null!=e?e.tooltipTime:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipTime",hash:{},data:o}):s))+" - "+d((s=null!=(s=n.tooltipBody||(null!=e?e.tooltipBody:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipBody",hash:{},data:o}):s))+"\n \n
\n"},7:function(t,e,n,i,r){return"vac-right-side"},compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n'+(null!=(a=n["if"].call(l,null!=e?e.showTooltip:e,{name:"if",hash:{},fn:t.program(5,o,0),inverse:t.noop,data:o}))?a:"")+"
\n"},useData:!0}),n.marker_wrap=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'
\n\t
\n
'},useData:!0}),n.new_comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n'},useData:!0}),n.player_button=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'\n\n\t\n\t \n\t \n\t\n'},useData:!0})},{"handlebars/runtime":20}],25:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0],e=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.isOpen=!0;var r=i||!u.isWithinRange(this.range.start,this.range.end,Math.floor(this.currentTime)),o=n&&this.plugin.options.showMarkerShapeAndTooltips;this.marker.setActive(o),!n&&this.plugin.options.showCommentList&&this.commentList.render(),(!n||n&&this.plugin.options.showMarkerShapeAndTooltips)&&(this.annotationShape.render(),this.shape&&this.annotationShape.$el.on("click.vac-annotation",function(){e.plugin.annotationState.openAnnotation(e,!1,!1,!1)})),t&&this.player.pause(),r&&(this.currentTime=this.range.start),this.plugin.fire("annotationOpened",{annotation:this.data,triggered_by_timeline:n})}},{key:"close",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isOpen&&(this.isOpen=!1,this.marker.deactivate(),this.commentList.teardown(!1),this.annotationShape.$el&&this.annotationShape.$el.off("click.vac-annotation"),this.annotationShape.teardown(),t&&this.plugin.annotationState.clearActive(),this.plugin.fire("annotationClosed",this.data))}},{key:"buildSecondsActiveArray",value:function(){var t=[];if(this.range.end)for(var e=this.range.start;e<=this.range.end;e++)t.push(e);else{var n=this.range.start;t.push(n),n0&&void 0!==arguments[0])||arguments[0];this.close(!0),this.marker.teardown(),this.commentList&&this.commentList.teardown(t),t&&this.plugin.annotationState.removeAnnotation(this),this.annotationShape&&this.annotationShape.teardown(),t&&s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return{id:this.id,range:this.range,shape:this.shape,comments:this.commentList.data}}},{key:"isActive",get:function(){return this.plugin.annotationState.activeAnnotation===this}}],[{key:"newFromData",value:function(t,n,i,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,a=h.dataObj(i,r);t&&(t=u.parseIntObj(t)),n&&(n=u.parseIntObj(n));var s={id:o,range:t,shape:n,comments:[a]};return new e(s,r.player)}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils.js":40,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(t,e,n){"use strict";function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);ee.range.start?1:0})}},{key:"addNewAnnotation",value:function(t){this._annotations.push(t),this.openAnnotation(t,!0,!0,!1,!0),this.stateChanged()}},{key:"createAndAddAnnotation",value:function(t){this.plugin.controls.uiState.adding&&this.plugin.controls.cancelAddNew();var e=d.newFromData(t.range,t.shape,t.commentStr||"",this.plugin,t.id);this.addNewAnnotation(e)}},{key:"destroyAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&e.teardown()}},{key:"removeAnnotation",value:function(t){var e=t.id,n=this._annotations.indexOf(t);this._annotations.splice(n,1),this.stateChanged(),this.plugin.fire("annotationDeleted",{id:e})}},{key:"setLiveAnnotation",value:function(){if(this.enabled){var t=Math.floor(this.currentTime);if(this.skipLiveCheck)return void(t!==this.lastVideoTime&&(this.skipLiveCheck=!1));var e=this.activeAnnotationsForTime(t);if(!e.length)return this.activeAnnotation.close();var n=this.annotations[e[e.length-1]];if(this.activeAnnotation.range){if(n===this.activeAnnotation)return;var i=n.range.start,r=this.activeAnnotation.range.start;if(i===r&&i===t)return}this.openAnnotation(n,!1,!1,!0)}}},{key:"activeAnnotationsForTime",value:function(t){return this.annotations.length?this.annotationTimeMap[t]||[]:[]}},{key:"rebuildAnnotationTimeMap",value:function(){var t=this,e={};this.annotations.forEach(function(n){n.secondsActive.forEach(function(i){var r=e[i]||[];r.push(t.annotations.indexOf(n)),e[i]=r})}),this.annotationTimeMap=e}},{key:"clearActive",value:function(){this.activeAnnotation.close(!1),this._activeAnnotation=null}},{key:"openAnnotation",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.plugin.active||this.plugin.toggleAnnotationMode(),this.skipLiveCheck=e,this.clearActive(),t.open(n,i,r),this.activeAnnotation=t,this.lastVideoTime=this.activeAnnotation.range.start}},{key:"openAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&this.openAnnotation(e)}},{key:"findAnnotation",value:function(t){return this.annotations.find(function(e){return e.id==t})}},{key:"findComment",value:function(t){var e,n=this.annotations.map(function(t){return t.commentList.comments});return n=(e=[]).concat.apply(e,i(n)),n.find(function(e){return e.id==t})}},{key:"nextAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=t===this.annotations.length-1?0:t+1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=0;in)return this.openAnnotation(this.annotations[i],!0);this.openAnnotation(this.annotations[0],!0)}},{key:"prevAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=0===t?this.annotations.length-1:t-1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=this.annotations.length-1;i>=0;i--)if(this.annotations[i].range.start0&&void 0!==arguments[0]?arguments[0]:null;this._activeAnnotation=t},get:function(){return this._activeAnnotation||{close:function(){}}}},{key:"data",get:function(){return this._annotations.map(function(t){return t.data})}}]),e}(c)},{"./../lib/player_component":37,"./../lib/utils":40,"./annotation":25}],27:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this,t)}},{key:"data",get:function(){return{id:this.id,meta:this.meta,body:this.body}}},{key:"HTML",get:function(){return this.$el[0].outerHTML}}],[{key:"newFromData",value:function(t,n,i){var r=this.dataObj(t,i);return new e(r,i.player)}},{key:"dataObj",value:function(t,e){return{meta:Object.assign({ -datetime:c().toISOString()},e.meta),id:u.guid(),body:t}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,moment:22}],28:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;na-10&&"down"==o&&(e.stop(),e.animate({scrollTop:n+40},100),t.preventDefault())}},{key:"sortComments",value:function(){this.comments.sort(function(t,e){return t.timestampe.timestamp?1:0})}},{key:"handleDeleteAnnotationClick",value:function(t){var e=this,n=$("").addClass("vac-delete-confirm").text("CONFIRM");n.on("click.comment",function(){n.off("click.comment"),e.annotation.teardown()}),$(t.target).replaceWith(n)}},{key:"unbindCommentFormEvents",value:function(){this.$newCommentForm&&this.$newCommentForm.off("click.vac-comment")}},{key:"teardown",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.$el&&this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"),this.comments.forEach(function(e){return e.teardown(t)}),t&&(this.comments=[]),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return this.comments.map(function(t){return t.data})}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./comment":27}],29:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this.uiState.adding&&(this.restoreNormalUI(),this.marker.teardown(),this.selectableShape.teardown()),this.uiState=u.cloneObject(m),this.$player.find(".vac-video-cover-canvas").off("mousedown.vac-cursor-tooltip").off("mouseup.vac-cursor-tooltip")),this.$tooltip_=null,this.$UI.controlElements.remove()}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.clear(t);var e=Object.assign({rangeStr:this.marker?u.humanTime(this.marker.range):null,showNav:this.plugin.annotationState.annotations.length>1},this.uiState,{internalCommenting:this.internalCommenting,showControls:this.showControls}),n=this.renderTemplate(p,e);this.$player.append(n),this.playerButton&&this.playerButton.updateNumAnnotations()}},{key:"cancelAddNew",value:function(){(this.uiState.adding||this.uiState.writingComment)&&(this.render(!0),this.marker.teardown(),this.marker=null)}},{key:"startAddNew",value:function(){this.plugin.active||this.plugin.toggleAnnotationMode(),this.player.pause(),this.setAddingUI(),this.uiState.adding=!0,this.render();var t={start:parseInt(this.currentTime,10),stop:parseInt(this.currentTime,10)};this.marker=new c(this.player,t),this.selectableShape=new d(this.player),this.showControls||this.bindCursorTooltip(),this.plugin.fire("enteredAddingAnnotation",{range:t})}},{key:"writeComment",value:function(){this.uiState.writingComment=!0,this.render()}},{key:"saveNew",value:function(){var t=this.$UI.newCommentTextarea.val();if(t){var e=f.newFromData(this.marker.range,this.selectableShape.shape,t,this.plugin);this.plugin.annotationState.addNewAnnotation(e),this.cancelAddNew()}}},{key:"setAddingUI",value:function(){this.plugin.annotationState.enabled=!1,this.disablePlayingAndControl()}},{key:"restoreNormalUI",value:function(){this.plugin.annotationState.enabled=this.plugin.active,this.enablePlayingAndControl(),$(document).off("mousemove.vac-tooltip-"+this.playerId)}},{key:"handleArrowKeys",value:function(t){if(this.plugin.active){var e=t.which;37==e&&this.plugin.annotationState.prevAnnotation(),39==e&&this.plugin.annotationState.nextAnnotation()}}},{key:"bindCursorTooltip",value:function(){var t=this;this.tooltipArea=u.areaOfHiddenEl(this.$tooltip,this.$UI.coverCanvas,this.UI_CLASSES.hidden),this.plugin.setBounds(!1),$(document).on("mousemove.vac-tooltip-"+this.playerId,u.throttle(function(e){if(t.plugin.bounds){var n=e.pageX,i=e.pageY,r=nt.plugin.bounds.right||it.plugin.bounds.bottom,o=!r&&i>=t.plugin.bounds.bottomWithoutControls,a=t.$tooltip.hasClass("vac-marker-hover");if(r)return void t.$tooltip.addClass(t.UI_CLASSES.hidden);var s=n-t.plugin.bounds.left,l=i-t.plugin.bounds.top,u=10,c=t.$player.width(),d=t.$player.height()-t.$UI.controlBar.height(),h=s+t.tooltipArea.width+2*u>=c,f=l+t.tooltipArea.height+2*u>=d,p=h?c-t.tooltipArea.width-u:s+u,m=f?d-t.tooltipArea.height-u:l+u;o&&!a||t.$tooltip.hasClass("vac-cursor-dragging")?t.$tooltip.addClass(t.UI_CLASSES.hidden):t.$tooltip.removeClass(t.UI_CLASSES.hidden),t.$tooltip.css({left:p+"px",top:m+"px"})}}.bind(this),50))}},{key:"$tooltip",get:function(){return this.$tooltip_=this.$tooltip_||this.$player.find(".vac-cursor-tool-tip"),this.$tooltip_}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;nthis.rangePin?this.range={start:this.rangePin,end:n}:this.range={start:n,end:this.rangePin},this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}},{key:"percentValFromXpos",value:function(t){var e=Math.max(0,t-this.$parent.offset().left),n=this.$parent.innerWidth(),i=e/n;return i>1&&(i=1),i<0&&(i=0),i}},{key:"teardown",value:function(){$(document).off("mousemove.vac-dmarker-"+this.playerId+" mouseup.vac-dmarker-"+this.playerId),this.$el.off("mouseenter.vac-cursor-tool-tip"),this.$el.off("mouseleave.vac-cursor-tool-tip"),this.$el.off("mousedown.vac-marker"),this.$el.remove()}},{key:"scrubStart",value:function(t){var e=this.range.start+t;this.currentTime=e,this.range.start=e,this.rangePin=e,this.teardown(),this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}}]),e}(s)},{"./../lib/utils":40,"./marker":31}],31:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:null;i(this,e);var a=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return a.range=n,a.comment=o,a.templateName=c,a.$UI.markerWrap.length||a.$UI.timeline.append(a.renderTemplate(d)),a}return o(e,t),a(e,[{key:"setActive",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$el.addClass(this.UI_CLASSES.active),t&&this.$el.addClass("vac-force-tooltip")}},{key:"deactivate",value:function(){this.$el.removeClass(this.UI_CLASSES.active+" vac-force-tooltip")}},{key:"render",value:function(){this.$UI.timeline.find('[data-marker-id="'+this.componentId+'"]').remove(),this.$el=$(this.renderTemplate(this.templateName,this.markerTemplateData)),this.$UI.markerWrap.append(this.$el),this.bindMarkerEvents()}},{key:"bindMarkerEvents",value:function(){var t=this;this.$el.on("mouseenter.vac-marker",function(){t.$el.addClass("vac-hovering").closest(".vac-marker-wrap").addClass("vac-dim-all")}).on("mouseleave.vac-marker",function(){t.$el.removeClass("vac-hovering").closest(".vac-marker-wrap").removeClass("vac-dim-all")})}},{key:"teardown",value:function(){this.$el.off("mouseenter.vac-marker").off("mouseleave.vac-marker").off("click.vac-marker"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"markerTemplateData",get:function(){var t=this.range.start/this.duration*100,e=this.range.end/this.duration*100-t,n=100-Math.floor(e)||100;return{left:t+"%",width:e+"%",zIndex:n,showTooltip:this.plugin.options.showMarkerShapeAndTooltips,tooltipRight:t>50,tooltipTime:u.humanTime(this.range),tooltipBody:this.comment?this.comment.body:null,rangeShow:!!this.range.end,id:this.componentId}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40}],32:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0?e.removeClass(this.UI_CLASSES.hidden):e.addClass(this.UI_CLASSES.hidden)}},{key:"teardown",value:function(){this.$el.off("click.vac-player-button"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}}]),e}(l)},{"./../lib/player_ui_component":38}],33:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var o=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return o.shape=n,o.$parent=o.$player,o}return o(e,t),a(e,[{key:"render",value:function(){this.shape&&(this.$el&&this.$el.remove(),this.$el=$("
").addClass("vac-shape"),this.setDimsFromShape(),this.$parent.append(this.$el))}},{key:"setDimsFromShape",value:function(){this.$el.css({left:this.shape.x1+"%",top:this.shape.y1+"%",width:this.shape.x2-this.shape.x1+"%",height:this.shape.y2-this.shape.y1+"%"})}}]),e}(s)},{"./../lib/player_ui_component":38}],35:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this._player=null)}},{key:"plugin",get:function(){return this.player.annotationComments()}},{key:"player",get:function(){return this._player}},{key:"duration",get:function(){return this.player.duration()}},{key:"currentTime",get:function(){return this.player.currentTime()},set:function(t){this.player.currentTime(t)}}]),t}()},{}],38:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return this.registerHandlebarsHelpers(),c[t](e)}},{key:"registerHandlebarsHelpers",value:function(){"breaklines"in u.helpers||u.registerHelper("breaklines",function(t){return t=u.Utils.escapeExpression(t),t=t.replace(/(\r\n|\n|\r)/gm,"
"),new u.SafeString(t)})}},{key:"teardown",value:function(){this.$el&&this.$el.remove(),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"$UI",get:function(){return Object.freeze({commentsContainer:this.$player.find(".vac-comments-container"),controlElements:this.$player.find(".vac-control"),newCommentTextarea:this.$player.find(".vac-video-write-new textarea"),timeline:this.$player.find(".vjs-progress-control"),markerCursorHelpText:this.$player.find(".vac-cursor-help-text"),controlBar:this.$player.find(".vjs-control-bar"),markerWrap:this.$player.find(".vac-marker-wrap"),coverCanvas:this.$player.find(".vac-video-cover-canvas")})}},{key:"UI_CLASSES",get:function(){return Object.freeze({hidden:"vac-hidden",active:"vac-active"})}},{key:"$player",get:function(){return $(this.player.el())}},{key:"playerId",get:function(){return this.$player.attr("id")}},{key:"componentId",get:function(){return this.cid_=this.cid_||d.guid(),this.cid_}}]),e}(l)},{"./../compiled/templates":24,"./../lib/utils":40,"./player_component":37,"handlebars/runtime":20}],39:[function(t,e,n){"use strict";t("ie-array-find-polyfill"),t("es6-object-assign").polyfill(),function(){if("undefined"==typeof Object.setPrototypeOf&&"function"==typeof Object.getOwnPropertyNames){var t=function(t,e){return function(){return e.apply(this,arguments)}},e=function(t,e,n){if(!n){var i=t.__proto__[e]; -n={get:function(){return t["__"+e]||i},set:function(n){t["__"+e]=n}}}Object.defineProperty(t,e,{get:n.get?n.get.bind(t):void 0,set:n.set?n.set.bind(t):void 0,configurable:!0})},n=function r(n,o){var a,s=Object.getOwnPropertyNames(o);n.__proto__=o;for(var l=0,u=s.length;le?(a&&(clearTimeout(a),a=null),s=u,o=t.apply(i,r),a||(i=r=null)):a||n.trailing===!1||(a=setTimeout(l,c)),o}},parseIntObj:function(t){return Object.keys(t).forEach(function(e){parseInt(t[e])&&(t[e]=parseInt(t[e]))}),t},humanTime:function(t){function e(t){var e=Math.floor(t/60),n=String(t%60);return e+":"+(1==n.length?"0":"")+n}var n=[e(t.start)];return t.end&&n.push(e(t.end)),n.join("-")},guid:function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},areaOfHiddenEl:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=t.clone(),r={};return i.css({visibility:"hidden",display:"inline-block"}),i.removeClass(n),e.append(i),r.width=i.outerWidth(),r.height=i.outerHeight(),i.remove(),r},isWithinRange:function(t,e,n){return e=e||t+1,n>=t&&n<=e}}},{}]},{},[23])(23)}); \ No newline at end of file diff --git a/build/videojs-annotation-comments.js b/build/videojs-annotation-comments.js deleted file mode 100644 index 003d807..0000000 --- a/build/videojs-annotation-comments.js +++ /dev/null @@ -1,8482 +0,0 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 2.0.0-beta.1', - 7: '>= 4.0.0' -}; - -exports.REVISION_CHANGES = REVISION_CHANGES; -var objectType = '[object Object]'; - -function HandlebarsEnvironment(helpers, partials, decorators) { - this.helpers = helpers || {}; - this.partials = partials || {}; - this.decorators = decorators || {}; - - _helpers.registerDefaultHelpers(this); - _decorators.registerDefaultDecorators(this); -} - -HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: _logger2['default'], - log: _logger2['default'].log, - - registerHelper: function registerHelper(name, fn) { - if (_utils.toString.call(name) === objectType) { - if (fn) { - throw new _exception2['default']('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (_utils.toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - }, - - registerDecorator: function registerDecorator(name, fn) { - if (_utils.toString.call(name) === objectType) { - if (fn) { - throw new _exception2['default']('Arg not supported with multiple decorators'); - } - _utils.extend(this.decorators, name); - } else { - this.decorators[name] = fn; - } - }, - unregisterDecorator: function unregisterDecorator(name) { - delete this.decorators[name]; - } -}; - -var log = _logger2['default'].log; - -exports.log = log; -exports.createFrame = _utils.createFrame; -exports.logger = _logger2['default']; - - -},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.registerDefaultDecorators = registerDefaultDecorators; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _decoratorsInline = require('./decorators/inline'); - -var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); - -function registerDefaultDecorators(instance) { - _decoratorsInline2['default'](instance); -} - - -},{"./decorators/inline":5}],5:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerDecorator('inline', function (fn, props, container, options) { - var ret = fn; - if (!props.partials) { - props.partials = {}; - ret = function (context, options) { - // Create a new partials stack frame prior to exec. - var original = container.partials; - container.partials = _utils.extend({}, original, props.partials); - var ret = fn(context, options); - container.partials = original; - return ret; - }; - } - - props.partials[options.args[0]] = options.fn; - - return ret; - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],6:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - -function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - /* istanbul ignore else */ - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - try { - if (loc) { - this.lineNumber = line; - - // Work around issue under safari where we can't directly set the column value - /* istanbul ignore next */ - if (Object.defineProperty) { - Object.defineProperty(this, 'column', { - value: column, - enumerable: true - }); - } else { - this.column = column; - } - } - } catch (nop) { - /* Ignore if the browser is very particular */ - } -} - -Exception.prototype = new Error(); - -exports['default'] = Exception; -module.exports = exports['default']; - - -},{}],7:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.registerDefaultHelpers = registerDefaultHelpers; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _helpersBlockHelperMissing = require('./helpers/block-helper-missing'); - -var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); - -var _helpersEach = require('./helpers/each'); - -var _helpersEach2 = _interopRequireDefault(_helpersEach); - -var _helpersHelperMissing = require('./helpers/helper-missing'); - -var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); - -var _helpersIf = require('./helpers/if'); - -var _helpersIf2 = _interopRequireDefault(_helpersIf); - -var _helpersLog = require('./helpers/log'); - -var _helpersLog2 = _interopRequireDefault(_helpersLog); - -var _helpersLookup = require('./helpers/lookup'); - -var _helpersLookup2 = _interopRequireDefault(_helpersLookup); - -var _helpersWith = require('./helpers/with'); - -var _helpersWith2 = _interopRequireDefault(_helpersWith); - -function registerDefaultHelpers(instance) { - _helpersBlockHelperMissing2['default'](instance); - _helpersEach2['default'](instance); - _helpersHelperMissing2['default'](instance); - _helpersIf2['default'](instance); - _helpersLog2['default'](instance); - _helpersLookup2['default'](instance); - _helpersWith2['default'](instance); -} - - -},{"./helpers/block-helper-missing":8,"./helpers/each":9,"./helpers/helper-missing":10,"./helpers/if":11,"./helpers/log":12,"./helpers/lookup":13,"./helpers/with":14}],8:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (_utils.isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = _utils.createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],9:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _utils = require('../utils'); - -var _exception = require('../exception'); - -var _exception2 = _interopRequireDefault(_exception); - -exports['default'] = function (instance) { - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (_utils.isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = _utils.createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (_utils.isArray(context)) { - for (var j = context.length; i < j; i++) { - if (i in context) { - execIteration(i, i, i === context.length - 1); - } - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey !== undefined) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey !== undefined) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); -}; - -module.exports = exports['default']; - - -},{"../exception":6,"../utils":19}],10:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _exception = require('../exception'); - -var _exception2 = _interopRequireDefault(_exception); - -exports['default'] = function (instance) { - instance.registerHelper('helperMissing', function () /* [args, ]options */{ - if (arguments.length === 1) { - // A missing field in a {{foo}} construct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); -}; - -module.exports = exports['default']; - - -},{"../exception":6}],11:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerHelper('if', function (conditional, options) { - if (_utils.isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],12:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -exports['default'] = function (instance) { - instance.registerHelper('log', function () /* message, options */{ - var args = [undefined], - options = arguments[arguments.length - 1]; - for (var i = 0; i < arguments.length - 1; i++) { - args.push(arguments[i]); - } - - var level = 1; - if (options.hash.level != null) { - level = options.hash.level; - } else if (options.data && options.data.level != null) { - level = options.data.level; - } - args[0] = level; - - instance.log.apply(instance, args); - }); -}; - -module.exports = exports['default']; - - -},{}],13:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -exports['default'] = function (instance) { - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); -}; - -module.exports = exports['default']; - - -},{}],14:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('../utils'); - -exports['default'] = function (instance) { - instance.registerHelper('with', function (context, options) { - if (_utils.isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - var data = options.data; - if (options.data && options.ids) { - data = _utils.createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - } - - return fn(context, { - data: data, - blockParams: _utils.blockParams([context], [data && data.contextPath]) - }); - } else { - return options.inverse(this); - } - }); -}; - -module.exports = exports['default']; - - -},{"../utils":19}],15:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; - -var _utils = require('./utils'); - -var logger = { - methodMap: ['debug', 'info', 'warn', 'error'], - level: 'info', - - // Maps a given level value to the `methodMap` indexes above. - lookupLevel: function lookupLevel(level) { - if (typeof level === 'string') { - var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); - if (levelMap >= 0) { - level = levelMap; - } else { - level = parseInt(level, 10); - } - } - - return level; - }, - - // Can be overridden in the host environment - log: function log(level) { - level = logger.lookupLevel(level); - - if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { - var method = logger.methodMap[level]; - if (!console[method]) { - // eslint-disable-line no-console - method = 'log'; - } - - for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - message[_key - 1] = arguments[_key]; - } - - console[method].apply(console, message); // eslint-disable-line no-console - } - } -}; - -exports['default'] = logger; -module.exports = exports['default']; - - -},{"./utils":19}],16:[function(require,module,exports){ -(function (global){ -/* global window */ -'use strict'; - -exports.__esModule = true; - -exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - return Handlebars; - }; -}; - -module.exports = exports['default']; - - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],17:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.checkRevision = checkRevision; -exports.template = template; -exports.wrapProgram = wrapProgram; -exports.resolvePartial = resolvePartial; -exports.invokePartial = invokePartial; -exports.noop = noop; -// istanbul ignore next - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -// istanbul ignore next - -function _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; } } - -var _utils = require('./utils'); - -var Utils = _interopRequireWildcard(_utils); - -var _exception = require('./exception'); - -var _exception2 = _interopRequireDefault(_exception); - -var _base = require('./base'); - -function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } -} - -function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - templateSpec.main.decorator = templateSpec.main_d; - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - if (options.ids) { - options.ids[0] = true; - } - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - var ret = templateSpec[i]; - ret.decorator = templateSpec[i + '_d']; - return ret; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - // An empty object to use as replacement for null-contexts - nullContext: Object.seal({}), - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - if (options.depths) { - depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; - } else { - depths = [context]; - } - } - - function main(context /*, options*/) { - return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); - } - main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); - return main(context, options); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - if (templateSpec.usePartial || templateSpec.useDecorators) { - container.decorators = container.merge(options.decorators, env.decorators); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - container.decorators = options.decorators; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; -} - -function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - var currentDepths = depths; - if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { - currentDepths = [context].concat(depths); - } - - return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); - } - - prog = executeDecorators(fn, prog, container, depths, data, blockParams); - - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; -} - -function resolvePartial(partial, context, options) { - if (!partial) { - if (options.name === '@partial-block') { - partial = options.data['partial-block']; - } else { - partial = options.partials[options.name]; - } - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; -} - -function invokePartial(partial, context, options) { - // Use the current closure context to save the partial-block if this partial - var currentPartialBlock = options.data && options.data['partial-block']; - options.partial = true; - if (options.ids) { - options.data.contextPath = options.ids[0] || options.data.contextPath; - } - - var partialBlock = undefined; - if (options.fn && options.fn !== noop) { - (function () { - options.data = _base.createFrame(options.data); - // Wrapper function to get access to currentPartialBlock from the closure - var fn = options.fn; - partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - // Restore the partial-block from the closure for the execution of the block - // i.e. the part inside the block of the partial call. - options.data = _base.createFrame(options.data); - options.data['partial-block'] = currentPartialBlock; - return fn(context, options); - }; - if (fn.partials) { - options.partials = Utils.extend({}, options.partials, fn.partials); - } - })(); - } - - if (partial === undefined && partialBlock) { - partial = partialBlock; - } - - if (partial === undefined) { - throw new _exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } -} - -function noop() { - return ''; -} - -function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; -} - -function executeDecorators(fn, prog, container, depths, data, blockParams) { - if (fn.decorator) { - var props = {}; - prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); - Utils.extend(prog, props); - } - return prog; -} - - -},{"./base":3,"./exception":6,"./utils":19}],18:[function(require,module,exports){ -// Build out our basic SafeString type -'use strict'; - -exports.__esModule = true; -function SafeString(string) { - this.string = string; -} - -SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; -}; - -exports['default'] = SafeString; -module.exports = exports['default']; - - -},{}],19:[function(require,module,exports){ -'use strict'; - -exports.__esModule = true; -exports.extend = extend; -exports.indexOf = indexOf; -exports.escapeExpression = escapeExpression; -exports.isEmpty = isEmpty; -exports.createFrame = createFrame; -exports.blockParams = blockParams; -exports.appendContextPath = appendContextPath; -var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`', - '=': '=' -}; - -var badChars = /[&<>"'`=]/g, - possible = /[&<>"'`=]/; - -function escapeChar(chr) { - return escape[chr]; -} - -function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; -} - -var toString = Object.prototype.toString; - -exports.toString = toString; -// Sourced from lodash -// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt -/* eslint-disable func-style */ -var isFunction = function isFunction(value) { - return typeof value === 'function'; -}; -// fallback for older versions of Chrome and Safari -/* istanbul ignore next */ -if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; -} -exports.isFunction = isFunction; - -/* eslint-enable func-style */ - -/* istanbul ignore next */ -var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; -}; - -exports.isArray = isArray; -// Older IE versions do not directly support indexOf so we must implement our own, sadly. - -function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; -} - -function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); -} - -function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } -} - -function createFrame(object) { - var frame = extend({}, object); - frame._parent = object; - return frame; -} - -function blockParams(params, ids) { - params.path = ids; - return params; -} - -function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; -} - - -},{}],20:[function(require,module,exports){ -// Create a simple path alias to allow browserify to resolve -// the runtime on a supported path. -module.exports = require('./dist/cjs/handlebars.runtime')['default']; - -},{"./dist/cjs/handlebars.runtime":2}],21:[function(require,module,exports){ -'use strict'; -if (!Array.prototype.find) { - Object.defineProperty(Array.prototype, 'find', { - value: function (predicate) { - - if (this == null) { - throw new TypeError('this is null or not defined'); - } - - var obj = Object(this); - var len = obj.length >>> 0; - - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - - var thisArg = arguments[1]; - - var index = 0; - - while (index < len) { - var iValue = obj[index]; - if (predicate.call(thisArg, iValue, index, obj)) { - return iValue; - } - index++; - } - - return undefined; - } - }); -} -},{}],22:[function(require,module,exports){ -//! moment.js - -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - global.moment = factory() -}(this, (function () { 'use strict'; - - var hookCallback; - - function hooks () { - return hookCallback.apply(null, arguments); - } - - // This is done to register the method called with moment() - // without creating circular dependencies. - function setHookCallback (callback) { - hookCallback = callback; - } - - function isArray(input) { - return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; - } - - function isObject(input) { - // IE8 will treat undefined and null as object if it wasn't for - // input != null - return input != null && Object.prototype.toString.call(input) === '[object Object]'; - } - - function isObjectEmpty(obj) { - if (Object.getOwnPropertyNames) { - return (Object.getOwnPropertyNames(obj).length === 0); - } else { - var k; - for (k in obj) { - if (obj.hasOwnProperty(k)) { - return false; - } - } - return true; - } - } - - function isUndefined(input) { - return input === void 0; - } - - function isNumber(input) { - return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; - } - - function isDate(input) { - return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; - } - - function map(arr, fn) { - var res = [], i; - for (i = 0; i < arr.length; ++i) { - res.push(fn(arr[i], i)); - } - return res; - } - - function hasOwnProp(a, b) { - return Object.prototype.hasOwnProperty.call(a, b); - } - - function extend(a, b) { - for (var i in b) { - if (hasOwnProp(b, i)) { - a[i] = b[i]; - } - } - - if (hasOwnProp(b, 'toString')) { - a.toString = b.toString; - } - - if (hasOwnProp(b, 'valueOf')) { - a.valueOf = b.valueOf; - } - - return a; - } - - function createUTC (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, true).utc(); - } - - function defaultParsingFlags() { - // We need to deep clone this object. - return { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso : false, - parsedDateParts : [], - meridiem : null, - rfc2822 : false, - weekdayMismatch : false - }; - } - - function getParsingFlags(m) { - if (m._pf == null) { - m._pf = defaultParsingFlags(); - } - return m._pf; - } - - var some; - if (Array.prototype.some) { - some = Array.prototype.some; - } else { - some = function (fun) { - var t = Object(this); - var len = t.length >>> 0; - - for (var i = 0; i < len; i++) { - if (i in t && fun.call(this, t[i], i, t)) { - return true; - } - } - - return false; - }; - } - - function isValid(m) { - if (m._isValid == null) { - var flags = getParsingFlags(m); - var parsedParts = some.call(flags.parsedDateParts, function (i) { - return i != null; - }); - var isNowValid = !isNaN(m._d.getTime()) && - flags.overflow < 0 && - !flags.empty && - !flags.invalidMonth && - !flags.invalidWeekday && - !flags.weekdayMismatch && - !flags.nullInput && - !flags.invalidFormat && - !flags.userInvalidated && - (!flags.meridiem || (flags.meridiem && parsedParts)); - - if (m._strict) { - isNowValid = isNowValid && - flags.charsLeftOver === 0 && - flags.unusedTokens.length === 0 && - flags.bigHour === undefined; - } - - if (Object.isFrozen == null || !Object.isFrozen(m)) { - m._isValid = isNowValid; - } - else { - return isNowValid; - } - } - return m._isValid; - } - - function createInvalid (flags) { - var m = createUTC(NaN); - if (flags != null) { - extend(getParsingFlags(m), flags); - } - else { - getParsingFlags(m).userInvalidated = true; - } - - return m; - } - - // Plugins that add properties should also add the key here (null value), - // so we can properly clone ourselves. - var momentProperties = hooks.momentProperties = []; - - function copyConfig(to, from) { - var i, prop, val; - - if (!isUndefined(from._isAMomentObject)) { - to._isAMomentObject = from._isAMomentObject; - } - if (!isUndefined(from._i)) { - to._i = from._i; - } - if (!isUndefined(from._f)) { - to._f = from._f; - } - if (!isUndefined(from._l)) { - to._l = from._l; - } - if (!isUndefined(from._strict)) { - to._strict = from._strict; - } - if (!isUndefined(from._tzm)) { - to._tzm = from._tzm; - } - if (!isUndefined(from._isUTC)) { - to._isUTC = from._isUTC; - } - if (!isUndefined(from._offset)) { - to._offset = from._offset; - } - if (!isUndefined(from._pf)) { - to._pf = getParsingFlags(from); - } - if (!isUndefined(from._locale)) { - to._locale = from._locale; - } - - if (momentProperties.length > 0) { - for (i = 0; i < momentProperties.length; i++) { - prop = momentProperties[i]; - val = from[prop]; - if (!isUndefined(val)) { - to[prop] = val; - } - } - } - - return to; - } - - var updateInProgress = false; - - // Moment prototype object - function Moment(config) { - copyConfig(this, config); - this._d = new Date(config._d != null ? config._d.getTime() : NaN); - if (!this.isValid()) { - this._d = new Date(NaN); - } - // Prevent infinite loop in case updateOffset creates new moment - // objects. - if (updateInProgress === false) { - updateInProgress = true; - hooks.updateOffset(this); - updateInProgress = false; - } - } - - function isMoment (obj) { - return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); - } - - function absFloor (number) { - if (number < 0) { - // -0 -> 0 - return Math.ceil(number) || 0; - } else { - return Math.floor(number); - } - } - - function toInt(argumentForCoercion) { - var coercedNumber = +argumentForCoercion, - value = 0; - - if (coercedNumber !== 0 && isFinite(coercedNumber)) { - value = absFloor(coercedNumber); - } - - return value; - } - - // compare two arrays, return the number of differences - function compareArrays(array1, array2, dontConvert) { - var len = Math.min(array1.length, array2.length), - lengthDiff = Math.abs(array1.length - array2.length), - diffs = 0, - i; - for (i = 0; i < len; i++) { - if ((dontConvert && array1[i] !== array2[i]) || - (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { - diffs++; - } - } - return diffs + lengthDiff; - } - - function warn(msg) { - if (hooks.suppressDeprecationWarnings === false && - (typeof console !== 'undefined') && console.warn) { - console.warn('Deprecation warning: ' + msg); - } - } - - function deprecate(msg, fn) { - var firstTime = true; - - return extend(function () { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(null, msg); - } - if (firstTime) { - var args = []; - var arg; - for (var i = 0; i < arguments.length; i++) { - arg = ''; - if (typeof arguments[i] === 'object') { - arg += '\n[' + i + '] '; - for (var key in arguments[0]) { - arg += key + ': ' + arguments[0][key] + ', '; - } - arg = arg.slice(0, -2); // Remove trailing comma and space - } else { - arg = arguments[i]; - } - args.push(arg); - } - warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); - firstTime = false; - } - return fn.apply(this, arguments); - }, fn); - } - - var deprecations = {}; - - function deprecateSimple(name, msg) { - if (hooks.deprecationHandler != null) { - hooks.deprecationHandler(name, msg); - } - if (!deprecations[name]) { - warn(msg); - deprecations[name] = true; - } - } - - hooks.suppressDeprecationWarnings = false; - hooks.deprecationHandler = null; - - function isFunction(input) { - return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; - } - - function set (config) { - var prop, i; - for (i in config) { - prop = config[i]; - if (isFunction(prop)) { - this[i] = prop; - } else { - this['_' + i] = prop; - } - } - this._config = config; - // Lenient ordinal parsing accepts just a number in addition to - // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. - // TODO: Remove "ordinalParse" fallback in next major release. - this._dayOfMonthOrdinalParseLenient = new RegExp( - (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + - '|' + (/\d{1,2}/).source); - } - - function mergeConfigs(parentConfig, childConfig) { - var res = extend({}, parentConfig), prop; - for (prop in childConfig) { - if (hasOwnProp(childConfig, prop)) { - if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { - res[prop] = {}; - extend(res[prop], parentConfig[prop]); - extend(res[prop], childConfig[prop]); - } else if (childConfig[prop] != null) { - res[prop] = childConfig[prop]; - } else { - delete res[prop]; - } - } - } - for (prop in parentConfig) { - if (hasOwnProp(parentConfig, prop) && - !hasOwnProp(childConfig, prop) && - isObject(parentConfig[prop])) { - // make sure changes to properties don't modify parent config - res[prop] = extend({}, res[prop]); - } - } - return res; - } - - function Locale(config) { - if (config != null) { - this.set(config); - } - } - - var keys; - - if (Object.keys) { - keys = Object.keys; - } else { - keys = function (obj) { - var i, res = []; - for (i in obj) { - if (hasOwnProp(obj, i)) { - res.push(i); - } - } - return res; - }; - } - - var defaultCalendar = { - sameDay : '[Today at] LT', - nextDay : '[Tomorrow at] LT', - nextWeek : 'dddd [at] LT', - lastDay : '[Yesterday at] LT', - lastWeek : '[Last] dddd [at] LT', - sameElse : 'L' - }; - - function calendar (key, mom, now) { - var output = this._calendar[key] || this._calendar['sameElse']; - return isFunction(output) ? output.call(mom, now) : output; - } - - var defaultLongDateFormat = { - LTS : 'h:mm:ss A', - LT : 'h:mm A', - L : 'MM/DD/YYYY', - LL : 'MMMM D, YYYY', - LLL : 'MMMM D, YYYY h:mm A', - LLLL : 'dddd, MMMM D, YYYY h:mm A' - }; - - function longDateFormat (key) { - var format = this._longDateFormat[key], - formatUpper = this._longDateFormat[key.toUpperCase()]; - - if (format || !formatUpper) { - return format; - } - - this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { - return val.slice(1); - }); - - return this._longDateFormat[key]; - } - - var defaultInvalidDate = 'Invalid date'; - - function invalidDate () { - return this._invalidDate; - } - - var defaultOrdinal = '%d'; - var defaultDayOfMonthOrdinalParse = /\d{1,2}/; - - function ordinal (number) { - return this._ordinal.replace('%d', number); - } - - var defaultRelativeTime = { - future : 'in %s', - past : '%s ago', - s : 'a few seconds', - ss : '%d seconds', - m : 'a minute', - mm : '%d minutes', - h : 'an hour', - hh : '%d hours', - d : 'a day', - dd : '%d days', - M : 'a month', - MM : '%d months', - y : 'a year', - yy : '%d years' - }; - - function relativeTime (number, withoutSuffix, string, isFuture) { - var output = this._relativeTime[string]; - return (isFunction(output)) ? - output(number, withoutSuffix, string, isFuture) : - output.replace(/%d/i, number); - } - - function pastFuture (diff, output) { - var format = this._relativeTime[diff > 0 ? 'future' : 'past']; - return isFunction(format) ? format(output) : format.replace(/%s/i, output); - } - - var aliases = {}; - - function addUnitAlias (unit, shorthand) { - var lowerCase = unit.toLowerCase(); - aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; - } - - function normalizeUnits(units) { - return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; - } - - function normalizeObjectUnits(inputObject) { - var normalizedInput = {}, - normalizedProp, - prop; - - for (prop in inputObject) { - if (hasOwnProp(inputObject, prop)) { - normalizedProp = normalizeUnits(prop); - if (normalizedProp) { - normalizedInput[normalizedProp] = inputObject[prop]; - } - } - } - - return normalizedInput; - } - - var priorities = {}; - - function addUnitPriority(unit, priority) { - priorities[unit] = priority; - } - - function getPrioritizedUnits(unitsObj) { - var units = []; - for (var u in unitsObj) { - units.push({unit: u, priority: priorities[u]}); - } - units.sort(function (a, b) { - return a.priority - b.priority; - }); - return units; - } - - function zeroFill(number, targetLength, forceSign) { - var absNumber = '' + Math.abs(number), - zerosToFill = targetLength - absNumber.length, - sign = number >= 0; - return (sign ? (forceSign ? '+' : '') : '-') + - Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; - } - - var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; - - var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; - - var formatFunctions = {}; - - var formatTokenFunctions = {}; - - // token: 'M' - // padded: ['MM', 2] - // ordinal: 'Mo' - // callback: function () { this.month() + 1 } - function addFormatToken (token, padded, ordinal, callback) { - var func = callback; - if (typeof callback === 'string') { - func = function () { - return this[callback](); - }; - } - if (token) { - formatTokenFunctions[token] = func; - } - if (padded) { - formatTokenFunctions[padded[0]] = function () { - return zeroFill(func.apply(this, arguments), padded[1], padded[2]); - }; - } - if (ordinal) { - formatTokenFunctions[ordinal] = function () { - return this.localeData().ordinal(func.apply(this, arguments), token); - }; - } - } - - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|\]$/g, ''); - } - return input.replace(/\\/g, ''); - } - - function makeFormatFunction(format) { - var array = format.match(formattingTokens), i, length; - - for (i = 0, length = array.length; i < length; i++) { - if (formatTokenFunctions[array[i]]) { - array[i] = formatTokenFunctions[array[i]]; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - - return function (mom) { - var output = '', i; - for (i = 0; i < length; i++) { - output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; - } - return output; - }; - } - - // format date using native date object - function formatMoment(m, format) { - if (!m.isValid()) { - return m.localeData().invalidDate(); - } - - format = expandFormat(format, m.localeData()); - formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); - - return formatFunctions[format](m); - } - - function expandFormat(format, locale) { - var i = 5; - - function replaceLongDateFormatTokens(input) { - return locale.longDateFormat(input) || input; - } - - localFormattingTokens.lastIndex = 0; - while (i >= 0 && localFormattingTokens.test(format)) { - format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); - localFormattingTokens.lastIndex = 0; - i -= 1; - } - - return format; - } - - var match1 = /\d/; // 0 - 9 - var match2 = /\d\d/; // 00 - 99 - var match3 = /\d{3}/; // 000 - 999 - var match4 = /\d{4}/; // 0000 - 9999 - var match6 = /[+-]?\d{6}/; // -999999 - 999999 - var match1to2 = /\d\d?/; // 0 - 99 - var match3to4 = /\d\d\d\d?/; // 999 - 9999 - var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 - var match1to3 = /\d{1,3}/; // 0 - 999 - var match1to4 = /\d{1,4}/; // 0 - 9999 - var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 - - var matchUnsigned = /\d+/; // 0 - inf - var matchSigned = /[+-]?\d+/; // -inf - inf - - var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z - var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z - - var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 - - // any word (or two) characters or numbers including two/three word month in arabic. - // includes scottish gaelic two word and hyphenated months - var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; - - var regexes = {}; - - function addRegexToken (token, regex, strictRegex) { - regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { - return (isStrict && strictRegex) ? strictRegex : regex; - }; - } - - function getParseRegexForToken (token, config) { - if (!hasOwnProp(regexes, token)) { - return new RegExp(unescapeFormat(token)); - } - - return regexes[token](config._strict, config._locale); - } - - // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript - function unescapeFormat(s) { - return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { - return p1 || p2 || p3 || p4; - })); - } - - function regexEscape(s) { - return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - - var tokens = {}; - - function addParseToken (token, callback) { - var i, func = callback; - if (typeof token === 'string') { - token = [token]; - } - if (isNumber(callback)) { - func = function (input, array) { - array[callback] = toInt(input); - }; - } - for (i = 0; i < token.length; i++) { - tokens[token[i]] = func; - } - } - - function addWeekParseToken (token, callback) { - addParseToken(token, function (input, array, config, token) { - config._w = config._w || {}; - callback(input, config._w, config, token); - }); - } - - function addTimeToArrayFromToken(token, input, config) { - if (input != null && hasOwnProp(tokens, token)) { - tokens[token](input, config._a, config, token); - } - } - - var YEAR = 0; - var MONTH = 1; - var DATE = 2; - var HOUR = 3; - var MINUTE = 4; - var SECOND = 5; - var MILLISECOND = 6; - var WEEK = 7; - var WEEKDAY = 8; - - // FORMATTING - - addFormatToken('Y', 0, 0, function () { - var y = this.year(); - return y <= 9999 ? '' + y : '+' + y; - }); - - addFormatToken(0, ['YY', 2], 0, function () { - return this.year() % 100; - }); - - addFormatToken(0, ['YYYY', 4], 0, 'year'); - addFormatToken(0, ['YYYYY', 5], 0, 'year'); - addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); - - // ALIASES - - addUnitAlias('year', 'y'); - - // PRIORITIES - - addUnitPriority('year', 1); - - // PARSING - - addRegexToken('Y', matchSigned); - addRegexToken('YY', match1to2, match2); - addRegexToken('YYYY', match1to4, match4); - addRegexToken('YYYYY', match1to6, match6); - addRegexToken('YYYYYY', match1to6, match6); - - addParseToken(['YYYYY', 'YYYYYY'], YEAR); - addParseToken('YYYY', function (input, array) { - array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); - }); - addParseToken('YY', function (input, array) { - array[YEAR] = hooks.parseTwoDigitYear(input); - }); - addParseToken('Y', function (input, array) { - array[YEAR] = parseInt(input, 10); - }); - - // HELPERS - - function daysInYear(year) { - return isLeapYear(year) ? 366 : 365; - } - - function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; - } - - // HOOKS - - hooks.parseTwoDigitYear = function (input) { - return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); - }; - - // MOMENTS - - var getSetYear = makeGetSet('FullYear', true); - - function getIsLeapYear () { - return isLeapYear(this.year()); - } - - function makeGetSet (unit, keepTime) { - return function (value) { - if (value != null) { - set$1(this, unit, value); - hooks.updateOffset(this, keepTime); - return this; - } else { - return get(this, unit); - } - }; - } - - function get (mom, unit) { - return mom.isValid() ? - mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; - } - - function set$1 (mom, unit, value) { - if (mom.isValid() && !isNaN(value)) { - if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); - } - else { - mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); - } - } - } - - // MOMENTS - - function stringGet (units) { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](); - } - return this; - } - - - function stringSet (units, value) { - if (typeof units === 'object') { - units = normalizeObjectUnits(units); - var prioritized = getPrioritizedUnits(units); - for (var i = 0; i < prioritized.length; i++) { - this[prioritized[i].unit](units[prioritized[i].unit]); - } - } else { - units = normalizeUnits(units); - if (isFunction(this[units])) { - return this[units](value); - } - } - return this; - } - - function mod(n, x) { - return ((n % x) + x) % x; - } - - var indexOf; - - if (Array.prototype.indexOf) { - indexOf = Array.prototype.indexOf; - } else { - indexOf = function (o) { - // I know - var i; - for (i = 0; i < this.length; ++i) { - if (this[i] === o) { - return i; - } - } - return -1; - }; - } - - function daysInMonth(year, month) { - if (isNaN(year) || isNaN(month)) { - return NaN; - } - var modMonth = mod(month, 12); - year += (month - modMonth) / 12; - return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); - } - - // FORMATTING - - addFormatToken('M', ['MM', 2], 'Mo', function () { - return this.month() + 1; - }); - - addFormatToken('MMM', 0, 0, function (format) { - return this.localeData().monthsShort(this, format); - }); - - addFormatToken('MMMM', 0, 0, function (format) { - return this.localeData().months(this, format); - }); - - // ALIASES - - addUnitAlias('month', 'M'); - - // PRIORITY - - addUnitPriority('month', 8); - - // PARSING - - addRegexToken('M', match1to2); - addRegexToken('MM', match1to2, match2); - addRegexToken('MMM', function (isStrict, locale) { - return locale.monthsShortRegex(isStrict); - }); - addRegexToken('MMMM', function (isStrict, locale) { - return locale.monthsRegex(isStrict); - }); - - addParseToken(['M', 'MM'], function (input, array) { - array[MONTH] = toInt(input) - 1; - }); - - addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { - var month = config._locale.monthsParse(input, token, config._strict); - // if we didn't find a month name, mark the date as invalid. - if (month != null) { - array[MONTH] = month; - } else { - getParsingFlags(config).invalidMonth = input; - } - }); - - // LOCALES - - var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); - function localeMonths (m, format) { - if (!m) { - return isArray(this._months) ? this._months : - this._months['standalone']; - } - return isArray(this._months) ? this._months[m.month()] : - this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; - } - - var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); - function localeMonthsShort (m, format) { - if (!m) { - return isArray(this._monthsShort) ? this._monthsShort : - this._monthsShort['standalone']; - } - return isArray(this._monthsShort) ? this._monthsShort[m.month()] : - this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; - } - - function handleStrictParse(monthName, format, strict) { - var i, ii, mom, llc = monthName.toLocaleLowerCase(); - if (!this._monthsParse) { - // this is not used - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - for (i = 0; i < 12; ++i) { - mom = createUTC([2000, i]); - this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); - this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'MMM') { - ii = indexOf.call(this._shortMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._longMonthsParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._longMonthsParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortMonthsParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeMonthsParse (monthName, format, strict) { - var i, mom, regex; - - if (this._monthsParseExact) { - return handleStrictParse.call(this, monthName, format, strict); - } - - if (!this._monthsParse) { - this._monthsParse = []; - this._longMonthsParse = []; - this._shortMonthsParse = []; - } - - // TODO: add sorting - // Sorting makes sure if one month (or abbr) is a prefix of another - // see sorting in computeMonthsParse - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - if (strict && !this._longMonthsParse[i]) { - this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); - this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); - } - if (!strict && !this._monthsParse[i]) { - regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); - this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { - return i; - } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { - return i; - } else if (!strict && this._monthsParse[i].test(monthName)) { - return i; - } - } - } - - // MOMENTS - - function setMonth (mom, value) { - var dayOfMonth; - - if (!mom.isValid()) { - // No op - return mom; - } - - if (typeof value === 'string') { - if (/^\d+$/.test(value)) { - value = toInt(value); - } else { - value = mom.localeData().monthsParse(value); - // TODO: Another silent failure? - if (!isNumber(value)) { - return mom; - } - } - } - - dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); - mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); - return mom; - } - - function getSetMonth (value) { - if (value != null) { - setMonth(this, value); - hooks.updateOffset(this, true); - return this; - } else { - return get(this, 'Month'); - } - } - - function getDaysInMonth () { - return daysInMonth(this.year(), this.month()); - } - - var defaultMonthsShortRegex = matchWord; - function monthsShortRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsShortStrictRegex; - } else { - return this._monthsShortRegex; - } - } else { - if (!hasOwnProp(this, '_monthsShortRegex')) { - this._monthsShortRegex = defaultMonthsShortRegex; - } - return this._monthsShortStrictRegex && isStrict ? - this._monthsShortStrictRegex : this._monthsShortRegex; - } - } - - var defaultMonthsRegex = matchWord; - function monthsRegex (isStrict) { - if (this._monthsParseExact) { - if (!hasOwnProp(this, '_monthsRegex')) { - computeMonthsParse.call(this); - } - if (isStrict) { - return this._monthsStrictRegex; - } else { - return this._monthsRegex; - } - } else { - if (!hasOwnProp(this, '_monthsRegex')) { - this._monthsRegex = defaultMonthsRegex; - } - return this._monthsStrictRegex && isStrict ? - this._monthsStrictRegex : this._monthsRegex; - } - } - - function computeMonthsParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var shortPieces = [], longPieces = [], mixedPieces = [], - i, mom; - for (i = 0; i < 12; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, i]); - shortPieces.push(this.monthsShort(mom, '')); - longPieces.push(this.months(mom, '')); - mixedPieces.push(this.months(mom, '')); - mixedPieces.push(this.monthsShort(mom, '')); - } - // Sorting makes sure if one month (or abbr) is a prefix of another it - // will match the longer piece. - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 12; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - } - for (i = 0; i < 24; i++) { - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._monthsShortRegex = this._monthsRegex; - this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - } - - function createDate (y, m, d, h, M, s, ms) { - // can't just apply() to create a date: - // https://stackoverflow.com/q/181348 - var date = new Date(y, m, d, h, M, s, ms); - - // the date constructor remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { - date.setFullYear(y); - } - return date; - } - - function createUTCDate (y) { - var date = new Date(Date.UTC.apply(null, arguments)); - - // the Date.UTC function remaps years 0-99 to 1900-1999 - if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(y); - } - return date; - } - - // start-of-first-week - start-of-year - function firstWeekOffset(year, dow, doy) { - var // first-week day -- which january is always in the first week (4 for iso, 1 for other) - fwd = 7 + dow - doy, - // first-week day local weekday -- which local weekday is fwd - fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; - - return -fwdlw + fwd - 1; - } - - // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday - function dayOfYearFromWeeks(year, week, weekday, dow, doy) { - var localWeekday = (7 + weekday - dow) % 7, - weekOffset = firstWeekOffset(year, dow, doy), - dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, - resYear, resDayOfYear; - - if (dayOfYear <= 0) { - resYear = year - 1; - resDayOfYear = daysInYear(resYear) + dayOfYear; - } else if (dayOfYear > daysInYear(year)) { - resYear = year + 1; - resDayOfYear = dayOfYear - daysInYear(year); - } else { - resYear = year; - resDayOfYear = dayOfYear; - } - - return { - year: resYear, - dayOfYear: resDayOfYear - }; - } - - function weekOfYear(mom, dow, doy) { - var weekOffset = firstWeekOffset(mom.year(), dow, doy), - week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, - resWeek, resYear; - - if (week < 1) { - resYear = mom.year() - 1; - resWeek = week + weeksInYear(resYear, dow, doy); - } else if (week > weeksInYear(mom.year(), dow, doy)) { - resWeek = week - weeksInYear(mom.year(), dow, doy); - resYear = mom.year() + 1; - } else { - resYear = mom.year(); - resWeek = week; - } - - return { - week: resWeek, - year: resYear - }; - } - - function weeksInYear(year, dow, doy) { - var weekOffset = firstWeekOffset(year, dow, doy), - weekOffsetNext = firstWeekOffset(year + 1, dow, doy); - return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; - } - - // FORMATTING - - addFormatToken('w', ['ww', 2], 'wo', 'week'); - addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); - - // ALIASES - - addUnitAlias('week', 'w'); - addUnitAlias('isoWeek', 'W'); - - // PRIORITIES - - addUnitPriority('week', 5); - addUnitPriority('isoWeek', 5); - - // PARSING - - addRegexToken('w', match1to2); - addRegexToken('ww', match1to2, match2); - addRegexToken('W', match1to2); - addRegexToken('WW', match1to2, match2); - - addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { - week[token.substr(0, 1)] = toInt(input); - }); - - // HELPERS - - // LOCALES - - function localeWeek (mom) { - return weekOfYear(mom, this._week.dow, this._week.doy).week; - } - - var defaultLocaleWeek = { - dow : 0, // Sunday is the first day of the week. - doy : 6 // The week that contains Jan 1st is the first week of the year. - }; - - function localeFirstDayOfWeek () { - return this._week.dow; - } - - function localeFirstDayOfYear () { - return this._week.doy; - } - - // MOMENTS - - function getSetWeek (input) { - var week = this.localeData().week(this); - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - function getSetISOWeek (input) { - var week = weekOfYear(this, 1, 4).week; - return input == null ? week : this.add((input - week) * 7, 'd'); - } - - // FORMATTING - - addFormatToken('d', 0, 'do', 'day'); - - addFormatToken('dd', 0, 0, function (format) { - return this.localeData().weekdaysMin(this, format); - }); - - addFormatToken('ddd', 0, 0, function (format) { - return this.localeData().weekdaysShort(this, format); - }); - - addFormatToken('dddd', 0, 0, function (format) { - return this.localeData().weekdays(this, format); - }); - - addFormatToken('e', 0, 0, 'weekday'); - addFormatToken('E', 0, 0, 'isoWeekday'); - - // ALIASES - - addUnitAlias('day', 'd'); - addUnitAlias('weekday', 'e'); - addUnitAlias('isoWeekday', 'E'); - - // PRIORITY - addUnitPriority('day', 11); - addUnitPriority('weekday', 11); - addUnitPriority('isoWeekday', 11); - - // PARSING - - addRegexToken('d', match1to2); - addRegexToken('e', match1to2); - addRegexToken('E', match1to2); - addRegexToken('dd', function (isStrict, locale) { - return locale.weekdaysMinRegex(isStrict); - }); - addRegexToken('ddd', function (isStrict, locale) { - return locale.weekdaysShortRegex(isStrict); - }); - addRegexToken('dddd', function (isStrict, locale) { - return locale.weekdaysRegex(isStrict); - }); - - addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { - var weekday = config._locale.weekdaysParse(input, token, config._strict); - // if we didn't get a weekday name, mark the date as invalid - if (weekday != null) { - week.d = weekday; - } else { - getParsingFlags(config).invalidWeekday = input; - } - }); - - addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { - week[token] = toInt(input); - }); - - // HELPERS - - function parseWeekday(input, locale) { - if (typeof input !== 'string') { - return input; - } - - if (!isNaN(input)) { - return parseInt(input, 10); - } - - input = locale.weekdaysParse(input); - if (typeof input === 'number') { - return input; - } - - return null; - } - - function parseIsoWeekday(input, locale) { - if (typeof input === 'string') { - return locale.weekdaysParse(input) % 7 || 7; - } - return isNaN(input) ? null : input; - } - - // LOCALES - - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); - function localeWeekdays (m, format) { - if (!m) { - return isArray(this._weekdays) ? this._weekdays : - this._weekdays['standalone']; - } - return isArray(this._weekdays) ? this._weekdays[m.day()] : - this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; - } - - var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); - function localeWeekdaysShort (m) { - return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; - } - - var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); - function localeWeekdaysMin (m) { - return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; - } - - function handleStrictParse$1(weekdayName, format, strict) { - var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._shortWeekdaysParse = []; - this._minWeekdaysParse = []; - - for (i = 0; i < 7; ++i) { - mom = createUTC([2000, 1]).day(i); - this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); - this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); - this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); - } - } - - if (strict) { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } else { - if (format === 'dddd') { - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else if (format === 'ddd') { - ii = indexOf.call(this._shortWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._minWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } else { - ii = indexOf.call(this._minWeekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._weekdaysParse, llc); - if (ii !== -1) { - return ii; - } - ii = indexOf.call(this._shortWeekdaysParse, llc); - return ii !== -1 ? ii : null; - } - } - } - - function localeWeekdaysParse (weekdayName, format, strict) { - var i, mom, regex; - - if (this._weekdaysParseExact) { - return handleStrictParse$1.call(this, weekdayName, format, strict); - } - - if (!this._weekdaysParse) { - this._weekdaysParse = []; - this._minWeekdaysParse = []; - this._shortWeekdaysParse = []; - this._fullWeekdaysParse = []; - } - - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - - mom = createUTC([2000, 1]).day(i); - if (strict && !this._fullWeekdaysParse[i]) { - this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); - this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); - this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); - } - if (!this._weekdaysParse[i]) { - regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); - this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); - } - // test the regex - if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { - return i; - } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { - return i; - } - } - } - - // MOMENTS - - function getSetDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - if (input != null) { - input = parseWeekday(input, this.localeData()); - return this.add(input - day, 'd'); - } else { - return day; - } - } - - function getSetLocaleDayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; - return input == null ? weekday : this.add(input - weekday, 'd'); - } - - function getSetISODayOfWeek (input) { - if (!this.isValid()) { - return input != null ? this : NaN; - } - - // behaves the same as moment#day except - // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) - // as a setter, sunday should belong to the previous week. - - if (input != null) { - var weekday = parseIsoWeekday(input, this.localeData()); - return this.day(this.day() % 7 ? weekday : weekday - 7); - } else { - return this.day() || 7; - } - } - - var defaultWeekdaysRegex = matchWord; - function weekdaysRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysStrictRegex; - } else { - return this._weekdaysRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysRegex')) { - this._weekdaysRegex = defaultWeekdaysRegex; - } - return this._weekdaysStrictRegex && isStrict ? - this._weekdaysStrictRegex : this._weekdaysRegex; - } - } - - var defaultWeekdaysShortRegex = matchWord; - function weekdaysShortRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysShortStrictRegex; - } else { - return this._weekdaysShortRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysShortRegex')) { - this._weekdaysShortRegex = defaultWeekdaysShortRegex; - } - return this._weekdaysShortStrictRegex && isStrict ? - this._weekdaysShortStrictRegex : this._weekdaysShortRegex; - } - } - - var defaultWeekdaysMinRegex = matchWord; - function weekdaysMinRegex (isStrict) { - if (this._weekdaysParseExact) { - if (!hasOwnProp(this, '_weekdaysRegex')) { - computeWeekdaysParse.call(this); - } - if (isStrict) { - return this._weekdaysMinStrictRegex; - } else { - return this._weekdaysMinRegex; - } - } else { - if (!hasOwnProp(this, '_weekdaysMinRegex')) { - this._weekdaysMinRegex = defaultWeekdaysMinRegex; - } - return this._weekdaysMinStrictRegex && isStrict ? - this._weekdaysMinStrictRegex : this._weekdaysMinRegex; - } - } - - - function computeWeekdaysParse () { - function cmpLenRev(a, b) { - return b.length - a.length; - } - - var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], - i, mom, minp, shortp, longp; - for (i = 0; i < 7; i++) { - // make the regex if we don't have it already - mom = createUTC([2000, 1]).day(i); - minp = this.weekdaysMin(mom, ''); - shortp = this.weekdaysShort(mom, ''); - longp = this.weekdays(mom, ''); - minPieces.push(minp); - shortPieces.push(shortp); - longPieces.push(longp); - mixedPieces.push(minp); - mixedPieces.push(shortp); - mixedPieces.push(longp); - } - // Sorting makes sure if one weekday (or abbr) is a prefix of another it - // will match the longer piece. - minPieces.sort(cmpLenRev); - shortPieces.sort(cmpLenRev); - longPieces.sort(cmpLenRev); - mixedPieces.sort(cmpLenRev); - for (i = 0; i < 7; i++) { - shortPieces[i] = regexEscape(shortPieces[i]); - longPieces[i] = regexEscape(longPieces[i]); - mixedPieces[i] = regexEscape(mixedPieces[i]); - } - - this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); - this._weekdaysShortRegex = this._weekdaysRegex; - this._weekdaysMinRegex = this._weekdaysRegex; - - this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); - this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); - this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); - } - - // FORMATTING - - function hFormat() { - return this.hours() % 12 || 12; - } - - function kFormat() { - return this.hours() || 24; - } - - addFormatToken('H', ['HH', 2], 0, 'hour'); - addFormatToken('h', ['hh', 2], 0, hFormat); - addFormatToken('k', ['kk', 2], 0, kFormat); - - addFormatToken('hmm', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); - }); - - addFormatToken('hmmss', 0, 0, function () { - return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - addFormatToken('Hmm', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2); - }); - - addFormatToken('Hmmss', 0, 0, function () { - return '' + this.hours() + zeroFill(this.minutes(), 2) + - zeroFill(this.seconds(), 2); - }); - - function meridiem (token, lowercase) { - addFormatToken(token, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); - }); - } - - meridiem('a', true); - meridiem('A', false); - - // ALIASES - - addUnitAlias('hour', 'h'); - - // PRIORITY - addUnitPriority('hour', 13); - - // PARSING - - function matchMeridiem (isStrict, locale) { - return locale._meridiemParse; - } - - addRegexToken('a', matchMeridiem); - addRegexToken('A', matchMeridiem); - addRegexToken('H', match1to2); - addRegexToken('h', match1to2); - addRegexToken('k', match1to2); - addRegexToken('HH', match1to2, match2); - addRegexToken('hh', match1to2, match2); - addRegexToken('kk', match1to2, match2); - - addRegexToken('hmm', match3to4); - addRegexToken('hmmss', match5to6); - addRegexToken('Hmm', match3to4); - addRegexToken('Hmmss', match5to6); - - addParseToken(['H', 'HH'], HOUR); - addParseToken(['k', 'kk'], function (input, array, config) { - var kInput = toInt(input); - array[HOUR] = kInput === 24 ? 0 : kInput; - }); - addParseToken(['a', 'A'], function (input, array, config) { - config._isPm = config._locale.isPM(input); - config._meridiem = input; - }); - addParseToken(['h', 'hh'], function (input, array, config) { - array[HOUR] = toInt(input); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - getParsingFlags(config).bigHour = true; - }); - addParseToken('Hmm', function (input, array, config) { - var pos = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos)); - array[MINUTE] = toInt(input.substr(pos)); - }); - addParseToken('Hmmss', function (input, array, config) { - var pos1 = input.length - 4; - var pos2 = input.length - 2; - array[HOUR] = toInt(input.substr(0, pos1)); - array[MINUTE] = toInt(input.substr(pos1, 2)); - array[SECOND] = toInt(input.substr(pos2)); - }); - - // LOCALES - - function localeIsPM (input) { - // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays - // Using charAt should be more compatible. - return ((input + '').toLowerCase().charAt(0) === 'p'); - } - - var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; - function localeMeridiem (hours, minutes, isLower) { - if (hours > 11) { - return isLower ? 'pm' : 'PM'; - } else { - return isLower ? 'am' : 'AM'; - } - } - - - // MOMENTS - - // Setting the hour should keep the time, because the user explicitly - // specified which hour they want. So trying to maintain the same hour (in - // a new timezone) makes sense. Adding/subtracting hours does not follow - // this rule. - var getSetHour = makeGetSet('Hours', true); - - var baseConfig = { - calendar: defaultCalendar, - longDateFormat: defaultLongDateFormat, - invalidDate: defaultInvalidDate, - ordinal: defaultOrdinal, - dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, - relativeTime: defaultRelativeTime, - - months: defaultLocaleMonths, - monthsShort: defaultLocaleMonthsShort, - - week: defaultLocaleWeek, - - weekdays: defaultLocaleWeekdays, - weekdaysMin: defaultLocaleWeekdaysMin, - weekdaysShort: defaultLocaleWeekdaysShort, - - meridiemParse: defaultLocaleMeridiemParse - }; - - // internal storage for locale config files - var locales = {}; - var localeFamilies = {}; - var globalLocale; - - function normalizeLocale(key) { - return key ? key.toLowerCase().replace('_', '-') : key; - } - - // pick the locale from the array - // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each - // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root - function chooseLocale(names) { - var i = 0, j, next, locale, split; - - while (i < names.length) { - split = normalizeLocale(names[i]).split('-'); - j = split.length; - next = normalizeLocale(names[i + 1]); - next = next ? next.split('-') : null; - while (j > 0) { - locale = loadLocale(split.slice(0, j).join('-')); - if (locale) { - return locale; - } - if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { - //the next array item is better than a shallower substring of this one - break; - } - j--; - } - i++; - } - return globalLocale; - } - - function loadLocale(name) { - var oldLocale = null; - // TODO: Find a better way to register and load all the locales in Node - if (!locales[name] && (typeof module !== 'undefined') && - module && module.exports) { - try { - oldLocale = globalLocale._abbr; - var aliasedRequire = require; - aliasedRequire('./locale/' + name); - getSetGlobalLocale(oldLocale); - } catch (e) {} - } - return locales[name]; - } - - // This function will load locale and then set the global locale. If - // no arguments are passed in, it will simply return the current global - // locale key. - function getSetGlobalLocale (key, values) { - var data; - if (key) { - if (isUndefined(values)) { - data = getLocale(key); - } - else { - data = defineLocale(key, values); - } - - if (data) { - // moment.duration._locale = moment._locale = data; - globalLocale = data; - } - else { - if ((typeof console !== 'undefined') && console.warn) { - //warn user if arguments are passed but the locale could not be set - console.warn('Locale ' + key + ' not found. Did you forget to load it?'); - } - } - } - - return globalLocale._abbr; - } - - function defineLocale (name, config) { - if (config !== null) { - var locale, parentConfig = baseConfig; - config.abbr = name; - if (locales[name] != null) { - deprecateSimple('defineLocaleOverride', - 'use moment.updateLocale(localeName, config) to change ' + - 'an existing locale. moment.defineLocale(localeName, ' + - 'config) should only be used for creating a new locale ' + - 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); - parentConfig = locales[name]._config; - } else if (config.parentLocale != null) { - if (locales[config.parentLocale] != null) { - parentConfig = locales[config.parentLocale]._config; - } else { - locale = loadLocale(config.parentLocale); - if (locale != null) { - parentConfig = locale._config; - } else { - if (!localeFamilies[config.parentLocale]) { - localeFamilies[config.parentLocale] = []; - } - localeFamilies[config.parentLocale].push({ - name: name, - config: config - }); - return null; - } - } - } - locales[name] = new Locale(mergeConfigs(parentConfig, config)); - - if (localeFamilies[name]) { - localeFamilies[name].forEach(function (x) { - defineLocale(x.name, x.config); - }); - } - - // backwards compat for now: also set the locale - // make sure we set the locale AFTER all child locales have been - // created, so we won't end up with the child locale set. - getSetGlobalLocale(name); - - - return locales[name]; - } else { - // useful for testing - delete locales[name]; - return null; - } - } - - function updateLocale(name, config) { - if (config != null) { - var locale, tmpLocale, parentConfig = baseConfig; - // MERGE - tmpLocale = loadLocale(name); - if (tmpLocale != null) { - parentConfig = tmpLocale._config; - } - config = mergeConfigs(parentConfig, config); - locale = new Locale(config); - locale.parentLocale = locales[name]; - locales[name] = locale; - - // backwards compat for now: also set the locale - getSetGlobalLocale(name); - } else { - // pass null for config to unupdate, useful for tests - if (locales[name] != null) { - if (locales[name].parentLocale != null) { - locales[name] = locales[name].parentLocale; - } else if (locales[name] != null) { - delete locales[name]; - } - } - } - return locales[name]; - } - - // returns locale data - function getLocale (key) { - var locale; - - if (key && key._locale && key._locale._abbr) { - key = key._locale._abbr; - } - - if (!key) { - return globalLocale; - } - - if (!isArray(key)) { - //short-circuit everything else - locale = loadLocale(key); - if (locale) { - return locale; - } - key = [key]; - } - - return chooseLocale(key); - } - - function listLocales() { - return keys(locales); - } - - function checkOverflow (m) { - var overflow; - var a = m._a; - - if (a && getParsingFlags(m).overflow === -2) { - overflow = - a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : - a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : - a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : - a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : - a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : - a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : - -1; - - if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { - overflow = DATE; - } - if (getParsingFlags(m)._overflowWeeks && overflow === -1) { - overflow = WEEK; - } - if (getParsingFlags(m)._overflowWeekday && overflow === -1) { - overflow = WEEKDAY; - } - - getParsingFlags(m).overflow = overflow; - } - - return m; - } - - // Pick the first defined of two or three arguments. - function defaults(a, b, c) { - if (a != null) { - return a; - } - if (b != null) { - return b; - } - return c; - } - - function currentDateArray(config) { - // hooks is actually the exported moment object - var nowValue = new Date(hooks.now()); - if (config._useUTC) { - return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; - } - return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; - } - - // convert an array to a date. - // the array should mirror the parameters below - // note: all values past the year are optional and will default to the lowest possible value. - // [year, month, day , hour, minute, second, millisecond] - function configFromArray (config) { - var i, date, input = [], currentDate, expectedWeekday, yearToUse; - - if (config._d) { - return; - } - - currentDate = currentDateArray(config); - - //compute day of the year from weeks and weekdays - if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - dayOfYearFromWeekInfo(config); - } - - //if the day of the year is set, figure out what it is - if (config._dayOfYear != null) { - yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); - - if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { - getParsingFlags(config)._overflowDayOfYear = true; - } - - date = createUTCDate(yearToUse, 0, config._dayOfYear); - config._a[MONTH] = date.getUTCMonth(); - config._a[DATE] = date.getUTCDate(); - } - - // Default to current date. - // * if no year, month, day of month are given, default to today - // * if day of month is given, default month and year - // * if month is given, default only year - // * if year is given, don't default anything - for (i = 0; i < 3 && config._a[i] == null; ++i) { - config._a[i] = input[i] = currentDate[i]; - } - - // Zero out whatever was not defaulted, including time - for (; i < 7; i++) { - config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; - } - - // Check for 24:00:00.000 - if (config._a[HOUR] === 24 && - config._a[MINUTE] === 0 && - config._a[SECOND] === 0 && - config._a[MILLISECOND] === 0) { - config._nextDay = true; - config._a[HOUR] = 0; - } - - config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); - expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); - - // Apply timezone offset from input. The actual utcOffset can be changed - // with parseZone. - if (config._tzm != null) { - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - } - - if (config._nextDay) { - config._a[HOUR] = 24; - } - - // check for mismatching day of week - if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { - getParsingFlags(config).weekdayMismatch = true; - } - } - - function dayOfYearFromWeekInfo(config) { - var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - dow = 1; - doy = 4; - - // TODO: We need to take the current isoWeekYear, but that depends on - // how we interpret now (local, utc, fixed offset). So create - // a now version of current config (take local/utc/offset flags, and - // create now). - weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); - week = defaults(w.W, 1); - weekday = defaults(w.E, 1); - if (weekday < 1 || weekday > 7) { - weekdayOverflow = true; - } - } else { - dow = config._locale._week.dow; - doy = config._locale._week.doy; - - var curWeek = weekOfYear(createLocal(), dow, doy); - - weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); - - // Default to current week. - week = defaults(w.w, curWeek.week); - - if (w.d != null) { - // weekday -- low day numbers are considered next week - weekday = w.d; - if (weekday < 0 || weekday > 6) { - weekdayOverflow = true; - } - } else if (w.e != null) { - // local weekday -- counting starts from begining of week - weekday = w.e + dow; - if (w.e < 0 || w.e > 6) { - weekdayOverflow = true; - } - } else { - // default to begining of week - weekday = dow; - } - } - if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { - getParsingFlags(config)._overflowWeeks = true; - } else if (weekdayOverflow != null) { - getParsingFlags(config)._overflowWeekday = true; - } else { - temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; - } - } - - // iso 8601 regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) - var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; - - var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; - - var isoDates = [ - ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], - ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], - ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], - ['GGGG-[W]WW', /\d{4}-W\d\d/, false], - ['YYYY-DDD', /\d{4}-\d{3}/], - ['YYYY-MM', /\d{4}-\d\d/, false], - ['YYYYYYMMDD', /[+-]\d{10}/], - ['YYYYMMDD', /\d{8}/], - // YYYYMM is NOT allowed by the standard - ['GGGG[W]WWE', /\d{4}W\d{3}/], - ['GGGG[W]WW', /\d{4}W\d{2}/, false], - ['YYYYDDD', /\d{7}/] - ]; - - // iso time formats and regexes - var isoTimes = [ - ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], - ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], - ['HH:mm:ss', /\d\d:\d\d:\d\d/], - ['HH:mm', /\d\d:\d\d/], - ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], - ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], - ['HHmmss', /\d\d\d\d\d\d/], - ['HHmm', /\d\d\d\d/], - ['HH', /\d\d/] - ]; - - var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; - - // date from iso format - function configFromISO(config) { - var i, l, - string = config._i, - match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), - allowTime, dateFormat, timeFormat, tzFormat; - - if (match) { - getParsingFlags(config).iso = true; - - for (i = 0, l = isoDates.length; i < l; i++) { - if (isoDates[i][1].exec(match[1])) { - dateFormat = isoDates[i][0]; - allowTime = isoDates[i][2] !== false; - break; - } - } - if (dateFormat == null) { - config._isValid = false; - return; - } - if (match[3]) { - for (i = 0, l = isoTimes.length; i < l; i++) { - if (isoTimes[i][1].exec(match[3])) { - // match[2] should be 'T' or space - timeFormat = (match[2] || ' ') + isoTimes[i][0]; - break; - } - } - if (timeFormat == null) { - config._isValid = false; - return; - } - } - if (!allowTime && timeFormat != null) { - config._isValid = false; - return; - } - if (match[4]) { - if (tzRegex.exec(match[4])) { - tzFormat = 'Z'; - } else { - config._isValid = false; - return; - } - } - config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); - configFromStringAndFormat(config); - } else { - config._isValid = false; - } - } - - // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 - var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; - - function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - var result = [ - untruncateYear(yearStr), - defaultLocaleMonthsShort.indexOf(monthStr), - parseInt(dayStr, 10), - parseInt(hourStr, 10), - parseInt(minuteStr, 10) - ]; - - if (secondStr) { - result.push(parseInt(secondStr, 10)); - } - - return result; - } - - function untruncateYear(yearStr) { - var year = parseInt(yearStr, 10); - if (year <= 49) { - return 2000 + year; - } else if (year <= 999) { - return 1900 + year; - } - return year; - } - - function preprocessRFC2822(s) { - // Remove comments and folding whitespace and replace multiple-spaces with a single space - return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); - } - - function checkWeekday(weekdayStr, parsedInput, config) { - if (weekdayStr) { - // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. - var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), - weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); - if (weekdayProvided !== weekdayActual) { - getParsingFlags(config).weekdayMismatch = true; - config._isValid = false; - return false; - } - } - return true; - } - - var obsOffsets = { - UT: 0, - GMT: 0, - EDT: -4 * 60, - EST: -5 * 60, - CDT: -5 * 60, - CST: -6 * 60, - MDT: -6 * 60, - MST: -7 * 60, - PDT: -7 * 60, - PST: -8 * 60 - }; - - function calculateOffset(obsOffset, militaryOffset, numOffset) { - if (obsOffset) { - return obsOffsets[obsOffset]; - } else if (militaryOffset) { - // the only allowed military tz is Z - return 0; - } else { - var hm = parseInt(numOffset, 10); - var m = hm % 100, h = (hm - m) / 100; - return h * 60 + m; - } - } - - // date and time from ref 2822 format - function configFromRFC2822(config) { - var match = rfc2822.exec(preprocessRFC2822(config._i)); - if (match) { - var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); - if (!checkWeekday(match[1], parsedArray, config)) { - return; - } - - config._a = parsedArray; - config._tzm = calculateOffset(match[8], match[9], match[10]); - - config._d = createUTCDate.apply(null, config._a); - config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - - getParsingFlags(config).rfc2822 = true; - } else { - config._isValid = false; - } - } - - // date from iso format or fallback - function configFromString(config) { - var matched = aspNetJsonRegex.exec(config._i); - - if (matched !== null) { - config._d = new Date(+matched[1]); - return; - } - - configFromISO(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - configFromRFC2822(config); - if (config._isValid === false) { - delete config._isValid; - } else { - return; - } - - // Final attempt, use Input Fallback - hooks.createFromInputFallback(config); - } - - hooks.createFromInputFallback = deprecate( - 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + - 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + - 'discouraged and will be removed in an upcoming major release. Please refer to ' + - 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', - function (config) { - config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); - } - ); - - // constant that refers to the ISO standard - hooks.ISO_8601 = function () {}; - - // constant that refers to the RFC 2822 form - hooks.RFC_2822 = function () {}; - - // date from string and format string - function configFromStringAndFormat(config) { - // TODO: Move this to another part of the creation flow to prevent circular deps - if (config._f === hooks.ISO_8601) { - configFromISO(config); - return; - } - if (config._f === hooks.RFC_2822) { - configFromRFC2822(config); - return; - } - config._a = []; - getParsingFlags(config).empty = true; - - // This array is used to make a Date, either with `new Date` or `Date.UTC` - var string = '' + config._i, - i, parsedInput, tokens, token, skipped, - stringLength = string.length, - totalParsedInputLength = 0; - - tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; - - for (i = 0; i < tokens.length; i++) { - token = tokens[i]; - parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; - // console.log('token', token, 'parsedInput', parsedInput, - // 'regex', getParseRegexForToken(token, config)); - if (parsedInput) { - skipped = string.substr(0, string.indexOf(parsedInput)); - if (skipped.length > 0) { - getParsingFlags(config).unusedInput.push(skipped); - } - string = string.slice(string.indexOf(parsedInput) + parsedInput.length); - totalParsedInputLength += parsedInput.length; - } - // don't parse if it's not a known token - if (formatTokenFunctions[token]) { - if (parsedInput) { - getParsingFlags(config).empty = false; - } - else { - getParsingFlags(config).unusedTokens.push(token); - } - addTimeToArrayFromToken(token, parsedInput, config); - } - else if (config._strict && !parsedInput) { - getParsingFlags(config).unusedTokens.push(token); - } - } - - // add remaining unparsed input length to the string - getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; - if (string.length > 0) { - getParsingFlags(config).unusedInput.push(string); - } - - // clear _12h flag if hour is <= 12 - if (config._a[HOUR] <= 12 && - getParsingFlags(config).bigHour === true && - config._a[HOUR] > 0) { - getParsingFlags(config).bigHour = undefined; - } - - getParsingFlags(config).parsedDateParts = config._a.slice(0); - getParsingFlags(config).meridiem = config._meridiem; - // handle meridiem - config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); - - configFromArray(config); - checkOverflow(config); - } - - - function meridiemFixWrap (locale, hour, meridiem) { - var isPm; - - if (meridiem == null) { - // nothing to do - return hour; - } - if (locale.meridiemHour != null) { - return locale.meridiemHour(hour, meridiem); - } else if (locale.isPM != null) { - // Fallback - isPm = locale.isPM(meridiem); - if (isPm && hour < 12) { - hour += 12; - } - if (!isPm && hour === 12) { - hour = 0; - } - return hour; - } else { - // this is not supposed to happen - return hour; - } - } - - // date from string and array of format strings - function configFromStringAndArray(config) { - var tempConfig, - bestMoment, - - scoreToBeat, - i, - currentScore; - - if (config._f.length === 0) { - getParsingFlags(config).invalidFormat = true; - config._d = new Date(NaN); - return; - } - - for (i = 0; i < config._f.length; i++) { - currentScore = 0; - tempConfig = copyConfig({}, config); - if (config._useUTC != null) { - tempConfig._useUTC = config._useUTC; - } - tempConfig._f = config._f[i]; - configFromStringAndFormat(tempConfig); - - if (!isValid(tempConfig)) { - continue; - } - - // if there is any input that was not parsed add a penalty for that format - currentScore += getParsingFlags(tempConfig).charsLeftOver; - - //or tokens - currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; - - getParsingFlags(tempConfig).score = currentScore; - - if (scoreToBeat == null || currentScore < scoreToBeat) { - scoreToBeat = currentScore; - bestMoment = tempConfig; - } - } - - extend(config, bestMoment || tempConfig); - } - - function configFromObject(config) { - if (config._d) { - return; - } - - var i = normalizeObjectUnits(config._i); - config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { - return obj && parseInt(obj, 10); - }); - - configFromArray(config); - } - - function createFromConfig (config) { - var res = new Moment(checkOverflow(prepareConfig(config))); - if (res._nextDay) { - // Adding is smart enough around DST - res.add(1, 'd'); - res._nextDay = undefined; - } - - return res; - } - - function prepareConfig (config) { - var input = config._i, - format = config._f; - - config._locale = config._locale || getLocale(config._l); - - if (input === null || (format === undefined && input === '')) { - return createInvalid({nullInput: true}); - } - - if (typeof input === 'string') { - config._i = input = config._locale.preparse(input); - } - - if (isMoment(input)) { - return new Moment(checkOverflow(input)); - } else if (isDate(input)) { - config._d = input; - } else if (isArray(format)) { - configFromStringAndArray(config); - } else if (format) { - configFromStringAndFormat(config); - } else { - configFromInput(config); - } - - if (!isValid(config)) { - config._d = null; - } - - return config; - } - - function configFromInput(config) { - var input = config._i; - if (isUndefined(input)) { - config._d = new Date(hooks.now()); - } else if (isDate(input)) { - config._d = new Date(input.valueOf()); - } else if (typeof input === 'string') { - configFromString(config); - } else if (isArray(input)) { - config._a = map(input.slice(0), function (obj) { - return parseInt(obj, 10); - }); - configFromArray(config); - } else if (isObject(input)) { - configFromObject(config); - } else if (isNumber(input)) { - // from milliseconds - config._d = new Date(input); - } else { - hooks.createFromInputFallback(config); - } - } - - function createLocalOrUTC (input, format, locale, strict, isUTC) { - var c = {}; - - if (locale === true || locale === false) { - strict = locale; - locale = undefined; - } - - if ((isObject(input) && isObjectEmpty(input)) || - (isArray(input) && input.length === 0)) { - input = undefined; - } - // object construction must be done this way. - // https://github.com/moment/moment/issues/1423 - c._isAMomentObject = true; - c._useUTC = c._isUTC = isUTC; - c._l = locale; - c._i = input; - c._f = format; - c._strict = strict; - - return createFromConfig(c); - } - - function createLocal (input, format, locale, strict) { - return createLocalOrUTC(input, format, locale, strict, false); - } - - var prototypeMin = deprecate( - 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other < this ? this : other; - } else { - return createInvalid(); - } - } - ); - - var prototypeMax = deprecate( - 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', - function () { - var other = createLocal.apply(null, arguments); - if (this.isValid() && other.isValid()) { - return other > this ? this : other; - } else { - return createInvalid(); - } - } - ); - - // Pick a moment m from moments so that m[fn](other) is true for all - // other. This relies on the function fn to be transitive. - // - // moments should either be an array of moment objects or an array, whose - // first element is an array of moment objects. - function pickBy(fn, moments) { - var res, i; - if (moments.length === 1 && isArray(moments[0])) { - moments = moments[0]; - } - if (!moments.length) { - return createLocal(); - } - res = moments[0]; - for (i = 1; i < moments.length; ++i) { - if (!moments[i].isValid() || moments[i][fn](res)) { - res = moments[i]; - } - } - return res; - } - - // TODO: Use [].sort instead? - function min () { - var args = [].slice.call(arguments, 0); - - return pickBy('isBefore', args); - } - - function max () { - var args = [].slice.call(arguments, 0); - - return pickBy('isAfter', args); - } - - var now = function () { - return Date.now ? Date.now() : +(new Date()); - }; - - var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; - - function isDurationValid(m) { - for (var key in m) { - if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { - return false; - } - } - - var unitHasDecimal = false; - for (var i = 0; i < ordering.length; ++i) { - if (m[ordering[i]]) { - if (unitHasDecimal) { - return false; // only allow non-integers for smallest unit - } - if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { - unitHasDecimal = true; - } - } - } - - return true; - } - - function isValid$1() { - return this._isValid; - } - - function createInvalid$1() { - return createDuration(NaN); - } - - function Duration (duration) { - var normalizedInput = normalizeObjectUnits(duration), - years = normalizedInput.year || 0, - quarters = normalizedInput.quarter || 0, - months = normalizedInput.month || 0, - weeks = normalizedInput.week || 0, - days = normalizedInput.day || 0, - hours = normalizedInput.hour || 0, - minutes = normalizedInput.minute || 0, - seconds = normalizedInput.second || 0, - milliseconds = normalizedInput.millisecond || 0; - - this._isValid = isDurationValid(normalizedInput); - - // representation for dateAddRemove - this._milliseconds = +milliseconds + - seconds * 1e3 + // 1000 - minutes * 6e4 + // 1000 * 60 - hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 - // Because of dateAddRemove treats 24 hours as different from a - // day when working around DST, we need to store them separately - this._days = +days + - weeks * 7; - // It is impossible to translate months into days without knowing - // which months you are are talking about, so we have to store - // it separately. - this._months = +months + - quarters * 3 + - years * 12; - - this._data = {}; - - this._locale = getLocale(); - - this._bubble(); - } - - function isDuration (obj) { - return obj instanceof Duration; - } - - function absRound (number) { - if (number < 0) { - return Math.round(-1 * number) * -1; - } else { - return Math.round(number); - } - } - - // FORMATTING - - function offset (token, separator) { - addFormatToken(token, 0, 0, function () { - var offset = this.utcOffset(); - var sign = '+'; - if (offset < 0) { - offset = -offset; - sign = '-'; - } - return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); - }); - } - - offset('Z', ':'); - offset('ZZ', ''); - - // PARSING - - addRegexToken('Z', matchShortOffset); - addRegexToken('ZZ', matchShortOffset); - addParseToken(['Z', 'ZZ'], function (input, array, config) { - config._useUTC = true; - config._tzm = offsetFromString(matchShortOffset, input); - }); - - // HELPERS - - // timezone chunker - // '+10:00' > ['10', '00'] - // '-1530' > ['-15', '30'] - var chunkOffset = /([\+\-]|\d\d)/gi; - - function offsetFromString(matcher, string) { - var matches = (string || '').match(matcher); - - if (matches === null) { - return null; - } - - var chunk = matches[matches.length - 1] || []; - var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; - var minutes = +(parts[1] * 60) + toInt(parts[2]); - - return minutes === 0 ? - 0 : - parts[0] === '+' ? minutes : -minutes; - } - - // Return a moment from input, that is local/utc/zone equivalent to model. - function cloneWithOffset(input, model) { - var res, diff; - if (model._isUTC) { - res = model.clone(); - diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); - // Use low-level api, because this fn is low-level api. - res._d.setTime(res._d.valueOf() + diff); - hooks.updateOffset(res, false); - return res; - } else { - return createLocal(input).local(); - } - } - - function getDateOffset (m) { - // On Firefox.24 Date#getTimezoneOffset returns a floating point. - // https://github.com/moment/moment/pull/1871 - return -Math.round(m._d.getTimezoneOffset() / 15) * 15; - } - - // HOOKS - - // This function will be called whenever a moment is mutated. - // It is intended to keep the offset in sync with the timezone. - hooks.updateOffset = function () {}; - - // MOMENTS - - // keepLocalTime = true means only change the timezone, without - // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> - // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset - // +0200, so we adjust the time as needed, to be valid. - // - // Keeping the time actually adds/subtracts (one hour) - // from the actual represented time. That is why we call updateOffset - // a second time. In case it wants us to change the offset again - // _changeInProgress == true case, then we have to adjust, because - // there is no such time in the given timezone. - function getSetOffset (input, keepLocalTime, keepMinutes) { - var offset = this._offset || 0, - localAdjust; - if (!this.isValid()) { - return input != null ? this : NaN; - } - if (input != null) { - if (typeof input === 'string') { - input = offsetFromString(matchShortOffset, input); - if (input === null) { - return this; - } - } else if (Math.abs(input) < 16 && !keepMinutes) { - input = input * 60; - } - if (!this._isUTC && keepLocalTime) { - localAdjust = getDateOffset(this); - } - this._offset = input; - this._isUTC = true; - if (localAdjust != null) { - this.add(localAdjust, 'm'); - } - if (offset !== input) { - if (!keepLocalTime || this._changeInProgress) { - addSubtract(this, createDuration(input - offset, 'm'), 1, false); - } else if (!this._changeInProgress) { - this._changeInProgress = true; - hooks.updateOffset(this, true); - this._changeInProgress = null; - } - } - return this; - } else { - return this._isUTC ? offset : getDateOffset(this); - } - } - - function getSetZone (input, keepLocalTime) { - if (input != null) { - if (typeof input !== 'string') { - input = -input; - } - - this.utcOffset(input, keepLocalTime); - - return this; - } else { - return -this.utcOffset(); - } - } - - function setOffsetToUTC (keepLocalTime) { - return this.utcOffset(0, keepLocalTime); - } - - function setOffsetToLocal (keepLocalTime) { - if (this._isUTC) { - this.utcOffset(0, keepLocalTime); - this._isUTC = false; - - if (keepLocalTime) { - this.subtract(getDateOffset(this), 'm'); - } - } - return this; - } - - function setOffsetToParsedOffset () { - if (this._tzm != null) { - this.utcOffset(this._tzm, false, true); - } else if (typeof this._i === 'string') { - var tZone = offsetFromString(matchOffset, this._i); - if (tZone != null) { - this.utcOffset(tZone); - } - else { - this.utcOffset(0, true); - } - } - return this; - } - - function hasAlignedHourOffset (input) { - if (!this.isValid()) { - return false; - } - input = input ? createLocal(input).utcOffset() : 0; - - return (this.utcOffset() - input) % 60 === 0; - } - - function isDaylightSavingTime () { - return ( - this.utcOffset() > this.clone().month(0).utcOffset() || - this.utcOffset() > this.clone().month(5).utcOffset() - ); - } - - function isDaylightSavingTimeShifted () { - if (!isUndefined(this._isDSTShifted)) { - return this._isDSTShifted; - } - - var c = {}; - - copyConfig(c, this); - c = prepareConfig(c); - - if (c._a) { - var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); - this._isDSTShifted = this.isValid() && - compareArrays(c._a, other.toArray()) > 0; - } else { - this._isDSTShifted = false; - } - - return this._isDSTShifted; - } - - function isLocal () { - return this.isValid() ? !this._isUTC : false; - } - - function isUtcOffset () { - return this.isValid() ? this._isUTC : false; - } - - function isUtc () { - return this.isValid() ? this._isUTC && this._offset === 0 : false; - } - - // ASP.NET json date format regex - var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; - - // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html - // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere - // and further modified to allow for strings containing both week and day - var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - - function createDuration (input, key) { - var duration = input, - // matching against regexp is expensive, do it on demand - match = null, - sign, - ret, - diffRes; - - if (isDuration(input)) { - duration = { - ms : input._milliseconds, - d : input._days, - M : input._months - }; - } else if (isNumber(input)) { - duration = {}; - if (key) { - duration[key] = input; - } else { - duration.milliseconds = input; - } - } else if (!!(match = aspNetRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : 1; - duration = { - y : 0, - d : toInt(match[DATE]) * sign, - h : toInt(match[HOUR]) * sign, - m : toInt(match[MINUTE]) * sign, - s : toInt(match[SECOND]) * sign, - ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match - }; - } else if (!!(match = isoRegex.exec(input))) { - sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; - duration = { - y : parseIso(match[2], sign), - M : parseIso(match[3], sign), - w : parseIso(match[4], sign), - d : parseIso(match[5], sign), - h : parseIso(match[6], sign), - m : parseIso(match[7], sign), - s : parseIso(match[8], sign) - }; - } else if (duration == null) {// checks for null or undefined - duration = {}; - } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { - diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); - - duration = {}; - duration.ms = diffRes.milliseconds; - duration.M = diffRes.months; - } - - ret = new Duration(duration); - - if (isDuration(input) && hasOwnProp(input, '_locale')) { - ret._locale = input._locale; - } - - return ret; - } - - createDuration.fn = Duration.prototype; - createDuration.invalid = createInvalid$1; - - function parseIso (inp, sign) { - // We'd normally use ~~inp for this, but unfortunately it also - // converts floats to ints. - // inp may be undefined, so careful calling replace on it. - var res = inp && parseFloat(inp.replace(',', '.')); - // apply sign while we're at it - return (isNaN(res) ? 0 : res) * sign; - } - - function positiveMomentsDifference(base, other) { - var res = {milliseconds: 0, months: 0}; - - res.months = other.month() - base.month() + - (other.year() - base.year()) * 12; - if (base.clone().add(res.months, 'M').isAfter(other)) { - --res.months; - } - - res.milliseconds = +other - +(base.clone().add(res.months, 'M')); - - return res; - } - - function momentsDifference(base, other) { - var res; - if (!(base.isValid() && other.isValid())) { - return {milliseconds: 0, months: 0}; - } - - other = cloneWithOffset(other, base); - if (base.isBefore(other)) { - res = positiveMomentsDifference(base, other); - } else { - res = positiveMomentsDifference(other, base); - res.milliseconds = -res.milliseconds; - res.months = -res.months; - } - - return res; - } - - // TODO: remove 'name' arg after deprecation is removed - function createAdder(direction, name) { - return function (val, period) { - var dur, tmp; - //invert the arguments, but complain about it - if (period !== null && !isNaN(+period)) { - deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + - 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); - tmp = val; val = period; period = tmp; - } - - val = typeof val === 'string' ? +val : val; - dur = createDuration(val, period); - addSubtract(this, dur, direction); - return this; - }; - } - - function addSubtract (mom, duration, isAdding, updateOffset) { - var milliseconds = duration._milliseconds, - days = absRound(duration._days), - months = absRound(duration._months); - - if (!mom.isValid()) { - // No op - return; - } - - updateOffset = updateOffset == null ? true : updateOffset; - - if (months) { - setMonth(mom, get(mom, 'Month') + months * isAdding); - } - if (days) { - set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); - } - if (milliseconds) { - mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); - } - if (updateOffset) { - hooks.updateOffset(mom, days || months); - } - } - - var add = createAdder(1, 'add'); - var subtract = createAdder(-1, 'subtract'); - - function getCalendarFormat(myMoment, now) { - var diff = myMoment.diff(now, 'days', true); - return diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; - } - - function calendar$1 (time, formats) { - // We want to compare the start of today, vs this. - // Getting start-of-today depends on whether we're local/utc/offset or not. - var now = time || createLocal(), - sod = cloneWithOffset(now, this).startOf('day'), - format = hooks.calendarFormat(this, sod) || 'sameElse'; - - var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); - - return this.format(output || this.localeData().calendar(format, this, createLocal(now))); - } - - function clone () { - return new Moment(this); - } - - function isAfter (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() > localInput.valueOf(); - } else { - return localInput.valueOf() < this.clone().startOf(units).valueOf(); - } - } - - function isBefore (input, units) { - var localInput = isMoment(input) ? input : createLocal(input); - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() < localInput.valueOf(); - } else { - return this.clone().endOf(units).valueOf() < localInput.valueOf(); - } - } - - function isBetween (from, to, units, inclusivity) { - inclusivity = inclusivity || '()'; - return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && - (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); - } - - function isSame (input, units) { - var localInput = isMoment(input) ? input : createLocal(input), - inputMs; - if (!(this.isValid() && localInput.isValid())) { - return false; - } - units = normalizeUnits(units || 'millisecond'); - if (units === 'millisecond') { - return this.valueOf() === localInput.valueOf(); - } else { - inputMs = localInput.valueOf(); - return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); - } - } - - function isSameOrAfter (input, units) { - return this.isSame(input, units) || this.isAfter(input,units); - } - - function isSameOrBefore (input, units) { - return this.isSame(input, units) || this.isBefore(input,units); - } - - function diff (input, units, asFloat) { - var that, - zoneDelta, - output; - - if (!this.isValid()) { - return NaN; - } - - that = cloneWithOffset(input, this); - - if (!that.isValid()) { - return NaN; - } - - zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; - - units = normalizeUnits(units); - - switch (units) { - case 'year': output = monthDiff(this, that) / 12; break; - case 'month': output = monthDiff(this, that); break; - case 'quarter': output = monthDiff(this, that) / 3; break; - case 'second': output = (this - that) / 1e3; break; // 1000 - case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 - case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 - case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst - case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst - default: output = this - that; - } - - return asFloat ? output : absFloor(output); - } - - function monthDiff (a, b) { - // difference in months - var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), - // b is in (anchor - 1 month, anchor + 1 month) - anchor = a.clone().add(wholeMonthDiff, 'months'), - anchor2, adjust; - - if (b - anchor < 0) { - anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor - anchor2); - } else { - anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); - // linear across the month - adjust = (b - anchor) / (anchor2 - anchor); - } - - //check for negative zero, return zero if negative zero - return -(wholeMonthDiff + adjust) || 0; - } - - hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; - hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; - - function toString () { - return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); - } - - function toISOString(keepOffset) { - if (!this.isValid()) { - return null; - } - var utc = keepOffset !== true; - var m = utc ? this.clone().utc() : this; - if (m.year() < 0 || m.year() > 9999) { - return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } - if (isFunction(Date.prototype.toISOString)) { - // native implementation is ~50x faster, use it when we can - if (utc) { - return this.toDate().toISOString(); - } else { - return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); - } - } - return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); - } - - /** - * Return a human readable representation of a moment that can - * also be evaluated to get a new moment which is the same - * - * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects - */ - function inspect () { - if (!this.isValid()) { - return 'moment.invalid(/* ' + this._i + ' */)'; - } - var func = 'moment'; - var zone = ''; - if (!this.isLocal()) { - func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; - zone = 'Z'; - } - var prefix = '[' + func + '("]'; - var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; - var datetime = '-MM-DD[T]HH:mm:ss.SSS'; - var suffix = zone + '[")]'; - - return this.format(prefix + year + datetime + suffix); - } - - function format (inputString) { - if (!inputString) { - inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; - } - var output = formatMoment(this, inputString); - return this.localeData().postformat(output); - } - - function from (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function fromNow (withoutSuffix) { - return this.from(createLocal(), withoutSuffix); - } - - function to (time, withoutSuffix) { - if (this.isValid() && - ((isMoment(time) && time.isValid()) || - createLocal(time).isValid())) { - return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); - } else { - return this.localeData().invalidDate(); - } - } - - function toNow (withoutSuffix) { - return this.to(createLocal(), withoutSuffix); - } - - // If passed a locale key, it will set the locale for this - // instance. Otherwise, it will return the locale configuration - // variables for this instance. - function locale (key) { - var newLocaleData; - - if (key === undefined) { - return this._locale._abbr; - } else { - newLocaleData = getLocale(key); - if (newLocaleData != null) { - this._locale = newLocaleData; - } - return this; - } - } - - var lang = deprecate( - 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', - function (key) { - if (key === undefined) { - return this.localeData(); - } else { - return this.locale(key); - } - } - ); - - function localeData () { - return this._locale; - } - - function startOf (units) { - units = normalizeUnits(units); - // the following switch intentionally omits break keywords - // to utilize falling through the cases. - switch (units) { - case 'year': - this.month(0); - /* falls through */ - case 'quarter': - case 'month': - this.date(1); - /* falls through */ - case 'week': - case 'isoWeek': - case 'day': - case 'date': - this.hours(0); - /* falls through */ - case 'hour': - this.minutes(0); - /* falls through */ - case 'minute': - this.seconds(0); - /* falls through */ - case 'second': - this.milliseconds(0); - } - - // weeks are a special case - if (units === 'week') { - this.weekday(0); - } - if (units === 'isoWeek') { - this.isoWeekday(1); - } - - // quarters are also special - if (units === 'quarter') { - this.month(Math.floor(this.month() / 3) * 3); - } - - return this; - } - - function endOf (units) { - units = normalizeUnits(units); - if (units === undefined || units === 'millisecond') { - return this; - } - - // 'date' is an alias for 'day', so it should be considered as such. - if (units === 'date') { - units = 'day'; - } - - return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); - } - - function valueOf () { - return this._d.valueOf() - ((this._offset || 0) * 60000); - } - - function unix () { - return Math.floor(this.valueOf() / 1000); - } - - function toDate () { - return new Date(this.valueOf()); - } - - function toArray () { - var m = this; - return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; - } - - function toObject () { - var m = this; - return { - years: m.year(), - months: m.month(), - date: m.date(), - hours: m.hours(), - minutes: m.minutes(), - seconds: m.seconds(), - milliseconds: m.milliseconds() - }; - } - - function toJSON () { - // new Date(NaN).toJSON() === null - return this.isValid() ? this.toISOString() : null; - } - - function isValid$2 () { - return isValid(this); - } - - function parsingFlags () { - return extend({}, getParsingFlags(this)); - } - - function invalidAt () { - return getParsingFlags(this).overflow; - } - - function creationData() { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - }; - } - - // FORMATTING - - addFormatToken(0, ['gg', 2], 0, function () { - return this.weekYear() % 100; - }); - - addFormatToken(0, ['GG', 2], 0, function () { - return this.isoWeekYear() % 100; - }); - - function addWeekYearFormatToken (token, getter) { - addFormatToken(0, [token, token.length], 0, getter); - } - - addWeekYearFormatToken('gggg', 'weekYear'); - addWeekYearFormatToken('ggggg', 'weekYear'); - addWeekYearFormatToken('GGGG', 'isoWeekYear'); - addWeekYearFormatToken('GGGGG', 'isoWeekYear'); - - // ALIASES - - addUnitAlias('weekYear', 'gg'); - addUnitAlias('isoWeekYear', 'GG'); - - // PRIORITY - - addUnitPriority('weekYear', 1); - addUnitPriority('isoWeekYear', 1); - - - // PARSING - - addRegexToken('G', matchSigned); - addRegexToken('g', matchSigned); - addRegexToken('GG', match1to2, match2); - addRegexToken('gg', match1to2, match2); - addRegexToken('GGGG', match1to4, match4); - addRegexToken('gggg', match1to4, match4); - addRegexToken('GGGGG', match1to6, match6); - addRegexToken('ggggg', match1to6, match6); - - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { - week[token.substr(0, 2)] = toInt(input); - }); - - addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { - week[token] = hooks.parseTwoDigitYear(input); - }); - - // MOMENTS - - function getSetWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, - this.week(), - this.weekday(), - this.localeData()._week.dow, - this.localeData()._week.doy); - } - - function getSetISOWeekYear (input) { - return getSetWeekYearHelper.call(this, - input, this.isoWeek(), this.isoWeekday(), 1, 4); - } - - function getISOWeeksInYear () { - return weeksInYear(this.year(), 1, 4); - } - - function getWeeksInYear () { - var weekInfo = this.localeData()._week; - return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); - } - - function getSetWeekYearHelper(input, week, weekday, dow, doy) { - var weeksTarget; - if (input == null) { - return weekOfYear(this, dow, doy).year; - } else { - weeksTarget = weeksInYear(input, dow, doy); - if (week > weeksTarget) { - week = weeksTarget; - } - return setWeekAll.call(this, input, week, weekday, dow, doy); - } - } - - function setWeekAll(weekYear, week, weekday, dow, doy) { - var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), - date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); - - this.year(date.getUTCFullYear()); - this.month(date.getUTCMonth()); - this.date(date.getUTCDate()); - return this; - } - - // FORMATTING - - addFormatToken('Q', 0, 'Qo', 'quarter'); - - // ALIASES - - addUnitAlias('quarter', 'Q'); - - // PRIORITY - - addUnitPriority('quarter', 7); - - // PARSING - - addRegexToken('Q', match1); - addParseToken('Q', function (input, array) { - array[MONTH] = (toInt(input) - 1) * 3; - }); - - // MOMENTS - - function getSetQuarter (input) { - return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); - } - - // FORMATTING - - addFormatToken('D', ['DD', 2], 'Do', 'date'); - - // ALIASES - - addUnitAlias('date', 'D'); - - // PRIORITY - addUnitPriority('date', 9); - - // PARSING - - addRegexToken('D', match1to2); - addRegexToken('DD', match1to2, match2); - addRegexToken('Do', function (isStrict, locale) { - // TODO: Remove "ordinalParse" fallback in next major release. - return isStrict ? - (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : - locale._dayOfMonthOrdinalParseLenient; - }); - - addParseToken(['D', 'DD'], DATE); - addParseToken('Do', function (input, array) { - array[DATE] = toInt(input.match(match1to2)[0]); - }); - - // MOMENTS - - var getSetDayOfMonth = makeGetSet('Date', true); - - // FORMATTING - - addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); - - // ALIASES - - addUnitAlias('dayOfYear', 'DDD'); - - // PRIORITY - addUnitPriority('dayOfYear', 4); - - // PARSING - - addRegexToken('DDD', match1to3); - addRegexToken('DDDD', match3); - addParseToken(['DDD', 'DDDD'], function (input, array, config) { - config._dayOfYear = toInt(input); - }); - - // HELPERS - - // MOMENTS - - function getSetDayOfYear (input) { - var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; - return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); - } - - // FORMATTING - - addFormatToken('m', ['mm', 2], 0, 'minute'); - - // ALIASES - - addUnitAlias('minute', 'm'); - - // PRIORITY - - addUnitPriority('minute', 14); - - // PARSING - - addRegexToken('m', match1to2); - addRegexToken('mm', match1to2, match2); - addParseToken(['m', 'mm'], MINUTE); - - // MOMENTS - - var getSetMinute = makeGetSet('Minutes', false); - - // FORMATTING - - addFormatToken('s', ['ss', 2], 0, 'second'); - - // ALIASES - - addUnitAlias('second', 's'); - - // PRIORITY - - addUnitPriority('second', 15); - - // PARSING - - addRegexToken('s', match1to2); - addRegexToken('ss', match1to2, match2); - addParseToken(['s', 'ss'], SECOND); - - // MOMENTS - - var getSetSecond = makeGetSet('Seconds', false); - - // FORMATTING - - addFormatToken('S', 0, 0, function () { - return ~~(this.millisecond() / 100); - }); - - addFormatToken(0, ['SS', 2], 0, function () { - return ~~(this.millisecond() / 10); - }); - - addFormatToken(0, ['SSS', 3], 0, 'millisecond'); - addFormatToken(0, ['SSSS', 4], 0, function () { - return this.millisecond() * 10; - }); - addFormatToken(0, ['SSSSS', 5], 0, function () { - return this.millisecond() * 100; - }); - addFormatToken(0, ['SSSSSS', 6], 0, function () { - return this.millisecond() * 1000; - }); - addFormatToken(0, ['SSSSSSS', 7], 0, function () { - return this.millisecond() * 10000; - }); - addFormatToken(0, ['SSSSSSSS', 8], 0, function () { - return this.millisecond() * 100000; - }); - addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { - return this.millisecond() * 1000000; - }); - - - // ALIASES - - addUnitAlias('millisecond', 'ms'); - - // PRIORITY - - addUnitPriority('millisecond', 16); - - // PARSING - - addRegexToken('S', match1to3, match1); - addRegexToken('SS', match1to3, match2); - addRegexToken('SSS', match1to3, match3); - - var token; - for (token = 'SSSS'; token.length <= 9; token += 'S') { - addRegexToken(token, matchUnsigned); - } - - function parseMs(input, array) { - array[MILLISECOND] = toInt(('0.' + input) * 1000); - } - - for (token = 'S'; token.length <= 9; token += 'S') { - addParseToken(token, parseMs); - } - // MOMENTS - - var getSetMillisecond = makeGetSet('Milliseconds', false); - - // FORMATTING - - addFormatToken('z', 0, 0, 'zoneAbbr'); - addFormatToken('zz', 0, 0, 'zoneName'); - - // MOMENTS - - function getZoneAbbr () { - return this._isUTC ? 'UTC' : ''; - } - - function getZoneName () { - return this._isUTC ? 'Coordinated Universal Time' : ''; - } - - var proto = Moment.prototype; - - proto.add = add; - proto.calendar = calendar$1; - proto.clone = clone; - proto.diff = diff; - proto.endOf = endOf; - proto.format = format; - proto.from = from; - proto.fromNow = fromNow; - proto.to = to; - proto.toNow = toNow; - proto.get = stringGet; - proto.invalidAt = invalidAt; - proto.isAfter = isAfter; - proto.isBefore = isBefore; - proto.isBetween = isBetween; - proto.isSame = isSame; - proto.isSameOrAfter = isSameOrAfter; - proto.isSameOrBefore = isSameOrBefore; - proto.isValid = isValid$2; - proto.lang = lang; - proto.locale = locale; - proto.localeData = localeData; - proto.max = prototypeMax; - proto.min = prototypeMin; - proto.parsingFlags = parsingFlags; - proto.set = stringSet; - proto.startOf = startOf; - proto.subtract = subtract; - proto.toArray = toArray; - proto.toObject = toObject; - proto.toDate = toDate; - proto.toISOString = toISOString; - proto.inspect = inspect; - proto.toJSON = toJSON; - proto.toString = toString; - proto.unix = unix; - proto.valueOf = valueOf; - proto.creationData = creationData; - proto.year = getSetYear; - proto.isLeapYear = getIsLeapYear; - proto.weekYear = getSetWeekYear; - proto.isoWeekYear = getSetISOWeekYear; - proto.quarter = proto.quarters = getSetQuarter; - proto.month = getSetMonth; - proto.daysInMonth = getDaysInMonth; - proto.week = proto.weeks = getSetWeek; - proto.isoWeek = proto.isoWeeks = getSetISOWeek; - proto.weeksInYear = getWeeksInYear; - proto.isoWeeksInYear = getISOWeeksInYear; - proto.date = getSetDayOfMonth; - proto.day = proto.days = getSetDayOfWeek; - proto.weekday = getSetLocaleDayOfWeek; - proto.isoWeekday = getSetISODayOfWeek; - proto.dayOfYear = getSetDayOfYear; - proto.hour = proto.hours = getSetHour; - proto.minute = proto.minutes = getSetMinute; - proto.second = proto.seconds = getSetSecond; - proto.millisecond = proto.milliseconds = getSetMillisecond; - proto.utcOffset = getSetOffset; - proto.utc = setOffsetToUTC; - proto.local = setOffsetToLocal; - proto.parseZone = setOffsetToParsedOffset; - proto.hasAlignedHourOffset = hasAlignedHourOffset; - proto.isDST = isDaylightSavingTime; - proto.isLocal = isLocal; - proto.isUtcOffset = isUtcOffset; - proto.isUtc = isUtc; - proto.isUTC = isUtc; - proto.zoneAbbr = getZoneAbbr; - proto.zoneName = getZoneName; - proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); - proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); - proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); - proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); - proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); - - function createUnix (input) { - return createLocal(input * 1000); - } - - function createInZone () { - return createLocal.apply(null, arguments).parseZone(); - } - - function preParsePostFormat (string) { - return string; - } - - var proto$1 = Locale.prototype; - - proto$1.calendar = calendar; - proto$1.longDateFormat = longDateFormat; - proto$1.invalidDate = invalidDate; - proto$1.ordinal = ordinal; - proto$1.preparse = preParsePostFormat; - proto$1.postformat = preParsePostFormat; - proto$1.relativeTime = relativeTime; - proto$1.pastFuture = pastFuture; - proto$1.set = set; - - proto$1.months = localeMonths; - proto$1.monthsShort = localeMonthsShort; - proto$1.monthsParse = localeMonthsParse; - proto$1.monthsRegex = monthsRegex; - proto$1.monthsShortRegex = monthsShortRegex; - proto$1.week = localeWeek; - proto$1.firstDayOfYear = localeFirstDayOfYear; - proto$1.firstDayOfWeek = localeFirstDayOfWeek; - - proto$1.weekdays = localeWeekdays; - proto$1.weekdaysMin = localeWeekdaysMin; - proto$1.weekdaysShort = localeWeekdaysShort; - proto$1.weekdaysParse = localeWeekdaysParse; - - proto$1.weekdaysRegex = weekdaysRegex; - proto$1.weekdaysShortRegex = weekdaysShortRegex; - proto$1.weekdaysMinRegex = weekdaysMinRegex; - - proto$1.isPM = localeIsPM; - proto$1.meridiem = localeMeridiem; - - function get$1 (format, index, field, setter) { - var locale = getLocale(); - var utc = createUTC().set(setter, index); - return locale[field](utc, format); - } - - function listMonthsImpl (format, index, field) { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - - if (index != null) { - return get$1(format, index, field, 'month'); - } - - var i; - var out = []; - for (i = 0; i < 12; i++) { - out[i] = get$1(format, i, field, 'month'); - } - return out; - } - - // () - // (5) - // (fmt, 5) - // (fmt) - // (true) - // (true, 5) - // (true, fmt, 5) - // (true, fmt) - function listWeekdaysImpl (localeSorted, format, index, field) { - if (typeof localeSorted === 'boolean') { - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } else { - format = localeSorted; - index = format; - localeSorted = false; - - if (isNumber(format)) { - index = format; - format = undefined; - } - - format = format || ''; - } - - var locale = getLocale(), - shift = localeSorted ? locale._week.dow : 0; - - if (index != null) { - return get$1(format, (index + shift) % 7, field, 'day'); - } - - var i; - var out = []; - for (i = 0; i < 7; i++) { - out[i] = get$1(format, (i + shift) % 7, field, 'day'); - } - return out; - } - - function listMonths (format, index) { - return listMonthsImpl(format, index, 'months'); - } - - function listMonthsShort (format, index) { - return listMonthsImpl(format, index, 'monthsShort'); - } - - function listWeekdays (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); - } - - function listWeekdaysShort (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); - } - - function listWeekdaysMin (localeSorted, format, index) { - return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); - } - - getSetGlobalLocale('en', { - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, - ordinal : function (number) { - var b = number % 10, - output = (toInt(number % 100 / 10) === 1) ? 'th' : - (b === 1) ? 'st' : - (b === 2) ? 'nd' : - (b === 3) ? 'rd' : 'th'; - return number + output; - } - }); - - // Side effect imports - - hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); - hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); - - var mathAbs = Math.abs; - - function abs () { - var data = this._data; - - this._milliseconds = mathAbs(this._milliseconds); - this._days = mathAbs(this._days); - this._months = mathAbs(this._months); - - data.milliseconds = mathAbs(data.milliseconds); - data.seconds = mathAbs(data.seconds); - data.minutes = mathAbs(data.minutes); - data.hours = mathAbs(data.hours); - data.months = mathAbs(data.months); - data.years = mathAbs(data.years); - - return this; - } - - function addSubtract$1 (duration, input, value, direction) { - var other = createDuration(input, value); - - duration._milliseconds += direction * other._milliseconds; - duration._days += direction * other._days; - duration._months += direction * other._months; - - return duration._bubble(); - } - - // supports only 2.0-style add(1, 's') or add(duration) - function add$1 (input, value) { - return addSubtract$1(this, input, value, 1); - } - - // supports only 2.0-style subtract(1, 's') or subtract(duration) - function subtract$1 (input, value) { - return addSubtract$1(this, input, value, -1); - } - - function absCeil (number) { - if (number < 0) { - return Math.floor(number); - } else { - return Math.ceil(number); - } - } - - function bubble () { - var milliseconds = this._milliseconds; - var days = this._days; - var months = this._months; - var data = this._data; - var seconds, minutes, hours, years, monthsFromDays; - - // if we have a mix of positive and negative values, bubble down first - // check: https://github.com/moment/moment/issues/2166 - if (!((milliseconds >= 0 && days >= 0 && months >= 0) || - (milliseconds <= 0 && days <= 0 && months <= 0))) { - milliseconds += absCeil(monthsToDays(months) + days) * 864e5; - days = 0; - months = 0; - } - - // The following code bubbles up values, see the tests for - // examples of what that means. - data.milliseconds = milliseconds % 1000; - - seconds = absFloor(milliseconds / 1000); - data.seconds = seconds % 60; - - minutes = absFloor(seconds / 60); - data.minutes = minutes % 60; - - hours = absFloor(minutes / 60); - data.hours = hours % 24; - - days += absFloor(hours / 24); - - // convert days to months - monthsFromDays = absFloor(daysToMonths(days)); - months += monthsFromDays; - days -= absCeil(monthsToDays(monthsFromDays)); - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - data.days = days; - data.months = months; - data.years = years; - - return this; - } - - function daysToMonths (days) { - // 400 years have 146097 days (taking into account leap year rules) - // 400 years have 12 months === 4800 - return days * 4800 / 146097; - } - - function monthsToDays (months) { - // the reverse of daysToMonths - return months * 146097 / 4800; - } - - function as (units) { - if (!this.isValid()) { - return NaN; - } - var days; - var months; - var milliseconds = this._milliseconds; - - units = normalizeUnits(units); - - if (units === 'month' || units === 'year') { - days = this._days + milliseconds / 864e5; - months = this._months + daysToMonths(days); - return units === 'month' ? months : months / 12; - } else { - // handle milliseconds separately because of floating point math errors (issue #1867) - days = this._days + Math.round(monthsToDays(this._months)); - switch (units) { - case 'week' : return days / 7 + milliseconds / 6048e5; - case 'day' : return days + milliseconds / 864e5; - case 'hour' : return days * 24 + milliseconds / 36e5; - case 'minute' : return days * 1440 + milliseconds / 6e4; - case 'second' : return days * 86400 + milliseconds / 1000; - // Math.floor prevents floating point math errors here - case 'millisecond': return Math.floor(days * 864e5) + milliseconds; - default: throw new Error('Unknown unit ' + units); - } - } - } - - // TODO: Use this.as('ms')? - function valueOf$1 () { - if (!this.isValid()) { - return NaN; - } - return ( - this._milliseconds + - this._days * 864e5 + - (this._months % 12) * 2592e6 + - toInt(this._months / 12) * 31536e6 - ); - } - - function makeAs (alias) { - return function () { - return this.as(alias); - }; - } - - var asMilliseconds = makeAs('ms'); - var asSeconds = makeAs('s'); - var asMinutes = makeAs('m'); - var asHours = makeAs('h'); - var asDays = makeAs('d'); - var asWeeks = makeAs('w'); - var asMonths = makeAs('M'); - var asYears = makeAs('y'); - - function clone$1 () { - return createDuration(this); - } - - function get$2 (units) { - units = normalizeUnits(units); - return this.isValid() ? this[units + 's']() : NaN; - } - - function makeGetter(name) { - return function () { - return this.isValid() ? this._data[name] : NaN; - }; - } - - var milliseconds = makeGetter('milliseconds'); - var seconds = makeGetter('seconds'); - var minutes = makeGetter('minutes'); - var hours = makeGetter('hours'); - var days = makeGetter('days'); - var months = makeGetter('months'); - var years = makeGetter('years'); - - function weeks () { - return absFloor(this.days() / 7); - } - - var round = Math.round; - var thresholds = { - ss: 44, // a few seconds to seconds - s : 45, // seconds to minute - m : 45, // minutes to hour - h : 22, // hours to day - d : 26, // days to month - M : 11 // months to year - }; - - // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize - function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { - return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); - } - - function relativeTime$1 (posNegDuration, withoutSuffix, locale) { - var duration = createDuration(posNegDuration).abs(); - var seconds = round(duration.as('s')); - var minutes = round(duration.as('m')); - var hours = round(duration.as('h')); - var days = round(duration.as('d')); - var months = round(duration.as('M')); - var years = round(duration.as('y')); - - var a = seconds <= thresholds.ss && ['s', seconds] || - seconds < thresholds.s && ['ss', seconds] || - minutes <= 1 && ['m'] || - minutes < thresholds.m && ['mm', minutes] || - hours <= 1 && ['h'] || - hours < thresholds.h && ['hh', hours] || - days <= 1 && ['d'] || - days < thresholds.d && ['dd', days] || - months <= 1 && ['M'] || - months < thresholds.M && ['MM', months] || - years <= 1 && ['y'] || ['yy', years]; - - a[2] = withoutSuffix; - a[3] = +posNegDuration > 0; - a[4] = locale; - return substituteTimeAgo.apply(null, a); - } - - // This function allows you to set the rounding function for relative time strings - function getSetRelativeTimeRounding (roundingFunction) { - if (roundingFunction === undefined) { - return round; - } - if (typeof(roundingFunction) === 'function') { - round = roundingFunction; - return true; - } - return false; - } - - // This function allows you to set a threshold for relative time strings - function getSetRelativeTimeThreshold (threshold, limit) { - if (thresholds[threshold] === undefined) { - return false; - } - if (limit === undefined) { - return thresholds[threshold]; - } - thresholds[threshold] = limit; - if (threshold === 's') { - thresholds.ss = limit - 1; - } - return true; - } - - function humanize (withSuffix) { - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var locale = this.localeData(); - var output = relativeTime$1(this, !withSuffix, locale); - - if (withSuffix) { - output = locale.pastFuture(+this, output); - } - - return locale.postformat(output); - } - - var abs$1 = Math.abs; - - function sign(x) { - return ((x > 0) - (x < 0)) || +x; - } - - function toISOString$1() { - // for ISO strings we do not use the normal bubbling rules: - // * milliseconds bubble up until they become hours - // * days do not bubble at all - // * months bubble up until they become years - // This is because there is no context-free conversion between hours and days - // (think of clock changes) - // and also not between days and months (28-31 days per month) - if (!this.isValid()) { - return this.localeData().invalidDate(); - } - - var seconds = abs$1(this._milliseconds) / 1000; - var days = abs$1(this._days); - var months = abs$1(this._months); - var minutes, hours, years; - - // 3600 seconds -> 60 minutes -> 1 hour - minutes = absFloor(seconds / 60); - hours = absFloor(minutes / 60); - seconds %= 60; - minutes %= 60; - - // 12 months -> 1 year - years = absFloor(months / 12); - months %= 12; - - - // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js - var Y = years; - var M = months; - var D = days; - var h = hours; - var m = minutes; - var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; - var total = this.asSeconds(); - - if (!total) { - // this is the same as C#'s (Noda) and python (isodate)... - // but not other JS (goog.date) - return 'P0D'; - } - - var totalSign = total < 0 ? '-' : ''; - var ymSign = sign(this._months) !== sign(total) ? '-' : ''; - var daysSign = sign(this._days) !== sign(total) ? '-' : ''; - var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; - - return totalSign + 'P' + - (Y ? ymSign + Y + 'Y' : '') + - (M ? ymSign + M + 'M' : '') + - (D ? daysSign + D + 'D' : '') + - ((h || m || s) ? 'T' : '') + - (h ? hmsSign + h + 'H' : '') + - (m ? hmsSign + m + 'M' : '') + - (s ? hmsSign + s + 'S' : ''); - } - - var proto$2 = Duration.prototype; - - proto$2.isValid = isValid$1; - proto$2.abs = abs; - proto$2.add = add$1; - proto$2.subtract = subtract$1; - proto$2.as = as; - proto$2.asMilliseconds = asMilliseconds; - proto$2.asSeconds = asSeconds; - proto$2.asMinutes = asMinutes; - proto$2.asHours = asHours; - proto$2.asDays = asDays; - proto$2.asWeeks = asWeeks; - proto$2.asMonths = asMonths; - proto$2.asYears = asYears; - proto$2.valueOf = valueOf$1; - proto$2._bubble = bubble; - proto$2.clone = clone$1; - proto$2.get = get$2; - proto$2.milliseconds = milliseconds; - proto$2.seconds = seconds; - proto$2.minutes = minutes; - proto$2.hours = hours; - proto$2.days = days; - proto$2.weeks = weeks; - proto$2.months = months; - proto$2.years = years; - proto$2.humanize = humanize; - proto$2.toISOString = toISOString$1; - proto$2.toString = toISOString$1; - proto$2.toJSON = toISOString$1; - proto$2.locale = locale; - proto$2.localeData = localeData; - - proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); - proto$2.lang = lang; - - // Side effect imports - - // FORMATTING - - addFormatToken('X', 0, 0, 'unix'); - addFormatToken('x', 0, 0, 'valueOf'); - - // PARSING - - addRegexToken('x', matchSigned); - addRegexToken('X', matchTimestamp); - addParseToken('X', function (input, array, config) { - config._d = new Date(parseFloat(input, 10) * 1000); - }); - addParseToken('x', function (input, array, config) { - config._d = new Date(toInt(input)); - }); - - // Side effect imports - - - hooks.version = '2.22.1'; - - setHookCallback(createLocal); - - hooks.fn = proto; - hooks.min = min; - hooks.max = max; - hooks.now = now; - hooks.utc = createUTC; - hooks.unix = createUnix; - hooks.months = listMonths; - hooks.isDate = isDate; - hooks.locale = getSetGlobalLocale; - hooks.invalid = createInvalid; - hooks.duration = createDuration; - hooks.isMoment = isMoment; - hooks.weekdays = listWeekdays; - hooks.parseZone = createInZone; - hooks.localeData = getLocale; - hooks.isDuration = isDuration; - hooks.monthsShort = listMonthsShort; - hooks.weekdaysMin = listWeekdaysMin; - hooks.defineLocale = defineLocale; - hooks.updateLocale = updateLocale; - hooks.locales = listLocales; - hooks.weekdaysShort = listWeekdaysShort; - hooks.normalizeUnits = normalizeUnits; - hooks.relativeTimeRounding = getSetRelativeTimeRounding; - hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; - hooks.calendarFormat = getCalendarFormat; - hooks.prototype = proto; - - // currently HTML5 input type only supports 24-hour formats - hooks.HTML5_FMT = { - DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // - DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // - DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // - DATE: 'YYYY-MM-DD', // - TIME: 'HH:mm', // - TIME_SECONDS: 'HH:mm:ss', // - TIME_MS: 'HH:mm:ss.SSS', // - WEEK: 'YYYY-[W]WW', // - MONTH: 'YYYY-MM' // - }; - - return hooks; - -}))); - -},{}],23:[function(require,module,exports){ -"use strict"; -/* - Main function and entry point - Can be registered to a videojs instance as a plugin -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -module.exports = function (videojs) { - require('./lib/polyfills'); - - var Plugin = videojs.getPlugin('plugin'), - Utils = require('./lib/utils'), - Controls = require("./components/controls"), - AnnotationState = require("./components/annotation_state"), - EventDispatcher = require("./lib/event_dispatcher"); - - var DEFAULT_OPTIONS = Object.freeze({ - bindArrowKeys: true, - meta: { user_id: null, user_name: null }, - annotationsObjects: [], - showControls: true, - showCommentList: true, - showFullScreen: true, - showMarkerShapeAndTooltips: true, - internalCommenting: true, - startInAnnotationMode: false - }); - - return function (_Plugin) { - _inherits(AnnotationComments, _Plugin); - - function AnnotationComments(player, options) { - _classCallCheck(this, AnnotationComments); - - options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options); - - var _this = _possibleConstructorReturn(this, (AnnotationComments.__proto__ || Object.getPrototypeOf(AnnotationComments)).call(this, player, options)); - - _this.eventDispatcher = new EventDispatcher(_this); - _this.eventDispatcher.registerListenersFor(_this, 'AnnotationComments'); - - _this.player = player; - _this.meta = options.meta; - _this.options = options; - - _this._readyCallbacks = []; - - // Assign reference to this class to player for access later by components where needed - player.annotationComments = function () { - return _this; - }.bind(_this); - - // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration - // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3 - if (player.readyState() >= 3) { - _this.postLoadDataConstructor(); - } else { - player.on('loadeddata', _this.postLoadDataConstructor.bind(_this)); - } - return _this; - } - - // Additional init/setup after video data + metadata is available - - - _createClass(AnnotationComments, [{ - key: 'postLoadDataConstructor', - value: function postLoadDataConstructor() { - // setup initial state and render UI - this.annotationState = new AnnotationState(this.player); - this.annotationState.annotations = this.options.annotationsObjects; - - this.controls = new Controls(this.player, this.options.bindArrowKeys); - this.bindEvents(); - this.setBounds(false); - if (this.options.startInAnnotationMode) this.toggleAnnotationMode(); - - this.pluginReady(); - } - - // Bind needed events for interaction w/ components - - }, { - key: 'bindEvents', - value: function bindEvents() { - var _this2 = this; - - // Set player boundaries on window size change or fullscreen change - $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500)); - this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500)); - - // Remove annotation features on fullscreen if showFullScreen: false - if (!this.options.showFullScreen) { - this.player.on('fullscreenchange', function () { - if (_this2.player.isFullscreen_) { - _this2.preFullscreenAnnotationsEnabled = _this2.active; - $(_this2.player.el()).addClass('vac-disable-fullscreen'); - } else { - $(_this2.player.el()).removeClass('vac-disable-fullscreen'); - } - if (_this2.preFullscreenAnnotationsEnabled) { - // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are - // in annotation mode, toggle the mode - _this2.toggleAnnotationMode(); - } - }.bind(this)); - } - } - - // A wrapper func to make it easier to use EventDispatcher from the client - // Ex: plugin.fire(type, data); - - }, { - key: 'fire', - value: function fire(type) { - var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - this.eventDispatcher.fire(type, data); - } - - // Toggle annotations mode on/off - - }, { - key: 'toggleAnnotationMode', - value: function toggleAnnotationMode() { - this.active = !this.active; - this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements - this.annotationState.enabled = this.active; - - if (this.active) { - this.fire("annotationModeEnabled"); - } else { - this.fire("annotationModeDisabled"); - } - - // Handle control component UI if showControls: true - if (this.options.showControls) { - if (!this.active) { - this.controls.clear(true); - } else { - this.controls.render(); - } - } - } - - // Set player UI boundaries - - }, { - key: 'setBounds', - value: function setBounds() { - var triggerChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.bounds = {}; - var $player = $(this.player.el()), - $ctrls = $player.find('.vjs-control-bar'); - - this.bounds.left = $player.offset().left; - this.bounds.top = $player.offset().top; - this.bounds.right = this.bounds.left + $player.width(); - this.bounds.bottom = this.bounds.top + $player.height(); - this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height(); - - // fires an event when bounds have changed during resizing - if (triggerChange) this.fire('playerBoundsChanged', this.bounds); - } - - // Public function to register a callback for when plugin is ready - - }, { - key: 'onReady', - value: function onReady(callback) { - if (this.eventDispatcher.pluginReady) { - return callback(); - } - this._readyCallbacks.push(callback); - } - - // Mark plugin as ready and fire any pending callbacks - - }, { - key: 'pluginReady', - value: function pluginReady() { - this.eventDispatcher.pluginReady = true; - while (this._readyCallbacks.length) { - this._readyCallbacks.pop()(); - } - } - - // Teardown all components, remove all listeners, and remove elements from DOM - - }, { - key: 'dispose', - value: function dispose() { - this.controls = this.controls.teardown(); - this.annotationState = this.annotationState.teardown(); - this.eventDispatcher = this.eventDispatcher.teardown(); - this.teardown(); - if (this.player) { - this.player.annotationComments = null; - $(this.player.el()).removeClass('vac-active'); - $(this.player.el()).find("[class^='vac-']").remove(); - } - _get(AnnotationComments.prototype.__proto__ || Object.getPrototypeOf(AnnotationComments.prototype), 'dispose', this).call(this); - } - }, { - key: 'teardown', - value: function teardown() { - if (this.player) this.player.off('fullscreenchange'); - $(window).off('resize.vac-window-resize'); - } - }]); - - return AnnotationComments; - }(Plugin); -}; - -},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":36,"./lib/polyfills":40,"./lib/utils":41}],24:[function(require,module,exports){ -var _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; }; - -var Handlebars = require("handlebars/runtime"); -exports["comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n
\n
" + alias4(container.lambda((stack1 = depth0 != null ? depth0.meta : depth0) != null ? stack1.user_name : stack1, depth0)) + "
\n
" + alias4((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "timeSince", "hash": {}, "data": data }) : helper)) + "\n   X\n
\n
\n
\n " + alias4((helpers.breaklines || depth0 && depth0.breaklines || alias2).call(alias1, depth0 != null ? depth0.body : depth0, { "name": "breaklines", "hash": {}, "data": data })) + "\n
\n
\n"; - }, "useData": true }); -exports["comment_list"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data, blockParams) { - var stack1; - - return " " + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : "") + "\n"; - }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data, blockParams) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}; - - return "
\n"; - }, "useData": true, "useBlockParams": true }); -exports["controls"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { - var stack1; - - return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(2, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; - }, "2": function _(container, depth0, helpers, partials, data) { - var stack1; - - return "
\n \n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.showNav : depth0, { "name": "if", "hash": {}, "fn": container.program(3, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; - }, "3": function _(container, depth0, helpers, partials, data) { - return "
\n
Prev
\n
Next
\n
\n"; - }, "5": function _(container, depth0, helpers, partials, data) { - var stack1, - alias1 = depth0 != null ? depth0 : container.nullContext || {}; - - return "
\n
\n
Click and drag to select
\n
\n
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showControls : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.writingComment : depth0, { "name": "if", "hash": {}, "fn": container.program(9, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); - }, "6": function _(container, depth0, helpers, partials, data) { - var stack1; - - return "
\n Select shape + range\n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.internalCommenting : depth0, { "name": "if", "hash": {}, "fn": container.program(7, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n
-1 sec
\n
+1 sec
\n
\n
\n"; - }, "7": function _(container, depth0, helpers, partials, data) { - return " \n cancel\n"; - }, "9": function _(container, depth0, helpers, partials, data) { - var helper; - - return "
\n
\n
\n
New Annotation @ " + container.escapeExpression((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "rangeStr", "hash": {}, "data": data }) : helper)) + "
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n"; - }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var stack1, - alias1 = depth0 != null ? depth0 : container.nullContext || {}; - - return ((stack1 = helpers.unless.call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "unless", "hash": {}, "fn": container.program(1, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.adding : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""); - }, "useData": true }); -exports["draggable_marker"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n
\n"; - }, "useData": true }); -exports["marker"] = Handlebars.template({ "1": function _(container, depth0, helpers, partials, data) { - return "vac-ranged-marker"; - }, "3": function _(container, depth0, helpers, partials, data) { - var helper; - - return "width:" + container.escapeExpression((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing, typeof helper === "function" ? helper.call(depth0 != null ? depth0 : container.nullContext || {}, { "name": "width", "hash": {}, "data": data }) : helper)) + ";"; - }, "5": function _(container, depth0, helpers, partials, data) { - var stack1; - - return (stack1 = helpers["if"].call(depth0 != null ? depth0 : container.nullContext || {}, depth0 != null ? depth0.tooltipBody : depth0, { "name": "if", "hash": {}, "fn": container.program(6, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : ""; - }, "6": function _(container, depth0, helpers, partials, data) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n \n " + alias4((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipTime", "hash": {}, "data": data }) : helper)) + " - " + alias4((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2, (typeof helper === "undefined" ? "undefined" : _typeof(helper)) === alias3 ? helper.call(alias1, { "name": "tooltipBody", "hash": {}, "data": data }) : helper)) + "\n \n
\n"; - }, "7": function _(container, depth0, helpers, partials, data) { - return "vac-right-side"; - }, "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var stack1, - helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n" + ((stack1 = helpers["if"].call(alias1, depth0 != null ? depth0.showTooltip : depth0, { "name": "if", "hash": {}, "fn": container.program(5, data, 0), "inverse": container.noop, "data": data })) != null ? stack1 : "") + "
\n"; - }, "useData": true }); -exports["marker_wrap"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - return "
\n
\n
"; - }, "useData": true }); -exports["new_comment"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - var helper, - alias1 = depth0 != null ? depth0 : container.nullContext || {}, - alias2 = helpers.helperMissing, - alias3 = "function", - alias4 = container.escapeExpression; - - return "
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n"; - }, "useData": true }); -exports["player_button"] = Handlebars.template({ "compiler": [7, ">= 4.0.0"], "main": function main(container, depth0, helpers, partials, data) { - return "\n\n \n \n \n \n"; - }, "useData": true }); - -},{"handlebars/runtime":20}],25:[function(require,module,exports){ -"use strict"; -/* - Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils.js"), - CommentList = require("./comment_list"), - Marker = require("./marker"), - Comment = require("./comment"), - Shape = require("./shape"); - -module.exports = function (_PlayerUIComponent) { - _inherits(Annotation, _PlayerUIComponent); - - function Annotation(data, player) { - _classCallCheck(this, Annotation); - - var _this = _possibleConstructorReturn(this, (Annotation.__proto__ || Object.getPrototypeOf(Annotation)).call(this, player)); - - _this.id = data.id || _this.componentId; - _this.range = data.range; - _this.shape = data.shape; - _this.secondsActive = _this.buildSecondsActiveArray(); - _this.buildComments(data); - _this.buildMarker(); - _this.buildShape(); - _this.bindEvents(); - - _this.isOpen = false; - return _this; - } - - _createClass(Annotation, [{ - key: "buildComments", - value: function buildComments(data) { - this.commentList = new CommentList({ "comments": data.comments, "annotation": this }, this.player); - } - }, { - key: "buildMarker", - value: function buildMarker() { - this.marker = new Marker(this.player, this.range, this.commentList.comments[0]); - this.marker.render(); - } - }, { - key: "buildShape", - value: function buildShape() { - this.annotationShape = new Shape(this.player, this.shape); - } - - // Serialize object - - }, { - key: "bindEvents", - value: function bindEvents() { - var _this2 = this; - - this.marker.$el.on('click.vac-marker', function (e) { - return _this2.plugin.annotationState.openAnnotation(_this2, true); - }); - } - - // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state - - }, { - key: "open", - value: function open() { - var withPause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - var _this3 = this; - - var previewOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var forceSnapToStart = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - this.isOpen = true; - var snapToStart = forceSnapToStart || !Utils.isWithinRange(this.range.start, this.range.end, Math.floor(this.currentTime)); - - var showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips; - this.marker.setActive(showTooltip); - if (!previewOnly && this.plugin.options.showCommentList) { - this.commentList.render(); - } - - if (!previewOnly || previewOnly && this.plugin.options.showMarkerShapeAndTooltips) { - this.annotationShape.render(); - - if (this.shape) { - this.annotationShape.$el.on("click.vac-annotation", function () { - _this3.plugin.annotationState.openAnnotation(_this3, false, false, false); - }); - } - } - - if (withPause) this.player.pause(); - if (snapToStart) this.currentTime = this.range.start; - - this.plugin.fire('annotationOpened', { - annotation: this.data, - triggered_by_timeline: previewOnly - }); - } - - // Closes the annotation. Handles marker, commendList, shape, and AnnotationState - - }, { - key: "close", - value: function close() { - var clearActive = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - if (!this.isOpen) return; - this.isOpen = false; - this.marker.deactivate(); - this.commentList.teardown(false); - if (this.annotationShape.$el) this.annotationShape.$el.off("click.vac-annotation"); - this.annotationShape.teardown(); - if (clearActive) this.plugin.annotationState.clearActive(); - this.plugin.fire('annotationClosed', this.data); - } - - // For preloading an array of seconds active on initialization - // Values used to build timeMap in AnnotationState - - }, { - key: "buildSecondsActiveArray", - value: function buildSecondsActiveArray() { - var seconds = []; - if (!!this.range.end) { - for (var i = this.range.start; i <= this.range.end; i++) { - seconds.push(i); - } - } else { - var start = this.range.start; - seconds.push(start); - if (start < this.duration) seconds.push(start + 1); - } - return seconds; - } - - // Tearsdown annotation and marker, removes object from AnnotationState - - }, { - key: "teardown", - value: function teardown() { - var removeFromCollection = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.close(true); - this.marker.teardown(); - if (this.commentList) this.commentList.teardown(removeFromCollection); - if (removeFromCollection) this.plugin.annotationState.removeAnnotation(this); - if (this.annotationShape) this.annotationShape.teardown(); - if (removeFromCollection) _get(Annotation.prototype.__proto__ || Object.getPrototypeOf(Annotation.prototype), "teardown", this).call(this); - } - - // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref - - }, { - key: "data", - get: function get() { - return { - id: this.id, - range: this.range, - shape: this.shape, - comments: this.commentList.data - }; - } - }, { - key: "isActive", - get: function get() { - return this.plugin.annotationState.activeAnnotation === this; - } - }], [{ - key: "newFromData", - value: function newFromData(range, shape, commentStr, plugin) { - var id = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; - - var comment = Comment.dataObj(commentStr, plugin); - if (range) range = Utils.parseIntObj(range); - if (shape) shape = Utils.parseIntObj(shape); - var data = { - id: id, - range: range, - shape: shape, - comments: [comment] - }; - return new Annotation(data, plugin.player); - } - }]); - - return Annotation; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":39,"./../lib/utils.js":41,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(require,module,exports){ -"use strict"; -/* - Component for managing the state of annotations, including showing active annotation during playback, - toggling active states for annotations, navigating annotations forward/back, etc -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Utils = require('./../lib/utils'), - PlayerComponent = require("./../lib/player_component"), - Annotation = require("./annotation"); - -module.exports = function (_PlayerComponent) { - _inherits(AnnotationState, _PlayerComponent); - - function AnnotationState(player) { - _classCallCheck(this, AnnotationState); - - var _this = _possibleConstructorReturn(this, (AnnotationState.__proto__ || Object.getPrototypeOf(AnnotationState)).call(this, player)); - - _this.initAPI(_this, 'AnnotationState'); - _this.resetData(); - _this.bindEvents(); - return _this; - } - - // sets _enabled and closes or opens annotation as needed - - - _createClass(AnnotationState, [{ - key: "bindEvents", - - - // Bind events for setting liveAnnotation on video time change - value: function bindEvents() { - this.player.on("timeupdate", Utils.throttle(this.setLiveAnnotation.bind(this), 100)); - } - - // Sort annotations by range.start - - }, { - key: "sortAnnotations", - value: function sortAnnotations() { - this._annotations.sort(function (a, b) { - return a.range.start < b.range.start ? -1 : a.range.start > b.range.start ? 1 : 0; - }); - } - - // Add a new annotation - - }, { - key: "addNewAnnotation", - value: function addNewAnnotation(annotation) { - this._annotations.push(annotation); - this.openAnnotation(annotation, true, true, false, true); - this.stateChanged(); - } - - // Create and add a annotation - - }, { - key: "createAndAddAnnotation", - value: function createAndAddAnnotation(data) { - this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew(); - - var annotation = Annotation.newFromData(data.range, data.shape, data.commentStr || "", this.plugin, data.id); - this.addNewAnnotation(annotation); - } - - // Destroy an existing annotation - - }, { - key: "destroyAnnotationById", - value: function destroyAnnotationById(id) { - var annotation = this.findAnnotation(id); - if (annotation) annotation.teardown(); - } - - // Remove an annotation - - }, { - key: "removeAnnotation", - value: function removeAnnotation(annotation) { - var id = annotation.id, - i = this._annotations.indexOf(annotation); - this._annotations.splice(i, 1); - this.stateChanged(); - this.plugin.fire('annotationDeleted', { id: id }); - } - - // Set the live annotation based on current video time - - }, { - key: "setLiveAnnotation", - value: function setLiveAnnotation() { - if (!this.enabled) return; - var time = Math.floor(this.currentTime); - - if (this.skipLiveCheck) { - if (time !== this.lastVideoTime) this.skipLiveCheck = false; - return; - } - - var matches = this.activeAnnotationsForTime(time); - if (!matches.length) return this.activeAnnotation.close(); - - // Set live annotation as the last match - var liveAnnotation = this.annotations[matches[matches.length - 1]]; - - // Special cases if this or another annotation is active - if (this.activeAnnotation.range) { - if (liveAnnotation === this.activeAnnotation) return; - // Check if the active annotation and live annotation share a start time - // Is that start time at the current playhead? - // If so, don't switch which is active. - var liveStart = liveAnnotation.range.start, - activeStart = this.activeAnnotation.range.start; - if (liveStart === activeStart && liveStart === time) return; - } - - this.openAnnotation(liveAnnotation, false, false, true); - } - - // Get all active annotations for a time (in seconds) - - }, { - key: "activeAnnotationsForTime", - value: function activeAnnotationsForTime(time) { - if (!this.annotations.length) return []; - return this.annotationTimeMap[time] || []; - } - - /* - Rebuild the annotation time map - Example: this._annotations[1] and this._annotations[3] are active during second 4 - this.annotationTimeMap = { 4: [1, 3] } - */ - - }, { - key: "rebuildAnnotationTimeMap", - value: function rebuildAnnotationTimeMap() { - var _this2 = this; - - var timeMap = {}; - this.annotations.forEach(function (annotation) { - annotation.secondsActive.forEach(function (second) { - var val = timeMap[second] || []; - val.push(_this2.annotations.indexOf(annotation)); - timeMap[second] = val; - }); - }); - this.annotationTimeMap = timeMap; - } - - // Close active annotation and remove reference in state - - }, { - key: "clearActive", - value: function clearActive() { - this.activeAnnotation.close(false); - this._activeAnnotation = null; - } - - // Open annotation with options to pause and show preview - // skipLiveCheck will short circuit setLiveAnnotation() - - }, { - key: "openAnnotation", - value: function openAnnotation(annotation) { - var skipLiveCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var pause = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - var previewOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - var forceSnapToStart = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - - if (!this.plugin.active) this.plugin.toggleAnnotationMode(); - this.skipLiveCheck = skipLiveCheck; - this.clearActive(); - annotation.open(pause, previewOnly, forceSnapToStart); - this.activeAnnotation = annotation; - this.lastVideoTime = this.activeAnnotation.range.start; - } - - // Open an annotation by ID (if it exists) - - }, { - key: "openAnnotationById", - value: function openAnnotationById(id) { - var annotation = this.findAnnotation(id); - if (annotation) this.openAnnotation(annotation); - } - - // Returns annotation object given ID - - }, { - key: "findAnnotation", - value: function findAnnotation(id) { - return this.annotations.find(function (a) { - return a.id == id; - }); - } - - // Returns comment object given ID - - }, { - key: "findComment", - value: function findComment(id) { - var _ref; - - var comments = this.annotations.map(function (a) { - return a.commentList.comments; - }); - comments = (_ref = []).concat.apply(_ref, _toConsumableArray(comments)); // flatten 2d array - return comments.find(function (c) { - return c.id == id; - }); - } - - // Finds the next annotation in collection and opens it - - }, { - key: "nextAnnotation", - value: function nextAnnotation() { - if (this._activeAnnotation) { - var ind = this.annotations.indexOf(this._activeAnnotation), - nextInd = ind === this.annotations.length - 1 ? 0 : ind + 1; - return this.openAnnotation(this.annotations[nextInd], true); - } - var time = Math.floor(this.currentTime); - for (var i = 0; i < this.annotations.length; i++) { - if (this.annotations[i].range.start > time) return this.openAnnotation(this.annotations[i], true); - } - this.openAnnotation(this.annotations[0], true); - } - - // Finds the previous annotation in collection and opens it - - }, { - key: "prevAnnotation", - value: function prevAnnotation() { - if (this._activeAnnotation) { - var ind = this.annotations.indexOf(this._activeAnnotation), - nextInd = ind === 0 ? this.annotations.length - 1 : ind - 1; - return this.openAnnotation(this.annotations[nextInd], true); - } - var time = Math.floor(this.currentTime); - for (var i = this.annotations.length - 1; i >= 0; i--) { - if (this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true); - } - this.openAnnotation(this.annotations[this.annotations.length - 1], true); - } - - // Use anywhere the annotation data changes - // Cleans internal state data, updates player button, triggers configurable callback - - }, { - key: "stateChanged", - value: function stateChanged() { - this.sortAnnotations(); - this.rebuildAnnotationTimeMap(); - this.plugin.fire('onStateChanged', this.data); - } - - // Reset internal state properties - - }, { - key: "resetData", - value: function resetData() { - this.annotations = []; - this.annotationTimeMap = {}; - this.activeAnnotation = null; - this.enabled = false; - this.skipNextTimeCheck = false; - this.lastVideoTime = 0; - } - - // Remove UI and unbind events for this and child components - - }, { - key: "teardown", - value: function teardown() { - this.annotations.forEach(function (annotation) { - annotation.teardown(false); - }); - this.resetData(); - _get(AnnotationState.prototype.__proto__ || Object.getPrototypeOf(AnnotationState.prototype), "teardown", this).call(this); - } - }, { - key: "enabled", - set: function set(shouldBeEnabled) { - this._enabled = shouldBeEnabled; - if (!shouldBeEnabled) this.activeAnnotation.close(); - if (shouldBeEnabled) { - this.skipLiveCheck = false; - this.setLiveAnnotation(); - } - }, - get: function get() { - return this._enabled; - } - - // Sets _annotations w/Annoation objects from input array - - }, { - key: "annotations", - set: function set(annotationsData) { - var _this3 = this; - - this._annotations = annotationsData.map(function (a) { - return new Annotation(a, _this3.player); - }); - this.sortAnnotations(); - this.rebuildAnnotationTimeMap(); - }, - get: function get() { - return this._annotations; - } - }, { - key: "activeAnnotation", - set: function set() { - var annotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - - this._activeAnnotation = annotation; - } - - // Get current active annotation or a null object with .close() - , - get: function get() { - return this._activeAnnotation || { close: function close() {} }; - } - - // Serialize data - - }, { - key: "data", - get: function get() { - return this._annotations.map(function (a) { - return a.data; - }); - } - }]); - - return AnnotationState; -}(PlayerComponent); - -},{"./../lib/player_component":38,"./../lib/utils":41,"./annotation":25}],27:[function(require,module,exports){ -"use strict"; -/* - Component for an invidual comment -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - moment = require("moment"), - templateName = 'comment'; - -module.exports = function (_PlayerUIComponent) { - _inherits(Comment, _PlayerUIComponent); - - function Comment(data, player) { - _classCallCheck(this, Comment); - - var _this = _possibleConstructorReturn(this, (Comment.__proto__ || Object.getPrototypeOf(Comment)).call(this, player)); - - _this.commentList = data.commentList; - _this.id = data.id || _this.componentId; - _this.meta = data.meta; - _this.body = data.body; - _this.timestamp = moment(data.meta.datetime).unix(); - _this.timeSince = _this.timeSince(); - - _this.$el = $(_this.render()); - return _this; - } - - // Serialize data - - - _createClass(Comment, [{ - key: "render", - value: function render() { - return this.renderTemplate(templateName, { - id: this.id, - body: this.body, - meta: this.meta, - timeSince: this.timeSince - }); - } - - // Return time since comment timestamp - - }, { - key: "timeSince", - value: function timeSince() { - return moment(this.meta.datetime).fromNow(); - } - }, { - key: "teardown", - value: function teardown() { - var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - _get(Comment.prototype.__proto__ || Object.getPrototypeOf(Comment.prototype), "teardown", this).call(this, destroy); - } - - // Return a Comment obj given body content and plugin reference - - }, { - key: "data", - get: function get() { - return { - id: this.id, - meta: this.meta, - body: this.body - }; - } - }, { - key: "HTML", - get: function get() { - return this.$el[0].outerHTML; - } - }], [{ - key: "newFromData", - value: function newFromData(body, commentList, plugin) { - var data = this.dataObj(body, plugin); - return new Comment(data, plugin.player); - } - - // Return an object with plugin data, timestamp, unique id, and body content - - }, { - key: "dataObj", - value: function dataObj(body, plugin) { - return { - meta: Object.assign({ - datetime: moment().toISOString() - }, plugin.meta), - id: Utils.guid(), - body: body - }; - } - }]); - - return Comment; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":39,"./../lib/utils":41,"moment":22}],28:[function(require,module,exports){ -"use strict"; -/* - Component for a list of comments in a visible/active annotation -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - Comment = require("./comment"), - commentListTemplateName = 'comment_list', - newCommentTemplateName = 'new_comment'; - -module.exports = function (_PlayerUIComponent) { - _inherits(CommentList, _PlayerUIComponent); - - function CommentList(data, player) { - _classCallCheck(this, CommentList); - - var _this = _possibleConstructorReturn(this, (CommentList.__proto__ || Object.getPrototypeOf(CommentList)).call(this, player)); - - _this.annotation = data.annotation; - _this.comments = data.comments.map(function (commentData) { - commentData.commentList = _this; - return new Comment(commentData, player); - }); - _this.sortComments(); - return _this; - } - - // Serialize object - - - _createClass(CommentList, [{ - key: "bindListEvents", - - - // Bind all events needed for the comment list - value: function bindListEvents() { - var _this2 = this; - - this.$el.on("click.vac-comment", ".vac-close-comment-list", function () { - return _this2.annotation.close(); - }.bind(this)) // Hide CommentList UI with close button - .on("click.vac-comment", ".vac-reply-btn", this.addNewComment.bind(this)) // Open new reply UI with reply button - .on("click.vac-comment", ".vac-delete-annotation", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button - .on("click.vac-comment", ".vac-delete-comment", this.destroyComment.bind(this)) // Delete comment with delete comment button - .on("mousewheel.vac-comment DOMMouseScroll.vac-comment", ".vac-comments-wrap", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI - } - - // Bind event listeners for new comments form - - }, { - key: "bindCommentFormEvents", - value: function bindCommentFormEvents() { - this.$newCommentForm.on("click.vac-comment", ".vac-add-controls a, .vac-video-write-new.vac-is-comment a", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link - .on("click.vac-comment", ".vac-video-write-new.vac-is-comment button", this.saveNewComment.bind(this)); // Save new comment with save button - } - - // Render CommentList UI with all comments using template - - }, { - key: "render", - value: function render() { - this.$el = $(this.renderTemplate(commentListTemplateName, { - commentsHTML: this.comments.map(function (c) { - return c.HTML; - }), - rangeStr: Utils.humanTime(this.annotation.range) - })); - - this.$player.append(this.$el); - this.$wrap = this.$UI.commentsContainer; - this.bindListEvents(); - } - - // Re-render UI on state change - - }, { - key: "reRender", - value: function reRender() { - this.teardown(false); - this.render(); - } - - // Render new comment form - - }, { - key: "addNewComment", - value: function addNewComment() { - this.$wrap.addClass(this.UI_CLASSES.active).find(".vac-comments-wrap").scrollTop(999999); - var $shapebox = this.$wrap.find(".vac-add-new-shapebox"), - width = $shapebox.outerWidth(), - top = $shapebox.position().top + 10, - right = this.$wrap.outerWidth() - ($shapebox.position().left + width); - - this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, { width: width, top: top, right: right })); - this.bindCommentFormEvents(); - this.$player.append(this.$newCommentForm); - } - - // Save comment from new comment form, update state and re-render UI - - }, { - key: "saveNewComment", - value: function saveNewComment() { - this.$wrap.removeClass(this.UI_CLASSES.active); - - var user_id = 1, - body = this.$UI.newCommentTextarea.val(); - - if (!body) return; // empty comment - TODO add validation / err message - this.createComment(body); - } - }, { - key: "createComment", - value: function createComment(body) { - var comment = Comment.newFromData(body, this, this.plugin); - this.comments.push(comment); - this.sortComments(); - - // Don't mutate UI if comment is being created for an inactive annotation (via API) - if (this.annotation.isActive) { - this.reRender(false); - this.closeNewComment(); - } - - this.plugin.annotationState.stateChanged(); - } - - // Cancel comment adding process - - }, { - key: "closeNewComment", - value: function closeNewComment() { - this.unbindCommentFormEvents(); - if (this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active); - if (this.$newCommentForm) this.$newCommentForm.remove(); - } - - // Delete a comment. If it is the only comment, delete the annotation - // Update state and re-render UI - - }, { - key: "destroyComment", - value: function destroyComment(event) { - var annotationId = this.annotation.id; - if (this.comments.length == 1) { - this.annotation.teardown(); - } else { - var commentId = this.findCommentId(event), - comment = this.comments.find(function (c) { - return c.id == commentId; - }), - i = this.comments.indexOf(comment); - this.comments.splice(i, 1); - this.reRender(); - } - - this.plugin.annotationState.stateChanged(); - } - }, { - key: "findCommentId", - value: function findCommentId(event) { - var id = typeof event.detail.id === 'undefined' ? $(event.target).closest('.vac-comment').data('id') : event.detail.id; - return id; - } - - // Prevents outer page scroll when at the top or bottom of CommentList UI - // TODO: This might need to be fine-tuned? - - }, { - key: "disablePageScroll", - value: function disablePageScroll(event) { - var $target = $(event.currentTarget), - height = $target.height(), - ogEvent = event.originalEvent, - delta = ogEvent.wheelDelta || -ogEvent.detail, - dir = delta < 0 ? "down" : "up", - scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight); - - // if scrolling into top of div - if ($target.scrollTop() < 20 && dir == "up") { - $target.stop(); - $target.animate({ scrollTop: 0 }, 100); - event.preventDefault(); - } - - // if scrolling into bottom of div - if ($target.scrollTop() > scrollDiff - 10 && dir == "down") { - $target.stop(); - $target.animate({ scrollTop: height + 40 }, 100); - event.preventDefault(); - } - } - - // Sort comments by timestamp - - }, { - key: "sortComments", - value: function sortComments() { - this.comments.sort(function (a, b) { - return a.timestamp < b.timestamp ? -1 : a.timestamp > b.timestamp ? 1 : 0; - }); - } - - // Delete the annotation - - }, { - key: "handleDeleteAnnotationClick", - value: function handleDeleteAnnotationClick(e) { - var _this3 = this; - - var $confirmEl = $("").addClass("vac-delete-confirm").text("CONFIRM"); - $confirmEl.on("click.comment", function () { - $confirmEl.off("click.comment"); - _this3.annotation.teardown(); - }); - $(e.target).replaceWith($confirmEl); - } - - // Unbind listeners for new comments form - - }, { - key: "unbindCommentFormEvents", - value: function unbindCommentFormEvents() { - if (this.$newCommentForm) this.$newCommentForm.off("click.vac-comment"); - } - - // Teardown CommentList UI, unbind events - - }, { - key: "teardown", - value: function teardown() { - var destroyComments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - if (this.$el) { - this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"); - } - this.comments.forEach(function (c) { - return c.teardown(destroyComments); - }); - if (destroyComments) this.comments = []; - _get(CommentList.prototype.__proto__ || Object.getPrototypeOf(CommentList.prototype), "teardown", this).call(this); - } - }, { - key: "data", - get: function get() { - return this.comments.map(function (c) { - return c.data; - }); - } - }]); - - return CommentList; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./comment":27}],29:[function(require,module,exports){ -"use strict"; -/* - Component for managing annotation "control box" in upper left of video when in annotation mode, - including all functionality to add new annotations -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - DraggableMarker = require("./draggable_marker.js"), - SelectableShape = require("./selectable_shape.js"), - PlayerButton = require("./player_button"), - Annotation = require("./annotation"), - templateName = 'controls'; - -// Control uses a "ui state" to determine how UI is rendered - this object is the base state, containing a -// default value for each item in the state -var BASE_UI_STATE = Object.freeze({ - adding: false, // Are we currently adding a new annotation? (step 1 of flow) - writingComment: false // Are we currently writing the comment for annotation (step 2 of flow) -}); - -module.exports = function (_PlayerUIComponent) { - _inherits(Controls, _PlayerUIComponent); - - function Controls(player, bindArrowKeys) { - _classCallCheck(this, Controls); - - var _this = _possibleConstructorReturn(this, (Controls.__proto__ || Object.getPrototypeOf(Controls)).call(this, player)); - - _this.initAPI(_this, 'Controls'); - - _this.internalCommenting = _this.plugin.options.internalCommenting; - _this.showControls = _this.plugin.options.showControls; - _this.uiState = Utils.cloneObject(BASE_UI_STATE); - _this.bindEvents(bindArrowKeys); - - if (_this.showControls) { - // create player button in the control bar if controls are shown - _this.playerButton = new PlayerButton(_this.player); - } - - _this.render(); - return _this; - } - - // Bind all the events we need for UI interaction - - - _createClass(Controls, [{ - key: "bindEvents", - value: function bindEvents(bindArrowKeys) { - var _this2 = this; - - this.$player.on("click.vac-controls", ".vac-controls button", this.startAddNew.bind(this)) // Add new button click - .on("click.vac-controls", ".vac-annotation-nav .vac-a-next", function () { - return _this2.plugin.annotationState.nextAnnotation(); - }) // Click 'next' on annotation nav - .on("click.vac-controls", ".vac-annotation-nav .vac-a-prev", function () { - return _this2.plugin.annotationState.prevAnnotation(); - }) // Click 'prev' on annotation nav - .on("click.vac-controls", ".vac-video-move .vac-a-next", function () { - return _this2.marker.scrubStart(1); - }) // Click '+1 sec' on marker nav - .on("click.vac-controls", ".vac-video-move .vac-a-prev", function () { - return _this2.marker.scrubStart(-1); - }); // Click '-1 sec' on marker nav - - if (this.internalCommenting) { - this.$player.on("click.vac-controls", ".vac-add-controls button", this.writeComment.bind(this)) // 'Next' button click while adding - .on("click.vac-controls", ".vac-video-write-new.vac-is-annotation button", this.saveNew.bind(this)) // 'Save' button click while adding - .on("click.vac-controls", ".vac-add-controls a, .vac-video-write-new.vac-is-annotation a", this.cancelAddNew.bind(this)); // Cancel link click - } - if (bindArrowKeys) { - $(document).on("keyup.vac-nav-" + this.playerId, function (e) { - return _this2.handleArrowKeys(e); - }); // Use arrow keys to navigate annotations - } - } - - // Remove UI and unbind events for this and child components - - }, { - key: "teardown", - value: function teardown() { - this.clear(true); - this.$player.off('click.vac-controls'); - $(document).off("keyup.vac-nav-" + this.playerId + " mousemove.vac-tooltip-" + this.playerId); - if (this.playerButton) this.playerButton.teardown(); - _get(Controls.prototype.__proto__ || Object.getPrototypeOf(Controls.prototype), "teardown", this).call(this); - } - - // Clear existing UI (resetting components if need be) - - }, { - key: "clear", - value: function clear() { - var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (reset) { - if (this.uiState.adding) { - this.restoreNormalUI(); - this.marker.teardown(); - this.selectableShape.teardown(); - } - this.uiState = Utils.cloneObject(BASE_UI_STATE); - this.$player.find('.vac-video-cover-canvas').off('mousedown.vac-cursor-tooltip').off('mouseup.vac-cursor-tooltip'); - } - this.$tooltip_ = null; - this.$UI.controlElements.remove(); - } - - // Render the UI elements (based on uiState) - - }, { - key: "render", - value: function render() { - var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - this.clear(reset); - var data = Object.assign({ - rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null, - showNav: this.plugin.annotationState.annotations.length > 1 - }, this.uiState, { internalCommenting: this.internalCommenting, showControls: this.showControls }); - - var $ctrls = this.renderTemplate(templateName, data); - this.$player.append($ctrls); - - if (this.playerButton) this.playerButton.updateNumAnnotations(); - } - - // User clicked to cancel in-progress add - restore to normal state - - }, { - key: "cancelAddNew", - value: function cancelAddNew() { - if (!(this.uiState.adding || this.uiState.writingComment)) return; - this.render(true); - this.marker.teardown(); - this.marker = null; - } - - // User clicked 'add' button in the controls - setup UI and marker - - }, { - key: "startAddNew", - value: function startAddNew() { - if (!this.plugin.active) this.plugin.toggleAnnotationMode(); - - this.player.pause(); - this.setAddingUI(); - this.uiState.adding = true; - this.render(); - - // construct new range and create marker - var range = { - start: parseInt(this.currentTime, 10), - stop: parseInt(this.currentTime, 10) - }; - this.marker = new DraggableMarker(this.player, range); - this.selectableShape = new SelectableShape(this.player); - - // show cursor help text if controls are hidden - if (!this.showControls) this.bindCursorTooltip(); - - this.plugin.fire('enteredAddingAnnotation', { range: range }); - } - - // User clicked 'next' action - show UI to write comment - - }, { - key: "writeComment", - value: function writeComment() { - this.uiState.writingComment = true; - this.render(); - } - - // User clicked to save a new annotation/comment during add new flow - - }, { - key: "saveNew", - value: function saveNew() { - var comment = this.$UI.newCommentTextarea.val(); - if (!comment) return; // empty comment - TODO add validation / err message - - var a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin); - this.plugin.annotationState.addNewAnnotation(a); - - this.cancelAddNew(); - } - - // Change normal UI (hide markers, hide playback, etc) on init add state - - }, { - key: "setAddingUI", - value: function setAddingUI() { - this.plugin.annotationState.enabled = false; - this.disablePlayingAndControl(); - } - - // Restore normal UI after add state - - }, { - key: "restoreNormalUI", - value: function restoreNormalUI() { - this.plugin.annotationState.enabled = this.plugin.active; - this.enablePlayingAndControl(); - $(document).off("mousemove.vac-tooltip-" + this.playerId); - } - - // On arrow key press, navigate to next or prev Annotation - - }, { - key: "handleArrowKeys", - value: function handleArrowKeys(e) { - if (!this.plugin.active) return; - var keyId = e.which; - - if (keyId == 37) this.plugin.annotationState.prevAnnotation(); - if (keyId == 39) this.plugin.annotationState.nextAnnotation(); - } - - // Adds help text to cursor during annotation mode - - }, { - key: "bindCursorTooltip", - value: function bindCursorTooltip() { - var _this3 = this; - - this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden); - - // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct - this.plugin.setBounds(false); - $(document).on("mousemove.vac-tooltip-" + this.playerId, Utils.throttle(function (event) { - if (!_this3.plugin.bounds) return; - - var x = event.pageX, - y = event.pageY, - outOfBounds = x < _this3.plugin.bounds.left || x > _this3.plugin.bounds.right || y < _this3.plugin.bounds.top || y > _this3.plugin.bounds.bottom, - withinControls = !outOfBounds && y >= _this3.plugin.bounds.bottomWithoutControls, - markerHovered = _this3.$tooltip.hasClass('vac-marker-hover'); - - if (outOfBounds) { - _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); - return; - } - - var cursorX = x - _this3.plugin.bounds.left, - cursorY = y - _this3.plugin.bounds.top, - margin = 10, - rightEdge = _this3.$player.width(), - bottomEdge = _this3.$player.height() - _this3.$UI.controlBar.height(), - atRightEdge = cursorX + _this3.tooltipArea.width + margin * 2 >= rightEdge, - atBottomEdge = cursorY + _this3.tooltipArea.height + margin * 2 >= bottomEdge; - - // is the tooltip too close to the right or bottom edge? - var posX = atRightEdge ? rightEdge - _this3.tooltipArea.width - margin : cursorX + margin, - posY = atBottomEdge ? bottomEdge - _this3.tooltipArea.height - margin : cursorY + margin; - - // hide if the cursor is over the control bar but not hovering over the draggable marker - // also hide if mouse is down - if (withinControls && !markerHovered || _this3.$tooltip.hasClass('vac-cursor-dragging')) { - _this3.$tooltip.addClass(_this3.UI_CLASSES.hidden); - } else { - _this3.$tooltip.removeClass(_this3.UI_CLASSES.hidden); - } - - _this3.$tooltip.css({ - left: posX + "px", - top: posY + "px" - }); - }.bind(this), 50)); - } - }, { - key: "$tooltip", - get: function get() { - this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip'); - return this.$tooltip_; - } - }]); - - return Controls; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(require,module,exports){ -"use strict"; -/* - Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range - as drag occurs -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Marker = require("./marker"), - Utils = require('./../lib/utils'), - markerTemplateName = 'draggable_marker'; - -module.exports = function (_Marker) { - _inherits(DraggableMarker, _Marker); - - function DraggableMarker(player, range) { - _classCallCheck(this, DraggableMarker); - - var _this = _possibleConstructorReturn(this, (DraggableMarker.__proto__ || Object.getPrototypeOf(DraggableMarker)).call(this, player, range)); - - _this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10 - _this.templateName = markerTemplateName; // Change template from base Marker template - _this.dragging = false; // Is a drag action currently occring? - _this.rangePin = range.start; // What's the original pinned timeline point when marker was added - _this.render(); - _this.$parent = _this.$UI.markerWrap; // Set parent as marker wrap - return _this; - } - - // Bind needed evnets for UI interaction - - - _createClass(DraggableMarker, [{ - key: "bindMarkerEvents", - value: function bindMarkerEvents() { - var _this2 = this; - - // On mouse down init drag - this.$el.on('mousedown.vac-marker', function (e) { - e.preventDefault(); - _this2.dragging = true; - // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms - $(document).on("mousemove.vac-dmarker-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 250)); - - // Add drag class to cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging').removeClass('vac-marker-hover'); - } - }); - - // On mouse up end drag action and unbind mousemove event - $(document).on("mouseup.vac-dmarker-" + this.playerId, function (e) { - if (!_this2.dragging) return; - $(document).off("mousemove.vac-dmarker-" + _this2.playerId); - _this2.dragging = false; - - // Remove drag class and hover class from cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging').removeClass('vac-marker-hover'); - } - }); - - // On mouse mouse enter, show cursor tooltip if controls are not shown - // This adds the class which is picked up in Controls - if (!this.plugin.options.showControls) { - var self = this; - self.$el.on('mouseenter.vac-cursor-tool-tip', function () { - self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover'); - }).on('mouseleave.vac-cursor-tool-tip', function () { - self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover'); - }); - }; - } - - // On drag action, calculate new range and re-render marker - - }, { - key: "onDrag", - value: function onDrag(e) { - var dragPercent = this.percentValFromXpos(e.pageX), - secVal = parseInt(this.duration * dragPercent); - - if (secVal > this.rangePin) { - this.range = { - start: this.rangePin, - end: secVal - }; - } else { - this.range = { - start: secVal, - end: this.rangePin - }; - } - this.render(); - this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); - } - - // Cal percentage (of video) position for a pixel-based X position on the document - - }, { - key: "percentValFromXpos", - value: function percentValFromXpos(xpos) { - var x = Math.max(0, xpos - this.$parent.offset().left), - // px val - max = this.$parent.innerWidth(), - per = x / max; - if (per > 1) per = 1; - if (per < 0) per = 0; - return per; - } - - // Remove bound events on destructon - - }, { - key: "teardown", - value: function teardown() { - $(document).off("mousemove.vac-dmarker-" + this.playerId + " mouseup.vac-dmarker-" + this.playerId); - this.$el.off('mouseenter.vac-cursor-tool-tip'); - this.$el.off('mouseleave.vac-cursor-tool-tip'); - this.$el.off('mousedown.vac-marker'); - this.$el.remove(); - } - - // Move the video & marker start by some num seconds (pos or neg) - - }, { - key: "scrubStart", - value: function scrubStart(secondsChanged) { - var newStart = this.range.start + secondsChanged; - this.currentTime = newStart; - this.range.start = newStart; - this.rangePin = newStart; - this.teardown(); - this.render(); - - this.plugin.fire('addingAnnotationDataChanged', { range: this.range }); - } - }]); - - return DraggableMarker; -}(Marker); - -},{"./../lib/utils":41,"./marker":31}],31:[function(require,module,exports){ -"use strict"; -/* - Component for a timeline marker with capabilities to render on timeline, including tooltip for comment -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - Utils = require("./../lib/utils"), - markerTemplateName = 'marker', - markerWrapTemplateName = 'marker_wrap'; - -module.exports = function (_PlayerUIComponent) { - _inherits(Marker, _PlayerUIComponent); - - function Marker(player, range) { - var comment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; - - _classCallCheck(this, Marker); - - var _this = _possibleConstructorReturn(this, (Marker.__proto__ || Object.getPrototypeOf(Marker)).call(this, player)); - - _this.range = range; - _this.comment = comment; - _this.templateName = markerTemplateName; - - if (!_this.$UI.markerWrap.length) { - _this.$UI.timeline.append(_this.renderTemplate(markerWrapTemplateName)); - } - return _this; - } - - // Set this marker as active (highlight) and optionally show tooltip also - - - _createClass(Marker, [{ - key: "setActive", - value: function setActive() { - var showTooltip = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - this.$el.addClass(this.UI_CLASSES.active); - if (showTooltip) this.$el.addClass('vac-force-tooltip'); - } - - // Deactivate this marker - - }, { - key: "deactivate", - value: function deactivate() { - this.$el.removeClass(this.UI_CLASSES.active + " vac-force-tooltip"); - } - - // Draw marker on timeline for this.range; - - }, { - key: "render", - value: function render() { - // clear existing marker if this one was already rendered - this.$UI.timeline.find("[data-marker-id=\"" + this.componentId + "\"]").remove(); - - // Bind to local instance var, add to DOM, and setup events - this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData)); - this.$UI.markerWrap.append(this.$el); - this.bindMarkerEvents(); - } - - // Bind needed events for this marker - - }, { - key: "bindMarkerEvents", - value: function bindMarkerEvents() { - var _this2 = this; - - // handle dimming other markers + highlighting this one on mouseenter/leave - this.$el.on("mouseenter.vac-marker", function () { - _this2.$el.addClass('vac-hovering').closest(".vac-marker-wrap").addClass('vac-dim-all'); - }).on("mouseleave.vac-marker", function () { - _this2.$el.removeClass('vac-hovering').closest(".vac-marker-wrap").removeClass('vac-dim-all'); - }); - } - - // Build object for template - - }, { - key: "teardown", - - - // Unbind event listeners on teardown and remove DOM nodes - value: function teardown() { - this.$el.off('mouseenter.vac-marker').off('mouseleave.vac-marker').off('click.vac-marker'); - _get(Marker.prototype.__proto__ || Object.getPrototypeOf(Marker.prototype), "teardown", this).call(this); - } - }, { - key: "markerTemplateData", - get: function get() { - // the smaller the width, the higher the z-index so overlaps are clickable - var left = this.range.start / this.duration * 100, - width = this.range.end / this.duration * 100 - left, - zIndex = 100 - Math.floor(width) || 100; - return { - left: left + '%', - width: width + '%', - zIndex: zIndex, - showTooltip: this.plugin.options.showMarkerShapeAndTooltips, - tooltipRight: left > 50, - tooltipTime: Utils.humanTime(this.range), - tooltipBody: !this.comment ? null : this.comment.body, - rangeShow: !!this.range.end, - id: this.componentId - }; - } - }]); - - return Marker; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":39,"./../lib/utils":41}],32:[function(require,module,exports){ -"use strict"; -/* - Component main 'annotation toggle' button in the player controls, including notifier for # annotations -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"), - templateName = "player_button"; - -module.exports = function (_PlayerUIComponent) { - _inherits(PlayerButton, _PlayerUIComponent); - - function PlayerButton(player) { - _classCallCheck(this, PlayerButton); - - var _this = _possibleConstructorReturn(this, (PlayerButton.__proto__ || Object.getPrototypeOf(PlayerButton)).call(this, player)); - - _this.render(); - - _this.initAPI(_this, 'PlayerButton'); - - _this.$el.on('click.vac-player-button', function () { - _this.plugin.toggleAnnotationMode(); - }); - return _this; - } - - // Add button to player - - - _createClass(PlayerButton, [{ - key: "render", - value: function render() { - var btn = this.player.getChild('controlBar').addChild('button', {}); - btn.controlText("Toggle Animations"); - this.$el = $(btn.el()); - this.$el.addClass('vac-player-btn').find(".vjs-icon-placeholder").html(this.renderTemplate(templateName)); - } - - // Update the number of annotations displayed in the bubble - - }, { - key: "updateNumAnnotations", - value: function updateNumAnnotations() { - var num = this.plugin.annotationState.annotations.length, - $bubble = this.$el.find("b"); - $bubble.text(num); - num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden); - } - - // Unbind event listeners on teardown and remove DOM nodes - - }, { - key: "teardown", - value: function teardown() { - this.$el.off('click.vac-player-button'); - _get(PlayerButton.prototype.__proto__ || Object.getPrototypeOf(PlayerButton.prototype), "teardown", this).call(this); - } - }]); - - return PlayerButton; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":39}],33:[function(require,module,exports){ -"use strict"; -/* - Component for a shape that can be drug/sized on top of the video while adding a new annotation -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Shape = require("./shape"), - Utils = require('./../lib/utils'); - -module.exports = function (_Shape) { - _inherits(SelectableShape, _Shape); - - function SelectableShape(player) { - _classCallCheck(this, SelectableShape); - - var _this = _possibleConstructorReturn(this, (SelectableShape.__proto__ || Object.getPrototypeOf(SelectableShape)).call(this, player)); - - _this.$parent = _this.$player.find(".vac-video-cover-canvas"); - _this.bindEvents(); - _this.dragging = false; - return _this; - } - - // Bind all needed events for drag action - - - _createClass(SelectableShape, [{ - key: "bindEvents", - value: function bindEvents() { - var _this2 = this; - - // On mousedown initialize drag - this.$parent.on("mousedown.vac-selectable-shape", function (e) { - // Check a few conditions to see if we should *not* start drag - if (!$(e.target).hasClass('vac-video-cover-canvas')) return; //didn't click on overlay - if ($(e.target).hasClass('vac-shape')) return; //user clicked on annotation - - // Remove old shape if one existed - if (_this2.$el) _this2.$el.remove(); - - // Define default starting shape (just x/y coords of where user clicked no width/height yet) - var shape = { - x1: _this2.xCoordToPercent(e.pageX), - y1: _this2.YCoordToPercent(e.pageY) - }; - shape.x2 = shape.x1; - shape.y2 = shape.y2; - _this2.shape = shape; - - // Save origin points for future use - _this2.originX = shape.x1; - _this2.originY = shape.y1; - - // Draw shape and start drag state - _this2.render(); - _this2.dragging = true; - _this2.dragMoved = false; // used to determine if user actually dragged or just clicked - - // Bind event on doc mousemove to track drag, throttled to once each 100ms - $(document).on("mousemove.vac-sshape-" + _this2.playerId, Utils.throttle(_this2.onDrag.bind(_this2), 100)); - - // Add drag class to cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging'); - } - }); - - // On mouseup, if during drag cancel drag event listeners - $(document).on("mouseup.vac-sshape-" + this.playerId, function (e) { - if (!_this2.dragging) return; - - $(document).off("mousemove.vac-sshape-" + _this2.playerId); - - if (!_this2.dragMoved) { - //clear shape if it's just a click (and not a drag) - _this2.shape = null; - if (_this2.$el) _this2.$el.remove(); - } - - _this2.dragging = false; - - // Remove drag class from cursor tooltip if available - if (!_this2.plugin.options.showControls) { - _this2.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging'); - } - }); - } - - // On each interation of drag action (mouse movement), recalc position and redraw shape - - }, { - key: "onDrag", - value: function onDrag(e) { - this.dragMoved = true; - - var xPer = this.xCoordToPercent(e.pageX), - yPer = this.YCoordToPercent(e.pageY); - - if (xPer < this.originX) { - this.shape.x2 = this.originX; - this.shape.x1 = Math.max(0, xPer); - } else { - this.shape.x2 = Math.min(100, xPer); - this.shape.x1 = this.originX; - } - if (yPer < this.originY) { - this.shape.y2 = this.originY; - this.shape.y1 = Math.max(0, yPer); - } else { - this.shape.y2 = Math.min(100, yPer); - this.shape.y1 = this.originY; - } - this.setDimsFromShape(); - - this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape }); - } - - // Convert pixel-based x position (relative to document) to percentage in video - - }, { - key: "xCoordToPercent", - value: function xCoordToPercent(x) { - x = x - this.$parent.offset().left; //pixel position - var max = this.$parent.innerWidth(); - return Number((x / max * 100).toFixed(2)); //round to 2 decimal places - } - - // Convert pixel-based y position (relative to document) to percentage in video - - }, { - key: "YCoordToPercent", - value: function YCoordToPercent(y) { - y = y - this.$parent.offset().top; //pixel position - var max = this.$parent.innerHeight(); - return Number((y / max * 100).toFixed(2)); //round to 2 decimal places - } - - // Unbind events and remove element - - }, { - key: "teardown", - value: function teardown() { - this.$parent.off('mousedown.vac-selectable-shape'); - $(document).off("mouseup.vac-sshape-" + this.playerId + " mousemove.vac-sshape-" + this.playerId); - _get(SelectableShape.prototype.__proto__ || Object.getPrototypeOf(SelectableShape.prototype), "teardown", this).call(this); - } - }]); - - return SelectableShape; -}(Shape); - -},{"./../lib/utils":41,"./shape":34}],34:[function(require,module,exports){ -"use strict"; -/* - Component for managing a shape (i.e. box drawn on the player) for an annotation -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerUIComponent = require("./../lib/player_ui_component"); - -module.exports = function (_PlayerUIComponent) { - _inherits(Shape, _PlayerUIComponent); - - function Shape(player) { - var shape = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - _classCallCheck(this, Shape); - - var _this = _possibleConstructorReturn(this, (Shape.__proto__ || Object.getPrototypeOf(Shape)).call(this, player)); - - _this.shape = shape; - _this.$parent = _this.$player; - return _this; - } - - // Draw the shape element on the $parent - - - _createClass(Shape, [{ - key: "render", - value: function render() { - if (!this.shape) return; - if (this.$el) this.$el.remove(); - - this.$el = $("
").addClass("vac-shape"); - this.setDimsFromShape(); - this.$parent.append(this.$el); - } - - // Set/update the dimensions of the shape based on this.shape - - }, { - key: "setDimsFromShape", - value: function setDimsFromShape() { - this.$el.css({ - left: this.shape.x1 + "%", - top: this.shape.y1 + "%", - width: this.shape.x2 - this.shape.x1 + "%", - height: this.shape.y2 - this.shape.y1 + "%" - }); - } - }]); - - return Shape; -}(PlayerUIComponent); - -},{"./../lib/player_ui_component":39}],35:[function(require,module,exports){ -"use strict"; -/* - Load plugin and register to global videojs -*/ - -(function ($, videojs) { - var AnnotationComments = require('./annotation_comments.js'); - videojs.registerPlugin('annotationComments', AnnotationComments(videojs)); -})(jQuery, window.videojs); - -},{"./annotation_comments.js":23}],36:[function(require,module,exports){ -'use strict'; -/* - Classes for registering and handling custom events for external interaction support. - Will be bound to plugin object as a message gateway between external elements and the plugin. -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Logger = require("./logger"); - -/* - A centralized collection of event callbacks organized by component and name - Main reference for external event api - These events will be bound to the plugin on initialization of their respective components - NOTE - 'self' as second param in each function is a workaround for transpiler not properly - keeping this , so we pass in instance to use as this for each fn - can't rely on bind - because this is rewritten from symbol registry in transpiler and it's not present -*/ - -var EventRegistry = { - AnnotationState: { - openAnnotation: function openAnnotation(event, _this) { - _this.openAnnotationById(event.detail.id); - }, - closeActiveAnnotation: function closeActiveAnnotation(event, _this) { - _this.clearActive(); - }, - newAnnotation: function newAnnotation(event, _this) { - _this.createAndAddAnnotation(event.detail); - }, - destroyAnnotation: function destroyAnnotation(event, _this) { - _this.destroyAnnotationById(event.detail.id); - }, - newComment: function newComment(event, _this) { - var annotation = _this.findAnnotation(event.detail.annotationId); - if (annotation) annotation.commentList.createComment(event.detail.body); - }, - destroyComment: function destroyComment(event, _this) { - var comment = _this.findComment(event.detail.id); - if (comment) comment.commentList.destroyComment(event); - } - }, - Controls: { - addingAnnotation: function addingAnnotation(event, _this) { - _this.startAddNew(); - }, - cancelAddingAnnotation: function cancelAddingAnnotation(event, _this) { - _this.cancelAddNew(); - } - }, - PlayerButton: { - onStateChanged: function onStateChanged(event, _this) { - _this.updateNumAnnotations(); - } - }, - AnnotationComments: { - toggleAnnotationMode: function toggleAnnotationMode(event, _this) { - _this.toggleAnnotationMode(); - } - } -}; - -module.exports = function () { - function EventDispatcher(plugin) { - _classCallCheck(this, EventDispatcher); - - this.plugin = plugin; - this.pluginReady = false; - this.pendingEvts = []; - this.registeredListeners = []; - this.eventRegistry = EventRegistry; - } - - // Use the EventRegistry to mass register events on each component initialization - - - _createClass(EventDispatcher, [{ - key: "registerListenersFor", - value: function registerListenersFor(obj, className) { - var _this2 = this; - - var matchingEvents = this.eventRegistry[className]; - if (matchingEvents) { - Object.keys(matchingEvents).forEach(function (key) { - // Don't register again if already in cached collection - if (!~_this2.registeredListeners.indexOf(key)) { - var callback = matchingEvents[key].bind(obj); - _this2.registerListener(key, function (evt) { - if (!_this2.pluginReady) return; - _this2.logCallback(key, className, evt); - callback(evt, obj); - }.bind(_this2)); - } - }); - } - } - - // Bind a listener to the plugin - - }, { - key: "registerListener", - value: function registerListener(type, callback) { - this.plugin.on(type, callback); - this.registeredListeners.push(type); - } - - // Unbind a listener from the plugin - - }, { - key: "unregisterListener", - value: function unregisterListener(type) { - this.plugin.off(type); - var i = this.registeredListeners.indexOf(type); - this.registeredListeners.splice(i, 1); - } - - // Trigger an event on the plugin - - }, { - key: "fire", - value: function fire(type, data) { - if (!this.pluginReady) return; - Logger.log("evt-dispatch-FIRE", type, data); - var evt = new CustomEvent(type, { 'detail': data }); - this.plugin.trigger(evt); - } - }, { - key: "teardown", - value: function teardown() { - var _this3 = this; - - this.registeredListeners.forEach(function (type) { - _this3.unregisterListener(type); - }); - } - }, { - key: "logCallback", - value: function logCallback(eventName, className, event) { - Logger.log("evt-dispatch-RECEIVE", eventName + " (" + className + ")", event); - } - }]); - - return EventDispatcher; -}(); - -},{"./logger":37}],37:[function(require,module,exports){ -'use strict'; -/* - General logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging -*/ - -// Prefix for appending to all logger messages - -var LOG_PREFIX = "::VAC::"; - -// Are we in debug mode? -function debug() { - return !!window.VAC_DEBUG; -} - -// Build arguments for console fn, adding prefix -function buildArgs(args) { - return [LOG_PREFIX].concat(args); -} - -// Log message/data -module.exports.log = function () { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - if (!debug()) return; - console.log.apply(null, buildArgs(args)); -}; - -// Error message/data -module.exports.error = function () { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - if (!debug()) return; - console.error.apply(null, buildArgs(args)); -}; - -// Info message/data -module.exports.info = function () { - for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - if (!debug()) return; - console.info.apply(null, buildArgs(args)); -}; - -},{}],38:[function(require,module,exports){ -"use strict"; -/* - Base class all player components interit from - it includes lots of helper functions (to get reference to - the player, the plugin, video state, etc) -*/ - -var _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; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -module.exports = function () { - function PlayerComponent(player) { - _classCallCheck(this, PlayerComponent); - - this._player = player; - } - - // attribute to get reference to the main plugin object (main.js instance) - - - _createClass(PlayerComponent, [{ - key: "initAPI", - - - // Register all events in the EventRegistry matching this className - value: function initAPI(obj, className) { - this.plugin.eventDispatcher.registerListenersFor(obj, className); - } - - // Nullify player reference so objects can be removed safely - // All components should call super.teardown() within their teardown funcs - - }, { - key: "teardown", - value: function teardown() { - var destroy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (destroy) this._player = null; - } - }, { - key: "plugin", - get: function get() { - return this.player.annotationComments(); - } - - // attribute to get player javascript instance - - }, { - key: "player", - get: function get() { - return this._player; - } - - // attribute to get video duration (in seconds) - - }, { - key: "duration", - get: function get() { - return this.player.duration(); - } - - // attribute to get player current time - - }, { - key: "currentTime", - get: function get() { - return this.player.currentTime(); - } - - // set current time of player - , - set: function set(time) { - this.player.currentTime(time); - } - }]); - - return PlayerComponent; -}(); - -},{}],39:[function(require,module,exports){ -"use strict"; -/* - Base class all player UI components interit from - it includes lots of helper functions (to get reference to - the player $el, various classes/helpers, template rendering, etc) -*/ - -var _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; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var PlayerComponent = require("./player_component"), - Handlebars = require('handlebars/runtime'), - Templates = require('./../compiled/templates'), - Utils = require('./../lib/utils'); - -module.exports = function (_PlayerComponent) { - _inherits(PlayerUIComponent, _PlayerComponent); - - function PlayerUIComponent(player) { - _classCallCheck(this, PlayerUIComponent); - - return _possibleConstructorReturn(this, (PlayerUIComponent.__proto__ || Object.getPrototypeOf(PlayerUIComponent)).call(this, player)); - } - - // helpers to get various UI components of the player quickly, keeping commonly reused class names - // consolidated in case of need to change in the future (and for quick access) - - - _createClass(PlayerUIComponent, [{ - key: "disablePlayingAndControl", - - - // Disable play/control actions on the current player - value: function disablePlayingAndControl() { - this.$player.addClass('vac-disable-play'); - //TODO - catch spacebar being hit - //TODO - prevent scrubbing and timeline click to seek - } - - // Enable play/control actions on the controller - - }, { - key: "enablePlayingAndControl", - value: function enablePlayingAndControl() { - this.$player.removeClass('vac-disable-play'); - } - - // Render a handlebars template with local data passed in via key/val in object - - }, { - key: "renderTemplate", - value: function renderTemplate(templateName) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - this.registerHandlebarsHelpers(); - return Templates[templateName](options); - } - - // Handle escaped breaklines in Handlebars - - }, { - key: "registerHandlebarsHelpers", - value: function registerHandlebarsHelpers() { - if ('breaklines' in Handlebars.helpers) return; - - Handlebars.registerHelper('breaklines', function (text) { - text = Handlebars.Utils.escapeExpression(text); - text = text.replace(/(\r\n|\n|\r)/gm, '
'); - return new Handlebars.SafeString(text); - }); - } - - // Provide basic teardown function to inherit - - }, { - key: "teardown", - value: function teardown() { - if (this.$el) this.$el.remove(); - _get(PlayerUIComponent.prototype.__proto__ || Object.getPrototypeOf(PlayerUIComponent.prototype), "teardown", this).call(this); - } - }, { - key: "$UI", - get: function get() { - return Object.freeze({ - commentsContainer: this.$player.find(".vac-comments-container"), // outer container for all comments - controlElements: this.$player.find(".vac-control"), // Each of multiple control elements in the control bar - newCommentTextarea: this.$player.find(".vac-video-write-new textarea"), // Textarea for writing a new comment - timeline: this.$player.find('.vjs-progress-control'), // Timeline element - markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline - controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs - markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline - coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state - }); - } - - // utility classes used in various components - - }, { - key: "UI_CLASSES", - get: function get() { - return Object.freeze({ - hidden: "vac-hidden", - active: "vac-active" - }); - } - - // attribute to get player jquery element - - }, { - key: "$player", - get: function get() { - return $(this.player.el()); - } - - // attribute to get player id from DOM - - }, { - key: "playerId", - get: function get() { - return this.$player.attr('id'); - } - - // Generate a pseudo-guid ID for this component, to use as an ID in the DOM - - }, { - key: "componentId", - get: function get() { - this.cid_ = this.cid_ || Utils.guid(); - return this.cid_; - } - }]); - - return PlayerUIComponent; -}(PlayerComponent); - -},{"./../compiled/templates":24,"./../lib/utils":41,"./player_component":38,"handlebars/runtime":20}],40:[function(require,module,exports){ -/* - Collection of polyfills neededf or IE10+ support -*/ - -// Array.prototype.find() for IE10+ -require('ie-array-find-polyfill'); -// Object.assign for IE10+ -require('es6-object-assign').polyfill(); - -// Allow use of object.constructor.staticFunc() in IE -// Not yet supported by babel -// https://gist.github.com/edoardocavazza/47246856759f2273e48b -(function () { - if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') { - var bindFunction = function bindFunction(ctx, fn) { - return function () { - return fn.apply(this, arguments); - }; - }; - - var bindProperty = function bindProperty(ctx, prop, parentDescriptor) { - if (!parentDescriptor) { - var defaultValue = ctx.__proto__[prop]; - parentDescriptor = { - get: function get() { - return ctx['__' + prop] || defaultValue; - }, - set: function set(val) { - ctx['__' + prop] = val; - } - }; - } - Object.defineProperty(ctx, prop, { - get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined, - set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined, - configurable: true - }); - }; - - var iterateProps = function iterateProps(subClass, superClass) { - var props = Object.getOwnPropertyNames(superClass), - proto; - - subClass.__proto__ = superClass; - for (var i = 0, len = props.length; i < len; i++) { - var prop = props[i]; - if (prop === '__proto__') { - proto = superClass[prop]; - } else if (_exclude.indexOf(i) === -1) { - var descriptor = Object.getOwnPropertyDescriptor(subClass, prop); - if (!descriptor) { - var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop); - if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') { - subClass[prop] = bindFunction(subClass, superClass[prop]); - } else if (typeof superDescriptor.get == 'function') { - bindProperty(subClass, prop, superDescriptor); - } else { - bindProperty(subClass, prop); - } - } - } - } - if (proto) { - iterateProps(subClass, proto); - } - }; - - var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype']; - - Object.setPrototypeOf = iterateProps; - } -})(); - -// Use CustomEvent in IE -(function () { - if (typeof window.CustomEvent === "function") return false; - - function CustomEvent(event, params) { - params = params || { bubbles: false, cancelable: false, detail: undefined }; - var evt = document.createEvent('CustomEvent'); - evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); - return evt; - } - - CustomEvent.prototype = window.Event.prototype; - - window.CustomEvent = CustomEvent; -})(); - -},{"es6-object-assign":1,"ie-array-find-polyfill":21}],41:[function(require,module,exports){ -"use strict"; -/* - Geneal utility functions, sourced from underscore & scratch built as needed -*/ - -module.exports = { - - // Clone an object - cloneObject: function cloneObject(obj) { - return Object.assign({}, obj); - }, - - // _throttle from underscore - throttle: function throttle(func, wait, options) { - var context, args, result; - var timeout = null; - var previous = 0; - if (!options) options = {}; - var later = function later() { - previous = options.leading === false ? 0 : Date.now(); - timeout = null; - result = func.apply(context, args); - if (!timeout) context = args = null; - }; - return function () { - var now = Date.now(); - if (!previous && options.leading === false) previous = now; - var remaining = wait - (now - previous); - context = this; - args = arguments; - if (remaining <= 0 || remaining > wait) { - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - previous = now; - result = func.apply(context, args); - if (!timeout) context = args = null; - } else if (!timeout && options.trailing !== false) { - timeout = setTimeout(later, remaining); - } - return result; - }; - }, - - // Parse all keys of an object to int - parseIntObj: function parseIntObj(obj) { - Object.keys(obj).forEach(function (key) { - if (parseInt(obj[key])) { - obj[key] = parseInt(obj[key]); - } - }); - return obj; - }, - - // Convert a range {start: int, (optional) end: int} to human readable time - humanTime: function humanTime(range) { - function readable(sec) { - var mins = Math.floor(sec / 60), - secs = String(sec % 60); - return mins + ":" + (secs.length == 1 ? "0" : "") + secs; - } - var time = [readable(range.start)]; - if (range.end) time.push(readable(range.end)); - return time.join("-"); - }, - - // Pseduo-random guid generator - guid: function guid() { - function s4() { - return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); - }, - - // Returns the height and width of an element that is not visible - // clones el and tricks DOM into rendering it w the correct size - // beware the container may be important for scoped styles - areaOfHiddenEl: function areaOfHiddenEl($el, $container) { - var hideClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - - var $clone = $el.clone(), - data = {}; - $clone.css({ - visibility: 'hidden', - display: 'inline-block' - }); - $clone.removeClass(hideClass); - $container.append($clone); - data.width = $clone.outerWidth(); - data.height = $clone.outerHeight(); - $clone.remove(); - - return data; - }, - - // Determine if a value (n) is within a range (start <= n <= end) - isWithinRange: function isWithinRange(start, end, n) { - end = end || start + 1; // for ranges with NO end defined, assume a 1s range - return n >= start && n <= end; - } -}; - -},{}]},{},[35]) - -//# sourceMappingURL=videojs-annotation-comments.js.map diff --git a/build/videojs-annotation-comments.js.map b/build/videojs-annotation-comments.js.map deleted file mode 100644 index 042fb7d..0000000 --- a/build/videojs-annotation-comments.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/es6-object-assign/index.js","node_modules/handlebars/lib/handlebars.runtime.js","node_modules/handlebars/lib/handlebars/base.js","node_modules/handlebars/lib/handlebars/decorators.js","node_modules/handlebars/lib/handlebars/decorators/inline.js","node_modules/handlebars/lib/handlebars/exception.js","node_modules/handlebars/lib/handlebars/helpers.js","node_modules/handlebars/lib/handlebars/helpers/block-helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/each.js","node_modules/handlebars/lib/handlebars/helpers/helper-missing.js","node_modules/handlebars/lib/handlebars/helpers/if.js","node_modules/handlebars/lib/handlebars/helpers/log.js","node_modules/handlebars/lib/handlebars/helpers/lookup.js","node_modules/handlebars/lib/handlebars/helpers/with.js","node_modules/handlebars/lib/handlebars/logger.js","node_modules/handlebars/dist/cjs/handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js","node_modules/handlebars/lib/handlebars/runtime.js","node_modules/handlebars/lib/handlebars/safe-string.js","node_modules/handlebars/lib/handlebars/utils.js","node_modules/handlebars/runtime.js","node_modules/ie-array-find-polyfill/index.js","node_modules/moment/moment.js","src/js/annotation_comments.js","src/js/compiled/templates.js","src/js/components/annotation.js","src/js/components/annotation_state.js","src/js/components/comment.js","src/js/components/comment_list.js","src/js/components/controls.js","src/js/components/draggable_marker.js","src/js/components/marker.js","src/js/components/player_button.js","src/js/components/selectable_shape.js","src/js/components/shape.js","src/js/index.js","src/js/lib/event_dispatcher.js","src/js/lib/logger.js","src/js/lib/player_component.js","src/js/lib/player_ui_component.js","src/js/lib/polyfills.js","src/js/lib/utils.js"],"names":[],"mappings":"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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC15IA;AACA;;;;;;;;;;;;;;;AAKA,OAAO,OAAP,GAAiB,UAAC,OAAD,EAAa;AAC1B,YAAQ,iBAAR;;AAEA,QAAM,SAAS,QAAQ,SAAR,CAAkB,QAAlB,CAAf;AAAA,QACM,QAAQ,QAAQ,aAAR,CADd;AAAA,QAEM,WAAW,QAAQ,uBAAR,CAFjB;AAAA,QAGM,kBAAkB,QAAQ,+BAAR,CAHxB;AAAA,QAIM,kBAAkB,QAAQ,wBAAR,CAJxB;;AAMA,QAAM,kBAAkB,OAAO,MAAP,CAAc;AAClC,uBAA4B,IADM;AAElC,cAA4B,EAAE,SAAS,IAAX,EAAiB,WAAW,IAA5B,EAFM;AAGlC,4BAA4B,EAHM;AAIlC,sBAA4B,IAJM;AAKlC,yBAA4B,IALM;AAMlC,wBAA4B,IANM;AAOlC,oCAA4B,IAPM;AAQlC,4BAA4B,IARM;AASlC,+BAA4B;AATM,KAAd,CAAxB;;AAYA;AAAA;;AAEI,oCAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC1B,sBAAU,OAAO,MAAP,CAAc,MAAM,WAAN,CAA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","file":"videojs-annotation-comments.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i= 2.0.0-beta.1',\n 7: '>= 4.0.0'\n};\n\nconst objectType = '[object Object]';\n\nexport function HandlebarsEnvironment(helpers, partials, decorators) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n this.decorators = decorators || {};\n\n registerDefaultHelpers(this);\n registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: logger,\n log: logger.log,\n\n registerHelper: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple helpers'); }\n extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function(name, partial) {\n if (toString.call(name) === objectType) {\n extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new Exception(`Attempting to register a partial called \"${name}\" as undefined`);\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function(name) {\n delete this.partials[name];\n },\n\n registerDecorator: function(name, fn) {\n if (toString.call(name) === objectType) {\n if (fn) { throw new Exception('Arg not supported with multiple decorators'); }\n extend(this.decorators, name);\n } else {\n this.decorators[name] = fn;\n }\n },\n unregisterDecorator: function(name) {\n delete this.decorators[name];\n }\n};\n\nexport let log = logger.log;\n\nexport {createFrame, logger};\n","import registerInline from './decorators/inline';\n\nexport function registerDefaultDecorators(instance) {\n registerInline(instance);\n}\n\n","import {extend} from '../utils';\n\nexport default function(instance) {\n instance.registerDecorator('inline', function(fn, props, container, options) {\n let ret = fn;\n if (!props.partials) {\n props.partials = {};\n ret = function(context, options) {\n // Create a new partials stack frame prior to exec.\n let original = container.partials;\n container.partials = extend({}, original, props.partials);\n let ret = fn(context, options);\n container.partials = original;\n return ret;\n };\n }\n\n props.partials[options.args[0]] = options.fn;\n\n return ret;\n });\n}\n","\nconst errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n let loc = node && node.loc,\n line,\n column;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n let tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (let idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n try {\n if (loc) {\n this.lineNumber = line;\n\n // Work around issue under safari where we can't directly set the column value\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(this, 'column', {\n value: column,\n enumerable: true\n });\n } else {\n this.column = column;\n }\n }\n } catch (nop) {\n /* Ignore if the browser is very particular */\n }\n}\n\nException.prototype = new Error();\n\nexport default Exception;\n","import registerBlockHelperMissing from './helpers/block-helper-missing';\nimport registerEach from './helpers/each';\nimport registerHelperMissing from './helpers/helper-missing';\nimport registerIf from './helpers/if';\nimport registerLog from './helpers/log';\nimport registerLookup from './helpers/lookup';\nimport registerWith from './helpers/with';\n\nexport function registerDefaultHelpers(instance) {\n registerBlockHelperMissing(instance);\n registerEach(instance);\n registerHelperMissing(instance);\n registerIf(instance);\n registerLog(instance);\n registerLookup(instance);\n registerWith(instance);\n}\n","import {appendContextPath, createFrame, isArray} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('blockHelperMissing', function(context, options) {\n let inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n let data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.name);\n options = {data: data};\n }\n\n return fn(context, options);\n }\n });\n}\n","import {appendContextPath, blockParams, createFrame, isArray, isFunction} from '../utils';\nimport Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('each', function(context, options) {\n if (!options) {\n throw new Exception('Must pass iterator to #each');\n }\n\n let fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data,\n contextPath;\n\n if (options.data && options.ids) {\n contextPath = appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (isFunction(context)) { context = context.call(this); }\n\n if (options.data) {\n data = createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (isArray(context)) {\n for (let j = context.length; i < j; i++) {\n if (i in context) {\n execIteration(i, i, i === context.length - 1);\n }\n }\n } else {\n let priorKey;\n\n for (let key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n}\n","import Exception from '../exception';\n\nexport default function(instance) {\n instance.registerHelper('helperMissing', function(/* [args, ]options */) {\n if (arguments.length === 1) {\n // A missing field in a {{foo}} construct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new Exception('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n}\n","import {isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('if', function(conditional, options) {\n if (isFunction(conditional)) { conditional = conditional.call(this); }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if ((!options.hash.includeZero && !conditional) || isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function(conditional, options) {\n return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});\n });\n}\n","export default function(instance) {\n instance.registerHelper('log', function(/* message, options */) {\n let args = [undefined],\n options = arguments[arguments.length - 1];\n for (let i = 0; i < arguments.length - 1; i++) {\n args.push(arguments[i]);\n }\n\n let level = 1;\n if (options.hash.level != null) {\n level = options.hash.level;\n } else if (options.data && options.data.level != null) {\n level = options.data.level;\n }\n args[0] = level;\n\n instance.log(... args);\n });\n}\n","export default function(instance) {\n instance.registerHelper('lookup', function(obj, field) {\n return obj && obj[field];\n });\n}\n","import {appendContextPath, blockParams, createFrame, isEmpty, isFunction} from '../utils';\n\nexport default function(instance) {\n instance.registerHelper('with', function(context, options) {\n if (isFunction(context)) { context = context.call(this); }\n\n let fn = options.fn;\n\n if (!isEmpty(context)) {\n let data = options.data;\n if (options.data && options.ids) {\n data = createFrame(options.data);\n data.contextPath = appendContextPath(options.data.contextPath, options.ids[0]);\n }\n\n return fn(context, {\n data: data,\n blockParams: blockParams([context], [data && data.contextPath])\n });\n } else {\n return options.inverse(this);\n }\n });\n}\n","import {indexOf} from './utils';\n\nlet logger = {\n methodMap: ['debug', 'info', 'warn', 'error'],\n level: 'info',\n\n // Maps a given level value to the `methodMap` indexes above.\n lookupLevel: function(level) {\n if (typeof level === 'string') {\n let levelMap = indexOf(logger.methodMap, level.toLowerCase());\n if (levelMap >= 0) {\n level = levelMap;\n } else {\n level = parseInt(level, 10);\n }\n }\n\n return level;\n },\n\n // Can be overridden in the host environment\n log: function(level, ...message) {\n level = logger.lookupLevel(level);\n\n if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n let method = logger.methodMap[level];\n if (!console[method]) { // eslint-disable-line no-console\n method = 'log';\n }\n console[method](...message); // eslint-disable-line no-console\n }\n }\n};\n\nexport default logger;\n","/* global window */\nexport default function(Handlebars) {\n /* istanbul ignore next */\n let root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function() {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n return Handlebars;\n };\n}\n","import * as Utils from './utils';\nimport Exception from './exception';\nimport { COMPILER_REVISION, REVISION_CHANGES, createFrame } from './base';\n\nexport function checkRevision(compilerInfo) {\n const compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n const runtimeVersions = REVISION_CHANGES[currentRevision],\n compilerVersions = REVISION_CHANGES[compilerRevision];\n throw new Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' +\n 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' +\n 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nexport function template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new Exception('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new Exception('Unknown template object: ' + typeof templateSpec);\n }\n\n templateSpec.main.decorator = templateSpec.main_d;\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n if (options.ids) {\n options.ids[0] = true;\n }\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n let result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n let lines = result.split('\\n');\n for (let i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n let container = {\n strict: function(obj, name) {\n if (!(name in obj)) {\n throw new Exception('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function(depths, name) {\n const len = depths.length;\n for (let i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function(i) {\n let ret = templateSpec[i];\n ret.decorator = templateSpec[i + '_d'];\n return ret;\n },\n\n programs: [],\n program: function(i, data, declaredBlockParams, blockParams, depths) {\n let programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function(param, common) {\n let obj = param || common;\n\n if (param && common && (param !== common)) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n // An empty object to use as replacement for null-contexts\n nullContext: Object.seal({}),\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context, options = {}) {\n let data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n let depths,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n if (options.depths) {\n depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;\n } else {\n depths = [context];\n }\n }\n\n function main(context/*, options*/) {\n return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n return main(context, options);\n }\n ret.isTop = true;\n\n ret._setup = function(options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n if (templateSpec.usePartial || templateSpec.useDecorators) {\n container.decorators = container.merge(options.decorators, env.decorators);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n container.decorators = options.decorators;\n }\n };\n\n ret._child = function(i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new Exception('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new Exception('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nexport function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context, options = {}) {\n let currentDepths = depths;\n if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {\n currentDepths = [context].concat(depths);\n }\n\n return fn(container,\n context,\n container.helpers, container.partials,\n options.data || data,\n blockParams && [options.blockParams].concat(blockParams),\n currentDepths);\n }\n\n prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nexport function resolvePartial(partial, context, options) {\n if (!partial) {\n if (options.name === '@partial-block') {\n partial = options.data['partial-block'];\n } else {\n partial = options.partials[options.name];\n }\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nexport function invokePartial(partial, context, options) {\n // Use the current closure context to save the partial-block if this partial\n const currentPartialBlock = options.data && options.data['partial-block'];\n options.partial = true;\n if (options.ids) {\n options.data.contextPath = options.ids[0] || options.data.contextPath;\n }\n\n let partialBlock;\n if (options.fn && options.fn !== noop) {\n options.data = createFrame(options.data);\n // Wrapper function to get access to currentPartialBlock from the closure\n let fn = options.fn;\n partialBlock = options.data['partial-block'] = function partialBlockWrapper(context, options = {}) {\n\n // Restore the partial-block from the closure for the execution of the block\n // i.e. the part inside the block of the partial call.\n options.data = createFrame(options.data);\n options.data['partial-block'] = currentPartialBlock;\n return fn(context, options);\n };\n if (fn.partials) {\n options.partials = Utils.extend({}, options.partials, fn.partials);\n }\n }\n\n if (partial === undefined && partialBlock) {\n partial = partialBlock;\n }\n\n if (partial === undefined) {\n throw new Exception('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nexport function noop() { return ''; }\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n if (fn.decorator) {\n let props = {};\n prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n Utils.extend(prog, props);\n }\n return prog;\n}\n","// Build out our basic SafeString type\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function() {\n return '' + this.string;\n};\n\nexport default SafeString;\n","const escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '=': '='\n};\n\nconst badChars = /[&<>\"'`=]/g,\n possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nexport function extend(obj/* , ...source */) {\n for (let i = 1; i < arguments.length; i++) {\n for (let key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nexport let toString = Object.prototype.toString;\n\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nlet isFunction = function(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n isFunction = function(value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nexport {isFunction};\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nexport const isArray = Array.isArray || function(value) {\n return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;\n};\n\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\nexport function indexOf(array, value) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\n\nexport function escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) { return string; }\n return string.replace(badChars, escapeChar);\n}\n\nexport function isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nexport function createFrame(object) {\n let frame = extend({}, object);\n frame._parent = object;\n return frame;\n}\n\nexport function blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nexport function appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n","// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = require('./dist/cjs/handlebars.runtime')['default'];\n","'use strict';\nif (!Array.prototype.find) {\n Object.defineProperty(Array.prototype, 'find', {\n value: function (predicate) {\n\n if (this == null) {\n throw new TypeError('this is null or not defined');\n }\n\n var obj = Object(this);\n var len = obj.length >>> 0;\n\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n var thisArg = arguments[1];\n\n var index = 0;\n\n while (index < len) {\n var iValue = obj[index];\n if (predicate.call(thisArg, iValue, index, obj)) {\n return iValue;\n }\n index++;\n }\n\n return undefined;\n }\n });\n}","//! moment.js\n\n;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n}(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return (Object.getOwnPropertyNames(obj).length === 0);\n } else {\n var k;\n for (k in obj) {\n if (obj.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n }\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.weekdayMismatch &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n // Plugins that add properties should also add the key here (null value),\n // so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n // Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n // compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n // token: 'M'\n // padded: ['MM', 2]\n // ordinal: 'Mo'\n // callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n // format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n // any word (or two) characters or numbers including two/three word month in arabic.\n // includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i;\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n // ALIASES\n\n addUnitAlias('year', 'y');\n\n // PRIORITIES\n\n addUnitPriority('year', 1);\n\n // PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n // HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n // HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n // MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid() && !isNaN(value)) {\n if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));\n }\n else {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n }\n\n // MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function mod(n, x) {\n return ((n % x) + x) % x;\n }\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n function daysInMonth(year, month) {\n if (isNaN(year) || isNaN(month)) {\n return NaN;\n }\n var modMonth = mod(month, 12);\n year += (month - modMonth) / 12;\n return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);\n }\n\n // FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n // ALIASES\n\n addUnitAlias('month', 'M');\n\n // PRIORITY\n\n addUnitPriority('month', 8);\n\n // PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n // LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n // FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n // ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n // PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n // PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n // HELPERS\n\n // LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n // MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n // ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n // PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n // PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n // HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n // LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n // FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n // ALIASES\n\n addUnitAlias('hour', 'h');\n\n // PRIORITY\n addUnitPriority('hour', 13);\n\n // PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n // LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n // MOMENTS\n\n // Setting the hour should keep the time, because the user explicitly\n // specified which hour they want. So trying to maintain the same hour (in\n // a new timezone) makes sense. Adding/subtracting hours does not follow\n // this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n // internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n // pick the locale from the array\n // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return globalLocale;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n var aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {}\n }\n return locales[name];\n }\n\n // This function will load locale and then set the global locale. If\n // no arguments are passed in, it will simply return the current global\n // locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n else {\n if ((typeof console !== 'undefined') && console.warn) {\n //warn user if arguments are passed but the locale could not be set\n console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n }\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var locale, parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n locale = loadLocale(config.parentLocale);\n if (locale != null) {\n parentConfig = locale._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, tmpLocale, parentConfig = baseConfig;\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n // returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n // Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n // convert an array to a date.\n // the array should mirror the parameters below\n // note: all values past the year are optional and will default to the lowest possible value.\n // [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, expectedWeekday, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n\n // check for mismatching day of week\n if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n // iso 8601 regex\n // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n // iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n // date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;\n\n function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n var result = [\n untruncateYear(yearStr),\n defaultLocaleMonthsShort.indexOf(monthStr),\n parseInt(dayStr, 10),\n parseInt(hourStr, 10),\n parseInt(minuteStr, 10)\n ];\n\n if (secondStr) {\n result.push(parseInt(secondStr, 10));\n }\n\n return result;\n }\n\n function untruncateYear(yearStr) {\n var year = parseInt(yearStr, 10);\n if (year <= 49) {\n return 2000 + year;\n } else if (year <= 999) {\n return 1900 + year;\n }\n return year;\n }\n\n function preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s.replace(/\\([^)]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').trim();\n }\n\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n }\n\n var obsOffsets = {\n UT: 0,\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60\n };\n\n function calculateOffset(obsOffset, militaryOffset, numOffset) {\n if (obsOffset) {\n return obsOffsets[obsOffset];\n } else if (militaryOffset) {\n // the only allowed military tz is Z\n return 0;\n } else {\n var hm = parseInt(numOffset, 10);\n var m = hm % 100, h = (hm - m) / 100;\n return h * 60 + m;\n }\n }\n\n // date and time from ref 2822 format\n function configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i));\n if (match) {\n var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n if (!checkWeekday(match[1], parsedArray, config)) {\n return;\n }\n\n config._a = parsedArray;\n config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n config._d = createUTCDate.apply(null, config._a);\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n // date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n // constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n // constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n // date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n // date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n // Pick a moment m from moments so that m[fn](other) is true for all\n // other. This relies on the function fn to be transitive.\n //\n // moments should either be an array of moment objects or an array, whose\n // first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n // TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible to translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n // FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n // PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n // HELPERS\n\n // timezone chunker\n // '+10:00' > ['10', '00']\n // '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n // Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n // HOOKS\n\n // This function will be called whenever a moment is mutated.\n // It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n // MOMENTS\n\n // keepLocalTime = true means only change the timezone, without\n // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n // +0200, so we adjust the time as needed, to be valid.\n //\n // Keeping the time actually adds/subtracts (one hour)\n // from the actual represented time. That is why we call updateOffset\n // a second time. In case it wants us to change the offset again\n // _changeInProgress == true case, then we have to adjust, because\n // there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n // ASP.NET json date format regex\n var aspNetRegex = /^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n // and further modified to allow for strings containing both week and day\n var isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n // TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units || 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n switch (units) {\n case 'year': output = monthDiff(this, that) / 12; break;\n case 'month': output = monthDiff(this, that); break;\n case 'quarter': output = monthDiff(this, that) / 3; break;\n case 'second': output = (this - that) / 1e3; break; // 1000\n case 'minute': output = (this - that) / 6e4; break; // 1000 * 60\n case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60\n case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst\n case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst\n default: output = this - that;\n }\n\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true;\n var m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n if (utc) {\n return this.toDate().toISOString();\n } else {\n return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n // If passed a locale key, it will set the locale for this\n // instance. Otherwise, it will return the locale configuration\n // variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n /* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n /* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n /* falls through */\n case 'hour':\n this.minutes(0);\n /* falls through */\n case 'minute':\n this.seconds(0);\n /* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n // FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n // ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n // PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n // PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n // MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n // FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n // ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n // PRIORITY\n\n addUnitPriority('quarter', 7);\n\n // PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n // MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // ALIASES\n\n addUnitAlias('date', 'D');\n\n // PRIORITY\n addUnitPriority('date', 9);\n\n // PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n });\n\n // MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n // FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n // ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n // PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n // PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n // HELPERS\n\n // MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n // FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n // ALIASES\n\n addUnitAlias('minute', 'm');\n\n // PRIORITY\n\n addUnitPriority('minute', 14);\n\n // PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n // MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n // FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n // ALIASES\n\n addUnitAlias('second', 's');\n\n // PRIORITY\n\n addUnitPriority('second', 15);\n\n // PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n // MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n // FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n // ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n // PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n // MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n // FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n // MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n proto.quarter = proto.quarters = getSetQuarter;\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n proto.hour = proto.hours = getSetHour;\n proto.minute = proto.minutes = getSetMinute;\n proto.second = proto.seconds = getSetSecond;\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n // ()\n // (5)\n // (fmt, 5)\n // (fmt)\n // (true)\n // (true, 5)\n // (true, fmt, 5)\n // (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n // Side effect imports\n\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n // supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n // TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function clone$1 () {\n return createDuration(this);\n }\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n // This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n // This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n }\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n var totalSign = total < 0 ? '-' : '';\n var ymSign = sign(this._months) !== sign(total) ? '-' : '';\n var daysSign = sign(this._days) !== sign(total) ? '-' : '';\n var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n return totalSign + 'P' +\n (Y ? ymSign + Y + 'Y' : '') +\n (M ? ymSign + M + 'M' : '') +\n (D ? daysSign + D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? hmsSign + h + 'H' : '') +\n (m ? hmsSign + m + 'M' : '') +\n (s ? hmsSign + s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.clone = clone$1;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n // Side effect imports\n\n // FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n // PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n // Side effect imports\n\n\n hooks.version = '2.22.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n // currently HTML5 input type only supports 24-hour formats\n hooks.HTML5_FMT = {\n DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // \n DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // \n DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // \n DATE: 'YYYY-MM-DD', // \n TIME: 'HH:mm', // \n TIME_SECONDS: 'HH:mm:ss', // \n TIME_MS: 'HH:mm:ss.SSS', // \n WEEK: 'YYYY-[W]WW', // \n MONTH: 'YYYY-MM' // \n };\n\n return hooks;\n\n})));\n","\"use strict\";\n/*\n Main function and entry point\n Can be registered to a videojs instance as a plugin\n*/\n\nmodule.exports = (videojs) => {\n require('./lib/polyfills');\n\n const Plugin = videojs.getPlugin('plugin'),\n Utils = require('./lib/utils'),\n Controls = require(\"./components/controls\"),\n AnnotationState = require(\"./components/annotation_state\"),\n EventDispatcher = require(\"./lib/event_dispatcher\");\n\n const DEFAULT_OPTIONS = Object.freeze({\n bindArrowKeys: true,\n meta: { user_id: null, user_name: null },\n annotationsObjects: [],\n showControls: true,\n showCommentList: true,\n showFullScreen: true,\n showMarkerShapeAndTooltips: true,\n internalCommenting: true,\n startInAnnotationMode: false\n });\n\n return class AnnotationComments extends Plugin {\n\n constructor (player, options) {\n options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options);\n super(player, options);\n\n this.eventDispatcher = new EventDispatcher(this);\n this.eventDispatcher.registerListenersFor(this, 'AnnotationComments');\n\n this.player = player;\n this.meta = options.meta;\n this.options = options;\n\n this._readyCallbacks = [];\n\n // Assign reference to this class to player for access later by components where needed\n player.annotationComments = (() => { return this }).bind(this);\n\n // Assert that components are initialized AFTER metadata + play data is loaded so we metadata/duration\n // NOTE - this check is required because player loadeddata doesn't always fire if readystate is > 3\n if(player.readyState() >= 3){\n this.postLoadDataConstructor();\n }else{\n player.on('loadeddata', this.postLoadDataConstructor.bind(this));\n }\n }\n\n // Additional init/setup after video data + metadata is available\n postLoadDataConstructor () {\n // setup initial state and render UI\n this.annotationState = new AnnotationState(this.player);\n this.annotationState.annotations = this.options.annotationsObjects;\n\n this.controls = new Controls(this.player, this.options.bindArrowKeys);\n this.bindEvents();\n this.setBounds(false);\n if(this.options.startInAnnotationMode) this.toggleAnnotationMode();\n\n this.pluginReady();\n }\n\n // Bind needed events for interaction w/ components\n bindEvents () {\n // Set player boundaries on window size change or fullscreen change\n $(window).on('resize.vac-window-resize', Utils.throttle(this.setBounds.bind(this), 500));\n this.player.on('fullscreenchange', Utils.throttle(this.setBounds.bind(this), 500));\n\n // Remove annotation features on fullscreen if showFullScreen: false\n if (!this.options.showFullScreen) {\n this.player.on('fullscreenchange', (() => {\n if (this.player.isFullscreen_) {\n this.preFullscreenAnnotationsEnabled = this.active;\n $(this.player.el()).addClass('vac-disable-fullscreen');\n } else {\n $(this.player.el()).removeClass('vac-disable-fullscreen');\n }\n if(this.preFullscreenAnnotationsEnabled){\n // If we were previously in annotation mode (pre-fullscreen) or entering fullscreeen and are\n // in annotation mode, toggle the mode\n this.toggleAnnotationMode();\n }\n }).bind(this));\n }\n }\n\n // A wrapper func to make it easier to use EventDispatcher from the client\n // Ex: plugin.fire(type, data);\n fire (type, data={}) {\n this.eventDispatcher.fire(type, data);\n }\n\n // Toggle annotations mode on/off\n toggleAnnotationMode() {\n this.active = !this.active;\n this.player.toggleClass('vac-active'); // Toggle global class to player to toggle display of elements\n this.annotationState.enabled = this.active;\n\n if(this.active){\n this.fire(\"annotationModeEnabled\");\n }else{\n this.fire(\"annotationModeDisabled\")\n }\n\n // Handle control component UI if showControls: true\n if(this.options.showControls){\n if(!this.active){\n this.controls.clear(true);\n }else{\n this.controls.render();\n }\n }\n }\n\n // Set player UI boundaries\n setBounds (triggerChange=true) {\n this.bounds = {};\n let $player = $(this.player.el()),\n $ctrls = $player.find('.vjs-control-bar');\n\n this.bounds.left = $player.offset().left;\n this.bounds.top = $player.offset().top;\n this.bounds.right = this.bounds.left + $player.width();\n this.bounds.bottom = this.bounds.top + $player.height();\n this.bounds.bottomWithoutControls = this.bounds.bottom - $ctrls.height();\n\n // fires an event when bounds have changed during resizing\n if(triggerChange) this.fire('playerBoundsChanged', this.bounds);\n }\n\n // Public function to register a callback for when plugin is ready\n onReady (callback) {\n if(this.eventDispatcher.pluginReady){\n return callback();\n }\n this._readyCallbacks.push(callback);\n }\n\n // Mark plugin as ready and fire any pending callbacks\n pluginReady () {\n this.eventDispatcher.pluginReady = true;\n while(this._readyCallbacks.length){\n this._readyCallbacks.pop()();\n }\n }\n\n // Teardown all components, remove all listeners, and remove elements from DOM\n dispose () {\n this.controls = this.controls.teardown();\n this.annotationState = this.annotationState.teardown();\n this.eventDispatcher = this.eventDispatcher.teardown();\n this.teardown();\n if(this.player) {\n this.player.annotationComments = null;\n $(this.player.el()).removeClass('vac-active');\n $(this.player.el()).find(\"[class^='vac-']\").remove();\n }\n super.dispose();\n }\n\n teardown () {\n if(this.player) this.player.off('fullscreenchange');\n $(window).off('resize.vac-window-resize');\n }\n }\n}\n","var Handlebars = require(\"handlebars/runtime\");\n exports[\"comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\"\n + alias4(container.lambda(((stack1 = (depth0 != null ? depth0.meta : depth0)) != null ? stack1.user_name : stack1), depth0))\n + \"
\\n
\"\n + alias4(((helper = (helper = helpers.timeSince || (depth0 != null ? depth0.timeSince : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"timeSince\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n   X\\n
\\n
\\n
\\n \"\n + alias4((helpers.breaklines || (depth0 && depth0.breaklines) || alias2).call(alias1,(depth0 != null ? depth0.body : depth0),{\"name\":\"breaklines\",\"hash\":{},\"data\":data}))\n + \"\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"comment_list\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1;\n\n return \" \"\n + ((stack1 = container.lambda(blockParams[0][0], depth0)) != null ? stack1 : \"\")\n + \"\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data,blockParams) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n\";\n},\"useData\":true,\"useBlockParams\":true});\nexports[\"controls\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n \\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.showNav : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \"
\\n
Prev
\\n
Next
\\n
\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"
\\n
\\n
Click and drag to select
\\n
\\n
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showControls : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.writingComment : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"
\\n Select shape + range\\n\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.internalCommenting : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n
-1 sec
\\n
+1 sec
\\n
\\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \" \\n cancel\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"
\\n
\\n
\\n
New Annotation @ \"\n + container.escapeExpression(((helper = (helper = helpers.rangeStr || (depth0 != null ? depth0.rangeStr : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"rangeStr\",\"hash\":{},\"data\":data}) : helper)))\n + \"
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n
\\n
\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.adding : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\nexports[\"draggable_marker\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n\";\n},\"useData\":true});\nexports[\"marker\"] = Handlebars.template({\"1\":function(container,depth0,helpers,partials,data) {\n return \"vac-ranged-marker\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \"width:\"\n + container.escapeExpression(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"width\",\"hash\":{},\"data\":data}) : helper)))\n + \";\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.tooltipBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"6\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n \\n \"\n + alias4(((helper = (helper = helpers.tooltipTime || (depth0 != null ? depth0.tooltipTime : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipTime\",\"hash\":{},\"data\":data}) : helper)))\n + \" - \"\n + alias4(((helper = (helper = helpers.tooltipBody || (depth0 != null ? depth0.tooltipBody : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"tooltipBody\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n \\n
\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \"vac-right-side\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n\"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showTooltip : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
\\n\";\n},\"useData\":true});\nexports[\"marker_wrap\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"
\\n\t
\\n
\";\n},\"useData\":true});\nexports[\"new_comment\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
\\n
\\n
\\n \\n
\\n \\n Cancel\\n
\\n
\\n
\\n\";\n},\"useData\":true});\nexports[\"player_button\"] = Handlebars.template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"\\n\\n\t\\n\t \\n\t \\n\t\\n\";\n},\"useData\":true});","\"use strict\";\n/*\n Component for an annotation, which includes controlling the marker/shape, rendering a commentList, etc\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils.js\"),\n CommentList = require(\"./comment_list\"),\n Marker = require(\"./marker\"),\n Comment = require(\"./comment\"),\n Shape = require(\"./shape\");\n\nmodule.exports = class Annotation extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.id = data.id || this.componentId;\n this.range = data.range;\n this.shape = data.shape;\n this.secondsActive = this.buildSecondsActiveArray();\n this.buildComments(data);\n this.buildMarker();\n this.buildShape();\n this.bindEvents();\n\n this.isOpen = false;\n }\n\n buildComments(data) {\n this.commentList = new CommentList(\n {\"comments\": data.comments, \"annotation\": this},\n this.player\n );\n }\n\n buildMarker () {\n this.marker = new Marker(this.player, this.range, this.commentList.comments[0]);\n this.marker.render();\n }\n\n buildShape() {\n this.annotationShape = new Shape(this.player, this.shape);\n }\n\n // Serialize object\n get data () {\n return {\n id: this.id,\n range: this.range,\n shape: this.shape,\n comments: this.commentList.data\n };\n }\n\n bindEvents () {\n this.marker.$el.on('click.vac-marker', (e) => this.plugin.annotationState.openAnnotation(this, true));\n }\n\n // Opens the annotation. Handles marker, commentList, shape, Annotation state, and player state\n open (withPause=true, previewOnly=false, forceSnapToStart=false) {\n this.isOpen = true;\n const snapToStart = forceSnapToStart || !Utils.isWithinRange(\n this.range.start,\n this.range.end,\n Math.floor(this.currentTime)\n );\n\n let showTooltip = previewOnly && this.plugin.options.showMarkerShapeAndTooltips;\n this.marker.setActive(showTooltip);\n if(!previewOnly && this.plugin.options.showCommentList){\n this.commentList.render();\n }\n\n if(!previewOnly || (previewOnly && this.plugin.options.showMarkerShapeAndTooltips)){\n this.annotationShape.render();\n\n if(this.shape) {\n this.annotationShape.$el.on(\"click.vac-annotation\", () => {\n this.plugin.annotationState.openAnnotation(this, false, false, false);\n });\n }\n }\n\n if(withPause) this.player.pause();\n if(snapToStart) this.currentTime = this.range.start;\n\n this.plugin.fire('annotationOpened', {\n annotation: this.data,\n triggered_by_timeline: previewOnly\n });\n }\n\n // Closes the annotation. Handles marker, commendList, shape, and AnnotationState\n close (clearActive=true) {\n if(!this.isOpen) return;\n this.isOpen = false;\n this.marker.deactivate();\n this.commentList.teardown(false);\n if(this.annotationShape.$el) this.annotationShape.$el.off(\"click.vac-annotation\");\n this.annotationShape.teardown();\n if(clearActive) this.plugin.annotationState.clearActive();\n this.plugin.fire('annotationClosed', this.data);\n }\n\n // For preloading an array of seconds active on initialization\n // Values used to build timeMap in AnnotationState\n buildSecondsActiveArray () {\n let seconds = [];\n if(!!this.range.end) {\n for (let i = this.range.start; i <= this.range.end; i++) {\n seconds.push(i);\n }\n } else {\n let start = this.range.start;\n seconds.push(start);\n if(start < this.duration) seconds.push(start+1);\n }\n return seconds;\n }\n\n // Tearsdown annotation and marker, removes object from AnnotationState\n teardown (removeFromCollection=true) {\n this.close(true);\n this.marker.teardown();\n if(this.commentList) this.commentList.teardown(removeFromCollection);\n if(removeFromCollection) this.plugin.annotationState.removeAnnotation(this);\n if(this.annotationShape) this.annotationShape.teardown();\n if(removeFromCollection) super.teardown();\n }\n\n // Build a new annotation instance by passing in data for range, shape, comment, & plugin ref\n static newFromData (range, shape, commentStr, plugin, id=null) {\n let comment = Comment.dataObj(commentStr, plugin);\n if(range) range = Utils.parseIntObj(range);\n if(shape) shape = Utils.parseIntObj(shape);\n let data = {\n id,\n range,\n shape,\n comments: [comment]\n };\n return new Annotation(data, plugin.player);\n }\n\n get isActive () {\n return this.plugin.annotationState.activeAnnotation === this;\n }\n}\n","\"use strict\";\n/*\n Component for managing the state of annotations, including showing active annotation during playback,\n toggling active states for annotations, navigating annotations forward/back, etc\n*/\n\nconst Utils = require('./../lib/utils'),\n PlayerComponent = require(\"./../lib/player_component\"),\n Annotation = require(\"./annotation\");\n\nmodule.exports = class AnnotationState extends PlayerComponent {\n\n constructor (player) {\n super(player);\n this.initAPI(this, 'AnnotationState');\n this.resetData();\n this.bindEvents();\n }\n\n // sets _enabled and closes or opens annotation as needed\n set enabled (shouldBeEnabled) {\n this._enabled = shouldBeEnabled;\n if(!shouldBeEnabled) this.activeAnnotation.close();\n if(shouldBeEnabled){\n this.skipLiveCheck = false;\n this.setLiveAnnotation();\n }\n }\n\n get enabled () {\n return this._enabled;\n }\n\n // Sets _annotations w/Annoation objects from input array\n set annotations (annotationsData) {\n this._annotations = annotationsData.map((a) => new Annotation(a, this.player));\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n }\n\n get annotations () {\n return this._annotations;\n }\n\n set activeAnnotation (annotation=null) {\n this._activeAnnotation = annotation;\n }\n\n // Get current active annotation or a null object with .close()\n get activeAnnotation () {\n return this._activeAnnotation || { close: (() => {}) };\n }\n\n // Serialize data\n get data () {\n return this._annotations.map((a) => a.data);\n }\n\n // Bind events for setting liveAnnotation on video time change\n bindEvents () {\n this.player.on(\"timeupdate\", Utils.throttle(this.setLiveAnnotation.bind(this), 100));\n }\n\n // Sort annotations by range.start\n sortAnnotations () {\n this._annotations.sort((a,b) => {\n return a.range.start < b.range.start ? -1 : (a.range.start > b.range.start ? 1 : 0);\n });\n }\n\n // Add a new annotation\n addNewAnnotation (annotation) {\n this._annotations.push(annotation);\n this.openAnnotation(annotation, true, true, false, true);\n this.stateChanged();\n }\n\n // Create and add a annotation\n createAndAddAnnotation (data) {\n this.plugin.controls.uiState.adding && this.plugin.controls.cancelAddNew();\n\n let annotation = Annotation.newFromData(\n data.range,\n data.shape,\n data.commentStr || \"\",\n this.plugin,\n data.id\n )\n this.addNewAnnotation(annotation)\n }\n\n // Destroy an existing annotation\n destroyAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) annotation.teardown();\n }\n\n // Remove an annotation\n removeAnnotation (annotation) {\n let id = annotation.id,\n i = this._annotations.indexOf(annotation);\n this._annotations.splice(i, 1);\n this.stateChanged();\n this.plugin.fire('annotationDeleted', {id});\n }\n\n // Set the live annotation based on current video time\n setLiveAnnotation () {\n if(!this.enabled) return;\n let time = Math.floor(this.currentTime);\n\n if(this.skipLiveCheck) {\n if(time !== this.lastVideoTime) this.skipLiveCheck = false;\n return;\n }\n\n let matches = this.activeAnnotationsForTime(time);\n if(!matches.length) return this.activeAnnotation.close();\n\n // Set live annotation as the last match\n let liveAnnotation = this.annotations[matches[matches.length-1]];\n\n // Special cases if this or another annotation is active\n if(this.activeAnnotation.range) {\n if(liveAnnotation === this.activeAnnotation) return;\n // Check if the active annotation and live annotation share a start time\n // Is that start time at the current playhead?\n // If so, don't switch which is active.\n let liveStart = liveAnnotation.range.start,\n activeStart = this.activeAnnotation.range.start;\n if(liveStart === activeStart && liveStart === time) return;\n }\n\n this.openAnnotation(liveAnnotation, false, false, true);\n }\n\n // Get all active annotations for a time (in seconds)\n activeAnnotationsForTime (time) {\n if(!this.annotations.length) return [];\n return this.annotationTimeMap[time] || [];\n }\n\n /*\n Rebuild the annotation time map\n Example: this._annotations[1] and this._annotations[3] are active during second 4\n this.annotationTimeMap = { 4: [1, 3] }\n */\n rebuildAnnotationTimeMap () {\n let timeMap = {};\n this.annotations.forEach((annotation) => {\n annotation.secondsActive.forEach((second) => {\n let val = (timeMap[second] || []);\n val.push(this.annotations.indexOf(annotation));\n timeMap[second] = val;\n });\n });\n this.annotationTimeMap = timeMap;\n }\n\n // Close active annotation and remove reference in state\n clearActive () {\n this.activeAnnotation.close(false);\n this._activeAnnotation = null;\n }\n\n // Open annotation with options to pause and show preview\n // skipLiveCheck will short circuit setLiveAnnotation()\n openAnnotation (annotation, skipLiveCheck=false, pause=true, previewOnly=false, forceSnapToStart=false) {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n this.skipLiveCheck = skipLiveCheck;\n this.clearActive();\n annotation.open(pause, previewOnly, forceSnapToStart);\n this.activeAnnotation = annotation;\n this.lastVideoTime = this.activeAnnotation.range.start;\n }\n\n // Open an annotation by ID (if it exists)\n openAnnotationById (id) {\n let annotation = this.findAnnotation(id);\n if (annotation) this.openAnnotation(annotation);\n }\n\n // Returns annotation object given ID\n findAnnotation (id) {\n return this.annotations.find((a) => a.id == id);\n }\n\n // Returns comment object given ID\n findComment (id) {\n let comments = this.annotations.map((a) => a.commentList.comments);\n comments = [].concat(...comments); // flatten 2d array\n return comments.find((c) => c.id == id);\n }\n\n // Finds the next annotation in collection and opens it\n nextAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === this.annotations.length-1 ? 0 : ind+1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=0; i time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[0], true);\n }\n\n // Finds the previous annotation in collection and opens it\n prevAnnotation () {\n if(this._activeAnnotation){\n let ind = this.annotations.indexOf(this._activeAnnotation),\n nextInd = (ind === 0 ? this.annotations.length-1 : ind-1);\n return this.openAnnotation(this.annotations[nextInd], true);\n }\n let time = Math.floor(this.currentTime);\n for(let i=this.annotations.length-1; i>=0; i--){\n if(this.annotations[i].range.start < time) return this.openAnnotation(this.annotations[i], true);\n }\n this.openAnnotation(this.annotations[this.annotations.length-1], true);\n }\n\n // Use anywhere the annotation data changes\n // Cleans internal state data, updates player button, triggers configurable callback\n stateChanged () {\n this.sortAnnotations();\n this.rebuildAnnotationTimeMap();\n this.plugin.fire('onStateChanged', this.data);\n }\n\n // Reset internal state properties\n resetData () {\n this.annotations = [];\n this.annotationTimeMap = {};\n this.activeAnnotation = null;\n this.enabled = false;\n this.skipNextTimeCheck = false;\n this.lastVideoTime = 0;\n }\n\n // Remove UI and unbind events for this and child components\n teardown() {\n this.annotations.forEach((annotation) => { annotation.teardown(false); });\n this.resetData();\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for an invidual comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n moment = require(\"moment\"),\n templateName = 'comment';\n\nmodule.exports = class Comment extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n this.commentList = data.commentList;\n this.id = data.id || this.componentId;\n this.meta = data.meta;\n this.body = data.body;\n this.timestamp = moment(data.meta.datetime).unix();\n this.timeSince = this.timeSince();\n\n this.$el = $(this.render());\n }\n\n // Serialize data\n get data () {\n return {\n id: this.id,\n meta: this.meta,\n body: this.body\n };\n }\n\n get HTML () {\n return this.$el[0].outerHTML;\n }\n\n render () {\n return this.renderTemplate(\n templateName,\n {\n id: this.id,\n body: this.body,\n meta: this.meta,\n timeSince: this.timeSince\n }\n );\n }\n\n // Return time since comment timestamp\n timeSince () {\n return moment(this.meta.datetime).fromNow();\n }\n\n teardown (destroy=false) {\n super.teardown(destroy);\n }\n\n // Return a Comment obj given body content and plugin reference\n static newFromData (body, commentList, plugin) {\n let data = this.dataObj(body, plugin);\n return new Comment(data, plugin.player);\n }\n\n // Return an object with plugin data, timestamp, unique id, and body content\n static dataObj (body, plugin) {\n return {\n meta: Object.assign({\n datetime: moment().toISOString()\n }, plugin.meta),\n id: Utils.guid(),\n body\n };\n }\n}\n","\"use strict\";\n/*\n Component for a list of comments in a visible/active annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n Comment = require(\"./comment\"),\n commentListTemplateName = 'comment_list',\n newCommentTemplateName = 'new_comment';\n\nmodule.exports = class CommentList extends PlayerUIComponent {\n\n constructor (data, player) {\n super(player);\n\n this.annotation = data.annotation;\n this.comments = data.comments.map((commentData) => {\n commentData.commentList = this;\n return new Comment(commentData, player);\n });\n this.sortComments();\n }\n\n // Serialize object\n get data () {\n return this.comments.map((c) => c.data);\n }\n\n // Bind all events needed for the comment list\n bindListEvents () {\n this.$el\n .on(\"click.vac-comment\", \".vac-close-comment-list\", (() => this.annotation.close()).bind(this)) // Hide CommentList UI with close button\n .on(\"click.vac-comment\", \".vac-reply-btn\", this.addNewComment.bind(this)) // Open new reply UI with reply button\n .on(\"click.vac-comment\", \".vac-delete-annotation\", this.handleDeleteAnnotationClick.bind(this)) // Delete annotation with main delete button\n .on(\"click.vac-comment\", \".vac-delete-comment\", this.destroyComment.bind(this)) // Delete comment with delete comment button\n .on(\"mousewheel.vac-comment DOMMouseScroll.vac-comment\", \".vac-comments-wrap\", this.disablePageScroll.bind(this)); // Prevent outer page scroll when scrolling inside of the CommentList UI\n }\n\n // Bind event listeners for new comments form\n bindCommentFormEvents () {\n this.$newCommentForm\n .on(\"click.vac-comment\", \".vac-add-controls a, .vac-video-write-new.vac-is-comment a\", this.closeNewComment.bind(this)) // Cancel new comment creation with cancel link\n .on(\"click.vac-comment\", \".vac-video-write-new.vac-is-comment button\", this.saveNewComment.bind(this)); // Save new comment with save button\n }\n\n // Render CommentList UI with all comments using template\n render () {\n this.$el = $(this.renderTemplate(\n commentListTemplateName,\n {\n commentsHTML: this.comments.map((c) => c.HTML),\n rangeStr: Utils.humanTime(this.annotation.range)\n }\n ));\n\n this.$player.append(this.$el);\n this.$wrap = this.$UI.commentsContainer;\n this.bindListEvents();\n }\n\n // Re-render UI on state change\n reRender () {\n this.teardown(false);\n this.render();\n }\n\n // Render new comment form\n addNewComment () {\n this.$wrap.addClass(this.UI_CLASSES.active).find(\".vac-comments-wrap\").scrollTop(999999);\n var $shapebox = this.$wrap.find(\".vac-add-new-shapebox\"),\n width = $shapebox.outerWidth(),\n top = $shapebox.position().top + 10,\n right = this.$wrap.outerWidth() - ($shapebox.position().left + width);\n\n this.$newCommentForm = $(this.renderTemplate(newCommentTemplateName, {width, top, right}));\n this.bindCommentFormEvents();\n this.$player.append(this.$newCommentForm);\n }\n\n // Save comment from new comment form, update state and re-render UI\n saveNewComment () {\n this.$wrap.removeClass(this.UI_CLASSES.active);\n\n let user_id = 1,\n body = this.$UI.newCommentTextarea.val();\n\n if(!body) return; // empty comment - TODO add validation / err message\n this.createComment(body);\n }\n\n createComment (body) {\n let comment = Comment.newFromData(body, this, this.plugin);\n this.comments.push(comment);\n this.sortComments();\n\n // Don't mutate UI if comment is being created for an inactive annotation (via API)\n if(this.annotation.isActive) {\n this.reRender(false);\n this.closeNewComment();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n // Cancel comment adding process\n closeNewComment () {\n this.unbindCommentFormEvents();\n if(this.$wrap) this.$wrap.removeClass(this.UI_CLASSES.active);\n if(this.$newCommentForm) this.$newCommentForm.remove();\n }\n\n // Delete a comment. If it is the only comment, delete the annotation\n // Update state and re-render UI\n destroyComment (event) {\n let annotationId = this.annotation.id;\n if(this.comments.length == 1) {\n this.annotation.teardown();\n } else {\n let commentId = this.findCommentId(event),\n comment = this.comments.find((c) => c.id == commentId),\n i = this.comments.indexOf(comment);\n this.comments.splice(i, 1);\n this.reRender();\n }\n\n this.plugin.annotationState.stateChanged();\n }\n\n findCommentId (event) {\n let id = typeof event.detail.id === 'undefined' ?\n $(event.target).closest('.vac-comment').data('id') :\n event.detail.id;\n return id;\n }\n\n // Prevents outer page scroll when at the top or bottom of CommentList UI\n // TODO: This might need to be fine-tuned?\n disablePageScroll (event) {\n let $target = $(event.currentTarget),\n height = $target.height(),\n ogEvent = event.originalEvent,\n delta = ogEvent.wheelDelta || -ogEvent.detail,\n dir = delta < 0 ? \"down\" : \"up\",\n scrollDiff = Math.abs(event.currentTarget.scrollHeight - event.currentTarget.clientHeight);\n\n // if scrolling into top of div\n if ($target.scrollTop() < 20 && dir == \"up\") {\n $target.stop();\n $target.animate({scrollTop: 0}, 100);\n event.preventDefault();\n }\n\n // if scrolling into bottom of div\n if ($target.scrollTop() > (scrollDiff - 10) && dir == \"down\") {\n $target.stop();\n $target.animate({scrollTop: height + 40}, 100);\n event.preventDefault();\n }\n }\n\n // Sort comments by timestamp\n sortComments () {\n this.comments.sort((a,b) => {\n return a.timestamp < b.timestamp ? -1 : (a.timestamp > b.timestamp ? 1 : 0);\n });\n }\n\n // Delete the annotation\n handleDeleteAnnotationClick (e) {\n let $confirmEl = $(\"\").addClass(\"vac-delete-confirm\").text(\"CONFIRM\");\n $confirmEl.on(\"click.comment\", () => {\n $confirmEl.off(\"click.comment\");\n this.annotation.teardown();\n });\n $(e.target).replaceWith($confirmEl);\n }\n\n // Unbind listeners for new comments form\n unbindCommentFormEvents () {\n if(this.$newCommentForm) this.$newCommentForm.off(\"click.vac-comment\");\n }\n\n // Teardown CommentList UI, unbind events\n teardown (destroyComments=true) {\n if(this.$el) {\n this.$el.off(\"click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment\");\n }\n this.comments.forEach((c) => c.teardown(destroyComments));\n if(destroyComments) this.comments = [];\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing annotation \"control box\" in upper left of video when in annotation mode,\n including all functionality to add new annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n DraggableMarker = require(\"./draggable_marker.js\"),\n SelectableShape = require(\"./selectable_shape.js\"),\n PlayerButton = require(\"./player_button\"),\n Annotation = require(\"./annotation\"),\n templateName = 'controls';\n\n// Control uses a \"ui state\" to determine how UI is rendered - this object is the base state, containing a\n// default value for each item in the state\nconst BASE_UI_STATE = Object.freeze({\n adding: false, // Are we currently adding a new annotation? (step 1 of flow)\n writingComment: false // Are we currently writing the comment for annotation (step 2 of flow)\n});\n\nmodule.exports = class Controls extends PlayerUIComponent {\n\n constructor (player, bindArrowKeys) {\n super(player);\n this.initAPI(this, 'Controls');\n\n this.internalCommenting = this.plugin.options.internalCommenting;\n this.showControls = this.plugin.options.showControls;\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.bindEvents(bindArrowKeys);\n\n if(this.showControls){\n // create player button in the control bar if controls are shown\n this.playerButton = new PlayerButton(this.player);\n }\n\n this.render();\n }\n\n // Bind all the events we need for UI interaction\n bindEvents (bindArrowKeys) {\n this.$player.on(\"click.vac-controls\", \".vac-controls button\", this.startAddNew.bind(this)) // Add new button click\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-next\", () => this.plugin.annotationState.nextAnnotation() ) // Click 'next' on annotation nav\n .on(\"click.vac-controls\", \".vac-annotation-nav .vac-a-prev\", () => this.plugin.annotationState.prevAnnotation() ) // Click 'prev' on annotation nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-next\", () => this.marker.scrubStart(1) ) // Click '+1 sec' on marker nav\n .on(\"click.vac-controls\", \".vac-video-move .vac-a-prev\", () => this.marker.scrubStart(-1) ); // Click '-1 sec' on marker nav\n\n if(this.internalCommenting) {\n this.$player.on(\"click.vac-controls\", \".vac-add-controls button\", this.writeComment.bind(this)) // 'Next' button click while adding\n .on(\"click.vac-controls\", \".vac-video-write-new.vac-is-annotation button\", this.saveNew.bind(this)) // 'Save' button click while adding\n .on(\"click.vac-controls\", \".vac-add-controls a, .vac-video-write-new.vac-is-annotation a\", this.cancelAddNew.bind(this)) // Cancel link click\n }\n if(bindArrowKeys){\n $(document).on(`keyup.vac-nav-${this.playerId}`, (e) => this.handleArrowKeys(e)); // Use arrow keys to navigate annotations\n }\n }\n\n // Remove UI and unbind events for this and child components\n teardown () {\n this.clear(true);\n this.$player.off('click.vac-controls');\n $(document).off(`keyup.vac-nav-${this.playerId} mousemove.vac-tooltip-${this.playerId}`);\n if(this.playerButton) this.playerButton.teardown();\n super.teardown();\n }\n\n // Clear existing UI (resetting components if need be)\n clear (reset=false) {\n if(reset){\n if(this.uiState.adding){\n this.restoreNormalUI();\n this.marker.teardown();\n this.selectableShape.teardown();\n }\n this.uiState = Utils.cloneObject(BASE_UI_STATE);\n this.$player.find('.vac-video-cover-canvas')\n .off('mousedown.vac-cursor-tooltip')\n .off('mouseup.vac-cursor-tooltip');\n }\n this.$tooltip_ = null;\n this.$UI.controlElements.remove();\n }\n\n // Render the UI elements (based on uiState)\n render (reset=false) {\n this.clear(reset);\n let data = Object.assign(\n {\n rangeStr: this.marker ? Utils.humanTime(this.marker.range) : null,\n showNav: this.plugin.annotationState.annotations.length > 1\n },\n this.uiState,\n { internalCommenting: this.internalCommenting, showControls: this.showControls }\n );\n\n let $ctrls = this.renderTemplate(templateName, data);\n this.$player.append($ctrls);\n\n if(this.playerButton) this.playerButton.updateNumAnnotations();\n }\n\n // User clicked to cancel in-progress add - restore to normal state\n cancelAddNew () {\n if(!(this.uiState.adding || this.uiState.writingComment)) return;\n this.render(true);\n this.marker.teardown();\n this.marker = null;\n }\n\n // User clicked 'add' button in the controls - setup UI and marker\n startAddNew () {\n if(!this.plugin.active) this.plugin.toggleAnnotationMode();\n\n this.player.pause();\n this.setAddingUI();\n this.uiState.adding = true;\n this.render();\n\n // construct new range and create marker\n let range = {\n start: parseInt(this.currentTime,10),\n stop: parseInt(this.currentTime,10)\n };\n this.marker = new DraggableMarker(this.player, range);\n this.selectableShape = new SelectableShape(this.player);\n\n // show cursor help text if controls are hidden\n if(!this.showControls) this.bindCursorTooltip();\n\n this.plugin.fire('enteredAddingAnnotation', { range: range });\n }\n\n // User clicked 'next' action - show UI to write comment\n writeComment () {\n this.uiState.writingComment = true;\n this.render();\n }\n\n // User clicked to save a new annotation/comment during add new flow\n saveNew () {\n let comment = this.$UI.newCommentTextarea.val();\n if(!comment) return; // empty comment - TODO add validation / err message\n\n let a = Annotation.newFromData(this.marker.range, this.selectableShape.shape, comment, this.plugin);\n this.plugin.annotationState.addNewAnnotation(a);\n\n this.cancelAddNew();\n }\n\n // Change normal UI (hide markers, hide playback, etc) on init add state\n setAddingUI () {\n this.plugin.annotationState.enabled = false;\n this.disablePlayingAndControl();\n }\n\n // Restore normal UI after add state\n restoreNormalUI () {\n this.plugin.annotationState.enabled = this.plugin.active;\n this.enablePlayingAndControl();\n $(document).off(`mousemove.vac-tooltip-${this.playerId}`);\n }\n\n // On arrow key press, navigate to next or prev Annotation\n handleArrowKeys (e) {\n if(!this.plugin.active) return;\n let keyId = e.which;\n\n if(keyId == 37) this.plugin.annotationState.prevAnnotation();\n if(keyId == 39) this.plugin.annotationState.nextAnnotation();\n }\n\n // Adds help text to cursor during annotation mode\n bindCursorTooltip () {\n this.tooltipArea = Utils.areaOfHiddenEl(this.$tooltip, this.$UI.coverCanvas, this.UI_CLASSES.hidden);\n\n // Assert bounds are updated in plugin in case page was modified since creation, so tooltip math is correct\n this.plugin.setBounds(false);\n $(document).on(`mousemove.vac-tooltip-${this.playerId}`, Utils.throttle(((event) => {\n if(!this.plugin.bounds) return;\n\n let x = event.pageX,\n y = event.pageY,\n outOfBounds =\n (x < this.plugin.bounds.left || x > this.plugin.bounds.right) ||\n (y < this.plugin.bounds.top || y > this.plugin.bounds.bottom),\n withinControls = !outOfBounds && y >= this.plugin.bounds.bottomWithoutControls,\n markerHovered = this.$tooltip.hasClass('vac-marker-hover');\n\n if(outOfBounds) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n return\n }\n\n let cursorX = x - this.plugin.bounds.left,\n cursorY = y - this.plugin.bounds.top,\n margin = 10,\n rightEdge = this.$player.width(),\n bottomEdge = this.$player.height() - this.$UI.controlBar.height(),\n atRightEdge = (cursorX + this.tooltipArea.width + margin*2) >= rightEdge,\n atBottomEdge = (cursorY + this.tooltipArea.height + margin*2) >= bottomEdge;\n\n // is the tooltip too close to the right or bottom edge?\n let posX = atRightEdge ? (rightEdge - this.tooltipArea.width - margin) : (cursorX + margin),\n posY = atBottomEdge ? (bottomEdge - this.tooltipArea.height - margin) : (cursorY + margin);\n\n // hide if the cursor is over the control bar but not hovering over the draggable marker\n // also hide if mouse is down\n if((withinControls && !markerHovered) || this.$tooltip.hasClass('vac-cursor-dragging')) {\n this.$tooltip.addClass(this.UI_CLASSES.hidden);\n } else {\n this.$tooltip.removeClass(this.UI_CLASSES.hidden);\n }\n\n this.$tooltip.css({\n left: `${posX}px`,\n top: `${posY}px`\n });\n }).bind(this), 50));\n }\n\n get $tooltip () {\n this.$tooltip_ = this.$tooltip_ || this.$player.find('.vac-cursor-tool-tip');\n return this.$tooltip_;\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker that is draggable when user clicks/drags on it, and rebuilds underlying range\n as drag occurs\n*/\n\nconst Marker = require(\"./marker\"),\n Utils = require('./../lib/utils'),\n markerTemplateName = 'draggable_marker';\n\nmodule.exports = class DraggableMarker extends Marker {\n\n constructor (player, range) {\n super(player, range);\n this.range = range; // NOTE - this shouldn't be required and is a HACK for how transpilation works in IE10\n this.templateName = markerTemplateName; // Change template from base Marker template\n this.dragging = false; // Is a drag action currently occring?\n this.rangePin = range.start; // What's the original pinned timeline point when marker was added\n this.render();\n this.$parent = this.$UI.markerWrap; // Set parent as marker wrap\n }\n\n // Bind needed evnets for UI interaction\n bindMarkerEvents () {\n // On mouse down init drag\n this.$el.on('mousedown.vac-marker', (e) => {\n e.preventDefault();\n this.dragging = true;\n // When mouse moves (with mouse down) call onDrag, throttling to once each 250 ms\n $(document).on(`mousemove.vac-dmarker-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 250) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .addClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse up end drag action and unbind mousemove event\n $(document).on(`mouseup.vac-dmarker-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n $(document).off(`mousemove.vac-dmarker-${this.playerId}`);\n this.dragging = false;\n\n // Remove drag class and hover class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip')\n .removeClass('vac-cursor-dragging')\n .removeClass('vac-marker-hover');\n }\n });\n\n // On mouse mouse enter, show cursor tooltip if controls are not shown\n // This adds the class which is picked up in Controls\n if(!this.plugin.options.showControls) {\n var self = this;\n self.$el\n .on('mouseenter.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').addClass('vac-marker-hover');\n })\n .on('mouseleave.vac-cursor-tool-tip', () => {\n self.$player.find('.vac-cursor-tool-tip').removeClass('vac-marker-hover');\n });\n };\n }\n\n // On drag action, calculate new range and re-render marker\n onDrag (e) {\n var dragPercent = this.percentValFromXpos(e.pageX),\n secVal = parseInt(this.duration * dragPercent);\n\n if(secVal > this.rangePin){\n this.range = {\n start: this.rangePin,\n end: secVal\n };\n }else{\n this.range = {\n start: secVal,\n end: this.rangePin\n };\n }\n this.render();\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n\n // Cal percentage (of video) position for a pixel-based X position on the document\n percentValFromXpos (xpos) {\n var x = Math.max(0, xpos - this.$parent.offset().left), // px val\n max = this.$parent.innerWidth(),\n per = (x / max);\n if(per > 1) per = 1;\n if(per < 0) per = 0;\n return per;\n }\n\n // Remove bound events on destructon\n teardown () {\n $(document).off(`mousemove.vac-dmarker-${this.playerId} mouseup.vac-dmarker-${this.playerId}`);\n this.$el.off('mouseenter.vac-cursor-tool-tip');\n this.$el.off('mouseleave.vac-cursor-tool-tip');\n this.$el.off('mousedown.vac-marker');\n this.$el.remove();\n }\n\n // Move the video & marker start by some num seconds (pos or neg)\n scrubStart (secondsChanged) {\n let newStart = this.range.start + secondsChanged;\n this.currentTime = newStart;\n this.range.start = newStart;\n this.rangePin = newStart;\n this.teardown();\n this.render();\n\n this.plugin.fire('addingAnnotationDataChanged', { range: this.range });\n }\n}\n","\"use strict\";\n/*\n Component for a timeline marker with capabilities to render on timeline, including tooltip for comment\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n Utils = require(\"./../lib/utils\"),\n markerTemplateName = 'marker',\n markerWrapTemplateName = 'marker_wrap';\n\nmodule.exports = class Marker extends PlayerUIComponent {\n\n constructor (player, range, comment=null) {\n super(player);\n this.range = range;\n this.comment = comment;\n this.templateName = markerTemplateName;\n\n if(!this.$UI.markerWrap.length){\n this.$UI.timeline.append(\n this.renderTemplate(markerWrapTemplateName)\n );\n }\n }\n\n // Set this marker as active (highlight) and optionally show tooltip also\n setActive (showTooltip=false) {\n this.$el.addClass(this.UI_CLASSES.active);\n if(showTooltip) this.$el.addClass('vac-force-tooltip');\n }\n\n // Deactivate this marker\n deactivate () {\n this.$el.removeClass(`${this.UI_CLASSES.active} vac-force-tooltip`);\n }\n\n // Draw marker on timeline for this.range;\n render () {\n // clear existing marker if this one was already rendered\n this.$UI.timeline.find(`[data-marker-id=\"${this.componentId}\"]`).remove();\n\n // Bind to local instance var, add to DOM, and setup events\n this.$el = $(this.renderTemplate(this.templateName, this.markerTemplateData));\n this.$UI.markerWrap.append(this.$el);\n this.bindMarkerEvents();\n }\n\n // Bind needed events for this marker\n bindMarkerEvents () {\n // handle dimming other markers + highlighting this one on mouseenter/leave\n this.$el.on(\"mouseenter.vac-marker\", () => {\n this.$el.addClass('vac-hovering').closest(\".vac-marker-wrap\").addClass('vac-dim-all');\n }).on(\"mouseleave.vac-marker\", () => {\n this.$el.removeClass('vac-hovering').closest(\".vac-marker-wrap\").removeClass('vac-dim-all');\n });\n }\n\n // Build object for template\n get markerTemplateData () {\n // the smaller the width, the higher the z-index so overlaps are clickable\n let left = (this.range.start / this.duration) * 100,\n width = ((this.range.end / this.duration) * 100) - left,\n zIndex = (100 - Math.floor(width)) || 100;\n return {\n left: left + '%',\n width: width + '%',\n zIndex: zIndex,\n showTooltip: this.plugin.options.showMarkerShapeAndTooltips,\n tooltipRight: left > 50,\n tooltipTime: Utils.humanTime(this.range),\n tooltipBody: !this.comment ? null : this.comment.body,\n rangeShow: !!this.range.end,\n id: this.componentId\n };\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el\n .off('mouseenter.vac-marker')\n .off('mouseleave.vac-marker')\n .off('click.vac-marker');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component main 'annotation toggle' button in the player controls, including notifier for # annotations\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\"),\n templateName = \"player_button\";\n\nmodule.exports = class PlayerButton extends PlayerUIComponent {\n\n constructor (player) {\n super(player);\n this.render();\n\n this.initAPI(this, 'PlayerButton');\n\n this.$el.on('click.vac-player-button', () => {\n this.plugin.toggleAnnotationMode();\n });\n }\n\n // Add button to player\n render () {\n let btn = this.player.getChild('controlBar').addChild('button', {});\n btn.controlText(\"Toggle Animations\");\n this.$el = $(btn.el());\n this.$el.addClass('vac-player-btn').find(\".vjs-icon-placeholder\").html(this.renderTemplate(templateName));\n }\n\n // Update the number of annotations displayed in the bubble\n updateNumAnnotations () {\n let num = this.plugin.annotationState.annotations.length,\n $bubble = this.$el.find(\"b\");\n $bubble.text(num);\n num > 0 ? $bubble.removeClass(this.UI_CLASSES.hidden) : $bubble.addClass(this.UI_CLASSES.hidden);\n }\n\n // Unbind event listeners on teardown and remove DOM nodes\n teardown () {\n this.$el.off('click.vac-player-button');\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for a shape that can be drug/sized on top of the video while adding a new annotation\n*/\n\nconst Shape = require(\"./shape\"),\n Utils = require('./../lib/utils');\n\nmodule.exports = class SelectableShape extends Shape {\n\n constructor (player) {\n super(player);\n this.$parent = this.$player.find(\".vac-video-cover-canvas\");\n this.bindEvents();\n this.dragging = false;\n }\n\n // Bind all needed events for drag action\n bindEvents () {\n // On mousedown initialize drag\n this.$parent.on(\"mousedown.vac-selectable-shape\", (e) => {\n // Check a few conditions to see if we should *not* start drag\n if( !($(e.target).hasClass('vac-video-cover-canvas')) ) return; //didn't click on overlay\n if( $(e.target).hasClass('vac-shape') ) return; //user clicked on annotation\n\n // Remove old shape if one existed\n if(this.$el) this.$el.remove();\n\n // Define default starting shape (just x/y coords of where user clicked no width/height yet)\n let shape = {\n x1: this.xCoordToPercent(e.pageX),\n y1: this.YCoordToPercent(e.pageY)\n };\n shape.x2 = shape.x1;\n shape.y2 = shape.y2;\n this.shape = shape;\n\n // Save origin points for future use\n this.originX = shape.x1;\n this.originY = shape.y1;\n\n // Draw shape and start drag state\n this.render();\n this.dragging = true;\n this.dragMoved = false; // used to determine if user actually dragged or just clicked\n\n // Bind event on doc mousemove to track drag, throttled to once each 100ms\n $(document).on(`mousemove.vac-sshape-${this.playerId}`, Utils.throttle(this.onDrag.bind(this), 100) );\n\n // Add drag class to cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').addClass('vac-cursor-dragging');\n }\n });\n\n // On mouseup, if during drag cancel drag event listeners\n $(document).on(`mouseup.vac-sshape-${this.playerId}`, (e) => {\n if(!this.dragging) return;\n\n $(document).off(`mousemove.vac-sshape-${this.playerId}`);\n\n if(!this.dragMoved){\n //clear shape if it's just a click (and not a drag)\n this.shape = null;\n if(this.$el) this.$el.remove();\n }\n\n this.dragging = false;\n\n // Remove drag class from cursor tooltip if available\n if(!this.plugin.options.showControls) {\n this.$player.find('.vac-cursor-tool-tip').removeClass('vac-cursor-dragging');\n }\n });\n }\n\n // On each interation of drag action (mouse movement), recalc position and redraw shape\n onDrag (e) {\n this.dragMoved = true;\n\n let xPer = this.xCoordToPercent(e.pageX),\n yPer = this.YCoordToPercent(e.pageY);\n\n if(xPer < this.originX){\n this.shape.x2 = this.originX;\n this.shape.x1 = Math.max(0, xPer);\n }else{\n this.shape.x2 = Math.min(100, xPer);\n this.shape.x1 = this.originX;\n }\n if(yPer < this.originY){\n this.shape.y2 = this.originY;\n this.shape.y1 = Math.max(0, yPer);\n }else{\n this.shape.y2 = Math.min(100, yPer);\n this.shape.y1 = this.originY;\n }\n this.setDimsFromShape();\n\n this.plugin.fire('addingAnnotationDataChanged', { shape: this.shape });\n }\n\n // Convert pixel-based x position (relative to document) to percentage in video\n xCoordToPercent (x) {\n x = x - this.$parent.offset().left; //pixel position\n let max = this.$parent.innerWidth();\n return Number(((x / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Convert pixel-based y position (relative to document) to percentage in video\n YCoordToPercent (y) {\n y = y - this.$parent.offset().top; //pixel position\n let max = this.$parent.innerHeight();\n return Number(((y / max) * 100).toFixed(2)); //round to 2 decimal places\n }\n\n // Unbind events and remove element\n teardown () {\n this.$parent.off('mousedown.vac-selectable-shape');\n $(document).off(`mouseup.vac-sshape-${this.playerId} mousemove.vac-sshape-${this.playerId}`);\n super.teardown();\n }\n}\n","\"use strict\";\n/*\n Component for managing a shape (i.e. box drawn on the player) for an annotation\n*/\n\nconst PlayerUIComponent = require(\"./../lib/player_ui_component\");\n\nmodule.exports = class Shape extends PlayerUIComponent {\n\n constructor (player, shape=null) {\n super(player);\n this.shape = shape;\n this.$parent = this.$player;\n }\n\n // Draw the shape element on the $parent\n render () {\n if(!this.shape) return;\n if(this.$el) this.$el.remove();\n\n this.$el = $(\"
\").addClass(\"vac-shape\");\n this.setDimsFromShape();\n this.$parent.append(this.$el);\n }\n\n // Set/update the dimensions of the shape based on this.shape\n setDimsFromShape () {\n this.$el.css({\n left: this.shape.x1 + \"%\",\n top: this.shape.y1 + \"%\",\n width: (this.shape.x2-this.shape.x1) + \"%\",\n height: (this.shape.y2-this.shape.y1) + \"%\"\n });\n }\n}\n","\"use strict\";\n/*\n Load plugin and register to global videojs\n*/\n\n(($, videojs) => {\n const AnnotationComments = require('./annotation_comments.js');\n videojs.registerPlugin(\n 'annotationComments',\n AnnotationComments(videojs)\n );\n})(jQuery, window.videojs);\n","'use strict';\n/*\n Classes for registering and handling custom events for external interaction support.\n Will be bound to plugin object as a message gateway between external elements and the plugin.\n*/\n\nconst Logger = require(\"./logger\");\n\n/*\n A centralized collection of event callbacks organized by component and name\n Main reference for external event api\n These events will be bound to the plugin on initialization of their respective components\n NOTE - 'self' as second param in each function is a workaround for transpiler not properly\n keeping this , so we pass in instance to use as this for each fn - can't rely on bind\n because this is rewritten from symbol registry in transpiler and it's not present\n*/\n\nconst EventRegistry = {\n AnnotationState: {\n openAnnotation: (event, _this) => {\n _this.openAnnotationById(event.detail.id);\n },\n closeActiveAnnotation: (event, _this) => {\n _this.clearActive();\n },\n newAnnotation: (event, _this) => {\n _this.createAndAddAnnotation(event.detail);\n },\n destroyAnnotation: (event, _this) => {\n _this.destroyAnnotationById(event.detail.id);\n },\n newComment: (event, _this) => {\n let annotation = _this.findAnnotation(event.detail.annotationId);\n if(annotation) annotation.commentList.createComment(event.detail.body);\n },\n destroyComment: (event, _this) => {\n let comment = _this.findComment(event.detail.id);\n if(comment) comment.commentList.destroyComment(event);\n }\n },\n Controls: {\n addingAnnotation: (event, _this) => {\n _this.startAddNew();\n },\n cancelAddingAnnotation: (event, _this) => {\n _this.cancelAddNew();\n }\n },\n PlayerButton: {\n onStateChanged: (event, _this) => {\n _this.updateNumAnnotations();\n }\n },\n AnnotationComments: {\n toggleAnnotationMode: (event, _this) => {\n _this.toggleAnnotationMode();\n }\n }\n};\n\nmodule.exports = class EventDispatcher {\n\n constructor (plugin) {\n this.plugin = plugin;\n this.pluginReady = false;\n this.pendingEvts = [];\n this.registeredListeners = [];\n this.eventRegistry = EventRegistry;\n }\n\n // Use the EventRegistry to mass register events on each component initialization\n registerListenersFor (obj, className) {\n let matchingEvents = this.eventRegistry[className];\n if (matchingEvents) {\n Object.keys(matchingEvents).forEach((key) => {\n // Don't register again if already in cached collection\n if (!~this.registeredListeners.indexOf(key)) {\n let callback = matchingEvents[key].bind(obj);\n this.registerListener(key, ((evt) => {\n if(!this.pluginReady) return;\n this.logCallback(key, className, evt);\n callback(evt, obj);\n }).bind(this));\n }\n });\n }\n }\n\n // Bind a listener to the plugin\n registerListener (type, callback) {\n this.plugin.on(type, callback);\n this.registeredListeners.push(type);\n }\n\n // Unbind a listener from the plugin\n unregisterListener (type) {\n this.plugin.off(type);\n let i = this.registeredListeners.indexOf(type);\n this.registeredListeners.splice(i, 1);\n }\n\n // Trigger an event on the plugin\n fire (type, data) {\n if(!this.pluginReady) return;\n Logger.log(\"evt-dispatch-FIRE\", type, data);\n let evt = new CustomEvent(type, { 'detail': data });\n this.plugin.trigger(evt);\n }\n\n teardown () {\n this.registeredListeners.forEach((type) => { this.unregisterListener(type) });\n }\n\n logCallback (eventName, className, event) {\n Logger.log(\"evt-dispatch-RECEIVE\", `${eventName} (${className})`, event);\n }\n}\n","'use strict';\n/*\n\tGeneral logging library, checking to see if window.VAC_DEBUG is present and true to enable debugging\n*/\n\n// Prefix for appending to all logger messages\nconst LOG_PREFIX = \"::VAC::\";\n\n// Are we in debug mode?\nfunction debug(){\n\treturn !!window.VAC_DEBUG;\n}\n\n// Build arguments for console fn, adding prefix\nfunction buildArgs(args){\n\treturn [LOG_PREFIX].concat(args);\n}\n\n// Log message/data\nmodule.exports.log = (...args) => {\n if(!debug()) return;\n console.log.apply(null, buildArgs(args));\n}\n\n// Error message/data\nmodule.exports.error = (...args) => {\n if(!debug()) return;\n console.error.apply(null, buildArgs(args));\n}\n\n// Info message/data\nmodule.exports.info = (...args) => {\n if(!debug()) return;\n console.info.apply(null, buildArgs(args));\n}\n","\"use strict\";\n/*\n Base class all player components interit from - it includes lots of helper functions (to get reference to\n the player, the plugin, video state, etc)\n*/\n\nmodule.exports = class PlayerComponent {\n\n constructor (player) {\n this._player = player;\n }\n\n // attribute to get reference to the main plugin object (main.js instance)\n get plugin () {\n return this.player.annotationComments();\n }\n\n // attribute to get player javascript instance\n get player () {\n return this._player;\n }\n\n // attribute to get video duration (in seconds)\n get duration () {\n return this.player.duration();\n }\n\n // attribute to get player current time\n get currentTime () {\n return this.player.currentTime();\n }\n\n // set current time of player\n set currentTime (time) {\n this.player.currentTime(time);\n }\n\n // Register all events in the EventRegistry matching this className\n initAPI (obj, className) {\n this.plugin.eventDispatcher.registerListenersFor(obj, className);\n }\n\n // Nullify player reference so objects can be removed safely\n // All components should call super.teardown() within their teardown funcs\n teardown (destroy=false) {\n if(destroy) this._player = null;\n }\n}\n","\"use strict\";\n/*\n Base class all player UI components interit from - it includes lots of helper functions (to get reference to\n the player $el, various classes/helpers, template rendering, etc)\n*/\n\nconst PlayerComponent = require(\"./player_component\"),\n Handlebars = require('handlebars/runtime'),\n Templates = require('./../compiled/templates'),\n Utils = require('./../lib/utils');\n\nmodule.exports = class PlayerUIComponent extends PlayerComponent {\n\n constructor (player) {\n super(player);\n }\n\n // helpers to get various UI components of the player quickly, keeping commonly reused class names\n // consolidated in case of need to change in the future (and for quick access)\n get $UI () {\n return Object.freeze({\n commentsContainer: this.$player.find(\".vac-comments-container\"), // outer container for all comments\n controlElements: this.$player.find(\".vac-control\"), // Each of multiple control elements in the control bar\n newCommentTextarea: this.$player.find(\".vac-video-write-new textarea\"), // Textarea for writing a new comment\n timeline: this.$player.find('.vjs-progress-control'), // Timeline element\n markerCursorHelpText: this.$player.find('.vac-cursor-help-text'), // Help text that appears with 'click/drag..' on timeline\n controlBar: this.$player.find('.vjs-control-bar'), // Conrol bar wrapper for vjs\n markerWrap: this.$player.find('.vac-marker-wrap'), // wrapper element to place markers in on timeline\n coverCanvas: this.$player.find('.vac-video-cover-canvas') // Player cover during adding annotation state\n });\n }\n\n // utility classes used in various components\n get UI_CLASSES () {\n return Object.freeze({\n hidden: \"vac-hidden\",\n active: \"vac-active\"\n });\n }\n\n // attribute to get player jquery element\n get $player () {\n return $(this.player.el());\n }\n\n\n // attribute to get player id from DOM\n get playerId () {\n return this.$player.attr('id');\n }\n\n // Generate a pseudo-guid ID for this component, to use as an ID in the DOM\n get componentId () {\n this.cid_ = this.cid_ || Utils.guid()\n return this.cid_;\n }\n\n // Disable play/control actions on the current player\n disablePlayingAndControl () {\n this.$player.addClass('vac-disable-play');\n //TODO - catch spacebar being hit\n //TODO - prevent scrubbing and timeline click to seek\n }\n\n // Enable play/control actions on the controller\n enablePlayingAndControl () {\n this.$player.removeClass('vac-disable-play');\n }\n\n // Render a handlebars template with local data passed in via key/val in object\n renderTemplate (templateName, options = {}) {\n this.registerHandlebarsHelpers();\n return Templates[templateName](options);\n }\n\n // Handle escaped breaklines in Handlebars\n registerHandlebarsHelpers () {\n if('breaklines' in Handlebars.helpers) return;\n\n Handlebars.registerHelper('breaklines', (text) => {\n text = Handlebars.Utils.escapeExpression(text);\n text = text.replace(/(\\r\\n|\\n|\\r)/gm, '
');\n return new Handlebars.SafeString(text);\n });\n }\n\n // Provide basic teardown function to inherit\n teardown () {\n if(this.$el) this.$el.remove();\n super.teardown();\n }\n}\n","/*\n Collection of polyfills neededf or IE10+ support\n*/\n\n// Array.prototype.find() for IE10+\nrequire('ie-array-find-polyfill');\n// Object.assign for IE10+\nrequire('es6-object-assign').polyfill();\n\n// Allow use of object.constructor.staticFunc() in IE\n// Not yet supported by babel\n// https://gist.github.com/edoardocavazza/47246856759f2273e48b\n(function () {\n if (typeof Object.setPrototypeOf === 'undefined' && typeof Object.getOwnPropertyNames === 'function') {\n var _exclude = ['length', 'name', 'arguments', 'caller', 'prototype'];\n\n function bindFunction(ctx, fn) {\n return function() {\n return fn.apply(this, arguments);\n }\n }\n\n function bindProperty(ctx, prop, parentDescriptor) {\n if (!parentDescriptor) {\n var defaultValue = ctx.__proto__[prop];\n parentDescriptor = {\n get: function () {\n return ctx['__' + prop] || defaultValue\n },\n set: function (val) {\n ctx['__' + prop] = val;\n }\n }\n }\n Object.defineProperty(ctx, prop, {\n get: parentDescriptor.get ? parentDescriptor.get.bind(ctx) : undefined,\n set: parentDescriptor.set ? parentDescriptor.set.bind(ctx) : undefined,\n configurable: true\n });\n\n }\n\n function iterateProps(subClass, superClass) {\n var props = Object.getOwnPropertyNames(superClass),\n proto;\n\n subClass.__proto__ = superClass;\n for (var i = 0, len = props.length; i < len; i++) {\n var prop = props[i];\n if (prop === '__proto__') {\n proto = superClass[prop];\n } else if (_exclude.indexOf(i) === -1) {\n var descriptor = Object.getOwnPropertyDescriptor(subClass, prop);\n if (!descriptor) {\n var superDescriptor = Object.getOwnPropertyDescriptor(superClass, prop);\n if (typeof superDescriptor.get !== 'function' && typeof superClass[prop] === 'function') {\n subClass[prop] = bindFunction(subClass, superClass[prop]);\n } else if (typeof superDescriptor.get == 'function') {\n bindProperty(subClass, prop, superDescriptor);\n } else {\n bindProperty(subClass, prop);\n }\n }\n }\n }\n if (proto) {\n iterateProps(subClass, proto);\n }\n }\n\n Object.setPrototypeOf = iterateProps;\n }\n})();\n\n// Use CustomEvent in IE\n(function () {\n if ( typeof window.CustomEvent === \"function\" ) return false;\n\n function CustomEvent ( event, params ) {\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n var evt = document.createEvent( 'CustomEvent' );\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\n return evt;\n }\n\n CustomEvent.prototype = window.Event.prototype;\n\n window.CustomEvent = CustomEvent;\n})();\n","\"use strict\";\n/*\n Geneal utility functions, sourced from underscore & scratch built as needed\n*/\n\nmodule.exports = {\n\n // Clone an object\n cloneObject: (obj) => Object.assign({}, obj),\n\n // _throttle from underscore\n throttle: (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function() {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function() {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n // Parse all keys of an object to int\n parseIntObj: (obj) => {\n Object.keys(obj).forEach((key) => {\n if(parseInt(obj[key])) {\n obj[key] = parseInt(obj[key]);\n }\n });\n return obj;\n },\n\n // Convert a range {start: int, (optional) end: int} to human readable time\n humanTime: (range) => {\n function readable(sec){\n let mins = Math.floor(sec/60),\n secs = String(sec % 60);\n return mins + \":\" + (secs.length==1 ? \"0\" : \"\") + secs;\n }\n let time = [readable(range.start)];\n if(range.end) time.push(readable(range.end));\n return time.join(\"-\");\n },\n\n // Pseduo-random guid generator\n guid: () => {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n },\n\n // Returns the height and width of an element that is not visible\n // clones el and tricks DOM into rendering it w the correct size\n // beware the container may be important for scoped styles\n areaOfHiddenEl: ($el, $container, hideClass='') => {\n let $clone = $el.clone(),\n data = {};\n $clone.css({\n visibility: 'hidden',\n display: 'inline-block'\n });\n $clone.removeClass(hideClass);\n $container.append($clone);\n data.width = $clone.outerWidth();\n data.height = $clone.outerHeight();\n $clone.remove();\n\n return data;\n },\n\n // Determine if a value (n) is within a range (start <= n <= end)\n isWithinRange: (start, end, n) => {\n end = end || start + 1; // for ranges with NO end defined, assume a 1s range\n return n >= start && n <= end;\n }\n};\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZXM2LW9iamVjdC1hc3NpZ24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy5ydW50aW1lLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9kZWNvcmF0b3JzL2lubGluZS5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2Jsb2NrLWhlbHBlci1taXNzaW5nLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9lYWNoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy9oZWxwZXItbWlzc2luZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9oZWxwZXJzL2xvZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvaGVscGVycy93aXRoLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvbGliL2hhbmRsZWJhcnMvbG9nZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9uby1jb25mbGljdC5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvaGFuZGxlYmFycy9saWIvaGFuZGxlYmFycy9zYWZlLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvcnVudGltZS5qcyIsIm5vZGVfbW9kdWxlcy9pZS1hcnJheS1maW5kLXBvbHlmaWxsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJzcmMvanMvYW5ub3RhdGlvbl9jb21tZW50cy5qcyIsInNyYy9qcy9jb21waWxlZC90ZW1wbGF0ZXMuanMiLCJzcmMvanMvY29tcG9uZW50cy9hbm5vdGF0aW9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvYW5ub3RhdGlvbl9zdGF0ZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL2NvbW1lbnQuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb21tZW50X2xpc3QuanMiLCJzcmMvanMvY29tcG9uZW50cy9jb250cm9scy5qcyIsInNyYy9qcy9jb21wb25lbnRzL2RyYWdnYWJsZV9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9tYXJrZXIuanMiLCJzcmMvanMvY29tcG9uZW50cy9wbGF5ZXJfYnV0dG9uLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvc2VsZWN0YWJsZV9zaGFwZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL3NoYXBlLmpzIiwic3JjL2pzL2luZGV4LmpzIiwic3JjL2pzL2xpYi9ldmVudF9kaXNwYXRjaGVyLmpzIiwic3JjL2pzL2xpYi9sb2dnZXIuanMiLCJzcmMvanMvbGliL3BsYXllcl9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BsYXllcl91aV9jb21wb25lbnQuanMiLCJzcmMvanMvbGliL3BvbHlmaWxscy5qcyIsInNyYy9qcy9saWIvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OzhCQzlDc0IsbUJBQW1COztJQUE3QixJQUFJOzs7OztvQ0FJTywwQkFBMEI7Ozs7bUNBQzNCLHdCQUF3Qjs7OzsrQkFDdkIsb0JBQW9COztJQUEvQixLQUFLOztpQ0FDUSxzQkFBc0I7O0lBQW5DLE9BQU87O29DQUVJLDBCQUEwQjs7Ozs7QUFHakQsU0FBUyxNQUFNLEdBQUc7QUFDaEIsTUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7QUFFMUMsT0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkIsSUFBRSxDQUFDLFVBQVUsb0NBQWEsQ0FBQztBQUMzQixJQUFFLENBQUMsU0FBUyxtQ0FBWSxDQUFDO0FBQ3pCLElBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLElBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7O0FBRTdDLElBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ2hCLElBQUUsQ0FBQyxRQUFRLEdBQUcsVUFBUyxJQUFJLEVBQUU7QUFDM0IsV0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FB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TUFBTSxFQUFFLEdBQUcsRUFBRTtBQUN2QyxRQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNsQixTQUFPLE1BQU0sQ0FBQztDQUNmOztBQUVNLFNBQVMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRTtBQUNqRCxTQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFBLEdBQUksRUFBRSxDQUFDO0NBQ3BEOzs7O0FDM0dEO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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bnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuICogQ29kZSByZWZhY3RvcmVkIGZyb20gTW96aWxsYSBEZXZlbG9wZXIgTmV0d29yazpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIGZpcnN0U291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBmaXJzdCBhcmd1bWVudCB0byBvYmplY3QnKTtcbiAgfVxuXG4gIHZhciB0byA9IE9iamVjdCh0YXJnZXQpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGlmIChuZXh0U291cmNlID09PSB1bmRlZmluZWQgfHwgbmV4dFNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGtleXNBcnJheSA9IE9iamVjdC5rZXlzKE9iamVjdChuZXh0U291cmNlKSk7XG4gICAgZm9yICh2YXIgbmV4dEluZGV4ID0gMCwgbGVuID0ga2V5c0FycmF5Lmxlbmd0aDsgbmV4dEluZGV4IDwgbGVuOyBuZXh0SW5kZXgrKykge1xuICAgICAgdmFyIG5leHRLZXkgPSBrZXlzQXJyYXlbbmV4dEluZGV4XTtcbiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXh0U291cmNlLCBuZXh0S2V5KTtcbiAgICAgIGlmIChkZXNjICE9PSB1bmRlZmluZWQgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgaWYgKCFPYmplY3QuYXNzaWduKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdCwgJ2Fzc2lnbicsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogYXNzaWduXG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzc2lnbjogYXNzaWduLFxuICBwb2x5ZmlsbDogcG9seWZpbGxcbn07XG4iLCJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iLCJpbXBvcnQge2NyZWF0ZUZyYW1lLCBleHRlbmQsIHRvU3RyaW5nfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9leGNlcHRpb24nO1xuaW1wb3J0IHtyZWdpc3RlckRlZmF1bHRIZWxwZXJzfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtyZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzfSBmcm9tICcuL2RlY29yYXRvcnMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMSc7XG5leHBvcnQgY29uc3QgQ09NUElMRVJfUkVWSVNJT04gPSA3O1xuXG5leHBvcnQgY29uc3QgUkVWSVNJT05fQ0hBTkdFUyA9IHtcbiAgMTogJzw9IDEuMC5yYy4yJywgLy8gMS4wLnJjLjIgaXMgYWN0dWFsbHkgcmV2MiBidXQgZG9lc24ndCByZXBvcnQgaXRcbiAgMjogJz09IDEuMC4wLXJjLjMnLFxuICAzOiAnPT0gMS4wLjAtcmMuNCcsXG4gIDQ6ICc9PSAxLngueCcsXG4gIDU6ICc9PSAyLjAuMC1hbHBoYS54JyxcbiAgNjogJz49IDIuMC4wLWJldGEuMScsXG4gIDc6ICc+PSA0LjAuMCdcbn07XG5cbmNvbnN0IG9iamVjdFR5cGUgPSAnW29iamVjdCBPYmplY3RdJztcblxuZXhwb3J0IGZ1bmN0aW9uIEhhbmRsZWJhcnNFbnZpcm9ubWVudChoZWxwZXJzLCBwYXJ0aWFscywgZGVjb3JhdG9ycykge1xuICB0aGlzLmhlbHBlcnMgPSBoZWxwZXJzIHx8IHt9O1xuICB0aGlzLnBhcnRpYWxzID0gcGFydGlhbHMgfHwge307XG4gIHRoaXMuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnMgfHwge307XG5cbiAgcmVnaXN0ZXJEZWZhdWx0SGVscGVycyh0aGlzKTtcbiAgcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyh0aGlzKTtcbn1cblxuSGFuZGxlYmFyc0Vudmlyb25tZW50LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEhhbmRsZWJhcnNFbnZpcm9ubWVudCxcblxuICBsb2dnZXI6IGxvZ2dlcixcbiAgbG9nOiBsb2dnZXIubG9nLFxuXG4gIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lLCBmbikge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7XG4gICAgICBpZiAoZm4pIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbignQXJnIG5vdCBzdXBwb3J0ZWQgd2l0aCBtdWx0aXBsZSBoZWxwZXJzJyk7IH1cbiAgICAgIGV4dGVuZCh0aGlzLmhlbHBlcnMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlbHBlcnNbbmFtZV0gPSBmbjtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24obmFtZSwgcGFydGlhbCkge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7XG4gICAgICBleHRlbmQodGhpcy5wYXJ0aWFscywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydGlhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihgQXR0ZW1wdGluZyB0byByZWdpc3RlciBhIHBhcnRpYWwgY2FsbGVkIFwiJHtuYW1lfVwiIGFzIHVuZGVmaW5lZGApO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lLCBmbikge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKG5hbWUpID09PSBvYmplY3RUeXBlKSB7XG4gICAgICBpZiAoZm4pIHsgdGhyb3cgbmV3IEV4Y2VwdGlvbignQXJnIG5vdCBzdXBwb3J0ZWQgd2l0aCBtdWx0aXBsZSBkZWNvcmF0b3JzJyk7IH1cbiAgICAgIGV4dGVuZCh0aGlzLmRlY29yYXRvcnMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlY29yYXRvcnNbbmFtZV0gPSBmbjtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5kZWNvcmF0b3JzW25hbWVdO1xuICB9XG59O1xuXG5leHBvcnQgbGV0IGxvZyA9IGxvZ2dlci5sb2c7XG5cbmV4cG9ydCB7Y3JlYXRlRnJhbWUsIGxvZ2dlcn07XG4iLCJpbXBvcnQgcmVnaXN0ZXJJbmxpbmUgZnJvbSAnLi9kZWNvcmF0b3JzL2lubGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVySW5saW5lKGluc3RhbmNlKTtcbn1cblxuIiwiaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJEZWNvcmF0b3IoJ2lubGluZScsIGZ1bmN0aW9uKGZuLCBwcm9wcywgY29udGFpbmVyLCBvcHRpb25zKSB7XG4gICAgbGV0IHJldCA9IGZuO1xuICAgIGlmICghcHJvcHMucGFydGlhbHMpIHtcbiAgICAgIHByb3BzLnBhcnRpYWxzID0ge307XG4gICAgICByZXQgPSBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYXJ0aWFscyBzdGFjayBmcmFtZSBwcmlvciB0byBleGVjLlxuICAgICAgICBsZXQgb3JpZ2luYWwgPSBjb250YWluZXIucGFydGlhbHM7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGV4dGVuZCh7fSwgb3JpZ2luYWwsIHByb3BzLnBhcnRpYWxzKTtcbiAgICAgICAgbGV0IHJldCA9IGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcmlnaW5hbDtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiIsIlxuY29uc3QgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107XG5cbmZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7XG4gIGxldCBsb2MgPSBub2RlICYmIG5vZGUubG9jLFxuICAgICAgbGluZSxcbiAgICAgIGNvbHVtbjtcbiAgaWYgKGxvYykge1xuICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTtcbiAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uO1xuXG4gICAgbWVzc2FnZSArPSAnIC0gJyArIGxpbmUgKyAnOicgKyBjb2x1bW47XG4gIH1cblxuICBsZXQgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG5cbiAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuXG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykge1xuICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXhjZXB0aW9uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvYykge1xuICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcblxuICAgICAgLy8gV29yayBhcm91bmQgaXNzdWUgdW5kZXIgc2FmYXJpIHdoZXJlIHdlIGNhbid0IGRpcmVjdGx5IHNldCB0aGUgY29sdW1uIHZhbHVlXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbHVtbicsIHtcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKG5vcCkge1xuICAgIC8qIElnbm9yZSBpZiB0aGUgYnJvd3NlciBpcyB2ZXJ5IHBhcnRpY3VsYXIgKi9cbiAgfVxufVxuXG5FeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydCBkZWZhdWx0IEV4Y2VwdGlvbjtcbiIsImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIiwiaW1wb3J0IHthcHBlbmRDb250ZXh0UGF0aCwgY3JlYXRlRnJhbWUsIGlzQXJyYXl9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2Jsb2NrSGVscGVyTWlzc2luZycsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBsZXQgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgICAgZm4gPSBvcHRpb25zLmZuO1xuXG4gICAgaWYgKGNvbnRleHQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmbih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRleHQgPT09IGZhbHNlIHx8IGNvbnRleHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGNvbnRleHQpKSB7XG4gICAgICBpZiAoY29udGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmlkcykge1xuICAgICAgICAgIG9wdGlvbnMuaWRzID0gW29wdGlvbnMubmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVycy5lYWNoKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludmVyc2UodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLm5hbWUpO1xuICAgICAgICBvcHRpb25zID0ge2RhdGE6IGRhdGF9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiIsImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtpc0VtcHR5LCBpc0Z1bmN0aW9ufSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29uZGl0aW9uYWwpKSB7IGNvbmRpdGlvbmFsID0gY29uZGl0aW9uYWwuY2FsbCh0aGlzKTsgfVxuXG4gICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW5kZXIgdGhlIHBvc2l0aXZlIHBhdGggaWYgdGhlIHZhbHVlIGlzIHRydXRoeSBhbmQgbm90IGVtcHR5LlxuICAgIC8vIFRoZSBgaW5jbHVkZVplcm9gIG9wdGlvbiBtYXkgYmUgc2V0IHRvIHRyZWF0IHRoZSBjb25kdGlvbmFsIGFzIHB1cmVseSBub3QgZW1wdHkgYmFzZWQgb24gdGhlXG4gICAgLy8gYmVoYXZpb3Igb2YgaXNFbXB0eS4gRWZmZWN0aXZlbHkgdGhpcyBkZXRlcm1pbmVzIGlmIDAgaXMgaGFuZGxlZCBieSB0aGUgcG9zaXRpdmUgcGF0aCBvciBuZWdhdGl2ZS5cbiAgICBpZiAoKCFvcHRpb25zLmhhc2guaW5jbHVkZVplcm8gJiYgIWNvbmRpdGlvbmFsKSB8fCBpc0VtcHR5KGNvbmRpdGlvbmFsKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gICAgfVxuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24oY29uZGl0aW9uYWwsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuaGVscGVyc1snaWYnXS5jYWxsKHRoaXMsIGNvbmRpdGlvbmFsLCB7Zm46IG9wdGlvbnMuaW52ZXJzZSwgaW52ZXJzZTogb3B0aW9ucy5mbiwgaGFzaDogb3B0aW9ucy5oYXNofSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uKG9iaiwgZmllbGQpIHtcbiAgICByZXR1cm4gb2JqICYmIG9ialtmaWVsZF07XG4gIH0pO1xufVxuIiwiaW1wb3J0IHthcHBlbmRDb250ZXh0UGF0aCwgYmxvY2tQYXJhbXMsIGNyZWF0ZUZyYW1lLCBpc0VtcHR5LCBpc0Z1bmN0aW9ufSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCd3aXRoJywgZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAoIWlzRW1wdHkoY29udGV4dCkpIHtcbiAgICAgIGxldCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwge1xuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMoW2NvbnRleHRdLCBbZGF0YSAmJiBkYXRhLmNvbnRleHRQYXRoXSlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQge2luZGV4T2Z9IGZyb20gJy4vdXRpbHMnO1xuXG5sZXQgbG9nZ2VyID0ge1xuICBtZXRob2RNYXA6IFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ10sXG4gIGxldmVsOiAnaW5mbycsXG5cbiAgLy8gTWFwcyBhIGdpdmVuIGxldmVsIHZhbHVlIHRvIHRoZSBgbWV0aG9kTWFwYCBpbmRleGVzIGFib3ZlLlxuICBsb29rdXBMZXZlbDogZnVuY3Rpb24obGV2ZWwpIHtcbiAgICBpZiAodHlwZW9mIGxldmVsID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IGxldmVsTWFwID0gaW5kZXhPZihsb2dnZXIubWV0aG9kTWFwLCBsZXZlbC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChsZXZlbE1hcCA+PSAwKSB7XG4gICAgICAgIGxldmVsID0gbGV2ZWxNYXA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbCA9IHBhcnNlSW50KGxldmVsLCAxMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxldmVsO1xuICB9LFxuXG4gIC8vIENhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IGVudmlyb25tZW50XG4gIGxvZzogZnVuY3Rpb24obGV2ZWwsIC4uLm1lc3NhZ2UpIHtcbiAgICBsZXZlbCA9IGxvZ2dlci5sb29rdXBMZXZlbChsZXZlbCk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGxvZ2dlci5sb29rdXBMZXZlbChsb2dnZXIubGV2ZWwpIDw9IGxldmVsKSB7XG4gICAgICBsZXQgbWV0aG9kID0gbG9nZ2VyLm1ldGhvZE1hcFtsZXZlbF07XG4gICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgeyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICBtZXRob2QgPSAnbG9nJztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGVbbWV0aG9kXSguLi5tZXNzYWdlKTsgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXI7XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihIYW5kbGViYXJzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGxldCByb290ID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3csXG4gICAgICAkSGFuZGxlYmFycyA9IHJvb3QuSGFuZGxlYmFycztcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgSGFuZGxlYmFycy5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHJvb3QuSGFuZGxlYmFycyA9PT0gSGFuZGxlYmFycykge1xuICAgICAgcm9vdC5IYW5kbGViYXJzID0gJEhhbmRsZWJhcnM7XG4gICAgfVxuICAgIHJldHVybiBIYW5kbGViYXJzO1xuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vZXhjZXB0aW9uJztcbmltcG9ydCB7IENPTVBJTEVSX1JFVklTSU9OLCBSRVZJU0lPTl9DSEFOR0VTLCBjcmVhdGVGcmFtZSB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICBjb25zdCBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgICBjdXJyZW50UmV2aXNpb24gPSBDT01QSUxFUl9SRVZJU0lPTjtcblxuICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7XG4gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSxcbiAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIHRlbXBsYXRlIG9iamVjdDogJyArIHR5cGVvZiB0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgdGVtcGxhdGVTcGVjLm1haW4uZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjLm1haW5fZDtcblxuICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvd1xuICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLlxuICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpO1xuXG4gIGZ1bmN0aW9uIGludm9rZVBhcnRpYWxXcmFwcGVyKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICBjb250ZXh0ID0gVXRpbHMuZXh0ZW5kKHt9LCBjb250ZXh0LCBvcHRpb25zLmhhc2gpO1xuICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIG9wdGlvbnMuaWRzWzBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJ0aWFsID0gZW52LlZNLnJlc29sdmVQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG4gICAgbGV0IHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7XG4gICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaW5lc1tpXSAmJiBpICsgMSA9PT0gbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGluZXNbaV0gPSBvcHRpb25zLmluZGVudCArIGxpbmVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1lLW9ubHkgbW9kZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEp1c3QgYWRkIHdhdGVyXG4gIGxldCBjb250YWluZXIgPSB7XG4gICAgc3RyaWN0OiBmdW5jdGlvbihvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdcIicgKyBuYW1lICsgJ1wiIG5vdCBkZWZpbmVkIGluICcgKyBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgICB9LFxuICAgIGxvb2t1cDogZnVuY3Rpb24oZGVwdGhzLCBuYW1lKSB7XG4gICAgICBjb25zdCBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbihjdXJyZW50LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50O1xuICAgIH0sXG5cbiAgICBlc2NhcGVFeHByZXNzaW9uOiBVdGlscy5lc2NhcGVFeHByZXNzaW9uLFxuICAgIGludm9rZVBhcnRpYWw6IGludm9rZVBhcnRpYWxXcmFwcGVyLFxuXG4gICAgZm46IGZ1bmN0aW9uKGkpIHtcbiAgICAgIGxldCByZXQgPSB0ZW1wbGF0ZVNwZWNbaV07XG4gICAgICByZXQuZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjW2kgKyAnX2QnXTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSxcblxuICAgIHByb2dyYW1zOiBbXSxcbiAgICBwcm9ncmFtOiBmdW5jdGlvbihpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICBsZXQgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZSwgZGVwdGgpIHtcbiAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbihwYXJhbSwgY29tbW9uKSB7XG4gICAgICBsZXQgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIChwYXJhbSAhPT0gY29tbW9uKSkge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG4gICAgLy8gQW4gZW1wdHkgb2JqZWN0IHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgbnVsbC1jb250ZXh0c1xuICAgIG51bGxDb250ZXh0OiBPYmplY3Quc2VhbCh7fSksXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgbGV0IGRlcHRocyxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT0gb3B0aW9ucy5kZXB0aHNbMF0gPyBbY29udGV4dF0uY29uY2F0KG9wdGlvbnMuZGVwdGhzKSA6IG9wdGlvbnMuZGVwdGhzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVwdGhzID0gW2NvbnRleHRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dC8qLCBvcHRpb25zKi8pIHtcbiAgICAgIHJldHVybiAnJyArIHRlbXBsYXRlU3BlYy5tYWluKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgfVxuICAgIG1haW4gPSBleGVjdXRlRGVjb3JhdG9ycyh0ZW1wbGF0ZVNwZWMubWFpbiwgbWFpbiwgY29udGFpbmVyLCBvcHRpb25zLmRlcHRocyB8fCBbXSwgZGF0YSwgYmxvY2tQYXJhbXMpO1xuICAgIHJldHVybiBtYWluKGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG4gIHJldC5pc1RvcCA9IHRydWU7XG5cbiAgcmV0Ll9zZXR1cCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCkge1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5oZWxwZXJzLCBlbnYuaGVscGVycyk7XG5cbiAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCkge1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykge1xuICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmRlY29yYXRvcnMsIGVudi5kZWNvcmF0b3JzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBvcHRpb25zLmhlbHBlcnM7XG4gICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcHRpb25zLnBhcnRpYWxzO1xuICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBvcHRpb25zLmRlY29yYXRvcnM7XG4gICAgfVxuICB9O1xuXG4gIHJldC5fY2hpbGQgPSBmdW5jdGlvbihpLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgaWYgKHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyAmJiAhYmxvY2tQYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ211c3QgcGFzcyBibG9jayBwYXJhbXMnKTtcbiAgICB9XG4gICAgaWYgKHRlbXBsYXRlU3BlYy51c2VEZXB0aHMgJiYgIWRlcHRocykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignbXVzdCBwYXNzIHBhcmVudCBkZXB0aHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCB0ZW1wbGF0ZVNwZWNbaV0sIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICBmdW5jdGlvbiBwcm9nKGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBjdXJyZW50RGVwdGhzID0gZGVwdGhzO1xuICAgIGlmIChkZXB0aHMgJiYgY29udGV4dCAhPSBkZXB0aHNbMF0gJiYgIShjb250ZXh0ID09PSBjb250YWluZXIubnVsbENvbnRleHQgJiYgZGVwdGhzWzBdID09PSBudWxsKSkge1xuICAgICAgY3VycmVudERlcHRocyA9IFtjb250ZXh0XS5jb25jYXQoZGVwdGhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oY29udGFpbmVyLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLFxuICAgICAgICBvcHRpb25zLmRhdGEgfHwgZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXMgJiYgW29wdGlvbnMuYmxvY2tQYXJhbXNdLmNvbmNhdChibG9ja1BhcmFtcyksXG4gICAgICAgIGN1cnJlbnREZXB0aHMpO1xuICB9XG5cbiAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpO1xuXG4gIHByb2cucHJvZ3JhbSA9IGk7XG4gIHByb2cuZGVwdGggPSBkZXB0aHMgPyBkZXB0aHMubGVuZ3RoIDogMDtcbiAgcHJvZy5ibG9ja1BhcmFtcyA9IGRlY2xhcmVkQmxvY2tQYXJhbXMgfHwgMDtcbiAgcmV0dXJuIHByb2c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHtcbiAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAvLyBVc2UgdGhlIGN1cnJlbnQgY2xvc3VyZSBjb250ZXh0IHRvIHNhdmUgdGhlIHBhcnRpYWwtYmxvY2sgaWYgdGhpcyBwYXJ0aWFsXG4gIGNvbnN0IGN1cnJlbnRQYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ107XG4gIG9wdGlvbnMucGFydGlhbCA9IHRydWU7XG4gIGlmIChvcHRpb25zLmlkcykge1xuICAgIG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCA9IG9wdGlvbnMuaWRzWzBdIHx8IG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aDtcbiAgfVxuXG4gIGxldCBwYXJ0aWFsQmxvY2s7XG4gIGlmIChvcHRpb25zLmZuICYmIG9wdGlvbnMuZm4gIT09IG5vb3ApIHtcbiAgICBvcHRpb25zLmRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIC8vIFdyYXBwZXIgZnVuY3Rpb24gdG8gZ2V0IGFjY2VzcyB0byBjdXJyZW50UGFydGlhbEJsb2NrIGZyb20gdGhlIGNsb3N1cmVcbiAgICBsZXQgZm4gPSBvcHRpb25zLmZuO1xuICAgIHBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddID0gZnVuY3Rpb24gcGFydGlhbEJsb2NrV3JhcHBlcihjb250ZXh0LCBvcHRpb25zID0ge30pIHtcblxuICAgICAgLy8gUmVzdG9yZSB0aGUgcGFydGlhbC1ibG9jayBmcm9tIHRoZSBjbG9zdXJlIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9ja1xuICAgICAgLy8gaS5lLiB0aGUgcGFydCBpbnNpZGUgdGhlIGJsb2NrIG9mIHRoZSBwYXJ0aWFsIGNhbGwuXG4gICAgICBvcHRpb25zLmRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBjdXJyZW50UGFydGlhbEJsb2NrO1xuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgaWYgKGZuLnBhcnRpYWxzKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzID0gVXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zLnBhcnRpYWxzLCBmbi5wYXJ0aWFscyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFsQmxvY2spIHtcbiAgICBwYXJ0aWFsID0gcGFydGlhbEJsb2NrO1xuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1RoZSBwYXJ0aWFsICcgKyBvcHRpb25zLm5hbWUgKyAnIGNvdWxkIG5vdCBiZSBmb3VuZCcpO1xuICB9IGVsc2UgaWYgKHBhcnRpYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIHJldHVybiBwYXJ0aWFsKGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub29wKCkgeyByZXR1cm4gJyc7IH1cblxuZnVuY3Rpb24gaW5pdERhdGEoY29udGV4dCwgZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgISgncm9vdCcgaW4gZGF0YSkpIHtcbiAgICBkYXRhID0gZGF0YSA/IGNyZWF0ZUZyYW1lKGRhdGEpIDoge307XG4gICAgZGF0YS5yb290ID0gY29udGV4dDtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZXhlY3V0ZURlY29yYXRvcnMoZm4sIHByb2csIGNvbnRhaW5lciwgZGVwdGhzLCBkYXRhLCBibG9ja1BhcmFtcykge1xuICBpZiAoZm4uZGVjb3JhdG9yKSB7XG4gICAgbGV0IHByb3BzID0ge307XG4gICAgcHJvZyA9IGZuLmRlY29yYXRvcihwcm9nLCBwcm9wcywgY29udGFpbmVyLCBkZXB0aHMgJiYgZGVwdGhzWzBdLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICBVdGlscy5leHRlbmQocHJvZywgcHJvcHMpO1xuICB9XG4gIHJldHVybiBwcm9nO1xufVxuIiwiLy8gQnVpbGQgb3V0IG91ciBiYXNpYyBTYWZlU3RyaW5nIHR5cGVcbmZ1bmN0aW9uIFNhZmVTdHJpbmcoc3RyaW5nKSB7XG4gIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xufVxuXG5TYWZlU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IFNhZmVTdHJpbmcucHJvdG90eXBlLnRvSFRNTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gJycgKyB0aGlzLnN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNhZmVTdHJpbmc7XG4iLCJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIiwiLy8gQ3JlYXRlIGEgc2ltcGxlIHBhdGggYWxpYXMgdG8gYWxsb3cgYnJvd3NlcmlmeSB0byByZXNvbHZlXG4vLyB0aGUgcnVudGltZSBvbiBhIHN1cHBvcnRlZCBwYXRoLlxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QvY2pzL2hhbmRsZWJhcnMucnVudGltZScpWydkZWZhdWx0J107XG4iLCIndXNlIHN0cmljdCc7XG5pZiAoIUFycmF5LnByb3RvdHlwZS5maW5kKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2ZpbmQnLCB7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG9iaiA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSBvYmoubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG5cbiAgICAgICAgICAgIHZhciBpbmRleCA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbikge1xuICAgICAgICAgICAgICAgIHZhciBpVmFsdWUgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCBpVmFsdWUsIGluZGV4LCBvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn0iLCIvLyEgbW9tZW50LmpzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzICgpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrIChjYWxsYmFjaykge1xuICAgICAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF5KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgICAgIC8vIGlucHV0ICE9IG51bGxcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eSAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VucyAgICA6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQgICAgIDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdyAgICAgICAgOiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXIgICA6IDAsXG4gICAgICAgICAgICBudWxsSW5wdXQgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRNb250aCAgICA6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICAgICAgaXNvICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZWREYXRlUGFydHMgOiBbXSxcbiAgICAgICAgICAgIG1lcmlkaWVtICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZmMyODIyICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHdlZWtkYXlNaXNtYXRjaCA6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2luZ0ZsYWdzKG0pIHtcbiAgICAgICAgaWYgKG0uX3BmID09IG51bGwpIHtcbiAgICAgICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9wZjtcbiAgICB9XG5cbiAgICB2YXIgc29tZTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgICAgICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvbWUgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgICAgICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIGlmIChtLl9pc1ZhbGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGlzTm93VmFsaWQgPSAhaXNOYU4obS5fZC5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkIChmbGFncykge1xuICAgICAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudCAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKChkb250Q29udmVydCAmJiBhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSAnXFxuWycgKyBpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0ga2V5ICsgJzogJyArIGFyZ3VtZW50c1swXVtrZXldICsgJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1snXycgKyBpXSA9IHByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArICgvXFxkezEsMn0vKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksIHByb3A7XG4gICAgICAgIGZvciAocHJvcCBpbiBjaGlsZENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkgJiYgaXNPYmplY3QoY2hpbGRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBjaGlsZENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZENvbmZpZ1twcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHBhcmVudENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2hhbmdlcyB0byBwcm9wZXJ0aWVzIGRvbid0IG1vZGlmeSBwYXJlbnQgY29uZmlnXG4gICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gZXh0ZW5kKHt9LCByZXNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9jYWxlKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cztcblxuICAgIGlmIChPYmplY3Qua2V5cykge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBpLCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFMgIDogJ2g6bW06c3MgQScsXG4gICAgICAgIExUICAgOiAnaDptbSBBJyxcbiAgICAgICAgTCAgICA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEwgICA6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zbGljZSgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbiAgICB2YXIgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbCAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgcGFzdCAgIDogJyVzIGFnbycsXG4gICAgICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbSAgOiAnYSBtaW51dGUnLFxuICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgaCAgOiAnYW4gaG91cicsXG4gICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgZCAgOiAnYSBkYXknLFxuICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgTSAgOiAnYSBtb250aCcsXG4gICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgIHkgIDogJ2EgeWVhcicsXG4gICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyAodW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGFsaWFzZXNbbG93ZXJDYXNlXSA9IGFsaWFzZXNbbG93ZXJDYXNlICsgJ3MnXSA9IGFsaWFzZXNbc2hvcnRoYW5kXSA9IHVuaXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZycgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSB7fSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICAgICAgcHJvcDtcblxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xuICAgIH1cblxuICAgIHZhciBwcmlvcml0aWVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0UHJpb3JpdHkodW5pdCwgcHJpb3JpdHkpIHtcbiAgICAgICAgcHJpb3JpdGllc1t1bml0XSA9IHByaW9yaXR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW107XG4gICAgICAgIGZvciAodmFyIHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIHVuaXRzLnB1c2goe3VuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdfSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIGFic051bWJlciA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgK1xuICAgICAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgKyBhYnNOdW1iZXI7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nO1xuXG4gICAgdmFyIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2c7XG5cbiAgICB2YXIgZm9ybWF0RnVuY3Rpb25zID0ge307XG5cbiAgICB2YXIgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbiAodG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdG9rZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJywgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKSA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2YXIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxICAgICAgICAgPSAvXFxkLzsgICAgICAgICAgICAvLyAgICAgICAwIC0gOVxuICAgIHZhciBtYXRjaDIgICAgICAgICA9IC9cXGRcXGQvOyAgICAgICAgICAvLyAgICAgIDAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzICAgICAgICAgPSAvXFxkezN9LzsgICAgICAgICAvLyAgICAgMDAwIC0gOTk5XG4gICAgdmFyIG1hdGNoNCAgICAgICAgID0gL1xcZHs0fS87ICAgICAgICAgLy8gICAgMDAwMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2g2ICAgICAgICAgPSAvWystXT9cXGR7Nn0vOyAgICAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMiAgICAgID0gL1xcZFxcZD8vOyAgICAgICAgIC8vICAgICAgIDAgLSA5OVxuICAgIHZhciBtYXRjaDN0bzQgICAgICA9IC9cXGRcXGRcXGRcXGQ/LzsgICAgIC8vICAgICA5OTkgLSA5OTk5XG4gICAgdmFyIG1hdGNoNXRvNiAgICAgID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vOyAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMyAgICAgID0gL1xcZHsxLDN9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OVxuICAgIHZhciBtYXRjaDF0bzQgICAgICA9IC9cXGR7MSw0fS87ICAgICAgIC8vICAgICAgIDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoMXRvNiAgICAgID0gL1srLV0/XFxkezEsNn0vOyAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuXG4gICAgdmFyIG1hdGNoVW5zaWduZWQgID0gL1xcZCsvOyAgICAgICAgICAgLy8gICAgICAgMCAtIGluZlxuICAgIHZhciBtYXRjaFNpZ25lZCAgICA9IC9bKy1dP1xcZCsvOyAgICAgIC8vICAgIC1pbmYgLSBpbmZcblxuICAgIHZhciBtYXRjaE9mZnNldCAgICA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naTsgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgdmFyIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naTsgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcblxuICAgIHZhciBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy87IC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbiAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgdmFyIG1hdGNoV29yZCA9IC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pO1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4KSA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuICh0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMDtcbiAgICB2YXIgTU9OVEggPSAxO1xuICAgIHZhciBEQVRFID0gMjtcbiAgICB2YXIgSE9VUiA9IDM7XG4gICAgdmFyIE1JTlVURSA9IDQ7XG4gICAgdmFyIFNFQ09ORCA9IDU7XG4gICAgdmFyIE1JTExJU0VDT05EID0gNjtcbiAgICB2YXIgV0VFSyA9IDc7XG4gICAgdmFyIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsICAgNF0sICAgICAgIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgneWVhcicsIDEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICBob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQgKHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKCkgP1xuICAgICAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEgKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdGdWxsWWVhcicgJiYgaXNMZWFwWWVhcihtb20ueWVhcigpKSAmJiBtb20ubW9udGgoKSA9PT0gMSAmJiBtb20uZGF0ZSgpID09PSAyOSkge1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSwgbW9tLm1vbnRoKCksIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQgKHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMSA/IChpc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCkgOiAoMzEgLSBtb2RNb250aCAlIDcgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbW9udGgnLCAnTScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbW9udGgnLCA4KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy87XG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPSAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydCA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0W01PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgaWksIG1vbSwgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU1NJyAmJiB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aCAobW9tLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoICgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcblxuICAgICAgICAvLyB0aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSAoeSkge1xuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuXG4gICAgICAgIC8vIHRoZSBEYXRlLlVUQyBmdW5jdGlvbiByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwICYmIGlzRmluaXRlKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQtb2YtZmlyc3Qtd2VlayAtIHN0YXJ0LW9mLXllYXJcbiAgICBmdW5jdGlvbiBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIC8vIGZpcnN0LXdlZWsgZGF5IC0tIHdoaWNoIGphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrICg0IGZvciBpc28sIDEgZm9yIG90aGVyKVxuICAgICAgICAgICAgZndkID0gNyArIGRvdyAtIGRveSxcbiAgICAgICAgICAgIC8vIGZpcnN0LXdlZWsgZGF5IGxvY2FsIHdlZWtkYXkgLS0gd2hpY2ggbG9jYWwgd2Vla2RheSBpcyBmd2RcbiAgICAgICAgICAgIGZ3ZGx3ID0gKDcgKyBjcmVhdGVVVENEYXRlKHllYXIsIDAsIGZ3ZCkuZ2V0VVRDRGF5KCkgLSBkb3cpICUgNztcblxuICAgICAgICByZXR1cm4gLWZ3ZGx3ICsgZndkIC0gMTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrcyh5ZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgbG9jYWxXZWVrZGF5ID0gKDcgKyB3ZWVrZGF5IC0gZG93KSAlIDcsXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRheU9mWWVhciA9IDEgKyA3ICogKHdlZWsgLSAxKSArIGxvY2FsV2Vla2RheSArIHdlZWtPZmZzZXQsXG4gICAgICAgICAgICByZXNZZWFyLCByZXNEYXlPZlllYXI7XG5cbiAgICAgICAgaWYgKGRheU9mWWVhciA8PSAwKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciAtIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlzSW5ZZWFyKHJlc1llYXIpICsgZGF5T2ZZZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRheU9mWWVhciA+IGRheXNJblllYXIoeWVhcikpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyICsgMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhciAtIGRheXNJblllYXIoeWVhcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhcjtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICAgICAgZGF5T2ZZZWFyOiByZXNEYXlPZlllYXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssIHJlc1llYXI7XG5cbiAgICAgICAgaWYgKHdlZWsgPCAxKSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSAtIDE7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayArIHdlZWtzSW5ZZWFyKHJlc1llYXIsIGRvdywgZG95KTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrID4gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayAtIHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KTtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2VlazogcmVzV2VlayxcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0TmV4dCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyICsgMSwgZG93LCBkb3kpO1xuICAgICAgICByZXR1cm4gKGRheXNJblllYXIoeWVhcikgLSB3ZWVrT2Zmc2V0ICsgd2Vla09mZnNldE5leHQpIC8gNztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigndycsIFsnd3cnLCAyXSwgJ3dvJywgJ3dlZWsnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignVycsIFsnV1cnLCAyXSwgJ1dvJywgJ2lzb1dlZWsnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2VlaycsICd3Jyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrJywgJ1cnKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2VlaycsIDUpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2VlaycsIDUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigndycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3d3JywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1cnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsndycsICd3dycsICdXJywgJ1dXJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAxKV0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrIChtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mV2VlayAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRveTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrIChpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrIChpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXknLCAnZCcpO1xuICAgIGFkZFVuaXRBbGlhcygnd2Vla2RheScsICdlJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrZGF5JywgJ0UnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrZGF5JywgMTEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla2RheScsIDExKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2QnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2UnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0UnLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2RkJywgJ2RkZCcsICdkZGRkJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGNvbmZpZy5fbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYSB3ZWVrZGF5IG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZFxuICAgICAgICBpZiAod2Vla2RheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWVrLmQgPSB3ZWVrZGF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkJywgJ2UnLCAnRSddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KSAlIDcgfHwgNztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4oaW5wdXQpID8gbnVsbCA6IGlucHV0O1xuICAgIH1cblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzIDpcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzW20uZGF5KCldIDpcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzW3RoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLmRheSgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQgPSAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQgKG0pIHtcbiAgICAgICAgcmV0dXJuIChtKSA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV0gOiB0aGlzLl93ZWVrZGF5c1Nob3J0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4gPSAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4gKG0pIHtcbiAgICAgICAgcmV0dXJuIChtKSA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSAod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXC4/JykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXC4/JykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkZCcgJiYgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZCcgJiYgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZCcgJiYgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXkgPSB0aGlzLl9pc1VUQyA/IHRoaXMuX2QuZ2V0VVRDRGF5KCkgOiB0aGlzLl9kLmdldERheSgpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLCBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb20sIG1pbnAsIHNob3J0cCwgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICBzaG9ydHAgPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICBsb25ncCA9IHRoaXMud2Vla2RheXMobW9tLCAnJyk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgbG93ZXJjYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTSAoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAvLyB0aGlzIHJ1bGUuXG4gICAgdmFyIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZVxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fTtcbiAgICB2YXIgbG9jYWxlRmFtaWxpZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGw7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmICghbG9jYWxlc1tuYW1lXSAmJiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICB2YXIgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUgKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTG9jYWxlICcgKyBrZXkgKyAgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZSgnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCB0bXBMb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93IChtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdztcbiAgICAgICAgdmFyIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW01PTlRIXSAgICAgICA8IDAgfHwgYVtNT05USF0gICAgICAgPiAxMSAgPyBNT05USCA6XG4gICAgICAgICAgICAgICAgYVtEQVRFXSAgICAgICAgPCAxIHx8IGFbREFURV0gICAgICAgID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgYVtIT1VSXSAgICAgICAgPCAwIHx8IGFbSE9VUl0gICAgICAgID4gMjQgfHwgKGFbSE9VUl0gPT09IDI0ICYmIChhW01JTlVURV0gIT09IDAgfHwgYVtTRUNPTkRdICE9PSAwIHx8IGFbTUlMTElTRUNPTkRdICE9PSAwKSkgPyBIT1VSIDpcbiAgICAgICAgICAgICAgICBhW01JTlVURV0gICAgICA8IDAgfHwgYVtNSU5VVEVdICAgICAgPiA1OSAgPyBNSU5VVEUgOlxuICAgICAgICAgICAgICAgIGFbU0VDT05EXSAgICAgIDwgMCB8fCBhW1NFQ09ORF0gICAgICA+IDU5ICA/IFNFQ09ORCA6XG4gICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxuICAgICAgICAgICAgICAgIC0xO1xuXG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSwgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkgKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIGV4cGVjdGVkV2Vla2RheSwgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8IGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KG51bGwsIGlucHV0KTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVEMgPyBjb25maWcuX2QuZ2V0VVRDRGF5KCkgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJiBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5KSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgICAgICBpZiAody5lIDwgMCB8fCB3LmUgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGJlZ2luaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gZG93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3ZWVrIDwgMSB8fCB3ZWVrID4gd2Vla3NJblllYXIod2Vla1llYXIsIGRvdywgZG95KSkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla3MgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWtkYXlPdmVyZmxvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrZGF5ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRlbXAgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdGVtcC5kYXlPZlllYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpc28gODYwMSByZWdleFxuICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgIHZhciBleHRlbmRlZElzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuICAgIHZhciBiYXNpY0lzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KSg/OlxcZFxcZFxcZFxcZHxXXFxkXFxkXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFtcXCtcXC1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLztcblxuICAgIHZhciB0elJlZ2V4ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vO1xuXG4gICAgdmFyIGlzb0RhdGVzID0gW1xuICAgICAgICBbJ1lZWVlZWS1NTS1ERCcsIC9bKy1dXFxkezZ9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVy1FJywgL1xcZHs0fS1XXFxkXFxkLVxcZC9dLFxuICAgICAgICBbJ0dHR0ctW1ddV1cnLCAvXFxkezR9LVdcXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dLFxuICAgICAgICBbJ1lZWVktTU0nLCAvXFxkezR9LVxcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZWVlNTUREJywgL1srLV1cXGR7MTB9L10sXG4gICAgICAgIFsnWVlZWU1NREQnLCAvXFxkezh9L10sXG4gICAgICAgIC8vIFlZWVlNTSBpcyBOT1QgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmRcbiAgICAgICAgWydHR0dHW1ddV1dFJywgL1xcZHs0fVdcXGR7M30vXSxcbiAgICAgICAgWydHR0dHW1ddV1cnLCAvXFxkezR9V1xcZHsyfS8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZREREJywgL1xcZHs3fS9dXG4gICAgXTtcblxuICAgIC8vIGlzbyB0aW1lIGZvcm1hdHMgYW5kIHJlZ2V4ZXNcbiAgICB2YXIgaXNvVGltZXMgPSBbXG4gICAgICAgIFsnSEg6bW06c3MuU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISDptbTpzcyxTU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkLFxcZCsvXSxcbiAgICAgICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIOm1tJywgL1xcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgWydISG1tc3MuU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICAgICAgWydISG1tc3MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkL10sXG4gICAgICAgIFsnSEhtbScsIC9cXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISCcsIC9cXGRcXGQvXVxuICAgIF07XG5cbiAgICB2YXIgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKChcXC0/XFxkKykvaTtcblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlTTyhjb25maWcpIHtcbiAgICAgICAgdmFyIGksIGwsXG4gICAgICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBtYXRjaCA9IGV4dGVuZGVkSXNvUmVnZXguZXhlYyhzdHJpbmcpIHx8IGJhc2ljSXNvUmVnZXguZXhlYyhzdHJpbmcpLFxuICAgICAgICAgICAgYWxsb3dUaW1lLCBkYXRlRm9ybWF0LCB0aW1lRm9ybWF0LCB0ekZvcm1hdDtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmlzbyA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29EYXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvRGF0ZXNbaV1bMV0uZXhlYyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9IGlzb0RhdGVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1RpbWUgPSBpc29EYXRlc1tpXVsyXSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvVGltZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hbMl0gc2hvdWxkIGJlICdUJyBvciBzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZUZvcm1hdCA9IChtYXRjaFsyXSB8fCAnICcpICsgaXNvVGltZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGltZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhbGxvd1RpbWUgJiYgdGltZUZvcm1hdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR6UmVnZXguZXhlYyhtYXRjaFs0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHpGb3JtYXQgPSAnWic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuX2YgPSBkYXRlRm9ybWF0ICsgKHRpbWVGb3JtYXQgfHwgJycpICsgKHR6Rm9ybWF0IHx8ICcnKTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUkZDIDI4MjIgcmVnZXg6IEZvciBkZXRhaWxzIHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjgyMiNzZWN0aW9uLTMuM1xuICAgIHZhciByZmMyODIyID0gL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfChbKy1dXFxkezR9KSkkLztcblxuICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgIHVudHJ1bmNhdGVZZWFyKHllYXJTdHIpLFxuICAgICAgICAgICAgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LmluZGV4T2YobW9udGhTdHIpLFxuICAgICAgICAgICAgcGFyc2VJbnQoZGF5U3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChob3VyU3RyLCAxMCksXG4gICAgICAgICAgICBwYXJzZUludChtaW51dGVTdHIsIDEwKVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChzZWNvbmRTdHIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlSW50KHNlY29uZFN0ciwgMTApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhclN0cikge1xuICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KHllYXJTdHIsIDEwKTtcbiAgICAgICAgaWYgKHllYXIgPD0gNDkpIHtcbiAgICAgICAgICAgIHJldHVybiAyMDAwICsgeWVhcjtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyIDw9IDk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIDE5MDAgKyB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5ZWFyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgJyAnKS5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKS50cmltKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVudGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShwYXJzZWRJbnB1dFswXSwgcGFyc2VkSW5wdXRbMV0sIHBhcnNlZElucHV0WzJdKS5nZXREYXkoKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5UHJvdmlkZWQgIT09IHdlZWtkYXlBY3R1YWwpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgb2JzT2Zmc2V0cyA9IHtcbiAgICAgICAgVVQ6IDAsXG4gICAgICAgIEdNVDogMCxcbiAgICAgICAgRURUOiAtNCAqIDYwLFxuICAgICAgICBFU1Q6IC01ICogNjAsXG4gICAgICAgIENEVDogLTUgKiA2MCxcbiAgICAgICAgQ1NUOiAtNiAqIDYwLFxuICAgICAgICBNRFQ6IC02ICogNjAsXG4gICAgICAgIE1TVDogLTcgKiA2MCxcbiAgICAgICAgUERUOiAtNyAqIDYwLFxuICAgICAgICBQU1Q6IC04ICogNjBcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCk7XG4gICAgICAgICAgICB2YXIgbSA9IGhtICUgMTAwLCBoID0gKGhtIC0gbSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaCAqIDYwICsgbTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgYW5kIHRpbWUgZnJvbSByZWYgMjgyMiBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tUkZDMjgyMihjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcmZjMjgyMi5leGVjKHByZXByb2Nlc3NSRkMyODIyKGNvbmZpZy5faSkpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MobWF0Y2hbNF0sIG1hdGNoWzNdLCBtYXRjaFsyXSwgbWF0Y2hbNV0sIG1hdGNoWzZdLCBtYXRjaFs3XSk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXQgb3IgZmFsbGJhY2tcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG5cbiAgICAgICAgaWYgKG1hdGNoZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCttYXRjaGVkWzFdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmFsIGF0dGVtcHQsIHVzZSBJbnB1dCBGYWxsYmFja1xuICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgIH1cblxuICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrID0gZGVwcmVjYXRlKFxuICAgICAgICAndmFsdWUgcHJvdmlkZWQgaXMgbm90IGluIGEgcmVjb2duaXplZCBSRkMyODIyIG9yIElTTyBmb3JtYXQuIG1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlKCksICcgK1xuICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgJ2Rpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvICcgK1xuICAgICAgICAnaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9qcy1kYXRlLyBmb3IgbW9yZSBpbmZvLicsXG4gICAgICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIGhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgUkZDIDI4MjIgZm9ybVxuICAgIGhvb2tzLlJGQ18yODIyID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5SRkNfMjgyMikge1xuICAgICAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksIHBhcnNlZElucHV0LCB0b2tlbnMsIHRva2VuLCBza2lwcGVkLFxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggPSAwO1xuXG4gICAgICAgIHRva2VucyA9IGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8IFtdKVswXTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0b2tlbicsIHRva2VuLCAncGFyc2VkSW5wdXQnLCBwYXJzZWRJbnB1dCxcbiAgICAgICAgICAgIC8vICAgICAgICAgJ3JlZ2V4JywgZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHNraXBwZWQgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHNraXBwZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2Uoc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIHBhcnNlZElucHV0LCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlnLl9zdHJpY3QgJiYgIXBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB1bnBhcnNlZCBpbnB1dCBsZW5ndGggdG8gdGhlIHN0cmluZ1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5jaGFyc0xlZnRPdmVyID0gc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgICAgICBpZiAoY29uZmlnLl9hW0hPVVJdIDw9IDEyICYmXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID09PSB0cnVlICYmXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoY29uZmlnLl9sb2NhbGUsIGNvbmZpZy5fYVtIT1VSXSwgY29uZmlnLl9tZXJpZGllbSk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtRml4V3JhcCAobG9jYWxlLCBob3VyLCBtZXJpZGllbSkge1xuICAgICAgICB2YXIgaXNQbTtcblxuICAgICAgICBpZiAobWVyaWRpZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5tZXJpZGllbUhvdXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5tZXJpZGllbUhvdXIoaG91ciwgbWVyaWRpZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZS5pc1BNICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrXG4gICAgICAgICAgICBpc1BtID0gbG9jYWxlLmlzUE0obWVyaWRpZW0pO1xuICAgICAgICAgICAgaWYgKGlzUG0gJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbSAmJiBob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW5cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciB0ZW1wQ29uZmlnLFxuICAgICAgICAgICAgYmVzdE1vbWVudCxcblxuICAgICAgICAgICAgc2NvcmVUb0JlYXQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgY3VycmVudFNjb3JlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2YubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLl9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcmUgPSAwO1xuICAgICAgICAgICAgdGVtcENvbmZpZyA9IGNvcHlDb25maWcoe30sIGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRlbXBDb25maWcuX3VzZVVUQyA9IGNvbmZpZy5fdXNlVVRDO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQodGVtcENvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZCh0ZW1wQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgdGhhdCB3YXMgbm90IHBhcnNlZCBhZGQgYSBwZW5hbHR5IGZvciB0aGF0IGZvcm1hdFxuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5jaGFyc0xlZnRPdmVyO1xuXG4gICAgICAgICAgICAvL29yIHRva2Vuc1xuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5zY29yZSA9IGN1cnJlbnRTY29yZTtcblxuICAgICAgICAgICAgaWYgKHNjb3JlVG9CZWF0ID09IG51bGwgfHwgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQpIHtcbiAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbU9iamVjdChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpO1xuICAgICAgICBjb25maWcuX2EgPSBtYXAoW2kueWVhciwgaS5tb250aCwgaS5kYXkgfHwgaS5kYXRlLCBpLmhvdXIsIGkubWludXRlLCBpLnNlY29uZCwgaS5taWxsaXNlY29uZF0sIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db25maWcgKGNvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gbmV3IE1vbWVudChjaGVja092ZXJmbG93KHByZXBhcmVDb25maWcoY29uZmlnKSkpO1xuICAgICAgICBpZiAocmVzLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgaXMgc21hcnQgZW5vdWdoIGFyb3VuZCBEU1RcbiAgICAgICAgICAgIHJlcy5hZGQoMSwgJ2QnKTtcbiAgICAgICAgICAgIHJlcy5fbmV4dERheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcGFyZUNvbmZpZyAoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoe251bGxJbnB1dDogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faSA9IGlucHV0ID0gY29uZmlnLl9sb2NhbGUucHJlcGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTW9tZW50KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGlucHV0O1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9ybWF0KSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gIGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlucHV0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQoY29uZmlnKSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2k7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dC52YWx1ZU9mKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9hID0gbWFwKGlucHV0LnNsaWNlKDApLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWxPclVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgaWYgKGxvY2FsZSA9PT0gdHJ1ZSB8fCBsb2NhbGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgICAgICBsb2NhbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGlzT2JqZWN0KGlucHV0KSAmJiBpc09iamVjdEVtcHR5KGlucHV0KSkgfHxcbiAgICAgICAgICAgICAgICAoaXNBcnJheShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX3VzZVVUQyA9IGMuX2lzVVRDID0gaXNVVEM7XG4gICAgICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVGcm9tQ29uZmlnKGMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsIChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5taW4gaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5tYXggaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyIDwgdGhpcyA/IHRoaXMgOiBvdGhlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICB2YXIgcHJvdG90eXBlTWF4ID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heCAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQWZ0ZXInLCBhcmdzKTtcbiAgICB9XG5cbiAgICB2YXIgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3cgPyBEYXRlLm5vdygpIDogKyhuZXcgRGF0ZSgpKTtcbiAgICB9O1xuXG4gICAgdmFyIG9yZGVyaW5nID0gWyd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ107XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uVmFsaWQobSkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbSkge1xuICAgICAgICAgICAgaWYgKCEoaW5kZXhPZi5jYWxsKG9yZGVyaW5nLCBrZXkpICE9PSAtMSAmJiAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1bml0SGFzRGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAobVtvcmRlcmluZ1tpXV0pIHtcbiAgICAgICAgICAgICAgICBpZiAodW5pdEhhc0RlY2ltYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvbmx5IGFsbG93IG5vbi1pbnRlZ2VycyBmb3Igc21hbGxlc3QgdW5pdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtW29yZGVyaW5nW2ldXSkgIT09IHRvSW50KG1bb3JkZXJpbmdbaV1dKSkge1xuICAgICAgICAgICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihOYU4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIER1cmF0aW9uIChkdXJhdGlvbikge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxuICAgICAgICAgICAgeWVhcnMgPSBub3JtYWxpemVkSW5wdXQueWVhciB8fCAwLFxuICAgICAgICAgICAgcXVhcnRlcnMgPSBub3JtYWxpemVkSW5wdXQucXVhcnRlciB8fCAwLFxuICAgICAgICAgICAgbW9udGhzID0gbm9ybWFsaXplZElucHV0Lm1vbnRoIHx8IDAsXG4gICAgICAgICAgICB3ZWVrcyA9IG5vcm1hbGl6ZWRJbnB1dC53ZWVrIHx8IDAsXG4gICAgICAgICAgICBkYXlzID0gbm9ybWFsaXplZElucHV0LmRheSB8fCAwLFxuICAgICAgICAgICAgaG91cnMgPSBub3JtYWxpemVkSW5wdXQuaG91ciB8fCAwLFxuICAgICAgICAgICAgbWludXRlcyA9IG5vcm1hbGl6ZWRJbnB1dC5taW51dGUgfHwgMCxcbiAgICAgICAgICAgIHNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQuc2Vjb25kIHx8IDAsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmQgfHwgMDtcblxuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gaXNEdXJhdGlvblZhbGlkKG5vcm1hbGl6ZWRJbnB1dCk7XG5cbiAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGRhdGVBZGRSZW1vdmVcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gK21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICBzZWNvbmRzICogMWUzICsgLy8gMTAwMFxuICAgICAgICAgICAgbWludXRlcyAqIDZlNCArIC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxuICAgICAgICAvLyBkYXkgd2hlbiB3b3JraW5nIGFyb3VuZCBEU1QsIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuX2RheXMgPSArZGF5cyArXG4gICAgICAgICAgICB3ZWVrcyAqIDc7XG4gICAgICAgIC8vIEl0IGlzIGltcG9zc2libGUgdG8gdHJhbnNsYXRlIG1vbnRocyBpbnRvIGRheXMgd2l0aG91dCBrbm93aW5nXG4gICAgICAgIC8vIHdoaWNoIG1vbnRocyB5b3UgYXJlIGFyZSB0YWxraW5nIGFib3V0LCBzbyB3ZSBoYXZlIHRvIHN0b3JlXG4gICAgICAgIC8vIGl0IHNlcGFyYXRlbHkuXG4gICAgICAgIHRoaXMuX21vbnRocyA9ICttb250aHMgK1xuICAgICAgICAgICAgcXVhcnRlcnMgKiAzICtcbiAgICAgICAgICAgIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRHVyYXRpb247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzUm91bmQgKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoLTEgKiBudW1iZXIpICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0ICh0b2tlbiwgc2VwYXJhdG9yKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgICAgIHZhciBzaWduID0gJysnO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2lnbiArIHplcm9GaWxsKH5+KG9mZnNldCAvIDYwKSwgMikgKyBzZXBhcmF0b3IgKyB6ZXJvRmlsbCh+fihvZmZzZXQpICUgNjAsIDIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvZmZzZXQoJ1onLCAnOicpO1xuICAgIG9mZnNldCgnWlonLCAnJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdaJywgIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1paJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ1onLCAnWlonXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fdXNlVVRDID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl90em0gPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIHRpbWV6b25lIGNodW5rZXJcbiAgICAvLyAnKzEwOjAwJyA+IFsnMTAnLCAgJzAwJ11cbiAgICAvLyAnLTE1MzAnICA+IFsnLTE1JywgJzMwJ11cbiAgICB2YXIgY2h1bmtPZmZzZXQgPSAvKFtcXCtcXC1dfFxcZFxcZCkvZ2k7XG5cbiAgICBmdW5jdGlvbiBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoZXIsIHN0cmluZykge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IChzdHJpbmcgfHwgJycpLm1hdGNoKG1hdGNoZXIpO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaHVuayAgID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdO1xuICAgICAgICB2YXIgcGFydHMgICA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgICAgIHZhciBtaW51dGVzID0gKyhwYXJ0c1sxXSAqIDYwKSArIHRvSW50KHBhcnRzWzJdKTtcblxuICAgICAgICByZXR1cm4gbWludXRlcyA9PT0gMCA/XG4gICAgICAgICAgMCA6XG4gICAgICAgICAgcGFydHNbMF0gPT09ICcrJyA/IG1pbnV0ZXMgOiAtbWludXRlcztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxuICAgIGZ1bmN0aW9uIGNsb25lV2l0aE9mZnNldChpbnB1dCwgbW9kZWwpIHtcbiAgICAgICAgdmFyIHJlcywgZGlmZjtcbiAgICAgICAgaWYgKG1vZGVsLl9pc1VUQykge1xuICAgICAgICAgICAgcmVzID0gbW9kZWwuY2xvbmUoKTtcbiAgICAgICAgICAgIGRpZmYgPSAoaXNNb21lbnQoaW5wdXQpIHx8IGlzRGF0ZShpbnB1dCkgPyBpbnB1dC52YWx1ZU9mKCkgOiBjcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0KS5sb2NhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0ZU9mZnNldCAobSkge1xuICAgICAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9wdWxsLzE4NzFcbiAgICAgICAgcmV0dXJuIC1NYXRoLnJvdW5kKG0uX2QuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDE1KSAqIDE1O1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9tZW50IGlzIG11dGF0ZWQuXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG4gICAgaG9va3MudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbiAgICAvLyBhZmZlY3RpbmcgdGhlIGxvY2FsIGhvdXIuIFNvIDU6MzE6MjYgKzAzMDAgLS1bdXRjT2Zmc2V0KDIsIHRydWUpXS0tPlxuICAgIC8vIDU6MzE6MjYgKzAyMDAgSXQgaXMgcG9zc2libGUgdGhhdCA1OjMxOjI2IGRvZXNuJ3QgZXhpc3Qgd2l0aCBvZmZzZXRcbiAgICAvLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4gICAgLy9cbiAgICAvLyBLZWVwaW5nIHRoZSB0aW1lIGFjdHVhbGx5IGFkZHMvc3VidHJhY3RzIChvbmUgaG91cilcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbiAgICAvLyBhIHNlY29uZCB0aW1lLiBJbiBjYXNlIGl0IHdhbnRzIHVzIHRvIGNoYW5nZSB0aGUgb2Zmc2V0IGFnYWluXG4gICAgLy8gX2NoYW5nZUluUHJvZ3Jlc3MgPT0gdHJ1ZSBjYXNlLCB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0LCBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbiAgICBmdW5jdGlvbiBnZXRTZXRPZmZzZXQgKGlucHV0LCBrZWVwTG9jYWxUaW1lLCBrZWVwTWludXRlcykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICBsb2NhbEFkanVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYgJiYgIWtlZXBNaW51dGVzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3QgPSBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XG4gICAgICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBjcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSwgMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0Wm9uZSAoaW5wdXQsIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSAtaW5wdXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLXRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1VUQyAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9Mb2NhbCAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQgKCkge1xuICAgICAgICBpZiAodGhpcy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9pID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgICAgICBpZiAodFpvbmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRab25lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc0FsaWduZWRIb3VyT2Zmc2V0IChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBpbnB1dCA/IGNyZWF0ZUxvY2FsKGlucHV0KS51dGNPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWUgKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKSB8fFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCAoKSB7XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5faXNEU1RTaGlmdGVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgY29weUNvbmZpZyhjLCB0aGlzKTtcbiAgICAgICAgYyA9IHByZXBhcmVDb25maWcoYyk7XG5cbiAgICAgICAgaWYgKGMuX2EpIHtcbiAgICAgICAgICAgIHZhciBvdGhlciA9IGMuX2lzVVRDID8gY3JlYXRlVVRDKGMuX2EpIDogY3JlYXRlTG9jYWwoYy5fYSk7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/ICF0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjT2Zmc2V0ICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgIHZhciBhc3BOZXRSZWdleCA9IC9eKFxcLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKVxcOihcXGQrKSg/OlxcOihcXGQrKShcXC5cXGQqKT8pPyQvO1xuXG4gICAgLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbiAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgIHZhciBpc29SZWdleCA9IC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEdXJhdGlvbiAoaW5wdXQsIGtleSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIGFnYWluc3QgcmVnZXhwIGlzIGV4cGVuc2l2ZSwgZG8gaXQgb24gZGVtYW5kXG4gICAgICAgICAgICBtYXRjaCA9IG51bGwsXG4gICAgICAgICAgICBzaWduLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAgZGlmZlJlcztcblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG1zIDogaW5wdXQuX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICBkICA6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgICAgIE0gIDogaW5wdXQuX21vbnRoc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb25ba2V5XSA9IGlucHV0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbi5taWxsaXNlY29uZHMgPSBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGFzcE5ldFJlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHkgIDogMCxcbiAgICAgICAgICAgICAgICBkICA6IHRvSW50KG1hdGNoW0RBVEVdKSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgaCAgOiB0b0ludChtYXRjaFtIT1VSXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIG0gIDogdG9JbnQobWF0Y2hbTUlOVVRFXSkgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBzICA6IHRvSW50KG1hdGNoW1NFQ09ORF0pICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbXMgOiB0b0ludChhYnNSb3VuZChtYXRjaFtNSUxMSVNFQ09ORF0gKiAxMDAwKSkgKiBzaWduIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghIShtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogKG1hdGNoWzFdID09PSAnKycpID8gMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE0gOiBwYXJzZUlzbyhtYXRjaFszXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgdyA6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGggOiBwYXJzZUlzbyhtYXRjaFs2XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgbSA6IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHsvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ29iamVjdCcgJiYgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLCBjcmVhdGVMb2NhbChkdXJhdGlvbi50bykpO1xuXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgZHVyYXRpb24ubXMgPSBkaWZmUmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGR1cmF0aW9uLk0gPSBkaWZmUmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvIChpbnAsIHNpZ24pIHtcbiAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cbiAgICAgICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcyA9IHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG5cbiAgICAgICAgcmVzLm1vbnRocyA9IG90aGVyLm1vbnRoKCkgLSBiYXNlLm1vbnRoKCkgK1xuICAgICAgICAgICAgKG90aGVyLnllYXIoKSAtIGJhc2UueWVhcigpKSAqIDEyO1xuICAgICAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgICAgICAtLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gKyhiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgaWYgKCEoYmFzZS5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG4gICAgICAgIH1cblxuICAgICAgICBvdGhlciA9IGNsb25lV2l0aE9mZnNldChvdGhlciwgYmFzZSk7XG4gICAgICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSAtcmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJlcy5tb250aHMgPSAtcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFkZGVyKGRpcmVjdGlvbiwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgICAgICAvL2ludmVydCB0aGUgYXJndW1lbnRzLCBidXQgY29tcGxhaW4gYWJvdXQgaXRcbiAgICAgICAgICAgIGlmIChwZXJpb2QgIT09IG51bGwgJiYgIWlzTmFOKCtwZXJpb2QpKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKG5hbWUsICdtb21lbnQoKS4nICsgbmFtZSAgKyAnKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLicgKyBuYW1lICsgJyhudW1iZXIsIHBlcmlvZCkuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9hZGQtaW52ZXJ0ZWQtcGFyYW0vIGZvciBtb3JlIGluZm8uJyk7XG4gICAgICAgICAgICAgICAgdG1wID0gdmFsOyB2YWwgPSBwZXJpb2Q7IHBlcmlvZCA9IHRtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyArdmFsIDogdmFsO1xuICAgICAgICAgICAgZHVyID0gY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgZHVyLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QgKG1vbSwgZHVyYXRpb24sIGlzQWRkaW5nLCB1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzUm91bmQoZHVyYXRpb24uX21vbnRocyk7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG1vbSwgZ2V0KG1vbSwgJ01vbnRoJykgKyBtb250aHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIHNldCQxKG1vbSwgJ0RhdGUnLCBnZXQobW9tLCAnRGF0ZScpICsgZGF5cyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVPZmZzZXQpIHtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChtb20sIGRheXMgfHwgbW9udGhzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhZGQgICAgICA9IGNyZWF0ZUFkZGVyKDEsICdhZGQnKTtcbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVBZGRlcigtMSwgJ3N1YnRyYWN0Jyk7XG5cbiAgICBmdW5jdGlvbiBnZXRDYWxlbmRhckZvcm1hdChteU1vbWVudCwgbm93KSB7XG4gICAgICAgIHZhciBkaWZmID0gbXlNb21lbnQuZGlmZihub3csICdkYXlzJywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBkaWZmIDwgLTYgPyAnc2FtZUVsc2UnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgLTEgPyAnbGFzdFdlZWsnIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMCA/ICdsYXN0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDEgPyAnc2FtZURheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAyID8gJ25leHREYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgNyA/ICduZXh0V2VlaycgOiAnc2FtZUVsc2UnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyJDEgKHRpbWUsIGZvcm1hdHMpIHtcbiAgICAgICAgLy8gV2Ugd2FudCB0byBjb21wYXJlIHRoZSBzdGFydCBvZiB0b2RheSwgdnMgdGhpcy5cbiAgICAgICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYWwvdXRjL29mZnNldCBvciBub3QuXG4gICAgICAgIHZhciBub3cgPSB0aW1lIHx8IGNyZWF0ZUxvY2FsKCksXG4gICAgICAgICAgICBzb2QgPSBjbG9uZVdpdGhPZmZzZXQobm93LCB0aGlzKS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGhvb2tzLmNhbGVuZGFyRm9ybWF0KHRoaXMsIHNvZCkgfHwgJ3NhbWVFbHNlJztcblxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0cyAmJiAoaXNGdW5jdGlvbihmb3JtYXRzW2Zvcm1hdF0pID8gZm9ybWF0c1tmb3JtYXRdLmNhbGwodGhpcywgbm93KSA6IGZvcm1hdHNbZm9ybWF0XSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWZ0ZXIgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA+IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQudmFsdWVPZigpIDwgdGhpcy5jbG9uZSgpLnN0YXJ0T2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmVmb3JlIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyghaXNVbmRlZmluZWQodW5pdHMpID8gdW5pdHMgOiAnbWlsbGlzZWNvbmQnKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZXR3ZWVuIChmcm9tLCB0bywgdW5pdHMsIGluY2x1c2l2aXR5KSB7XG4gICAgICAgIGluY2x1c2l2aXR5ID0gaW5jbHVzaXZpdHkgfHwgJygpJztcbiAgICAgICAgcmV0dXJuIChpbmNsdXNpdml0eVswXSA9PT0gJygnID8gdGhpcy5pc0FmdGVyKGZyb20sIHVuaXRzKSA6ICF0aGlzLmlzQmVmb3JlKGZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknID8gdGhpcy5pc0JlZm9yZSh0bywgdW5pdHMpIDogIXRoaXMuaXNBZnRlcih0bywgdW5pdHMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWUgKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpLFxuICAgICAgICAgICAgaW5wdXRNcztcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyB8fCAnbWlsbGlzZWNvbmQnKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRNcyA9IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCkgPD0gaW5wdXRNcyAmJiBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNBZnRlcihpbnB1dCx1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQmVmb3JlKGlucHV0LHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsXG4gICAgICAgICAgICB6b25lRGVsdGEsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzOyBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDsgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTsgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6IG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZiAoYSwgYikge1xuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIpICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMiwgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmcoa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZTtcbiAgICAgICAgdmFyIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCB1dGMgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuYyA9ICdtb21lbnQnO1xuICAgICAgICB2YXIgem9uZSA9ICcnO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHZhciB5ZWFyID0gKDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgdmFyIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHZhciBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQgKGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fFxuICAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe3RvOiB0aGlzLCBmcm9tOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7ZnJvbTogdGhpcywgdG86IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUgKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnRPZiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgc3dpdGNoIGludGVudGlvbmFsbHkgb21pdHMgYnJlYWsga2V5d29yZHNcbiAgICAgICAgLy8gdG8gdXRpbGl6ZSBmYWxsaW5nIHRocm91Z2ggdGhlIGNhc2VzLlxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgxKTtcbiAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoMCk7XG4gICAgICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWNvbmRzKDApO1xuICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZHMoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZWVrcyBhcmUgYSBzcGVjaWFsIGNhc2VcbiAgICAgICAgaWYgKHVuaXRzID09PSAnd2VlaycpIHtcbiAgICAgICAgICAgIHRoaXMud2Vla2RheSgwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdHMgPT09ICdpc29XZWVrJykge1xuICAgICAgICAgICAgdGhpcy5pc29XZWVrZGF5KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVhcnRlcnMgYXJlIGFsc28gc3BlY2lhbFxuICAgICAgICBpZiAodW5pdHMgPT09ICdxdWFydGVyJykge1xuICAgICAgICAgICAgdGhpcy5tb250aChNYXRoLmZsb29yKHRoaXMubW9udGgoKSAvIDMpICogMyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRPZiAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICdkYXRlJyBpcyBhbiBhbGlhcyBmb3IgJ2RheScsIHNvIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHN1Y2guXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB1bml0cyA9ICdkYXknO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0cykuYWRkKDEsICh1bml0cyA9PT0gJ2lzb1dlZWsnID8gJ3dlZWsnIDogdW5pdHMpKS5zdWJ0cmFjdCgxLCAnbXMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZU9mICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2QudmFsdWVPZigpIC0gKCh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5peCAoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9EYXRlICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0FycmF5ICgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW20ueWVhcigpLCBtLm1vbnRoKCksIG0uZGF0ZSgpLCBtLmhvdXIoKSwgbS5taW51dGUoKSwgbS5zZWNvbmQoKSwgbS5taWxsaXNlY29uZCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b09iamVjdCAoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXJzOiBtLnllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoczogbS5tb250aCgpLFxuICAgICAgICAgICAgZGF0ZTogbS5kYXRlKCksXG4gICAgICAgICAgICBob3VyczogbS5ob3VycygpLFxuICAgICAgICAgICAgbWludXRlczogbS5taW51dGVzKCksXG4gICAgICAgICAgICBzZWNvbmRzOiBtLnNlY29uZHMoKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogbS5taWxsaXNlY29uZHMoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgICAgIC8vIG5ldyBEYXRlKE5hTikudG9KU09OKCkgPT09IG51bGxcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy50b0lTT1N0cmluZygpIDogbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDIgKCkge1xuICAgICAgICByZXR1cm4gaXNWYWxpZCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzaW5nRmxhZ3MgKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCAoKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzaW5nRmxhZ3ModGhpcykub3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRpb25EYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuX2YsXG4gICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgICAgIHN0cmljdDogdGhpcy5fc3RyaWN0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4gKHRva2VuLCBnZXR0ZXIpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4oMCwgW3Rva2VuLCB0b2tlbi5sZW5ndGhdLCAwLCBnZXR0ZXIpO1xuICAgIH1cblxuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2cnLCAgICAgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAgICAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgICdpc29XZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3dlZWtZZWFyJywgJ2dnJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrWWVhcicsICdHRycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnd2Vla1llYXInLCAxKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2lzb1dlZWtZZWFyJywgMSk7XG5cblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0cnLCAgICAgIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdnJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0dHJywgIG1hdGNoMXRvNiwgbWF0Y2g2KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnZycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnZ2cnLCAnZ2dnZ2cnLCAnR0dHRycsICdHR0dHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMildID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZycsICdHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWsoKSxcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXkoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhciAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwodGhpcyxcbiAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy5pc29XZWVrKCksIHRoaXMuaXNvV2Vla2RheSgpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luWWVhciAoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJblllYXIgKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXJIZWxwZXIoaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKHRoaXMsIGRvdywgZG95KS55ZWFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2Vla3NUYXJnZXQgPSB3ZWVrc0luWWVhcihpbnB1dCwgZG93LCBkb3kpO1xuICAgICAgICAgICAgaWYgKHdlZWsgPiB3ZWVrc1RhcmdldCkge1xuICAgICAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXRXZWVrQWxsLmNhbGwodGhpcywgaW5wdXQsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFdlZWtBbGwod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZShkYXlPZlllYXJEYXRhLnllYXIsIDAsIGRheU9mWWVhckRhdGEuZGF5T2ZZZWFyKTtcblxuICAgICAgICB0aGlzLnllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgICAgICB0aGlzLmRhdGUoZGF0ZS5nZXRVVENEYXRlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUScsIDAsICdRbycsICdxdWFydGVyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3F1YXJ0ZXInLCAnUScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgncXVhcnRlcicsIDcpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUScsIG1hdGNoMSk7XG4gICAgYWRkUGFyc2VUb2tlbignUScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gKHRvSW50KGlucHV0KSAtIDEpICogMztcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFF1YXJ0ZXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gTWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkgKyAxKSAvIDMpIDogdGhpcy5tb250aCgoaW5wdXQgLSAxKSAqIDMgKyB0aGlzLm1vbnRoKCkgJSAzKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignRCcsIFsnREQnLCAyXSwgJ0RvJywgJ2RhdGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF0ZScsICdEJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF0ZScsIDkpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgP1xuICAgICAgICAgIChsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2UgfHwgbG9jYWxlLl9vcmRpbmFsUGFyc2UpIDpcbiAgICAgICAgICBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50O1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG4gICAgYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQubWF0Y2gobWF0Y2gxdG8yKVswXSk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheU9mWWVhcicsICdEREQnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXlPZlllYXInLCA0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0RERCcsICBtYXRjaDF0bzMpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REREQnLCBtYXRjaDMpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydEREQnLCAnRERERCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZlllYXIgKGlucHV0KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXIgPSBNYXRoLnJvdW5kKCh0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykgLSB0aGlzLmNsb25lKCkuc3RhcnRPZigneWVhcicpKSAvIDg2NGU1KSArIDE7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoKGlucHV0IC0gZGF5T2ZZZWFyKSwgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignbScsIFsnbW0nLCAyXSwgMCwgJ21pbnV0ZScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaW51dGUnLCAnbScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbWludXRlJywgMTQpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignbScsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3NlY29uZCcsICdzJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdzZWNvbmQnLCAxNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3MnLCAnc3MnXSwgU0VDT05EKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwMDtcbiAgICB9KTtcblxuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaWxsaXNlY29uZCcsICdtcycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbWlsbGlzZWNvbmQnLCAxNik7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdTJywgICAgbWF0Y2gxdG8zLCBtYXRjaDEpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTJywgICBtYXRjaDF0bzMsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignU1NTJywgIG1hdGNoMXRvMywgbWF0Y2gzKTtcblxuICAgIHZhciB0b2tlbjtcbiAgICBmb3IgKHRva2VuID0gJ1NTU1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFJlZ2V4VG9rZW4odG9rZW4sIG1hdGNoVW5zaWduZWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlTXMoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01JTExJU0VDT05EXSA9IHRvSW50KCgnMC4nICsgaW5wdXQpICogMTAwMCk7XG4gICAgfVxuXG4gICAgZm9yICh0b2tlbiA9ICdTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBwYXJzZU1zKTtcbiAgICB9XG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbGxpc2Vjb25kID0gbWFrZUdldFNldCgnTWlsbGlzZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3onLCAgMCwgMCwgJ3pvbmVBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3p6JywgMCwgMCwgJ3pvbmVOYW1lJyk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRab25lQWJiciAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZU5hbWUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUnIDogJyc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gTW9tZW50LnByb3RvdHlwZTtcblxuICAgIHByb3RvLmFkZCAgICAgICAgICAgICAgID0gYWRkO1xuICAgIHByb3RvLmNhbGVuZGFyICAgICAgICAgID0gY2FsZW5kYXIkMTtcbiAgICBwcm90by5jbG9uZSAgICAgICAgICAgICA9IGNsb25lO1xuICAgIHByb3RvLmRpZmYgICAgICAgICAgICAgID0gZGlmZjtcbiAgICBwcm90by5lbmRPZiAgICAgICAgICAgICA9IGVuZE9mO1xuICAgIHByb3RvLmZvcm1hdCAgICAgICAgICAgID0gZm9ybWF0O1xuICAgIHByb3RvLmZyb20gICAgICAgICAgICAgID0gZnJvbTtcbiAgICBwcm90by5mcm9tTm93ICAgICAgICAgICA9IGZyb21Ob3c7XG4gICAgcHJvdG8udG8gICAgICAgICAgICAgICAgPSB0bztcbiAgICBwcm90by50b05vdyAgICAgICAgICAgICA9IHRvTm93O1xuICAgIHByb3RvLmdldCAgICAgICAgICAgICAgID0gc3RyaW5nR2V0O1xuICAgIHByb3RvLmludmFsaWRBdCAgICAgICAgID0gaW52YWxpZEF0O1xuICAgIHByb3RvLmlzQWZ0ZXIgICAgICAgICAgID0gaXNBZnRlcjtcbiAgICBwcm90by5pc0JlZm9yZSAgICAgICAgICA9IGlzQmVmb3JlO1xuICAgIHByb3RvLmlzQmV0d2VlbiAgICAgICAgID0gaXNCZXR3ZWVuO1xuICAgIHByb3RvLmlzU2FtZSAgICAgICAgICAgID0gaXNTYW1lO1xuICAgIHByb3RvLmlzU2FtZU9yQWZ0ZXIgICAgID0gaXNTYW1lT3JBZnRlcjtcbiAgICBwcm90by5pc1NhbWVPckJlZm9yZSAgICA9IGlzU2FtZU9yQmVmb3JlO1xuICAgIHByb3RvLmlzVmFsaWQgICAgICAgICAgID0gaXNWYWxpZCQyO1xuICAgIHByb3RvLmxhbmcgICAgICAgICAgICAgID0gbGFuZztcbiAgICBwcm90by5sb2NhbGUgICAgICAgICAgICA9IGxvY2FsZTtcbiAgICBwcm90by5sb2NhbGVEYXRhICAgICAgICA9IGxvY2FsZURhdGE7XG4gICAgcHJvdG8ubWF4ICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNYXg7XG4gICAgcHJvdG8ubWluICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNaW47XG4gICAgcHJvdG8ucGFyc2luZ0ZsYWdzICAgICAgPSBwYXJzaW5nRmxhZ3M7XG4gICAgcHJvdG8uc2V0ICAgICAgICAgICAgICAgPSBzdHJpbmdTZXQ7XG4gICAgcHJvdG8uc3RhcnRPZiAgICAgICAgICAgPSBzdGFydE9mO1xuICAgIHByb3RvLnN1YnRyYWN0ICAgICAgICAgID0gc3VidHJhY3Q7XG4gICAgcHJvdG8udG9BcnJheSAgICAgICAgICAgPSB0b0FycmF5O1xuICAgIHByb3RvLnRvT2JqZWN0ICAgICAgICAgID0gdG9PYmplY3Q7XG4gICAgcHJvdG8udG9EYXRlICAgICAgICAgICAgPSB0b0RhdGU7XG4gICAgcHJvdG8udG9JU09TdHJpbmcgICAgICAgPSB0b0lTT1N0cmluZztcbiAgICBwcm90by5pbnNwZWN0ICAgICAgICAgICA9IGluc3BlY3Q7XG4gICAgcHJvdG8udG9KU09OICAgICAgICAgICAgPSB0b0pTT047XG4gICAgcHJvdG8udG9TdHJpbmcgICAgICAgICAgPSB0b1N0cmluZztcbiAgICBwcm90by51bml4ICAgICAgICAgICAgICA9IHVuaXg7XG4gICAgcHJvdG8udmFsdWVPZiAgICAgICAgICAgPSB2YWx1ZU9mO1xuICAgIHByb3RvLmNyZWF0aW9uRGF0YSAgICAgID0gY3JlYXRpb25EYXRhO1xuICAgIHByb3RvLnllYXIgICAgICAgPSBnZXRTZXRZZWFyO1xuICAgIHByb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuICAgIHByb3RvLndlZWtZZWFyICAgID0gZ2V0U2V0V2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcbiAgICBwcm90by5xdWFydGVyID0gcHJvdG8ucXVhcnRlcnMgPSBnZXRTZXRRdWFydGVyO1xuICAgIHByb3RvLm1vbnRoICAgICAgID0gZ2V0U2V0TW9udGg7XG4gICAgcHJvdG8uZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbiAgICBwcm90by53ZWVrICAgICAgICAgICA9IHByb3RvLndlZWtzICAgICAgICA9IGdldFNldFdlZWs7XG4gICAgcHJvdG8uaXNvV2VlayAgICAgICAgPSBwcm90by5pc29XZWVrcyAgICAgPSBnZXRTZXRJU09XZWVrO1xuICAgIHByb3RvLndlZWtzSW5ZZWFyICAgID0gZ2V0V2Vla3NJblllYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcbiAgICBwcm90by5kYXRlICAgICAgID0gZ2V0U2V0RGF5T2ZNb250aDtcbiAgICBwcm90by5kYXkgICAgICAgID0gcHJvdG8uZGF5cyAgICAgICAgICAgICA9IGdldFNldERheU9mV2VlaztcbiAgICBwcm90by53ZWVrZGF5ICAgID0gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrO1xuICAgIHByb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG4gICAgcHJvdG8uZGF5T2ZZZWFyICA9IGdldFNldERheU9mWWVhcjtcbiAgICBwcm90by5ob3VyID0gcHJvdG8uaG91cnMgPSBnZXRTZXRIb3VyO1xuICAgIHByb3RvLm1pbnV0ZSA9IHByb3RvLm1pbnV0ZXMgPSBnZXRTZXRNaW51dGU7XG4gICAgcHJvdG8uc2Vjb25kID0gcHJvdG8uc2Vjb25kcyA9IGdldFNldFNlY29uZDtcbiAgICBwcm90by5taWxsaXNlY29uZCA9IHByb3RvLm1pbGxpc2Vjb25kcyA9IGdldFNldE1pbGxpc2Vjb25kO1xuICAgIHByb3RvLnV0Y09mZnNldCAgICAgICAgICAgID0gZ2V0U2V0T2Zmc2V0O1xuICAgIHByb3RvLnV0YyAgICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9VVEM7XG4gICAgcHJvdG8ubG9jYWwgICAgICAgICAgICAgICAgPSBzZXRPZmZzZXRUb0xvY2FsO1xuICAgIHByb3RvLnBhcnNlWm9uZSAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQ7XG4gICAgcHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbiAgICBwcm90by5pc0RTVCAgICAgICAgICAgICAgICA9IGlzRGF5bGlnaHRTYXZpbmdUaW1lO1xuICAgIHByb3RvLmlzTG9jYWwgICAgICAgICAgICAgID0gaXNMb2NhbDtcbiAgICBwcm90by5pc1V0Y09mZnNldCAgICAgICAgICA9IGlzVXRjT2Zmc2V0O1xuICAgIHByb3RvLmlzVXRjICAgICAgICAgICAgICAgID0gaXNVdGM7XG4gICAgcHJvdG8uaXNVVEMgICAgICAgICAgICAgICAgPSBpc1V0YztcbiAgICBwcm90by56b25lQWJiciA9IGdldFpvbmVBYmJyO1xuICAgIHByb3RvLnpvbmVOYW1lID0gZ2V0Wm9uZU5hbWU7XG4gICAgcHJvdG8uZGF0ZXMgID0gZGVwcmVjYXRlKCdkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLicsIGdldFNldERheU9mTW9udGgpO1xuICAgIHByb3RvLm1vbnRocyA9IGRlcHJlY2F0ZSgnbW9udGhzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb250aCBpbnN0ZWFkJywgZ2V0U2V0TW9udGgpO1xuICAgIHByb3RvLnllYXJzICA9IGRlcHJlY2F0ZSgneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsIGdldFNldFllYXIpO1xuICAgIHByb3RvLnpvbmUgICA9IGRlcHJlY2F0ZSgnbW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3Mvem9uZS8nLCBnZXRTZXRab25lKTtcbiAgICBwcm90by5pc0RTVFNoaWZ0ZWQgPSBkZXByZWNhdGUoJ2lzRFNUU2hpZnRlZCBpcyBkZXByZWNhdGVkLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kc3Qtc2hpZnRlZC8gZm9yIG1vcmUgaW5mb3JtYXRpb24nLCBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQpO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlVW5peCAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0ICogMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5ab25lICgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0IChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbiAgICBwcm90byQxLmNhbGVuZGFyICAgICAgICA9IGNhbGVuZGFyO1xuICAgIHByb3RvJDEubG9uZ0RhdGVGb3JtYXQgID0gbG9uZ0RhdGVGb3JtYXQ7XG4gICAgcHJvdG8kMS5pbnZhbGlkRGF0ZSAgICAgPSBpbnZhbGlkRGF0ZTtcbiAgICBwcm90byQxLm9yZGluYWwgICAgICAgICA9IG9yZGluYWw7XG4gICAgcHJvdG8kMS5wcmVwYXJzZSAgICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5wb3N0Zm9ybWF0ICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5yZWxhdGl2ZVRpbWUgICAgPSByZWxhdGl2ZVRpbWU7XG4gICAgcHJvdG8kMS5wYXN0RnV0dXJlICAgICAgPSBwYXN0RnV0dXJlO1xuICAgIHByb3RvJDEuc2V0ICAgICAgICAgICAgID0gc2V0O1xuXG4gICAgcHJvdG8kMS5tb250aHMgICAgICAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHM7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydCAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNTaG9ydDtcbiAgICBwcm90byQxLm1vbnRoc1BhcnNlICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1BhcnNlO1xuICAgIHByb3RvJDEubW9udGhzUmVnZXggICAgICAgPSBtb250aHNSZWdleDtcbiAgICBwcm90byQxLm1vbnRoc1Nob3J0UmVnZXggID0gbW9udGhzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWsgPSBsb2NhbGVXZWVrO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZlllYXIgPSBsb2NhbGVGaXJzdERheU9mWWVhcjtcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZXZWVrID0gbG9jYWxlRmlyc3REYXlPZldlZWs7XG5cbiAgICBwcm90byQxLndlZWtkYXlzICAgICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzO1xuICAgIHByb3RvJDEud2Vla2RheXNNaW4gICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNNaW47XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0ICA9ICAgICAgICBsb2NhbGVXZWVrZGF5c1Nob3J0O1xuICAgIHByb3RvJDEud2Vla2RheXNQYXJzZSAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNQYXJzZTtcblxuICAgIHByb3RvJDEud2Vla2RheXNSZWdleCAgICAgICA9ICAgICAgICB3ZWVrZGF5c1JlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydFJlZ2V4ICA9ICAgICAgICB3ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pblJlZ2V4ICAgID0gICAgICAgIHdlZWtkYXlzTWluUmVnZXg7XG5cbiAgICBwcm90byQxLmlzUE0gPSBsb2NhbGVJc1BNO1xuICAgIHByb3RvJDEubWVyaWRpZW0gPSBsb2NhbGVNZXJpZGllbTtcblxuICAgIGZ1bmN0aW9uIGdldCQxIChmb3JtYXQsIGluZGV4LCBmaWVsZCwgc2V0dGVyKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKTtcbiAgICAgICAgdmFyIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGxvY2FsZVtmaWVsZF0odXRjLCBmb3JtYXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNJbXBsIChmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCBpLCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICAvLyAoKVxuICAgIC8vICg1KVxuICAgIC8vIChmbXQsIDUpXG4gICAgLy8gKGZtdClcbiAgICAvLyAodHJ1ZSlcbiAgICAvLyAodHJ1ZSwgNSlcbiAgICAvLyAodHJ1ZSwgZm10LCA1KVxuICAgIC8vICh0cnVlLCBmbXQpXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzSW1wbCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gbG9jYWxlU29ydGVkO1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBsb2NhbGVTb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDA7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIChpbmRleCArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIChpICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHMgKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzU2hvcnQgKGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5cyAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzU2hvcnQgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzTWluIChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNNaW4nKTtcbiAgICB9XG5cbiAgICBnZXRTZXRHbG9iYWxMb2NhbGUoJ2VuJywge1xuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRvSW50KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuICAgIGhvb2tzLmxhbmcgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuJywgZ2V0U2V0R2xvYmFsTG9jYWxlKTtcbiAgICBob29rcy5sYW5nRGF0YSA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLicsIGdldExvY2FsZSk7XG5cbiAgICB2YXIgbWF0aEFicyA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gYWJzICgpIHtcbiAgICAgICAgdmFyIGRhdGEgICAgICAgICAgID0gdGhpcy5fZGF0YTtcblxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgICAgIHRoaXMuX2RheXMgICAgICAgICA9IG1hdGhBYnModGhpcy5fZGF5cyk7XG4gICAgICAgIHRoaXMuX21vbnRocyAgICAgICA9IG1hdGhBYnModGhpcy5fbW9udGhzKTtcblxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyAgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzICAgICAgID0gbWF0aEFicyhkYXRhLnNlY29uZHMpO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgICAgICAgPSBtYXRoQWJzKGRhdGEubWludXRlcyk7XG4gICAgICAgIGRhdGEuaG91cnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgICAgIGRhdGEubW9udGhzICAgICAgICA9IG1hdGhBYnMoZGF0YS5tb250aHMpO1xuICAgICAgICBkYXRhLnllYXJzICAgICAgICAgPSBtYXRoQWJzKGRhdGEueWVhcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0JDEgKGR1cmF0aW9uLCBpbnB1dCwgdmFsdWUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgICAgIGR1cmF0aW9uLl9taWxsaXNlY29uZHMgKz0gZGlyZWN0aW9uICogb3RoZXIuX21pbGxpc2Vjb25kcztcbiAgICAgICAgZHVyYXRpb24uX2RheXMgICAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fZGF5cztcbiAgICAgICAgZHVyYXRpb24uX21vbnRocyAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgICAgIHJldHVybiBkdXJhdGlvbi5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGFkZCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAxKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBzdWJ0cmFjdCgxLCAncycpIG9yIHN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIHN1YnRyYWN0JDEgKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIC0xKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNDZWlsIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWJibGUgKCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuICAgICAgICB2YXIgZGF5cyAgICAgICAgID0gdGhpcy5fZGF5cztcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IHRoaXMuX21vbnRocztcbiAgICAgICAgdmFyIGRhdGEgICAgICAgICA9IHRoaXMuX2RhdGE7XG4gICAgICAgIHZhciBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgeWVhcnMsIG1vbnRoc0Zyb21EYXlzO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAgICAgLy8gY2hlY2s6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yMTY2XG4gICAgICAgIGlmICghKChtaWxsaXNlY29uZHMgPj0gMCAmJiBkYXlzID49IDAgJiYgbW9udGhzID49IDApIHx8XG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA8PSAwICYmIGRheXMgPD0gMCAmJiBtb250aHMgPD0gMCkpKSB7XG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgKz0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzKSArIGRheXMpICogODY0ZTU7XG4gICAgICAgICAgICBkYXlzID0gMDtcbiAgICAgICAgICAgIG1vbnRocyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgYnViYmxlcyB1cCB2YWx1ZXMsIHNlZSB0aGUgdGVzdHMgZm9yXG4gICAgICAgIC8vIGV4YW1wbGVzIG9mIHdoYXQgdGhhdCBtZWFucy5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgIHNlY29uZHMgICAgICAgICAgID0gYWJzRmxvb3IobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgID0gc2Vjb25kcyAlIDYwO1xuXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgPSBtaW51dGVzICUgNjA7XG5cbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICA9IGhvdXJzICUgMjQ7XG5cbiAgICAgICAgZGF5cyArPSBhYnNGbG9vcihob3VycyAvIDI0KTtcblxuICAgICAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgICAgIG1vbnRoc0Zyb21EYXlzID0gYWJzRmxvb3IoZGF5c1RvTW9udGhzKGRheXMpKTtcbiAgICAgICAgbW9udGhzICs9IG1vbnRoc0Zyb21EYXlzO1xuICAgICAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIGRhdGEuZGF5cyAgID0gZGF5cztcbiAgICAgICAgZGF0YS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIGRhdGEueWVhcnMgID0geWVhcnM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c1RvTW9udGhzIChkYXlzKSB7XG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTIgbW9udGhzID09PSA0ODAwXG4gICAgICAgIHJldHVybiBkYXlzICogNDgwMCAvIDE0NjA5NztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNUb0RheXMgKG1vbnRocykge1xuICAgICAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICAgICAgcmV0dXJuIG1vbnRocyAqIDE0NjA5NyAvIDQ4MDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXMgKHVuaXRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheXM7XG4gICAgICAgIHZhciBtb250aHM7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSAnbW9udGgnIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgICA9IHRoaXMuX2RheXMgICArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzICsgZGF5c1RvTW9udGhzKGRheXMpO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXRzID09PSAnbW9udGgnID8gbW9udGhzIDogbW9udGhzIC8gMTI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIE1hdGgucm91bmQobW9udGhzVG9EYXlzKHRoaXMuX21vbnRocykpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnICAgOiByZXR1cm4gZGF5cyAvIDcgICAgICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheScgICAgOiByZXR1cm4gZGF5cyAgICAgICAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cicgICA6IHJldHVybiBkYXlzICogMjQgICAgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZScgOiByZXR1cm4gZGF5cyAqIDE0NDAgICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCcgOiByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6IHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuICAgIGZ1bmN0aW9uIHZhbHVlT2YkMSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzIChhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKTtcbiAgICB2YXIgYXNTZWNvbmRzICAgICAgPSBtYWtlQXMoJ3MnKTtcbiAgICB2YXIgYXNNaW51dGVzICAgICAgPSBtYWtlQXMoJ20nKTtcbiAgICB2YXIgYXNIb3VycyAgICAgICAgPSBtYWtlQXMoJ2gnKTtcbiAgICB2YXIgYXNEYXlzICAgICAgICAgPSBtYWtlQXMoJ2QnKTtcbiAgICB2YXIgYXNXZWVrcyAgICAgICAgPSBtYWtlQXMoJ3cnKTtcbiAgICB2YXIgYXNNb250aHMgICAgICAgPSBtYWtlQXMoJ00nKTtcbiAgICB2YXIgYXNZZWFycyAgICAgICAgPSBtYWtlQXMoJ3knKTtcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzW3VuaXRzICsgJ3MnXSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyk7XG4gICAgdmFyIHNlY29uZHMgICAgICA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKTtcbiAgICB2YXIgbWludXRlcyAgICAgID0gbWFrZUdldHRlcignbWludXRlcycpO1xuICAgIHZhciBob3VycyAgICAgICAgPSBtYWtlR2V0dGVyKCdob3VycycpO1xuICAgIHZhciBkYXlzICAgICAgICAgPSBtYWtlR2V0dGVyKCdkYXlzJyk7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IG1ha2VHZXR0ZXIoJ21vbnRocycpO1xuICAgIHZhciB5ZWFycyAgICAgICAgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MgKCkge1xuICAgICAgICByZXR1cm4gYWJzRmxvb3IodGhpcy5kYXlzKCkgLyA3KTtcbiAgICB9XG5cbiAgICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xuICAgIHZhciB0aHJlc2hvbGRzID0ge1xuICAgICAgICBzczogNDQsICAgICAgICAgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgIHMgOiA0NSwgICAgICAgICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtIDogNDUsICAgICAgICAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgIGggOiAyMiwgICAgICAgICAvLyBob3VycyB0byBkYXlcbiAgICAgICAgZCA6IDI2LCAgICAgICAgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgTSA6IDExICAgICAgICAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpO1xuICAgICAgICB2YXIgc2Vjb25kcyAgPSByb3VuZChkdXJhdGlvbi5hcygncycpKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSk7XG4gICAgICAgIHZhciBob3VycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpO1xuICAgICAgICB2YXIgZGF5cyAgICAgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKTtcbiAgICAgICAgdmFyIG1vbnRocyAgID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSk7XG4gICAgICAgIHZhciB5ZWFycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpO1xuXG4gICAgICAgIHZhciBhID0gc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdICB8fFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgICAmJiBbJ3NzJywgc2Vjb25kc10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAgICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ2gnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICAgJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAgICYmIFsnZCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGRheXMgICAgPCB0aHJlc2hvbGRzLmQgICAmJiBbJ2RkJywgZGF5c10gICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAgICYmIFsnTU0nLCBtb250aHNdICB8fFxuICAgICAgICAgICAgICAgIHllYXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ3knXSAgICAgICAgICAgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yocm91bmRpbmdGdW5jdGlvbikgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJvdW5kID0gcm91bmRpbmdGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQgKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZSAod2l0aFN1ZmZpeCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoKHggPiAwKSAtICh4IDwgMCkpIHx8ICt4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nJDEoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDA7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSBhYnMkMSh0aGlzLl9kYXlzKTtcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IGFicyQxKHRoaXMuX21vbnRocyk7XG4gICAgICAgIHZhciBtaW51dGVzLCBob3VycywgeWVhcnM7XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBzZWNvbmRzICU9IDYwO1xuICAgICAgICBtaW51dGVzICU9IDYwO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cblxuICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICB2YXIgWSA9IHllYXJzO1xuICAgICAgICB2YXIgTSA9IG1vbnRocztcbiAgICAgICAgdmFyIEQgPSBkYXlzO1xuICAgICAgICB2YXIgaCA9IGhvdXJzO1xuICAgICAgICB2YXIgbSA9IG1pbnV0ZXM7XG4gICAgICAgIHZhciBzID0gc2Vjb25kcyA/IHNlY29uZHMudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgJycpIDogJyc7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgZGF5c1NpZ24gPSBzaWduKHRoaXMuX2RheXMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gdG90YWxTaWduICsgJ1AnICtcbiAgICAgICAgICAgIChZID8geW1TaWduICsgWSArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAoTSA/IHltU2lnbiArIE0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKEQgPyBkYXlzU2lnbiArIEQgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgKChoIHx8IG0gfHwgcykgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGggPyBobXNTaWduICsgaCArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobSA/IGhtc1NpZ24gKyBtICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJyk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDIgPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBwcm90byQyLmlzVmFsaWQgICAgICAgID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzICAgICAgICAgICAgPSBhYnM7XG4gICAgcHJvdG8kMi5hZGQgICAgICAgICAgICA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgICAgICAgICAgICAgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyAgICAgID0gYXNNaW51dGVzO1xuICAgIHByb3RvJDIuYXNIb3VycyAgICAgICAgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG4gICAgcHJvdG8kMi5hc1dlZWtzICAgICAgICA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyAgICAgICA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xuICAgIHByb3RvJDIudmFsdWVPZiAgICAgICAgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlICAgICAgICA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lICAgICAgICAgID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgICA9IG1pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLnNlY29uZHMgICAgICAgID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzICAgICAgICAgID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzICAgICAgICAgICA9IGRheXM7XG4gICAgcHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xuICAgIHByb3RvJDIubW9udGhzICAgICAgICAgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyAgICAgICAgICA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvJDIubG9jYWxlRGF0YSAgICAgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZSgndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLCB0b0lTT1N0cmluZyQxKTtcbiAgICBwcm90byQyLmxhbmcgPSBsYW5nO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1gnLCAwLCAwLCAndW5peCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3gnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbiAgICBhZGRQYXJzZVRva2VuKCdYJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQsIDEwKSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuXG4gICAgaG9va3MudmVyc2lvbiA9ICcyLjIyLjEnO1xuXG4gICAgc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuICAgIGhvb2tzLmZuICAgICAgICAgICAgICAgICAgICA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiAgICAgICAgICAgICAgICAgICA9IG1pbjtcbiAgICBob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG4gICAgaG9va3Mubm93ICAgICAgICAgICAgICAgICAgID0gbm93O1xuICAgIGhvb2tzLnV0YyAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuICAgIGhvb2tzLm1vbnRocyAgICAgICAgICAgICAgICA9IGxpc3RNb250aHM7XG4gICAgaG9va3MuaXNEYXRlICAgICAgICAgICAgICAgID0gaXNEYXRlO1xuICAgIGhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbiAgICBob29rcy5pbnZhbGlkICAgICAgICAgICAgICAgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uICAgICAgICAgICAgICA9IGNyZWF0ZUR1cmF0aW9uO1xuICAgIGhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzICAgICAgICAgICAgICA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgICAgICAgICAgICAgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gICAgICAgICAgICA9IGlzRHVyYXRpb247XG4gICAgaG9va3MubW9udGhzU2hvcnQgICAgICAgICAgID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgICAgICAgICAgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlICAgICAgICAgID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgICAgICAgICA9IGxpc3RXZWVrZGF5c1Nob3J0O1xuICAgIGhvb2tzLm5vcm1hbGl6ZVVuaXRzICAgICAgICA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nICA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbiAgICBob29rcy5wcm90b3R5cGUgICAgICAgICAgICAgPSBwcm90bztcblxuICAgIC8vIGN1cnJlbnRseSBIVE1MNSBpbnB1dCB0eXBlIG9ubHkgc3VwcG9ydHMgMjQtaG91ciBmb3JtYXRzXG4gICAgaG9va3MuSFRNTDVfRk1UID0ge1xuICAgICAgICBEQVRFVElNRV9MT0NBTDogJ1lZWVktTU0tRERUSEg6bW0nLCAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfU0VDT05EUzogJ1lZWVktTU0tRERUSEg6bW06c3MnLCAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsICAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIERBVEU6ICdZWVlZLU1NLUREJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ1lZWVktW1ddV1cnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBNYWluIGZ1bmN0aW9uIGFuZCBlbnRyeSBwb2ludFxuICAgIENhbiBiZSByZWdpc3RlcmVkIHRvIGEgdmlkZW9qcyBpbnN0YW5jZSBhcyBhIHBsdWdpblxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSAodmlkZW9qcykgPT4ge1xuICAgIHJlcXVpcmUoJy4vbGliL3BvbHlmaWxscycpO1xuXG4gICAgY29uc3QgUGx1Z2luID0gdmlkZW9qcy5nZXRQbHVnaW4oJ3BsdWdpbicpLFxuICAgICAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi9saWIvdXRpbHMnKSxcbiAgICAgICAgICBDb250cm9scyA9IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvY29udHJvbHNcIiksXG4gICAgICAgICAgQW5ub3RhdGlvblN0YXRlID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9hbm5vdGF0aW9uX3N0YXRlXCIpLFxuICAgICAgICAgIEV2ZW50RGlzcGF0Y2hlciA9IHJlcXVpcmUoXCIuL2xpYi9ldmVudF9kaXNwYXRjaGVyXCIpO1xuXG4gICAgY29uc3QgREVGQVVMVF9PUFRJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGJpbmRBcnJvd0tleXM6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBtZXRhOiAgICAgICAgICAgICAgICAgICAgICAgeyB1c2VyX2lkOiBudWxsLCB1c2VyX25hbWU6IG51bGwgfSxcbiAgICAgICAgYW5ub3RhdGlvbnNPYmplY3RzOiAgICAgICAgIFtdLFxuICAgICAgICBzaG93Q29udHJvbHM6ICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc2hvd0NvbW1lbnRMaXN0OiAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHNob3dGdWxsU2NyZWVuOiAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBzaG93TWFya2VyU2hhcGVBbmRUb29sdGlwczogdHJ1ZSxcbiAgICAgICAgaW50ZXJuYWxDb21tZW50aW5nOiAgICAgICAgIHRydWUsXG4gICAgICAgIHN0YXJ0SW5Bbm5vdGF0aW9uTW9kZTogICAgICBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNsYXNzIEFubm90YXRpb25Db21tZW50cyBleHRlbmRzIFBsdWdpbiB7XG5cbiAgICAgICAgY29uc3RydWN0b3IgKHBsYXllciwgb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oVXRpbHMuY2xvbmVPYmplY3QoREVGQVVMVF9PUFRJT05TKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5yZWdpc3Rlckxpc3RlbmVyc0Zvcih0aGlzLCAnQW5ub3RhdGlvbkNvbW1lbnRzJyk7XG5cbiAgICAgICAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgICAgICAgICAgdGhpcy5tZXRhID0gb3B0aW9ucy5tZXRhO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICAgICAgdGhpcy5fcmVhZHlDYWxsYmFja3MgPSBbXTtcblxuICAgICAgICAgICAgLy8gQXNzaWduIHJlZmVyZW5jZSB0byB0aGlzIGNsYXNzIHRvIHBsYXllciBmb3IgYWNjZXNzIGxhdGVyIGJ5IGNvbXBvbmVudHMgd2hlcmUgbmVlZGVkXG4gICAgICAgICAgICBwbGF5ZXIuYW5ub3RhdGlvbkNvbW1lbnRzID0gKCgpID0+IHsgcmV0dXJuIHRoaXMgfSkuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgY29tcG9uZW50cyBhcmUgaW5pdGlhbGl6ZWQgQUZURVIgbWV0YWRhdGEgKyBwbGF5IGRhdGEgaXMgbG9hZGVkIHNvIHdlIG1ldGFkYXRhL2R1cmF0aW9uXG4gICAgICAgICAgICAvLyBOT1RFIC0gdGhpcyBjaGVjayBpcyByZXF1aXJlZCBiZWNhdXNlIHBsYXllciBsb2FkZWRkYXRhIGRvZXNuJ3QgYWx3YXlzIGZpcmUgaWYgcmVhZHlzdGF0ZSBpcyA+IDNcbiAgICAgICAgICAgIGlmKHBsYXllci5yZWFkeVN0YXRlKCkgPj0gMyl7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3N0TG9hZERhdGFDb25zdHJ1Y3RvcigpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcGxheWVyLm9uKCdsb2FkZWRkYXRhJywgdGhpcy5wb3N0TG9hZERhdGFDb25zdHJ1Y3Rvci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgaW5pdC9zZXR1cCBhZnRlciB2aWRlbyBkYXRhICsgbWV0YWRhdGEgaXMgYXZhaWxhYmxlXG4gICAgICAgIHBvc3RMb2FkRGF0YUNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgICAgIC8vIHNldHVwIGluaXRpYWwgc3RhdGUgYW5kIHJlbmRlciBVSVxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RhdGUgPSBuZXcgQW5ub3RhdGlvblN0YXRlKHRoaXMucGxheWVyKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0YXRlLmFubm90YXRpb25zID0gdGhpcy5vcHRpb25zLmFubm90YXRpb25zT2JqZWN0cztcblxuICAgICAgICAgICAgdGhpcy5jb250cm9scyA9IG5ldyBDb250cm9scyh0aGlzLnBsYXllciwgdGhpcy5vcHRpb25zLmJpbmRBcnJvd0tleXMpO1xuICAgICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLnNldEJvdW5kcyhmYWxzZSk7XG4gICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMuc3RhcnRJbkFubm90YXRpb25Nb2RlKSB0aGlzLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2luUmVhZHkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJpbmQgbmVlZGVkIGV2ZW50cyBmb3IgaW50ZXJhY3Rpb24gdy8gY29tcG9uZW50c1xuICAgICAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgICAgIC8vIFNldCBwbGF5ZXIgYm91bmRhcmllcyBvbiB3aW5kb3cgc2l6ZSBjaGFuZ2Ugb3IgZnVsbHNjcmVlbiBjaGFuZ2VcbiAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplLnZhYy13aW5kb3ctcmVzaXplJywgVXRpbHMudGhyb3R0bGUodGhpcy5zZXRCb3VuZHMuYmluZCh0aGlzKSwgNTAwKSk7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5vbignZnVsbHNjcmVlbmNoYW5nZScsIFV0aWxzLnRocm90dGxlKHRoaXMuc2V0Qm91bmRzLmJpbmQodGhpcyksIDUwMCkpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgYW5ub3RhdGlvbiBmZWF0dXJlcyBvbiBmdWxsc2NyZWVuIGlmIHNob3dGdWxsU2NyZWVuOiBmYWxzZVxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2hvd0Z1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5vbignZnVsbHNjcmVlbmNoYW5nZScsICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5pc0Z1bGxzY3JlZW5fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZUZ1bGxzY3JlZW5Bbm5vdGF0aW9uc0VuYWJsZWQgPSB0aGlzLmFjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5wbGF5ZXIuZWwoKSkuYWRkQ2xhc3MoJ3ZhYy1kaXNhYmxlLWZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5wbGF5ZXIuZWwoKSkucmVtb3ZlQ2xhc3MoJ3ZhYy1kaXNhYmxlLWZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnByZUZ1bGxzY3JlZW5Bbm5vdGF0aW9uc0VuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSBwcmV2aW91c2x5IGluIGFubm90YXRpb24gbW9kZSAocHJlLWZ1bGxzY3JlZW4pIG9yIGVudGVyaW5nIGZ1bGxzY3JlZWVuIGFuZCBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFubm90YXRpb24gbW9kZSwgdG9nZ2xlIHRoZSBtb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgd3JhcHBlciBmdW5jIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHVzZSBFdmVudERpc3BhdGNoZXIgZnJvbSB0aGUgY2xpZW50XG4gICAgICAgIC8vIEV4OiBwbHVnaW4uZmlyZSh0eXBlLCBkYXRhKTtcbiAgICAgICAgZmlyZSAodHlwZSwgZGF0YT17fSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZmlyZSh0eXBlLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRvZ2dsZSBhbm5vdGF0aW9ucyBtb2RlIG9uL29mZlxuICAgICAgICB0b2dnbGVBbm5vdGF0aW9uTW9kZSgpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gIXRoaXMuYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIudG9nZ2xlQ2xhc3MoJ3ZhYy1hY3RpdmUnKTsgLy8gVG9nZ2xlIGdsb2JhbCBjbGFzcyB0byBwbGF5ZXIgdG8gdG9nZ2xlIGRpc3BsYXkgb2YgZWxlbWVudHNcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0YXRlLmVuYWJsZWQgPSB0aGlzLmFjdGl2ZTtcblxuICAgICAgICAgICAgaWYodGhpcy5hY3RpdmUpe1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShcImFubm90YXRpb25Nb2RlRW5hYmxlZFwiKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShcImFubm90YXRpb25Nb2RlRGlzYWJsZWRcIilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIGNvbnRyb2wgY29tcG9uZW50IFVJIGlmIHNob3dDb250cm9sczogdHJ1ZVxuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLnNob3dDb250cm9scyl7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuYWN0aXZlKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5jbGVhcih0cnVlKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5yZW5kZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgcGxheWVyIFVJIGJvdW5kYXJpZXNcbiAgICAgICAgc2V0Qm91bmRzICh0cmlnZ2VyQ2hhbmdlPXRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0ge307XG4gICAgICAgICAgICBsZXQgJHBsYXllciA9ICQodGhpcy5wbGF5ZXIuZWwoKSksXG4gICAgICAgICAgICAgICAgJGN0cmxzICA9ICRwbGF5ZXIuZmluZCgnLnZqcy1jb250cm9sLWJhcicpO1xuXG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5sZWZ0ID0gJHBsYXllci5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMudG9wID0gJHBsYXllci5vZmZzZXQoKS50b3A7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5yaWdodCA9IHRoaXMuYm91bmRzLmxlZnQgKyAkcGxheWVyLndpZHRoKCk7XG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5ib3R0b20gPSB0aGlzLmJvdW5kcy50b3AgKyAkcGxheWVyLmhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMuYm90dG9tV2l0aG91dENvbnRyb2xzID0gdGhpcy5ib3VuZHMuYm90dG9tIC0gJGN0cmxzLmhlaWdodCgpO1xuXG4gICAgICAgICAgICAvLyBmaXJlcyBhbiBldmVudCB3aGVuIGJvdW5kcyBoYXZlIGNoYW5nZWQgZHVyaW5nIHJlc2l6aW5nXG4gICAgICAgICAgICBpZih0cmlnZ2VyQ2hhbmdlKSB0aGlzLmZpcmUoJ3BsYXllckJvdW5kc0NoYW5nZWQnLCB0aGlzLmJvdW5kcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQdWJsaWMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmb3Igd2hlbiBwbHVnaW4gaXMgcmVhZHlcbiAgICAgICAgb25SZWFkeSAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZXZlbnREaXNwYXRjaGVyLnBsdWdpblJlYWR5KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBwbHVnaW4gYXMgcmVhZHkgYW5kIGZpcmUgYW55IHBlbmRpbmcgY2FsbGJhY2tzXG4gICAgICAgIHBsdWdpblJlYWR5ICgpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLnBsdWdpblJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlKHRoaXMuX3JlYWR5Q2FsbGJhY2tzLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZHlDYWxsYmFja3MucG9wKCkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlYXJkb3duIGFsbCBjb21wb25lbnRzLCByZW1vdmUgYWxsIGxpc3RlbmVycywgYW5kIHJlbW92ZSBlbGVtZW50cyBmcm9tIERPTVxuICAgICAgICBkaXNwb3NlICgpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSB0aGlzLmNvbnRyb2xzLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdGF0ZSA9IHRoaXMuYW5ub3RhdGlvblN0YXRlLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlciA9IHRoaXMuZXZlbnREaXNwYXRjaGVyLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB0aGlzLnRlYXJkb3duKCk7XG4gICAgICAgICAgICBpZih0aGlzLnBsYXllcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmFubm90YXRpb25Db21tZW50cyA9IG51bGw7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnBsYXllci5lbCgpKS5yZW1vdmVDbGFzcygndmFjLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICQodGhpcy5wbGF5ZXIuZWwoKSkuZmluZChcIltjbGFzc149J3ZhYy0nXVwiKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMucGxheWVyKSB0aGlzLnBsYXllci5vZmYoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICAgICAgICAgICQod2luZG93KS5vZmYoJ3Jlc2l6ZS52YWMtd2luZG93LXJlc2l6ZScpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIEhhbmRsZWJhcnMgPSByZXF1aXJlKFwiaGFuZGxlYmFycy9ydW50aW1lXCIpO1xuIGV4cG9ydHNbXCJjb21tZW50XCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnRcXFwiIGRhdGEtaWQ9XFxcIlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImlkXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudC1oZWFkZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYXV0aG9yLW5hbWVcXFwiPlwiXG4gICAgKyBhbGlhczQoY29udGFpbmVyLmxhbWJkYSgoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXRhIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51c2VyX25hbWUgOiBzdGFjazEpLCBkZXB0aDApKVxuICAgICsgXCI8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLXRpbWVzdGFtcFxcXCI+XCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRpbWVTaW5jZSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudGltZVNpbmNlIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ0aW1lU2luY2VcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcInZhYy1kZWxldGUtY29tbWVudFxcXCI+Jm5ic3A7Jm5ic3A7WDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50LWJvZHlcXFwiPlxcbiAgICBcIlxuICAgICsgYWxpYXM0KChoZWxwZXJzLmJyZWFrbGluZXMgfHwgKGRlcHRoMCAmJiBkZXB0aDAuYnJlYWtsaW5lcykgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYm9keSA6IGRlcHRoMCkse1wibmFtZVwiOlwiYnJlYWtsaW5lc1wiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSlcbiAgICArIFwiXFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcImNvbW1lbnRfbGlzdFwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgICBcIlxuICAgICsgKChzdGFjazEgPSBjb250YWluZXIubGFtYmRhKGJsb2NrUGFyYW1zWzBdWzBdLCBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhLGJsb2NrUGFyYW1zKSB7XG4gICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KTtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJ2YWMtY29tbWVudHMtY29udGFpbmVyXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50cy13cmFwXFxcIj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbW1lbnRzSFRNTCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZWFjaFwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAxLCBibG9ja1BhcmFtcyksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YSxcImJsb2NrUGFyYW1zXCI6YmxvY2tQYXJhbXN9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtcmVwbHktYnRuIHZhYy1idXR0b25cXFwiPkFERCBSRVBMWTwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYWRkLW5ldy1zaGFwZWJveFxcXCI+PC9kaXY+XFxuICA8L2Rpdj5cXG4gIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50cy1jb250cm9sLWJhclxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1yYW5nZVxcXCI+PGI+QDwvYj4gXCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucmFuZ2VTdHIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU3RyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IFwiZnVuY3Rpb25cIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJyYW5nZVN0clwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGEsXCJibG9ja1BhcmFtc1wiOmJsb2NrUGFyYW1zfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jb250cm9sLWJ1dHRvbnNcXFwiPlxcbiAgICAgIDxhIGNsYXNzPVxcXCJ2YWMtZGVsZXRlLWFubm90YXRpb25cXFwiPkRFTEVURTwvYT4gfCA8YSBjbGFzcz1cXFwidmFjLWNsb3NlLWNvbW1lbnQtbGlzdFxcXCI+Q0xPU0U8L2E+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWUsXCJ1c2VCbG9ja1BhcmFtc1wiOnRydWV9KTtcbmV4cG9ydHNbXCJjb250cm9sc1wiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93Q29udHJvbHMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjJcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY29udHJvbHMgdmFjLWNvbnRyb2xcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcInZhYy1idXR0b25cXFwiPisgTkVXPC9idXR0b24+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2hvd05hdiA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgICAgICA8L2Rpdj5cXG5cIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWFubm90YXRpb24tbmF2XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLXByZXZcXFwiPlByZXY8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLW5leHRcXFwiPk5leHQ8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiNVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSk7XG5cbiAgcmV0dXJuIFwiICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby1jb3ZlciB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8tY292ZXItY2FudmFzXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtY3Vyc29yLXRvb2wtdGlwIHZhYy1oaWRkZW5cXFwiPkNsaWNrIGFuZCBkcmFnIHRvIHNlbGVjdDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2hvd0NvbnRyb2xzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndyaXRpbmdDb21tZW50IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg5LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCI2XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLWFkZC1jb250cm9scyB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICAgICAgPGk+U2VsZWN0IHNoYXBlICsgcmFuZ2U8L2k+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW50ZXJuYWxDb21tZW50aW5nIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8tbW92ZVxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1hLXByZXZcXFwiPi0xIHNlYzwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2YWMtYS1uZXh0XFxcIj4rMSBzZWM8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblwiO1xufSxcIjdcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJ2YWMtYnV0dG9uXFxcIj5DT05USU5VRTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YT5jYW5jZWw8L2E+XFxuXCI7XG59LFwiOVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIGhlbHBlcjtcblxuICByZXR1cm4gXCIgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy12aWRlby13cml0ZS1uZXctd3JhcCB2YWMtY29udHJvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLXdyaXRlLW5ldyB2YWMtaXMtYW5ub3RhdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgICA8aDU+PGI+TmV3IEFubm90YXRpb248L2I+IEAgXCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucmFuZ2VTdHIgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU3RyIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGhlbHBlcnMuaGVscGVyTWlzc2luZyksKHR5cGVvZiBoZWxwZXIgPT09IFwiZnVuY3Rpb25cIiA/IGhlbHBlci5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSkse1wibmFtZVwiOlwicmFuZ2VTdHJcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiPC9oNT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInZhYy1jb21tZW50LXNob3dib3hcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj1cXFwiRW50ZXIgY29tbWVudC4uLlxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJ2YWMtYnV0dG9uXFxcIj5TQVZFPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhPkNhbmNlbDwvYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMudW5sZXNzLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hZGRpbmcgOiBkZXB0aDApLHtcIm5hbWVcIjpcInVubGVzc1wiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFkZGluZyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIik7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJkcmFnZ2FibGVfbWFya2VyXCJdID0gSGFuZGxlYmFycy50ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiAoY29udGFpbmVyLm51bGxDb250ZXh0IHx8IHt9KSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPVwiZnVuY3Rpb25cIiwgYWxpYXM0PWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uO1xuXG4gIHJldHVybiBcIjxkaXYgZGF0YS1tYXJrZXItaWQ9XFxcIlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5pZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImlkXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcXCIgY2xhc3M9XFxcInZhYy1tYXJrZXItZHJhZ2dhYmxlIHZhYy1yYW5nZWQtbWFya2VyXFxcIiBzdHlsZT1cXFwibGVmdDogXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxlZnQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxlZnQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImxlZnRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiOyB3aWR0aDpcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMud2lkdGggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLndpZHRoIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJ3aWR0aFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCI7XFxcIj5cXG48L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xuZXhwb3J0c1tcIm1hcmtlclwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwidmFjLXJhbmdlZC1tYXJrZXJcIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgaGVscGVyO1xuXG4gIHJldHVybiBcIndpZHRoOlwiXG4gICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLndpZHRoIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC53aWR0aCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBcImZ1bmN0aW9uXCIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLHtcIm5hbWVcIjpcIndpZHRoXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIjtcIjtcbn0sXCI1XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDogKGNvbnRhaW5lci5udWxsQ29udGV4dCB8fCB7fSksKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnRvb2x0aXBCb2R5IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg2LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCI2XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiICAgICAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInZhYy10b29sdGlwIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudG9vbHRpcFJpZ2h0IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGI+XCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRvb2x0aXBUaW1lIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b29sdGlwVGltZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwidG9vbHRpcFRpbWVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiPC9iPiAtIFwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy50b29sdGlwQm9keSB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudG9vbHRpcEJvZHkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInRvb2x0aXBCb2R5XCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwidmFjLXJpZ2h0LXNpZGVcIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBkYXRhLW1hcmtlci1pZD1cXFwiXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmlkIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiaWRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIiBjbGFzcz1cXFwidmFjLW1hcmtlciBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU2hvdyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIiBzdHlsZT1cXFwibGVmdDogXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmxlZnQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmxlZnQgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcImxlZnRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiOyBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJhbmdlU2hvdyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiIHotaW5kZXg6IFwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy56SW5kZXggfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnpJbmRleCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiekluZGV4XCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcXCI+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93VG9vbHRpcCA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9kaXY+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbmV4cG9ydHNbXCJtYXJrZXJfd3JhcFwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwidmFjLW1hcmtlci1vd3JhcFxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJ2YWMtbWFya2VyLXdyYXBcXFwiPjwvZGl2PlxcbjwvZGl2PlwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wibmV3X2NvbW1lbnRcIl0gPSBIYW5kbGViYXJzLnRlbXBsYXRlKHtcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pLCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwidmFjLXZpZGVvLXdyaXRlLW5ldy13cmFwIHZhYy1uZXctY29tbWVudFxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJ2YWMtdmlkZW8td3JpdGUtbmV3IHZhYy1pcy1jb21tZW50XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidmFjLWNvbW1lbnQtc2hvd2JveFxcXCIgc3R5bGU9XFxcIndpZHRoOlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy53aWR0aCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAud2lkdGggOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcIndpZHRoXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcInB4O3RvcDpcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMudG9wIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b3AgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwodHlwZW9mIGhlbHBlciA9PT0gYWxpYXMzID8gaGVscGVyLmNhbGwoYWxpYXMxLHtcIm5hbWVcIjpcInRvcFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJweDtyaWdodDpcIlxuICAgICsgYWxpYXM0KCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucmlnaHQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJpZ2h0IDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJyaWdodFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJweFxcXCI+XFxuICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVxcXCJFbnRlciBjb21tZW50Li4uXFxcIj48L3RleHRhcmVhPlxcbiAgICAgIDxkaXY+XFxuICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJ2YWMtYnV0dG9uXFxcIj5TQVZFPC9idXR0b24+XFxuICAgICAgICA8YT5DYW5jZWw8L2E+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG5leHBvcnRzW1wicGxheWVyX2J1dHRvblwiXSA9IEhhbmRsZWJhcnMudGVtcGxhdGUoe1wiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiPGI+PC9iPlxcbjxpIGNsYXNzPVxcXCJ2YWMtcGxheWVyLWljb25cXFwiPlxcblx0PHN2ZyBoZWlnaHQ9XFxcIjI0XFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiIHdpZHRoPVxcXCIyNFxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIj5cXG5cdCAgICA8cGF0aCBkPVxcXCJNMjEuOTkgNGMwLTEuMS0uODktMi0xLjk5LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNGw0IDQtLjAxLTE4ek0xOCAxNEg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyelxcXCIvPlxcblx0ICAgIDxwYXRoIGQ9XFxcIk0wIDBoMjR2MjRIMHpcXFwiIGZpbGw9XFxcIm5vbmVcXFwiLz5cXG5cdDwvc3ZnPlxcbjwvaT5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pOyIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIGFuIGFubm90YXRpb24sIHdoaWNoIGluY2x1ZGVzIGNvbnRyb2xsaW5nIHRoZSBtYXJrZXIvc2hhcGUsIHJlbmRlcmluZyBhIGNvbW1lbnRMaXN0LCBldGNcbiovXG5cbmNvbnN0ICAgUGxheWVyVUlDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX3VpX2NvbXBvbmVudFwiKSxcbiAgICAgICAgVXRpbHMgPSByZXF1aXJlKFwiLi8uLi9saWIvdXRpbHMuanNcIiksXG4gICAgICAgIENvbW1lbnRMaXN0ID0gcmVxdWlyZShcIi4vY29tbWVudF9saXN0XCIpLFxuICAgICAgICBNYXJrZXIgPSByZXF1aXJlKFwiLi9tYXJrZXJcIiksXG4gICAgICAgIENvbW1lbnQgPSByZXF1aXJlKFwiLi9jb21tZW50XCIpLFxuICAgICAgICBTaGFwZSA9IHJlcXVpcmUoXCIuL3NoYXBlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZGF0YSwgcGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkIHx8IHRoaXMuY29tcG9uZW50SWQ7XG4gICAgICAgIHRoaXMucmFuZ2UgPSBkYXRhLnJhbmdlO1xuICAgICAgICB0aGlzLnNoYXBlID0gZGF0YS5zaGFwZTtcbiAgICAgICAgdGhpcy5zZWNvbmRzQWN0aXZlID0gdGhpcy5idWlsZFNlY29uZHNBY3RpdmVBcnJheSgpO1xuICAgICAgICB0aGlzLmJ1aWxkQ29tbWVudHMoZGF0YSk7XG4gICAgICAgIHRoaXMuYnVpbGRNYXJrZXIoKTtcbiAgICAgICAgdGhpcy5idWlsZFNoYXBlKCk7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuXG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYnVpbGRDb21tZW50cyhkYXRhKSB7XG4gICAgICAgIHRoaXMuY29tbWVudExpc3QgPSBuZXcgQ29tbWVudExpc3QoXG4gICAgICAgICAgICB7XCJjb21tZW50c1wiOiBkYXRhLmNvbW1lbnRzLCBcImFubm90YXRpb25cIjogdGhpc30sXG4gICAgICAgICAgICB0aGlzLnBsYXllclxuICAgICAgICApO1xuICAgIH1cblxuICAgIGJ1aWxkTWFya2VyICgpIHtcbiAgICAgICAgdGhpcy5tYXJrZXIgPSBuZXcgTWFya2VyKHRoaXMucGxheWVyLCB0aGlzLnJhbmdlLCB0aGlzLmNvbW1lbnRMaXN0LmNvbW1lbnRzWzBdKTtcbiAgICAgICAgdGhpcy5tYXJrZXIucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgYnVpbGRTaGFwZSgpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUgPSBuZXcgU2hhcGUodGhpcy5wbGF5ZXIsIHRoaXMuc2hhcGUpO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBvYmplY3RcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgICAgcmFuZ2U6ICAgICAgdGhpcy5yYW5nZSxcbiAgICAgICAgICAgIHNoYXBlOiAgICAgIHRoaXMuc2hhcGUsXG4gICAgICAgICAgICBjb21tZW50czogICB0aGlzLmNvbW1lbnRMaXN0LmRhdGFcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgdGhpcy5tYXJrZXIuJGVsLm9uKCdjbGljay52YWMtbWFya2VyJywgKGUpID0+IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5vcGVuQW5ub3RhdGlvbih0aGlzLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLy8gT3BlbnMgdGhlIGFubm90YXRpb24uIEhhbmRsZXMgbWFya2VyLCBjb21tZW50TGlzdCwgc2hhcGUsIEFubm90YXRpb24gc3RhdGUsIGFuZCBwbGF5ZXIgc3RhdGVcbiAgICBvcGVuICh3aXRoUGF1c2U9dHJ1ZSwgcHJldmlld09ubHk9ZmFsc2UsIGZvcmNlU25hcFRvU3RhcnQ9ZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICBjb25zdCBzbmFwVG9TdGFydCA9IGZvcmNlU25hcFRvU3RhcnQgfHwgIVV0aWxzLmlzV2l0aGluUmFuZ2UoXG4gICAgICAgICAgICB0aGlzLnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgdGhpcy5yYW5nZS5lbmQsXG4gICAgICAgICAgICBNYXRoLmZsb29yKHRoaXMuY3VycmVudFRpbWUpXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHNob3dUb29sdGlwID0gcHJldmlld09ubHkgJiYgdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93TWFya2VyU2hhcGVBbmRUb29sdGlwcztcbiAgICAgICAgdGhpcy5tYXJrZXIuc2V0QWN0aXZlKHNob3dUb29sdGlwKTtcbiAgICAgICAgaWYoIXByZXZpZXdPbmx5ICYmIHRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbW1lbnRMaXN0KXtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudExpc3QucmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighcHJldmlld09ubHkgfHwgKHByZXZpZXdPbmx5ICYmIHRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd01hcmtlclNoYXBlQW5kVG9vbHRpcHMpKXtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblNoYXBlLnJlbmRlcigpO1xuXG4gICAgICAgICAgICBpZih0aGlzLnNoYXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2hhcGUuJGVsLm9uKFwiY2xpY2sudmFjLWFubm90YXRpb25cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUub3BlbkFubm90YXRpb24odGhpcywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih3aXRoUGF1c2UpIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gICAgICAgIGlmKHNuYXBUb1N0YXJ0KSB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5yYW5nZS5zdGFydDtcblxuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhbm5vdGF0aW9uT3BlbmVkJywge1xuICAgICAgICAgICAgYW5ub3RhdGlvbjogdGhpcy5kYXRhLFxuICAgICAgICAgICAgdHJpZ2dlcmVkX2J5X3RpbWVsaW5lOiBwcmV2aWV3T25seVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDbG9zZXMgdGhlIGFubm90YXRpb24uIEhhbmRsZXMgbWFya2VyLCBjb21tZW5kTGlzdCwgc2hhcGUsIGFuZCBBbm5vdGF0aW9uU3RhdGVcbiAgICBjbG9zZSAoY2xlYXJBY3RpdmU9dHJ1ZSkge1xuICAgICAgICBpZighdGhpcy5pc09wZW4pIHJldHVybjtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXJrZXIuZGVhY3RpdmF0ZSgpO1xuICAgICAgICB0aGlzLmNvbW1lbnRMaXN0LnRlYXJkb3duKGZhbHNlKTtcbiAgICAgICAgaWYodGhpcy5hbm5vdGF0aW9uU2hhcGUuJGVsKSB0aGlzLmFubm90YXRpb25TaGFwZS4kZWwub2ZmKFwiY2xpY2sudmFjLWFubm90YXRpb25cIik7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblNoYXBlLnRlYXJkb3duKCk7XG4gICAgICAgIGlmKGNsZWFyQWN0aXZlKSB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuY2xlYXJBY3RpdmUoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYW5ub3RhdGlvbkNsb3NlZCcsIHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHByZWxvYWRpbmcgYW4gYXJyYXkgb2Ygc2Vjb25kcyBhY3RpdmUgb24gaW5pdGlhbGl6YXRpb25cbiAgICAvLyBWYWx1ZXMgdXNlZCB0byBidWlsZCB0aW1lTWFwIGluIEFubm90YXRpb25TdGF0ZVxuICAgIGJ1aWxkU2Vjb25kc0FjdGl2ZUFycmF5ICgpIHtcbiAgICAgICAgbGV0IHNlY29uZHMgPSBbXTtcbiAgICAgICAgaWYoISF0aGlzLnJhbmdlLmVuZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucmFuZ2Uuc3RhcnQ7IGkgPD0gdGhpcy5yYW5nZS5lbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHNlY29uZHMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgICBzZWNvbmRzLnB1c2goc3RhcnQpO1xuICAgICAgICAgICAgaWYoc3RhcnQgPCB0aGlzLmR1cmF0aW9uKSBzZWNvbmRzLnB1c2goc3RhcnQrMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlY29uZHM7XG4gICAgfVxuXG4gICAgLy8gVGVhcnNkb3duIGFubm90YXRpb24gYW5kIG1hcmtlciwgcmVtb3ZlcyBvYmplY3QgZnJvbSBBbm5vdGF0aW9uU3RhdGVcbiAgICB0ZWFyZG93biAocmVtb3ZlRnJvbUNvbGxlY3Rpb249dHJ1ZSkge1xuICAgICAgICB0aGlzLmNsb3NlKHRydWUpO1xuICAgICAgICB0aGlzLm1hcmtlci50ZWFyZG93bigpO1xuICAgICAgICBpZih0aGlzLmNvbW1lbnRMaXN0KSB0aGlzLmNvbW1lbnRMaXN0LnRlYXJkb3duKHJlbW92ZUZyb21Db2xsZWN0aW9uKTtcbiAgICAgICAgaWYocmVtb3ZlRnJvbUNvbGxlY3Rpb24pIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5yZW1vdmVBbm5vdGF0aW9uKHRoaXMpO1xuICAgICAgICBpZih0aGlzLmFubm90YXRpb25TaGFwZSkgdGhpcy5hbm5vdGF0aW9uU2hhcGUudGVhcmRvd24oKTtcbiAgICAgICAgaWYocmVtb3ZlRnJvbUNvbGxlY3Rpb24pIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYSBuZXcgYW5ub3RhdGlvbiBpbnN0YW5jZSBieSBwYXNzaW5nIGluIGRhdGEgZm9yIHJhbmdlLCBzaGFwZSwgY29tbWVudCwgJiBwbHVnaW4gcmVmXG4gICAgc3RhdGljIG5ld0Zyb21EYXRhIChyYW5nZSwgc2hhcGUsIGNvbW1lbnRTdHIsIHBsdWdpbiwgaWQ9bnVsbCkge1xuICAgICAgICBsZXQgY29tbWVudCA9IENvbW1lbnQuZGF0YU9iaihjb21tZW50U3RyLCBwbHVnaW4pO1xuICAgICAgICBpZihyYW5nZSkgcmFuZ2UgPSBVdGlscy5wYXJzZUludE9iaihyYW5nZSk7XG4gICAgICAgIGlmKHNoYXBlKSBzaGFwZSA9IFV0aWxzLnBhcnNlSW50T2JqKHNoYXBlKTtcbiAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICBjb21tZW50czogW2NvbW1lbnRdXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbihkYXRhLCBwbHVnaW4ucGxheWVyKTtcbiAgICB9XG5cbiAgICBnZXQgaXNBY3RpdmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLmFjdGl2ZUFubm90YXRpb24gPT09IHRoaXM7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgbWFuYWdpbmcgdGhlIHN0YXRlIG9mIGFubm90YXRpb25zLCBpbmNsdWRpbmcgc2hvd2luZyBhY3RpdmUgYW5ub3RhdGlvbiBkdXJpbmcgcGxheWJhY2ssXG4gICAgdG9nZ2xpbmcgYWN0aXZlIHN0YXRlcyBmb3IgYW5ub3RhdGlvbnMsIG5hdmlnYXRpbmcgYW5ub3RhdGlvbnMgZm9yd2FyZC9iYWNrLCBldGNcbiovXG5cbmNvbnN0ICAgVXRpbHMgPSByZXF1aXJlKCcuLy4uL2xpYi91dGlscycpLFxuICAgICAgICBQbGF5ZXJDb21wb25lbnQgPSByZXF1aXJlKFwiLi8uLi9saWIvcGxheWVyX2NvbXBvbmVudFwiKSxcbiAgICAgICAgQW5ub3RhdGlvbiA9IHJlcXVpcmUoXCIuL2Fubm90YXRpb25cIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQW5ub3RhdGlvblN0YXRlIGV4dGVuZHMgUGxheWVyQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5pbml0QVBJKHRoaXMsICdBbm5vdGF0aW9uU3RhdGUnKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gc2V0cyBfZW5hYmxlZCBhbmQgY2xvc2VzIG9yIG9wZW5zIGFubm90YXRpb24gYXMgbmVlZGVkXG4gICAgc2V0IGVuYWJsZWQgKHNob3VsZEJlRW5hYmxlZCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gc2hvdWxkQmVFbmFibGVkO1xuICAgICAgICBpZighc2hvdWxkQmVFbmFibGVkKSB0aGlzLmFjdGl2ZUFubm90YXRpb24uY2xvc2UoKTtcbiAgICAgICAgaWYoc2hvdWxkQmVFbmFibGVkKXtcbiAgICAgICAgICAgIHRoaXMuc2tpcExpdmVDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRMaXZlQW5ub3RhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGVuYWJsZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvLyBTZXRzIF9hbm5vdGF0aW9ucyB3L0Fubm9hdGlvbiBvYmplY3RzIGZyb20gaW5wdXQgYXJyYXlcbiAgICBzZXQgYW5ub3RhdGlvbnMgKGFubm90YXRpb25zRGF0YSkge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zRGF0YS5tYXAoKGEpID0+IG5ldyBBbm5vdGF0aW9uKGEsIHRoaXMucGxheWVyKSk7XG4gICAgICAgIHRoaXMuc29ydEFubm90YXRpb25zKCk7XG4gICAgICAgIHRoaXMucmVidWlsZEFubm90YXRpb25UaW1lTWFwKCk7XG4gICAgfVxuXG4gICAgZ2V0IGFubm90YXRpb25zICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cblxuICAgIHNldCBhY3RpdmVBbm5vdGF0aW9uIChhbm5vdGF0aW9uPW51bGwpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlQW5ub3RhdGlvbiA9IGFubm90YXRpb247XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgYWN0aXZlIGFubm90YXRpb24gb3IgYSBudWxsIG9iamVjdCB3aXRoIC5jbG9zZSgpXG4gICAgZ2V0IGFjdGl2ZUFubm90YXRpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlQW5ub3RhdGlvbiB8fCB7IGNsb3NlOiAoKCkgPT4ge30pIH07XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIGRhdGFcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucy5tYXAoKGEpID0+IGEuZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gQmluZCBldmVudHMgZm9yIHNldHRpbmcgbGl2ZUFubm90YXRpb24gb24gdmlkZW8gdGltZSBjaGFuZ2VcbiAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIub24oXCJ0aW1ldXBkYXRlXCIsIFV0aWxzLnRocm90dGxlKHRoaXMuc2V0TGl2ZUFubm90YXRpb24uYmluZCh0aGlzKSwgMTAwKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBhbm5vdGF0aW9ucyBieSByYW5nZS5zdGFydFxuICAgIHNvcnRBbm5vdGF0aW9ucyAoKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zLnNvcnQoKGEsYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQgPCBiLnJhbmdlLnN0YXJ0ID8gLTEgOiAoYS5yYW5nZS5zdGFydCA+IGIucmFuZ2Uuc3RhcnQgPyAxIDogMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBhIG5ldyBhbm5vdGF0aW9uXG4gICAgYWRkTmV3QW5ub3RhdGlvbiAoYW5ub3RhdGlvbikge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKGFubm90YXRpb24sIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYW5kIGFkZCBhIGFubm90YXRpb25cbiAgICBjcmVhdGVBbmRBZGRBbm5vdGF0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLmNvbnRyb2xzLnVpU3RhdGUuYWRkaW5nICYmIHRoaXMucGx1Z2luLmNvbnRyb2xzLmNhbmNlbEFkZE5ldygpO1xuXG4gICAgICAgIGxldCBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbi5uZXdGcm9tRGF0YShcbiAgICAgICAgICAgIGRhdGEucmFuZ2UsXG4gICAgICAgICAgICBkYXRhLnNoYXBlLFxuICAgICAgICAgICAgZGF0YS5jb21tZW50U3RyIHx8IFwiXCIsXG4gICAgICAgICAgICB0aGlzLnBsdWdpbixcbiAgICAgICAgICAgIGRhdGEuaWRcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmFkZE5ld0Fubm90YXRpb24oYW5ub3RhdGlvbilcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGFuIGV4aXN0aW5nIGFubm90YXRpb25cbiAgICBkZXN0cm95QW5ub3RhdGlvbkJ5SWQgKGlkKSB7XG4gICAgICAgIGxldCBhbm5vdGF0aW9uID0gdGhpcy5maW5kQW5ub3RhdGlvbihpZCk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uKSBhbm5vdGF0aW9uLnRlYXJkb3duKCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFuIGFubm90YXRpb25cbiAgICByZW1vdmVBbm5vdGF0aW9uIChhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZCA9IGFubm90YXRpb24uaWQsXG4gICAgICAgICAgICBpID0gdGhpcy5fYW5ub3RhdGlvbnMuaW5kZXhPZihhbm5vdGF0aW9uKTtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZCgpO1xuICAgICAgICB0aGlzLnBsdWdpbi5maXJlKCdhbm5vdGF0aW9uRGVsZXRlZCcsIHtpZH0pO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbGl2ZSBhbm5vdGF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgdmlkZW8gdGltZVxuICAgIHNldExpdmVBbm5vdGF0aW9uICgpIHtcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgdGltZSA9IE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGltZSk7XG5cbiAgICAgICAgaWYodGhpcy5za2lwTGl2ZUNoZWNrKSB7XG4gICAgICAgICAgICBpZih0aW1lICE9PSB0aGlzLmxhc3RWaWRlb1RpbWUpIHRoaXMuc2tpcExpdmVDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1hdGNoZXMgPSB0aGlzLmFjdGl2ZUFubm90YXRpb25zRm9yVGltZSh0aW1lKTtcbiAgICAgICAgaWYoIW1hdGNoZXMubGVuZ3RoKSByZXR1cm4gdGhpcy5hY3RpdmVBbm5vdGF0aW9uLmNsb3NlKCk7XG5cbiAgICAgICAgLy8gU2V0IGxpdmUgYW5ub3RhdGlvbiBhcyB0aGUgbGFzdCBtYXRjaFxuICAgICAgICBsZXQgbGl2ZUFubm90YXRpb24gPSB0aGlzLmFubm90YXRpb25zW21hdGNoZXNbbWF0Y2hlcy5sZW5ndGgtMV1dO1xuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZXMgaWYgdGhpcyBvciBhbm90aGVyIGFubm90YXRpb24gaXMgYWN0aXZlXG4gICAgICAgIGlmKHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5yYW5nZSkge1xuICAgICAgICAgICAgaWYobGl2ZUFubm90YXRpb24gPT09IHRoaXMuYWN0aXZlQW5ub3RhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGl2ZSBhbm5vdGF0aW9uIGFuZCBsaXZlIGFubm90YXRpb24gc2hhcmUgYSBzdGFydCB0aW1lXG4gICAgICAgICAgICAvLyBJcyB0aGF0IHN0YXJ0IHRpbWUgYXQgdGhlIGN1cnJlbnQgcGxheWhlYWQ/XG4gICAgICAgICAgICAvLyBJZiBzbywgZG9uJ3Qgc3dpdGNoIHdoaWNoIGlzIGFjdGl2ZS5cbiAgICAgICAgICAgIGxldCBsaXZlU3RhcnQgPSBsaXZlQW5ub3RhdGlvbi5yYW5nZS5zdGFydCxcbiAgICAgICAgICAgICAgICBhY3RpdmVTdGFydCA9IHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGlmKGxpdmVTdGFydCA9PT0gYWN0aXZlU3RhcnQgJiYgbGl2ZVN0YXJ0ID09PSB0aW1lKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKGxpdmVBbm5vdGF0aW9uLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdldCBhbGwgYWN0aXZlIGFubm90YXRpb25zIGZvciBhIHRpbWUgKGluIHNlY29uZHMpXG4gICAgYWN0aXZlQW5ub3RhdGlvbnNGb3JUaW1lICh0aW1lKSB7XG4gICAgICAgIGlmKCF0aGlzLmFubm90YXRpb25zLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uVGltZU1hcFt0aW1lXSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAgICBSZWJ1aWxkIHRoZSBhbm5vdGF0aW9uIHRpbWUgbWFwXG4gICAgICAgIEV4YW1wbGU6IHRoaXMuX2Fubm90YXRpb25zWzFdIGFuZCB0aGlzLl9hbm5vdGF0aW9uc1szXSBhcmUgYWN0aXZlIGR1cmluZyBzZWNvbmQgNFxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uVGltZU1hcCA9IHsgNDogWzEsIDNdIH1cbiAgICAqL1xuICAgIHJlYnVpbGRBbm5vdGF0aW9uVGltZU1hcCAoKSB7XG4gICAgICAgIGxldCB0aW1lTWFwID0ge307XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbi5zZWNvbmRzQWN0aXZlLmZvckVhY2goKHNlY29uZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSAodGltZU1hcFtzZWNvbmRdIHx8IFtdKTtcbiAgICAgICAgICAgICAgICB2YWwucHVzaCh0aGlzLmFubm90YXRpb25zLmluZGV4T2YoYW5ub3RhdGlvbikpO1xuICAgICAgICAgICAgICAgIHRpbWVNYXBbc2Vjb25kXSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uVGltZU1hcCA9IHRpbWVNYXA7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgYWN0aXZlIGFubm90YXRpb24gYW5kIHJlbW92ZSByZWZlcmVuY2UgaW4gc3RhdGVcbiAgICBjbGVhckFjdGl2ZSAoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQW5ub3RhdGlvbi5jbG9zZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUFubm90YXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIE9wZW4gYW5ub3RhdGlvbiB3aXRoIG9wdGlvbnMgdG8gcGF1c2UgYW5kIHNob3cgcHJldmlld1xuICAgIC8vIHNraXBMaXZlQ2hlY2sgd2lsbCBzaG9ydCBjaXJjdWl0IHNldExpdmVBbm5vdGF0aW9uKClcbiAgICBvcGVuQW5ub3RhdGlvbiAoYW5ub3RhdGlvbiwgc2tpcExpdmVDaGVjaz1mYWxzZSwgcGF1c2U9dHJ1ZSwgcHJldmlld09ubHk9ZmFsc2UsIGZvcmNlU25hcFRvU3RhcnQ9ZmFsc2UpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLmFjdGl2ZSkgdGhpcy5wbHVnaW4udG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcbiAgICAgICAgdGhpcy5za2lwTGl2ZUNoZWNrID0gc2tpcExpdmVDaGVjaztcbiAgICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgICBhbm5vdGF0aW9uLm9wZW4ocGF1c2UsIHByZXZpZXdPbmx5LCBmb3JjZVNuYXBUb1N0YXJ0KTtcbiAgICAgICAgdGhpcy5hY3RpdmVBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5sYXN0VmlkZW9UaW1lID0gdGhpcy5hY3RpdmVBbm5vdGF0aW9uLnJhbmdlLnN0YXJ0O1xuICAgIH1cblxuICAgIC8vIE9wZW4gYW4gYW5ub3RhdGlvbiBieSBJRCAoaWYgaXQgZXhpc3RzKVxuICAgIG9wZW5Bbm5vdGF0aW9uQnlJZCAoaWQpIHtcbiAgICAgICAgbGV0IGFubm90YXRpb24gPSB0aGlzLmZpbmRBbm5vdGF0aW9uKGlkKTtcbiAgICAgICAgaWYgKGFubm90YXRpb24pIHRoaXMub3BlbkFubm90YXRpb24oYW5ub3RhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBhbm5vdGF0aW9uIG9iamVjdCBnaXZlbiBJRFxuICAgIGZpbmRBbm5vdGF0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5maW5kKChhKSA9PiBhLmlkID09IGlkKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGNvbW1lbnQgb2JqZWN0IGdpdmVuIElEXG4gICAgZmluZENvbW1lbnQgKGlkKSB7XG4gICAgICAgIGxldCBjb21tZW50cyA9IHRoaXMuYW5ub3RhdGlvbnMubWFwKChhKSA9PiBhLmNvbW1lbnRMaXN0LmNvbW1lbnRzKTtcbiAgICAgICAgY29tbWVudHMgPSBbXS5jb25jYXQoLi4uY29tbWVudHMpOyAvLyBmbGF0dGVuIDJkIGFycmF5XG4gICAgICAgIHJldHVybiBjb21tZW50cy5maW5kKChjKSA9PiBjLmlkID09IGlkKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kcyB0aGUgbmV4dCBhbm5vdGF0aW9uIGluIGNvbGxlY3Rpb24gYW5kIG9wZW5zIGl0XG4gICAgbmV4dEFubm90YXRpb24gKCkge1xuICAgICAgICBpZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKXtcbiAgICAgICAgICAgIGxldCBpbmQgPSB0aGlzLmFubm90YXRpb25zLmluZGV4T2YodGhpcy5fYWN0aXZlQW5ub3RhdGlvbiksXG4gICAgICAgICAgICAgICAgbmV4dEluZCA9IChpbmQgPT09IHRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoLTEgPyAwIDogaW5kKzEpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1tuZXh0SW5kXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRpbWUgPSBNYXRoLmZsb29yKHRoaXMuY3VycmVudFRpbWUpO1xuICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLmFubm90YXRpb25zLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGlmKHRoaXMuYW5ub3RhdGlvbnNbaV0ucmFuZ2Uuc3RhcnQgPiB0aW1lKSByZXR1cm4gdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW2ldLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbMF0sIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEZpbmRzIHRoZSBwcmV2aW91cyBhbm5vdGF0aW9uIGluIGNvbGxlY3Rpb24gYW5kIG9wZW5zIGl0XG4gICAgcHJldkFubm90YXRpb24gKCkge1xuICAgICAgICBpZih0aGlzLl9hY3RpdmVBbm5vdGF0aW9uKXtcbiAgICAgICAgICAgIGxldCBpbmQgPSB0aGlzLmFubm90YXRpb25zLmluZGV4T2YodGhpcy5fYWN0aXZlQW5ub3RhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmQgPSAoaW5kID09PSAwID8gdGhpcy5hbm5vdGF0aW9ucy5sZW5ndGgtMSA6IGluZC0xKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5Bbm5vdGF0aW9uKHRoaXMuYW5ub3RhdGlvbnNbbmV4dEluZF0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0aW1lID0gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRUaW1lKTtcbiAgICAgICAgZm9yKGxldCBpPXRoaXMuYW5ub3RhdGlvbnMubGVuZ3RoLTE7IGk+PTA7IGktLSl7XG4gICAgICAgICAgICBpZih0aGlzLmFubm90YXRpb25zW2ldLnJhbmdlLnN0YXJ0IDwgdGltZSkgcmV0dXJuIHRoaXMub3BlbkFubm90YXRpb24odGhpcy5hbm5vdGF0aW9uc1tpXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuQW5ub3RhdGlvbih0aGlzLmFubm90YXRpb25zW3RoaXMuYW5ub3RhdGlvbnMubGVuZ3RoLTFdLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBVc2UgYW55d2hlcmUgdGhlIGFubm90YXRpb24gZGF0YSBjaGFuZ2VzXG4gICAgLy8gQ2xlYW5zIGludGVybmFsIHN0YXRlIGRhdGEsIHVwZGF0ZXMgcGxheWVyIGJ1dHRvbiwgdHJpZ2dlcnMgY29uZmlndXJhYmxlIGNhbGxiYWNrXG4gICAgc3RhdGVDaGFuZ2VkICgpIHtcbiAgICAgICAgdGhpcy5zb3J0QW5ub3RhdGlvbnMoKTtcbiAgICAgICAgdGhpcy5yZWJ1aWxkQW5ub3RhdGlvblRpbWVNYXAoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnb25TdGF0ZUNoYW5nZWQnLCB0aGlzLmRhdGEpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIHN0YXRlIHByb3BlcnRpZXNcbiAgICByZXNldERhdGEgKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25zICAgICAgID0gW107XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblRpbWVNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5hY3RpdmVBbm5vdGF0aW9uICA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5hYmxlZCAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5za2lwTmV4dFRpbWVDaGVjayA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RWaWRlb1RpbWUgICAgID0gMDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgVUkgYW5kIHVuYmluZCBldmVudHMgZm9yIHRoaXMgYW5kIGNoaWxkIGNvbXBvbmVudHNcbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7IGFubm90YXRpb24udGVhcmRvd24oZmFsc2UpOyB9KTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gIENvbXBvbmVudCBmb3IgYW4gaW52aWR1YWwgY29tbWVudFxuKi9cblxuY29uc3QgICBQbGF5ZXJVSUNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfdWlfY29tcG9uZW50XCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoXCIuLy4uL2xpYi91dGlsc1wiKSxcbiAgICAgICAgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKSxcbiAgICAgICAgdGVtcGxhdGVOYW1lID0gJ2NvbW1lbnQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZGF0YSwgcGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuY29tbWVudExpc3QgPSBkYXRhLmNvbW1lbnRMaXN0O1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZCB8fCB0aGlzLmNvbXBvbmVudElkO1xuICAgICAgICB0aGlzLm1ldGEgPSBkYXRhLm1ldGE7XG4gICAgICAgIHRoaXMuYm9keSA9IGRhdGEuYm9keTtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBtb21lbnQoZGF0YS5tZXRhLmRhdGV0aW1lKS51bml4KCk7XG4gICAgICAgIHRoaXMudGltZVNpbmNlID0gdGhpcy50aW1lU2luY2UoKTtcblxuICAgICAgICB0aGlzLiRlbCA9ICQodGhpcy5yZW5kZXIoKSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIGRhdGFcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIG1ldGE6IHRoaXMubWV0YSxcbiAgICAgICAgICAgIGJvZHk6IHRoaXMuYm9keVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBIVE1MICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGVsWzBdLm91dGVySFRNTDtcbiAgICB9XG5cbiAgICByZW5kZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJUZW1wbGF0ZShcbiAgICAgICAgICAgIHRlbXBsYXRlTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGJvZHk6ICAgICAgIHRoaXMuYm9keSxcbiAgICAgICAgICAgICAgICBtZXRhOiAgICAgICB0aGlzLm1ldGEsXG4gICAgICAgICAgICAgICAgdGltZVNpbmNlOiAgdGhpcy50aW1lU2luY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGltZSBzaW5jZSBjb21tZW50IHRpbWVzdGFtcFxuICAgIHRpbWVTaW5jZSAoKSB7XG4gICAgICAgIHJldHVybiBtb21lbnQodGhpcy5tZXRhLmRhdGV0aW1lKS5mcm9tTm93KCk7XG4gICAgfVxuXG4gICAgdGVhcmRvd24gKGRlc3Ryb3k9ZmFsc2UpIHtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oZGVzdHJveSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgQ29tbWVudCBvYmogZ2l2ZW4gYm9keSBjb250ZW50IGFuZCBwbHVnaW4gcmVmZXJlbmNlXG4gICAgc3RhdGljIG5ld0Zyb21EYXRhIChib2R5LCBjb21tZW50TGlzdCwgcGx1Z2luKSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5kYXRhT2JqKGJvZHksIHBsdWdpbik7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWVudChkYXRhLCBwbHVnaW4ucGxheWVyKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gb2JqZWN0IHdpdGggcGx1Z2luIGRhdGEsIHRpbWVzdGFtcCwgdW5pcXVlIGlkLCBhbmQgYm9keSBjb250ZW50XG4gICAgc3RhdGljIGRhdGFPYmogKGJvZHksIHBsdWdpbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWV0YTogICBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lOiBtb21lbnQoKS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH0sIHBsdWdpbi5tZXRhKSxcbiAgICAgICAgICAgIGlkOiAgICAgVXRpbHMuZ3VpZCgpLFxuICAgICAgICAgICAgYm9keVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgQ29tcG9uZW50IGZvciBhIGxpc3Qgb2YgY29tbWVudHMgaW4gYSB2aXNpYmxlL2FjdGl2ZSBhbm5vdGF0aW9uXG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBDb21tZW50ID0gcmVxdWlyZShcIi4vY29tbWVudFwiKSxcbiAgICAgICAgY29tbWVudExpc3RUZW1wbGF0ZU5hbWUgPSAnY29tbWVudF9saXN0JyxcbiAgICAgICAgbmV3Q29tbWVudFRlbXBsYXRlTmFtZSA9ICduZXdfY29tbWVudCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQ29tbWVudExpc3QgZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZGF0YSwgcGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG5cbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gZGF0YS5hbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLmNvbW1lbnRzID0gZGF0YS5jb21tZW50cy5tYXAoKGNvbW1lbnREYXRhKSA9PiB7XG4gICAgICAgICAgICBjb21tZW50RGF0YS5jb21tZW50TGlzdCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbW1lbnQoY29tbWVudERhdGEsIHBsYXllcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvcnRDb21tZW50cygpO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBvYmplY3RcbiAgICBnZXQgZGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRzLm1hcCgoYykgPT4gYy5kYXRhKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGFsbCBldmVudHMgbmVlZGVkIGZvciB0aGUgY29tbWVudCBsaXN0XG4gICAgYmluZExpc3RFdmVudHMgKCkge1xuICAgICAgICB0aGlzLiRlbFxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbW1lbnRcIiwgXCIudmFjLWNsb3NlLWNvbW1lbnQtbGlzdFwiLCAoKCkgPT4gdGhpcy5hbm5vdGF0aW9uLmNsb3NlKCkpLmJpbmQodGhpcykpIC8vIEhpZGUgQ29tbWVudExpc3QgVUkgd2l0aCBjbG9zZSBidXR0b25cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1yZXBseS1idG5cIiwgdGhpcy5hZGROZXdDb21tZW50LmJpbmQodGhpcykpIC8vIE9wZW4gbmV3IHJlcGx5IFVJIHdpdGggcmVwbHkgYnV0dG9uXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29tbWVudFwiLCBcIi52YWMtZGVsZXRlLWFubm90YXRpb25cIiwgdGhpcy5oYW5kbGVEZWxldGVBbm5vdGF0aW9uQ2xpY2suYmluZCh0aGlzKSkgLy8gRGVsZXRlIGFubm90YXRpb24gd2l0aCBtYWluIGRlbGV0ZSBidXR0b25cbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy1kZWxldGUtY29tbWVudFwiLCB0aGlzLmRlc3Ryb3lDb21tZW50LmJpbmQodGhpcykpIC8vIERlbGV0ZSBjb21tZW50IHdpdGggZGVsZXRlIGNvbW1lbnQgYnV0dG9uXG4gICAgICAgICAgICAub24oXCJtb3VzZXdoZWVsLnZhYy1jb21tZW50IERPTU1vdXNlU2Nyb2xsLnZhYy1jb21tZW50XCIsIFwiLnZhYy1jb21tZW50cy13cmFwXCIsIHRoaXMuZGlzYWJsZVBhZ2VTY3JvbGwuYmluZCh0aGlzKSk7IC8vIFByZXZlbnQgb3V0ZXIgcGFnZSBzY3JvbGwgd2hlbiBzY3JvbGxpbmcgaW5zaWRlIG9mIHRoZSBDb21tZW50TGlzdCBVSVxuICAgIH1cblxuICAgIC8vIEJpbmQgZXZlbnQgbGlzdGVuZXJzIGZvciBuZXcgY29tbWVudHMgZm9ybVxuICAgIGJpbmRDb21tZW50Rm9ybUV2ZW50cyAoKSB7XG4gICAgICAgIHRoaXMuJG5ld0NvbW1lbnRGb3JtXG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29tbWVudFwiLCBcIi52YWMtYWRkLWNvbnRyb2xzIGEsIC52YWMtdmlkZW8td3JpdGUtbmV3LnZhYy1pcy1jb21tZW50IGFcIiwgdGhpcy5jbG9zZU5ld0NvbW1lbnQuYmluZCh0aGlzKSkgLy8gQ2FuY2VsIG5ldyBjb21tZW50IGNyZWF0aW9uIHdpdGggY2FuY2VsIGxpbmtcbiAgICAgICAgICAgIC5vbihcImNsaWNrLnZhYy1jb21tZW50XCIsIFwiLnZhYy12aWRlby13cml0ZS1uZXcudmFjLWlzLWNvbW1lbnQgYnV0dG9uXCIsIHRoaXMuc2F2ZU5ld0NvbW1lbnQuYmluZCh0aGlzKSk7IC8vIFNhdmUgbmV3IGNvbW1lbnQgd2l0aCBzYXZlIGJ1dHRvblxuICAgIH1cblxuICAgIC8vIFJlbmRlciBDb21tZW50TGlzdCBVSSB3aXRoIGFsbCBjb21tZW50cyB1c2luZyB0ZW1wbGF0ZVxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIHRoaXMuJGVsID0gJCh0aGlzLnJlbmRlclRlbXBsYXRlKFxuICAgICAgICAgICAgY29tbWVudExpc3RUZW1wbGF0ZU5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWVudHNIVE1MOiB0aGlzLmNvbW1lbnRzLm1hcCgoYykgPT4gYy5IVE1MKSxcbiAgICAgICAgICAgICAgICByYW5nZVN0cjogVXRpbHMuaHVtYW5UaW1lKHRoaXMuYW5ub3RhdGlvbi5yYW5nZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSk7XG5cbiAgICAgICAgdGhpcy4kcGxheWVyLmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgICAgIHRoaXMuJHdyYXAgPSB0aGlzLiRVSS5jb21tZW50c0NvbnRhaW5lcjtcbiAgICAgICAgdGhpcy5iaW5kTGlzdEV2ZW50cygpO1xuICAgIH1cblxuICAgIC8vIFJlLXJlbmRlciBVSSBvbiBzdGF0ZSBjaGFuZ2VcbiAgICByZVJlbmRlciAoKSB7XG4gICAgICAgIHRoaXMudGVhcmRvd24oZmFsc2UpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBuZXcgY29tbWVudCBmb3JtXG4gICAgYWRkTmV3Q29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMuJHdyYXAuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmFjdGl2ZSkuZmluZChcIi52YWMtY29tbWVudHMtd3JhcFwiKS5zY3JvbGxUb3AoOTk5OTk5KTtcbiAgICAgICAgdmFyICRzaGFwZWJveCA9IHRoaXMuJHdyYXAuZmluZChcIi52YWMtYWRkLW5ldy1zaGFwZWJveFwiKSxcbiAgICAgICAgICAgIHdpZHRoID0gJHNoYXBlYm94Lm91dGVyV2lkdGgoKSxcbiAgICAgICAgICAgIHRvcCA9ICRzaGFwZWJveC5wb3NpdGlvbigpLnRvcCArIDEwLFxuICAgICAgICAgICAgcmlnaHQgPSB0aGlzLiR3cmFwLm91dGVyV2lkdGgoKSAtICgkc2hhcGVib3gucG9zaXRpb24oKS5sZWZ0ICsgd2lkdGgpO1xuXG4gICAgICAgIHRoaXMuJG5ld0NvbW1lbnRGb3JtID0gJCh0aGlzLnJlbmRlclRlbXBsYXRlKG5ld0NvbW1lbnRUZW1wbGF0ZU5hbWUsIHt3aWR0aCwgdG9wLCByaWdodH0pKTtcbiAgICAgICAgdGhpcy5iaW5kQ29tbWVudEZvcm1FdmVudHMoKTtcbiAgICAgICAgdGhpcy4kcGxheWVyLmFwcGVuZCh0aGlzLiRuZXdDb21tZW50Rm9ybSk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBjb21tZW50IGZyb20gbmV3IGNvbW1lbnQgZm9ybSwgdXBkYXRlIHN0YXRlIGFuZCByZS1yZW5kZXIgVUlcbiAgICBzYXZlTmV3Q29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMuJHdyYXAucmVtb3ZlQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmFjdGl2ZSk7XG5cbiAgICAgICAgbGV0IHVzZXJfaWQgPSAxLFxuICAgICAgICAgICAgYm9keSA9IHRoaXMuJFVJLm5ld0NvbW1lbnRUZXh0YXJlYS52YWwoKTtcblxuICAgICAgICBpZighYm9keSkgcmV0dXJuOyAvLyBlbXB0eSBjb21tZW50IC0gVE9ETyBhZGQgdmFsaWRhdGlvbiAvIGVyciBtZXNzYWdlXG4gICAgICAgIHRoaXMuY3JlYXRlQ29tbWVudChib2R5KTtcbiAgICB9XG5cbiAgICBjcmVhdGVDb21tZW50IChib2R5KSB7XG4gICAgICAgIGxldCBjb21tZW50ID0gQ29tbWVudC5uZXdGcm9tRGF0YShib2R5LCB0aGlzLCB0aGlzLnBsdWdpbik7XG4gICAgICAgIHRoaXMuY29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgdGhpcy5zb3J0Q29tbWVudHMoKTtcblxuICAgICAgICAvLyBEb24ndCBtdXRhdGUgVUkgaWYgY29tbWVudCBpcyBiZWluZyBjcmVhdGVkIGZvciBhbiBpbmFjdGl2ZSBhbm5vdGF0aW9uICh2aWEgQVBJKVxuICAgICAgICBpZih0aGlzLmFubm90YXRpb24uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVSZW5kZXIoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZU5ld0NvbW1lbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5zdGF0ZUNoYW5nZWQoKTtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWwgY29tbWVudCBhZGRpbmcgcHJvY2Vzc1xuICAgIGNsb3NlTmV3Q29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMudW5iaW5kQ29tbWVudEZvcm1FdmVudHMoKTtcbiAgICAgICAgaWYodGhpcy4kd3JhcCkgdGhpcy4kd3JhcC5yZW1vdmVDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKTtcbiAgICAgICAgaWYodGhpcy4kbmV3Q29tbWVudEZvcm0pIHRoaXMuJG5ld0NvbW1lbnRGb3JtLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBhIGNvbW1lbnQuIElmIGl0IGlzIHRoZSBvbmx5IGNvbW1lbnQsIGRlbGV0ZSB0aGUgYW5ub3RhdGlvblxuICAgIC8vIFVwZGF0ZSBzdGF0ZSBhbmQgcmUtcmVuZGVyIFVJXG4gICAgZGVzdHJveUNvbW1lbnQgKGV2ZW50KSB7XG4gICAgICAgIGxldCBhbm5vdGF0aW9uSWQgPSB0aGlzLmFubm90YXRpb24uaWQ7XG4gICAgICAgIGlmKHRoaXMuY29tbWVudHMubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbi50ZWFyZG93bigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbW1lbnRJZCAgPSB0aGlzLmZpbmRDb21tZW50SWQoZXZlbnQpLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0aGlzLmNvbW1lbnRzLmZpbmQoKGMpID0+IGMuaWQgPT0gY29tbWVudElkKSxcbiAgICAgICAgICAgICAgICBpID0gdGhpcy5jb21tZW50cy5pbmRleE9mKGNvbW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21tZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB0aGlzLnJlUmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuc3RhdGVDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgZmluZENvbW1lbnRJZCAoZXZlbnQpIHtcbiAgICAgICAgbGV0IGlkID0gdHlwZW9mIGV2ZW50LmRldGFpbC5pZCA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoJy52YWMtY29tbWVudCcpLmRhdGEoJ2lkJykgOlxuICAgICAgICAgICAgZXZlbnQuZGV0YWlsLmlkO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudHMgb3V0ZXIgcGFnZSBzY3JvbGwgd2hlbiBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBDb21tZW50TGlzdCBVSVxuICAgIC8vIFRPRE86IFRoaXMgbWlnaHQgbmVlZCB0byBiZSBmaW5lLXR1bmVkP1xuICAgIGRpc2FibGVQYWdlU2Nyb2xsIChldmVudCkge1xuICAgICAgICBsZXQgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCksXG4gICAgICAgICAgICBoZWlnaHQgID0gJHRhcmdldC5oZWlnaHQoKSxcbiAgICAgICAgICAgIG9nRXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50LFxuICAgICAgICAgICAgZGVsdGEgICA9IG9nRXZlbnQud2hlZWxEZWx0YSB8fCAtb2dFdmVudC5kZXRhaWwsXG4gICAgICAgICAgICBkaXIgICAgID0gZGVsdGEgPCAwID8gXCJkb3duXCIgOiBcInVwXCIsXG4gICAgICAgICAgICBzY3JvbGxEaWZmID0gTWF0aC5hYnMoZXZlbnQuY3VycmVudFRhcmdldC5zY3JvbGxIZWlnaHQgLSBldmVudC5jdXJyZW50VGFyZ2V0LmNsaWVudEhlaWdodCk7XG5cbiAgICAgICAgLy8gaWYgc2Nyb2xsaW5nIGludG8gdG9wIG9mIGRpdlxuICAgICAgICBpZiAoJHRhcmdldC5zY3JvbGxUb3AoKSA8IDIwICYmIGRpciA9PSBcInVwXCIpIHtcbiAgICAgICAgICAgICR0YXJnZXQuc3RvcCgpO1xuICAgICAgICAgICAgJHRhcmdldC5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCAxMDApO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHNjcm9sbGluZyBpbnRvIGJvdHRvbSBvZiBkaXZcbiAgICAgICAgaWYgKCR0YXJnZXQuc2Nyb2xsVG9wKCkgPiAoc2Nyb2xsRGlmZiAtIDEwKSAmJiBkaXIgPT0gXCJkb3duXCIpIHtcbiAgICAgICAgICAgICR0YXJnZXQuc3RvcCgpO1xuICAgICAgICAgICAgJHRhcmdldC5hbmltYXRlKHtzY3JvbGxUb3A6IGhlaWdodCArIDQwfSwgMTAwKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGNvbW1lbnRzIGJ5IHRpbWVzdGFtcFxuICAgIHNvcnRDb21tZW50cyAoKSB7XG4gICAgICAgIHRoaXMuY29tbWVudHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS50aW1lc3RhbXAgPCBiLnRpbWVzdGFtcCA/IC0xIDogKGEudGltZXN0YW1wID4gYi50aW1lc3RhbXAgPyAxIDogMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSB0aGUgYW5ub3RhdGlvblxuICAgIGhhbmRsZURlbGV0ZUFubm90YXRpb25DbGljayAoZSkge1xuICAgICAgICBsZXQgJGNvbmZpcm1FbCA9ICQoXCI8YS8+XCIpLmFkZENsYXNzKFwidmFjLWRlbGV0ZS1jb25maXJtXCIpLnRleHQoXCJDT05GSVJNXCIpO1xuICAgICAgICAkY29uZmlybUVsLm9uKFwiY2xpY2suY29tbWVudFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAkY29uZmlybUVsLm9mZihcImNsaWNrLmNvbW1lbnRcIik7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb24udGVhcmRvd24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgICQoZS50YXJnZXQpLnJlcGxhY2VXaXRoKCRjb25maXJtRWwpO1xuICAgIH1cblxuICAgIC8vIFVuYmluZCBsaXN0ZW5lcnMgZm9yIG5ldyBjb21tZW50cyBmb3JtXG4gICAgdW5iaW5kQ29tbWVudEZvcm1FdmVudHMgKCkge1xuICAgICAgICBpZih0aGlzLiRuZXdDb21tZW50Rm9ybSkgdGhpcy4kbmV3Q29tbWVudEZvcm0ub2ZmKFwiY2xpY2sudmFjLWNvbW1lbnRcIik7XG4gICAgfVxuXG4gICAgLy8gVGVhcmRvd24gQ29tbWVudExpc3QgVUksIHVuYmluZCBldmVudHNcbiAgICB0ZWFyZG93biAoZGVzdHJveUNvbW1lbnRzPXRydWUpIHtcbiAgICAgICAgaWYodGhpcy4kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLm9mZihcImNsaWNrLnZhYy1jb21tZW50IG1vdXNld2hlZWwudmFjLWNvbW1lbnQgRE9NTW91c2VTY3JvbGwudmFjLWNvbW1lbnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tZW50cy5mb3JFYWNoKChjKSA9PiBjLnRlYXJkb3duKGRlc3Ryb3lDb21tZW50cykpO1xuICAgICAgICBpZihkZXN0cm95Q29tbWVudHMpIHRoaXMuY29tbWVudHMgPSBbXTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQ29tcG9uZW50IGZvciBtYW5hZ2luZyBhbm5vdGF0aW9uIFwiY29udHJvbCBib3hcIiBpbiB1cHBlciBsZWZ0IG9mIHZpZGVvIHdoZW4gaW4gYW5ub3RhdGlvbiBtb2RlLFxuICAgIGluY2x1ZGluZyBhbGwgZnVuY3Rpb25hbGl0eSB0byBhZGQgbmV3IGFubm90YXRpb25zXG4qL1xuXG5jb25zdCAgIFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZShcIi4vLi4vbGliL3V0aWxzXCIpLFxuICAgICAgICBEcmFnZ2FibGVNYXJrZXIgPSByZXF1aXJlKFwiLi9kcmFnZ2FibGVfbWFya2VyLmpzXCIpLFxuICAgICAgICBTZWxlY3RhYmxlU2hhcGUgPSByZXF1aXJlKFwiLi9zZWxlY3RhYmxlX3NoYXBlLmpzXCIpLFxuICAgICAgICBQbGF5ZXJCdXR0b24gPSByZXF1aXJlKFwiLi9wbGF5ZXJfYnV0dG9uXCIpLFxuICAgICAgICBBbm5vdGF0aW9uID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvblwiKSxcbiAgICAgICAgdGVtcGxhdGVOYW1lID0gJ2NvbnRyb2xzJztcblxuLy8gQ29udHJvbCB1c2VzIGEgXCJ1aSBzdGF0ZVwiIHRvIGRldGVybWluZSBob3cgVUkgaXMgcmVuZGVyZWQgLSB0aGlzIG9iamVjdCBpcyB0aGUgYmFzZSBzdGF0ZSwgY29udGFpbmluZyBhXG4vLyBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIGl0ZW0gaW4gdGhlIHN0YXRlXG5jb25zdCBCQVNFX1VJX1NUQVRFID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgYWRkaW5nOiBmYWxzZSwgICAgICAgICAgLy8gQXJlIHdlIGN1cnJlbnRseSBhZGRpbmcgYSBuZXcgYW5ub3RhdGlvbj8gKHN0ZXAgMSBvZiBmbG93KVxuICAgIHdyaXRpbmdDb21tZW50OiBmYWxzZSAgIC8vIEFyZSB3ZSBjdXJyZW50bHkgd3JpdGluZyB0aGUgY29tbWVudCBmb3IgYW5ub3RhdGlvbiAoc3RlcCAyIG9mIGZsb3cpXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBDb250cm9scyBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIsIGJpbmRBcnJvd0tleXMpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5pbml0QVBJKHRoaXMsICdDb250cm9scycpO1xuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxDb21tZW50aW5nID0gdGhpcy5wbHVnaW4ub3B0aW9ucy5pbnRlcm5hbENvbW1lbnRpbmc7XG4gICAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHM7XG4gICAgICAgIHRoaXMudWlTdGF0ZSA9IFV0aWxzLmNsb25lT2JqZWN0KEJBU0VfVUlfU1RBVEUpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoYmluZEFycm93S2V5cyk7XG5cbiAgICAgICAgaWYodGhpcy5zaG93Q29udHJvbHMpe1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBsYXllciBidXR0b24gaW4gdGhlIGNvbnRyb2wgYmFyIGlmIGNvbnRyb2xzIGFyZSBzaG93blxuICAgICAgICAgICAgdGhpcy5wbGF5ZXJCdXR0b24gPSBuZXcgUGxheWVyQnV0dG9uKHRoaXMucGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gQmluZCBhbGwgdGhlIGV2ZW50cyB3ZSBuZWVkIGZvciBVSSBpbnRlcmFjdGlvblxuICAgIGJpbmRFdmVudHMgKGJpbmRBcnJvd0tleXMpIHtcbiAgICAgICAgdGhpcy4kcGxheWVyLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1jb250cm9scyBidXR0b25cIiwgdGhpcy5zdGFydEFkZE5ldy5iaW5kKHRoaXMpKSAvLyBBZGQgbmV3IGJ1dHRvbiBjbGlja1xuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1hbm5vdGF0aW9uLW5hdiAudmFjLWEtbmV4dFwiLCAoKSA9PiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUubmV4dEFubm90YXRpb24oKSApIC8vIENsaWNrICduZXh0JyBvbiBhbm5vdGF0aW9uIG5hdlxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1hbm5vdGF0aW9uLW5hdiAudmFjLWEtcHJldlwiLCAoKSA9PiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUucHJldkFubm90YXRpb24oKSApIC8vIENsaWNrICdwcmV2JyBvbiBhbm5vdGF0aW9uIG5hdlxuICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy12aWRlby1tb3ZlIC52YWMtYS1uZXh0XCIsICgpID0+IHRoaXMubWFya2VyLnNjcnViU3RhcnQoMSkgKSAvLyBDbGljayAnKzEgc2VjJyBvbiBtYXJrZXIgbmF2XG4gICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLXZpZGVvLW1vdmUgLnZhYy1hLXByZXZcIiwgKCkgPT4gdGhpcy5tYXJrZXIuc2NydWJTdGFydCgtMSkgKTsgLy8gQ2xpY2sgJy0xIHNlYycgb24gbWFya2VyIG5hdlxuXG4gICAgICAgIGlmKHRoaXMuaW50ZXJuYWxDb21tZW50aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiRwbGF5ZXIub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLWFkZC1jb250cm9scyBidXR0b25cIiwgdGhpcy53cml0ZUNvbW1lbnQuYmluZCh0aGlzKSkgLy8gJ05leHQnIGJ1dHRvbiBjbGljayB3aGlsZSBhZGRpbmdcbiAgICAgICAgICAgICAgICAub24oXCJjbGljay52YWMtY29udHJvbHNcIiwgXCIudmFjLXZpZGVvLXdyaXRlLW5ldy52YWMtaXMtYW5ub3RhdGlvbiBidXR0b25cIiwgdGhpcy5zYXZlTmV3LmJpbmQodGhpcykpIC8vICdTYXZlJyBidXR0b24gY2xpY2sgd2hpbGUgYWRkaW5nXG4gICAgICAgICAgICAgICAgLm9uKFwiY2xpY2sudmFjLWNvbnRyb2xzXCIsIFwiLnZhYy1hZGQtY29udHJvbHMgYSwgLnZhYy12aWRlby13cml0ZS1uZXcudmFjLWlzLWFubm90YXRpb24gYVwiLCB0aGlzLmNhbmNlbEFkZE5ldy5iaW5kKHRoaXMpKSAvLyBDYW5jZWwgbGluayBjbGlja1xuICAgICAgICB9XG4gICAgICAgIGlmKGJpbmRBcnJvd0tleXMpe1xuICAgICAgICAgICAgJChkb2N1bWVudCkub24oYGtleXVwLnZhYy1uYXYtJHt0aGlzLnBsYXllcklkfWAsIChlKSA9PiB0aGlzLmhhbmRsZUFycm93S2V5cyhlKSk7IC8vIFVzZSBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlIGFubm90YXRpb25zXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgVUkgYW5kIHVuYmluZCBldmVudHMgZm9yIHRoaXMgYW5kIGNoaWxkIGNvbXBvbmVudHNcbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIodHJ1ZSk7XG4gICAgICAgIHRoaXMuJHBsYXllci5vZmYoJ2NsaWNrLnZhYy1jb250cm9scycpO1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoYGtleXVwLnZhYy1uYXYtJHt0aGlzLnBsYXllcklkfSBtb3VzZW1vdmUudmFjLXRvb2x0aXAtJHt0aGlzLnBsYXllcklkfWApO1xuICAgICAgICBpZih0aGlzLnBsYXllckJ1dHRvbikgdGhpcy5wbGF5ZXJCdXR0b24udGVhcmRvd24oKTtcbiAgICAgICAgc3VwZXIudGVhcmRvd24oKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBleGlzdGluZyBVSSAocmVzZXR0aW5nIGNvbXBvbmVudHMgaWYgbmVlZCBiZSlcbiAgICBjbGVhciAocmVzZXQ9ZmFsc2UpIHtcbiAgICAgICAgaWYocmVzZXQpe1xuICAgICAgICAgICAgaWYodGhpcy51aVN0YXRlLmFkZGluZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlTm9ybWFsVUkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlci50ZWFyZG93bigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZVNoYXBlLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVpU3RhdGUgPSBVdGlscy5jbG9uZU9iamVjdChCQVNFX1VJX1NUQVRFKTtcbiAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLXZpZGVvLWNvdmVyLWNhbnZhcycpXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2Vkb3duLnZhYy1jdXJzb3ItdG9vbHRpcCcpXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2V1cC52YWMtY3Vyc29yLXRvb2x0aXAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiR0b29sdGlwXyA9IG51bGw7XG4gICAgICAgIHRoaXMuJFVJLmNvbnRyb2xFbGVtZW50cy5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgdGhlIFVJIGVsZW1lbnRzIChiYXNlZCBvbiB1aVN0YXRlKVxuICAgIHJlbmRlciAocmVzZXQ9ZmFsc2UpIHtcbiAgICAgICAgdGhpcy5jbGVhcihyZXNldCk7XG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByYW5nZVN0cjogdGhpcy5tYXJrZXIgPyBVdGlscy5odW1hblRpbWUodGhpcy5tYXJrZXIucmFuZ2UpIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzaG93TmF2OiB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuYW5ub3RhdGlvbnMubGVuZ3RoID4gMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMudWlTdGF0ZSxcbiAgICAgICAgICAgIHsgaW50ZXJuYWxDb21tZW50aW5nOiB0aGlzLmludGVybmFsQ29tbWVudGluZywgc2hvd0NvbnRyb2xzOiB0aGlzLnNob3dDb250cm9scyB9XG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0ICRjdHJscyA9IHRoaXMucmVuZGVyVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBkYXRhKTtcbiAgICAgICAgdGhpcy4kcGxheWVyLmFwcGVuZCgkY3RybHMpO1xuXG4gICAgICAgIGlmKHRoaXMucGxheWVyQnV0dG9uKSB0aGlzLnBsYXllckJ1dHRvbi51cGRhdGVOdW1Bbm5vdGF0aW9ucygpO1xuICAgIH1cblxuICAgIC8vIFVzZXIgY2xpY2tlZCB0byBjYW5jZWwgaW4tcHJvZ3Jlc3MgYWRkIC0gcmVzdG9yZSB0byBub3JtYWwgc3RhdGVcbiAgICBjYW5jZWxBZGROZXcgKCkge1xuICAgICAgICBpZighKHRoaXMudWlTdGF0ZS5hZGRpbmcgfHwgdGhpcy51aVN0YXRlLndyaXRpbmdDb21tZW50KSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgICAgdGhpcy5tYXJrZXIudGVhcmRvd24oKTtcbiAgICAgICAgdGhpcy5tYXJrZXIgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFVzZXIgY2xpY2tlZCAnYWRkJyBidXR0b24gaW4gdGhlIGNvbnRyb2xzIC0gc2V0dXAgVUkgYW5kIG1hcmtlclxuICAgIHN0YXJ0QWRkTmV3ICgpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLmFjdGl2ZSkgdGhpcy5wbHVnaW4udG9nZ2xlQW5ub3RhdGlvbk1vZGUoKTtcblxuICAgICAgICB0aGlzLnBsYXllci5wYXVzZSgpO1xuICAgICAgICB0aGlzLnNldEFkZGluZ1VJKCk7XG4gICAgICAgIHRoaXMudWlTdGF0ZS5hZGRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIC8vIGNvbnN0cnVjdCBuZXcgcmFuZ2UgYW5kIGNyZWF0ZSBtYXJrZXJcbiAgICAgICAgbGV0IHJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHBhcnNlSW50KHRoaXMuY3VycmVudFRpbWUsMTApLFxuICAgICAgICAgICAgc3RvcDogcGFyc2VJbnQodGhpcy5jdXJyZW50VGltZSwxMClcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5tYXJrZXIgPSBuZXcgRHJhZ2dhYmxlTWFya2VyKHRoaXMucGxheWVyLCByYW5nZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZVNoYXBlID0gbmV3IFNlbGVjdGFibGVTaGFwZSh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgLy8gc2hvdyBjdXJzb3IgaGVscCB0ZXh0IGlmIGNvbnRyb2xzIGFyZSBoaWRkZW5cbiAgICAgICAgaWYoIXRoaXMuc2hvd0NvbnRyb2xzKSB0aGlzLmJpbmRDdXJzb3JUb29sdGlwKCk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnZW50ZXJlZEFkZGluZ0Fubm90YXRpb24nLCB7IHJhbmdlOiByYW5nZSB9KTtcbiAgICB9XG5cbiAgICAvLyBVc2VyIGNsaWNrZWQgJ25leHQnIGFjdGlvbiAtIHNob3cgVUkgdG8gd3JpdGUgY29tbWVudFxuICAgIHdyaXRlQ29tbWVudCAoKSB7XG4gICAgICAgIHRoaXMudWlTdGF0ZS53cml0aW5nQ29tbWVudCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gVXNlciBjbGlja2VkIHRvIHNhdmUgYSBuZXcgYW5ub3RhdGlvbi9jb21tZW50IGR1cmluZyBhZGQgbmV3IGZsb3dcbiAgICBzYXZlTmV3ICgpIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSB0aGlzLiRVSS5uZXdDb21tZW50VGV4dGFyZWEudmFsKCk7XG4gICAgICAgIGlmKCFjb21tZW50KSByZXR1cm47IC8vIGVtcHR5IGNvbW1lbnQgLSBUT0RPIGFkZCB2YWxpZGF0aW9uIC8gZXJyIG1lc3NhZ2VcblxuICAgICAgICBsZXQgYSA9IEFubm90YXRpb24ubmV3RnJvbURhdGEodGhpcy5tYXJrZXIucmFuZ2UsIHRoaXMuc2VsZWN0YWJsZVNoYXBlLnNoYXBlLCBjb21tZW50LCB0aGlzLnBsdWdpbik7XG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5hZGROZXdBbm5vdGF0aW9uKGEpO1xuXG4gICAgICAgIHRoaXMuY2FuY2VsQWRkTmV3KCk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIG5vcm1hbCBVSSAoaGlkZSBtYXJrZXJzLCBoaWRlIHBsYXliYWNrLCBldGMpIG9uIGluaXQgYWRkIHN0YXRlXG4gICAgc2V0QWRkaW5nVUkgKCkge1xuICAgICAgICB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpc2FibGVQbGF5aW5nQW5kQ29udHJvbCgpO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgbm9ybWFsIFVJIGFmdGVyIGFkZCBzdGF0ZVxuICAgIHJlc3RvcmVOb3JtYWxVSSAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5lbmFibGVkID0gdGhpcy5wbHVnaW4uYWN0aXZlO1xuICAgICAgICB0aGlzLmVuYWJsZVBsYXlpbmdBbmRDb250cm9sKCk7XG4gICAgICAgICQoZG9jdW1lbnQpLm9mZihgbW91c2Vtb3ZlLnZhYy10b29sdGlwLSR7dGhpcy5wbGF5ZXJJZH1gKTtcbiAgICB9XG5cbiAgICAvLyBPbiBhcnJvdyBrZXkgcHJlc3MsIG5hdmlnYXRlIHRvIG5leHQgb3IgcHJldiBBbm5vdGF0aW9uXG4gICAgaGFuZGxlQXJyb3dLZXlzIChlKSB7XG4gICAgICAgIGlmKCF0aGlzLnBsdWdpbi5hY3RpdmUpIHJldHVybjtcbiAgICAgICAgbGV0IGtleUlkID0gZS53aGljaDtcblxuICAgICAgICBpZihrZXlJZCA9PSAzNykgdGhpcy5wbHVnaW4uYW5ub3RhdGlvblN0YXRlLnByZXZBbm5vdGF0aW9uKCk7XG4gICAgICAgIGlmKGtleUlkID09IDM5KSB0aGlzLnBsdWdpbi5hbm5vdGF0aW9uU3RhdGUubmV4dEFubm90YXRpb24oKTtcbiAgICB9XG5cbiAgICAvLyBBZGRzIGhlbHAgdGV4dCB0byBjdXJzb3IgZHVyaW5nIGFubm90YXRpb24gbW9kZVxuICAgIGJpbmRDdXJzb3JUb29sdGlwICgpIHtcbiAgICAgICAgdGhpcy50b29sdGlwQXJlYSA9IFV0aWxzLmFyZWFPZkhpZGRlbkVsKHRoaXMuJHRvb2x0aXAsIHRoaXMuJFVJLmNvdmVyQ2FudmFzLCB0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKTtcblxuICAgICAgICAvLyBBc3NlcnQgYm91bmRzIGFyZSB1cGRhdGVkIGluIHBsdWdpbiBpbiBjYXNlIHBhZ2Ugd2FzIG1vZGlmaWVkIHNpbmNlIGNyZWF0aW9uLCBzbyB0b29sdGlwIG1hdGggaXMgY29ycmVjdFxuICAgICAgICB0aGlzLnBsdWdpbi5zZXRCb3VuZHMoZmFsc2UpO1xuICAgICAgICAkKGRvY3VtZW50KS5vbihgbW91c2Vtb3ZlLnZhYy10b29sdGlwLSR7dGhpcy5wbGF5ZXJJZH1gLCBVdGlscy50aHJvdHRsZSgoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZighdGhpcy5wbHVnaW4uYm91bmRzKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxldCB4ID0gZXZlbnQucGFnZVgsXG4gICAgICAgICAgICAgICAgeSA9IGV2ZW50LnBhZ2VZLFxuICAgICAgICAgICAgICAgIG91dE9mQm91bmRzID1cbiAgICAgICAgICAgICAgICAgICAgKHggPCB0aGlzLnBsdWdpbi5ib3VuZHMubGVmdCB8fCB4ID4gdGhpcy5wbHVnaW4uYm91bmRzLnJpZ2h0KSB8fFxuICAgICAgICAgICAgICAgICAgICAoeSA8IHRoaXMucGx1Z2luLmJvdW5kcy50b3AgfHwgeSA+IHRoaXMucGx1Z2luLmJvdW5kcy5ib3R0b20pLFxuICAgICAgICAgICAgICAgIHdpdGhpbkNvbnRyb2xzID0gIW91dE9mQm91bmRzICYmIHkgPj0gdGhpcy5wbHVnaW4uYm91bmRzLmJvdHRvbVdpdGhvdXRDb250cm9scyxcbiAgICAgICAgICAgICAgICBtYXJrZXJIb3ZlcmVkID0gdGhpcy4kdG9vbHRpcC5oYXNDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuXG4gICAgICAgICAgICBpZihvdXRPZkJvdW5kcykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHRvb2x0aXAuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjdXJzb3JYICAgICAgPSB4IC0gdGhpcy5wbHVnaW4uYm91bmRzLmxlZnQsXG4gICAgICAgICAgICAgICAgY3Vyc29yWSAgICAgID0geSAtIHRoaXMucGx1Z2luLmJvdW5kcy50b3AsXG4gICAgICAgICAgICAgICAgbWFyZ2luICAgICAgID0gMTAsXG4gICAgICAgICAgICAgICAgcmlnaHRFZGdlICAgID0gdGhpcy4kcGxheWVyLndpZHRoKCksXG4gICAgICAgICAgICAgICAgYm90dG9tRWRnZSAgID0gdGhpcy4kcGxheWVyLmhlaWdodCgpIC0gdGhpcy4kVUkuY29udHJvbEJhci5oZWlnaHQoKSxcbiAgICAgICAgICAgICAgICBhdFJpZ2h0RWRnZSAgPSAoY3Vyc29yWCArIHRoaXMudG9vbHRpcEFyZWEud2lkdGggKyBtYXJnaW4qMikgPj0gcmlnaHRFZGdlLFxuICAgICAgICAgICAgICAgIGF0Qm90dG9tRWRnZSA9IChjdXJzb3JZICsgdGhpcy50b29sdGlwQXJlYS5oZWlnaHQgKyBtYXJnaW4qMikgPj0gYm90dG9tRWRnZTtcblxuICAgICAgICAgICAgLy8gaXMgdGhlIHRvb2x0aXAgdG9vIGNsb3NlIHRvIHRoZSByaWdodCBvciBib3R0b20gZWRnZT9cbiAgICAgICAgICAgIGxldCBwb3NYID0gYXRSaWdodEVkZ2UgPyAocmlnaHRFZGdlIC0gdGhpcy50b29sdGlwQXJlYS53aWR0aCAtIG1hcmdpbikgOiAoY3Vyc29yWCArIG1hcmdpbiksXG4gICAgICAgICAgICAgICAgcG9zWSA9IGF0Qm90dG9tRWRnZSA/IChib3R0b21FZGdlIC0gdGhpcy50b29sdGlwQXJlYS5oZWlnaHQgLSBtYXJnaW4pIDogKGN1cnNvclkgKyBtYXJnaW4pO1xuXG4gICAgICAgICAgICAvLyBoaWRlIGlmIHRoZSBjdXJzb3IgaXMgb3ZlciB0aGUgY29udHJvbCBiYXIgYnV0IG5vdCBob3ZlcmluZyBvdmVyIHRoZSBkcmFnZ2FibGUgbWFya2VyXG4gICAgICAgICAgICAvLyBhbHNvIGhpZGUgaWYgbW91c2UgaXMgZG93blxuICAgICAgICAgICAgaWYoKHdpdGhpbkNvbnRyb2xzICYmICFtYXJrZXJIb3ZlcmVkKSB8fCB0aGlzLiR0b29sdGlwLmhhc0NsYXNzKCd2YWMtY3Vyc29yLWRyYWdnaW5nJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiR0b29sdGlwLmFkZENsYXNzKHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiR0b29sdGlwLnJlbW92ZUNsYXNzKHRoaXMuVUlfQ0xBU1NFUy5oaWRkZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLiR0b29sdGlwLmNzcyh7XG4gICAgICAgICAgICAgICAgbGVmdDogYCR7cG9zWH1weGAsXG4gICAgICAgICAgICAgICAgdG9wOiBgJHtwb3NZfXB4YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmJpbmQodGhpcyksIDUwKSk7XG4gICAgfVxuXG4gICAgZ2V0ICR0b29sdGlwICgpIHtcbiAgICAgICAgdGhpcy4kdG9vbHRpcF8gPSB0aGlzLiR0b29sdGlwXyB8fCB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHRvb2x0aXBfO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIGEgdGltZWxpbmUgbWFya2VyIHRoYXQgaXMgZHJhZ2dhYmxlIHdoZW4gdXNlciBjbGlja3MvZHJhZ3Mgb24gaXQsIGFuZCByZWJ1aWxkcyB1bmRlcmx5aW5nIHJhbmdlXG4gICAgYXMgZHJhZyBvY2N1cnNcbiovXG5cbmNvbnN0ICAgTWFya2VyID0gcmVxdWlyZShcIi4vbWFya2VyXCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoJy4vLi4vbGliL3V0aWxzJyksXG4gICAgICAgIG1hcmtlclRlbXBsYXRlTmFtZSA9ICdkcmFnZ2FibGVfbWFya2VyJztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBEcmFnZ2FibGVNYXJrZXIgZXh0ZW5kcyBNYXJrZXIge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllciwgcmFuZ2UpIHtcbiAgICAgICAgc3VwZXIocGxheWVyLCByYW5nZSk7XG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEUgLSB0aGlzIHNob3VsZG4ndCBiZSByZXF1aXJlZCBhbmQgaXMgYSBIQUNLIGZvciBob3cgdHJhbnNwaWxhdGlvbiB3b3JrcyBpbiBJRTEwXG4gICAgICAgIHRoaXMudGVtcGxhdGVOYW1lID0gbWFya2VyVGVtcGxhdGVOYW1lOyAgIC8vIENoYW5nZSB0ZW1wbGF0ZSBmcm9tIGJhc2UgTWFya2VyIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgIC8vIElzIGEgZHJhZyBhY3Rpb24gY3VycmVudGx5IG9jY3Jpbmc/XG4gICAgICAgIHRoaXMucmFuZ2VQaW4gPSByYW5nZS5zdGFydDsgICAgICAgICAgICAgIC8vIFdoYXQncyB0aGUgb3JpZ2luYWwgcGlubmVkIHRpbWVsaW5lIHBvaW50IHdoZW4gbWFya2VyIHdhcyBhZGRlZFxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLiRVSS5tYXJrZXJXcmFwOyAgICAgICAvLyBTZXQgcGFyZW50IGFzIG1hcmtlciB3cmFwXG4gICAgfVxuXG4gICAgLy8gQmluZCBuZWVkZWQgZXZuZXRzIGZvciBVSSBpbnRlcmFjdGlvblxuICAgIGJpbmRNYXJrZXJFdmVudHMgKCkge1xuICAgICAgICAvLyBPbiBtb3VzZSBkb3duIGluaXQgZHJhZ1xuICAgICAgICB0aGlzLiRlbC5vbignbW91c2Vkb3duLnZhYy1tYXJrZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICAvLyBXaGVuIG1vdXNlIG1vdmVzICh3aXRoIG1vdXNlIGRvd24pIGNhbGwgb25EcmFnLCB0aHJvdHRsaW5nIHRvIG9uY2UgZWFjaCAyNTAgbXNcbiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZW1vdmUudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWAsIFV0aWxzLnRocm90dGxlKHRoaXMub25EcmFnLmJpbmQodGhpcyksIDI1MCkgKTtcblxuICAgICAgICAgICAgLy8gQWRkIGRyYWcgY2xhc3MgdG8gY3Vyc29yIHRvb2x0aXAgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZighdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3ZhYy1tYXJrZXItaG92ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT24gbW91c2UgdXAgZW5kIGRyYWcgYWN0aW9uIGFuZCB1bmJpbmQgbW91c2Vtb3ZlIGV2ZW50XG4gICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZXVwLnZhYy1kbWFya2VyLSR7dGhpcy5wbGF5ZXJJZH1gLCAoZSkgPT4ge1xuICAgICAgICAgICAgIGlmKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfWApO1xuICAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgIC8vIFJlbW92ZSBkcmFnIGNsYXNzIGFuZCBob3ZlciBjbGFzcyBmcm9tIGN1cnNvciB0b29sdGlwIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3ZhYy1jdXJzb3ItZHJhZ2dpbmcnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3ZhYy1tYXJrZXItaG92ZXInKTtcbiAgICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9uIG1vdXNlIG1vdXNlIGVudGVyLCBzaG93IGN1cnNvciB0b29sdGlwIGlmIGNvbnRyb2xzIGFyZSBub3Qgc2hvd25cbiAgICAgICAgLy8gVGhpcyBhZGRzIHRoZSBjbGFzcyB3aGljaCBpcyBwaWNrZWQgdXAgaW4gQ29udHJvbHNcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd0NvbnRyb2xzKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBzZWxmLiRlbFxuICAgICAgICAgICAgICAgIC5vbignbW91c2VlbnRlci52YWMtY3Vyc29yLXRvb2wtdGlwJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKS5hZGRDbGFzcygndmFjLW1hcmtlci1ob3ZlcicpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdtb3VzZWxlYXZlLnZhYy1jdXJzb3ItdG9vbC10aXAnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLnJlbW92ZUNsYXNzKCd2YWMtbWFya2VyLWhvdmVyJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gT24gZHJhZyBhY3Rpb24sIGNhbGN1bGF0ZSBuZXcgcmFuZ2UgYW5kIHJlLXJlbmRlciBtYXJrZXJcbiAgICBvbkRyYWcgKGUpIHtcbiAgICAgICAgdmFyIGRyYWdQZXJjZW50ID0gdGhpcy5wZXJjZW50VmFsRnJvbVhwb3MoZS5wYWdlWCksXG4gICAgICAgICAgICBzZWNWYWwgPSBwYXJzZUludCh0aGlzLmR1cmF0aW9uICogZHJhZ1BlcmNlbnQpO1xuXG4gICAgICAgIGlmKHNlY1ZhbCA+IHRoaXMucmFuZ2VQaW4pe1xuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogIHRoaXMucmFuZ2VQaW4sXG4gICAgICAgICAgICAgICAgZW5kOiAgICBzZWNWYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogIHNlY1ZhbCxcbiAgICAgICAgICAgICAgICBlbmQ6ICAgIHRoaXMucmFuZ2VQaW5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5wbHVnaW4uZmlyZSgnYWRkaW5nQW5ub3RhdGlvbkRhdGFDaGFuZ2VkJywgeyByYW5nZTogdGhpcy5yYW5nZSB9KTtcbiAgICB9XG5cbiAgICAvLyBDYWwgcGVyY2VudGFnZSAob2YgdmlkZW8pIHBvc2l0aW9uIGZvciBhIHBpeGVsLWJhc2VkIFggcG9zaXRpb24gb24gdGhlIGRvY3VtZW50XG4gICAgcGVyY2VudFZhbEZyb21YcG9zICh4cG9zKSB7XG4gICAgICAgIHZhciB4ID0gTWF0aC5tYXgoMCwgeHBvcyAtIHRoaXMuJHBhcmVudC5vZmZzZXQoKS5sZWZ0KSwgLy8gcHggdmFsXG4gICAgICAgICAgICBtYXggPSB0aGlzLiRwYXJlbnQuaW5uZXJXaWR0aCgpLFxuICAgICAgICAgICAgcGVyID0gKHggLyBtYXgpO1xuICAgICAgICBpZihwZXIgPiAxKSBwZXIgPSAxO1xuICAgICAgICBpZihwZXIgPCAwKSBwZXIgPSAwO1xuICAgICAgICByZXR1cm4gcGVyO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBib3VuZCBldmVudHMgb24gZGVzdHJ1Y3RvblxuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLWRtYXJrZXItJHt0aGlzLnBsYXllcklkfSBtb3VzZXVwLnZhYy1kbWFya2VyLSR7dGhpcy5wbGF5ZXJJZH1gKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdtb3VzZWVudGVyLnZhYy1jdXJzb3ItdG9vbC10aXAnKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdtb3VzZWxlYXZlLnZhYy1jdXJzb3ItdG9vbC10aXAnKTtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdtb3VzZWRvd24udmFjLW1hcmtlcicpO1xuICAgICAgICB0aGlzLiRlbC5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHRoZSB2aWRlbyAmIG1hcmtlciBzdGFydCBieSBzb21lIG51bSBzZWNvbmRzIChwb3Mgb3IgbmVnKVxuICAgIHNjcnViU3RhcnQgKHNlY29uZHNDaGFuZ2VkKSB7XG4gICAgICAgIGxldCBuZXdTdGFydCA9IHRoaXMucmFuZ2Uuc3RhcnQgKyBzZWNvbmRzQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VGltZSA9IG5ld1N0YXJ0O1xuICAgICAgICB0aGlzLnJhbmdlLnN0YXJ0ID0gbmV3U3RhcnQ7XG4gICAgICAgIHRoaXMucmFuZ2VQaW4gPSBuZXdTdGFydDtcbiAgICAgICAgdGhpcy50ZWFyZG93bigpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2FkZGluZ0Fubm90YXRpb25EYXRhQ2hhbmdlZCcsIHsgcmFuZ2U6IHRoaXMucmFuZ2UgfSk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgYSB0aW1lbGluZSBtYXJrZXIgd2l0aCBjYXBhYmlsaXRpZXMgdG8gcmVuZGVyIG9uIHRpbWVsaW5lLCBpbmNsdWRpbmcgdG9vbHRpcCBmb3IgY29tbWVudFxuKi9cblxuY29uc3QgICBQbGF5ZXJVSUNvbXBvbmVudCA9IHJlcXVpcmUoXCIuLy4uL2xpYi9wbGF5ZXJfdWlfY29tcG9uZW50XCIpLFxuICAgICAgICBVdGlscyA9IHJlcXVpcmUoXCIuLy4uL2xpYi91dGlsc1wiKSxcbiAgICAgICAgbWFya2VyVGVtcGxhdGVOYW1lID0gJ21hcmtlcicsXG4gICAgICAgIG1hcmtlcldyYXBUZW1wbGF0ZU5hbWUgPSAnbWFya2VyX3dyYXAnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIE1hcmtlciBleHRlbmRzIFBsYXllclVJQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIsIHJhbmdlLCBjb21tZW50PW51bGwpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICB0aGlzLnRlbXBsYXRlTmFtZSA9IG1hcmtlclRlbXBsYXRlTmFtZTtcblxuICAgICAgICBpZighdGhpcy4kVUkubWFya2VyV3JhcC5sZW5ndGgpe1xuICAgICAgICAgICAgdGhpcy4kVUkudGltZWxpbmUuYXBwZW5kKFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVGVtcGxhdGUobWFya2VyV3JhcFRlbXBsYXRlTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdGhpcyBtYXJrZXIgYXMgYWN0aXZlIChoaWdobGlnaHQpIGFuZCBvcHRpb25hbGx5IHNob3cgdG9vbHRpcCBhbHNvXG4gICAgc2V0QWN0aXZlIChzaG93VG9vbHRpcD1mYWxzZSkge1xuICAgICAgICB0aGlzLiRlbC5hZGRDbGFzcyh0aGlzLlVJX0NMQVNTRVMuYWN0aXZlKTtcbiAgICAgICAgaWYoc2hvd1Rvb2x0aXApIHRoaXMuJGVsLmFkZENsYXNzKCd2YWMtZm9yY2UtdG9vbHRpcCcpO1xuICAgIH1cblxuICAgIC8vIERlYWN0aXZhdGUgdGhpcyBtYXJrZXJcbiAgICBkZWFjdGl2YXRlICgpIHtcbiAgICAgICAgdGhpcy4kZWwucmVtb3ZlQ2xhc3MoYCR7dGhpcy5VSV9DTEFTU0VTLmFjdGl2ZX0gdmFjLWZvcmNlLXRvb2x0aXBgKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IG1hcmtlciBvbiB0aW1lbGluZSBmb3IgdGhpcy5yYW5nZTtcbiAgICByZW5kZXIgKCkge1xuICAgICAgICAvLyBjbGVhciBleGlzdGluZyBtYXJrZXIgaWYgdGhpcyBvbmUgd2FzIGFscmVhZHkgcmVuZGVyZWRcbiAgICAgICAgdGhpcy4kVUkudGltZWxpbmUuZmluZChgW2RhdGEtbWFya2VyLWlkPVwiJHt0aGlzLmNvbXBvbmVudElkfVwiXWApLnJlbW92ZSgpO1xuXG4gICAgICAgIC8vIEJpbmQgdG8gbG9jYWwgaW5zdGFuY2UgdmFyLCBhZGQgdG8gRE9NLCBhbmQgc2V0dXAgZXZlbnRzXG4gICAgICAgIHRoaXMuJGVsID0gJCh0aGlzLnJlbmRlclRlbXBsYXRlKHRoaXMudGVtcGxhdGVOYW1lLCB0aGlzLm1hcmtlclRlbXBsYXRlRGF0YSkpO1xuICAgICAgICB0aGlzLiRVSS5tYXJrZXJXcmFwLmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgICAgIHRoaXMuYmluZE1hcmtlckV2ZW50cygpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgbmVlZGVkIGV2ZW50cyBmb3IgdGhpcyBtYXJrZXJcbiAgICBiaW5kTWFya2VyRXZlbnRzICgpIHtcbiAgICAgICAgLy8gaGFuZGxlIGRpbW1pbmcgb3RoZXIgbWFya2VycyArIGhpZ2hsaWdodGluZyB0aGlzIG9uZSBvbiBtb3VzZWVudGVyL2xlYXZlXG4gICAgICAgIHRoaXMuJGVsLm9uKFwibW91c2VlbnRlci52YWMtbWFya2VyXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKCd2YWMtaG92ZXJpbmcnKS5jbG9zZXN0KFwiLnZhYy1tYXJrZXItd3JhcFwiKS5hZGRDbGFzcygndmFjLWRpbS1hbGwnKTtcbiAgICAgICAgfSkub24oXCJtb3VzZWxlYXZlLnZhYy1tYXJrZXJcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kZWwucmVtb3ZlQ2xhc3MoJ3ZhYy1ob3ZlcmluZycpLmNsb3Nlc3QoXCIudmFjLW1hcmtlci13cmFwXCIpLnJlbW92ZUNsYXNzKCd2YWMtZGltLWFsbCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBvYmplY3QgZm9yIHRlbXBsYXRlXG4gICAgZ2V0IG1hcmtlclRlbXBsYXRlRGF0YSAoKSB7XG4gICAgICAgICAvLyB0aGUgc21hbGxlciB0aGUgd2lkdGgsIHRoZSBoaWdoZXIgdGhlIHotaW5kZXggc28gb3ZlcmxhcHMgYXJlIGNsaWNrYWJsZVxuICAgICAgICBsZXQgbGVmdCA9ICh0aGlzLnJhbmdlLnN0YXJ0IC8gdGhpcy5kdXJhdGlvbikgKiAxMDAsXG4gICAgICAgICAgICB3aWR0aCA9ICgodGhpcy5yYW5nZS5lbmQgLyB0aGlzLmR1cmF0aW9uKSAqIDEwMCkgLSBsZWZ0LFxuICAgICAgICAgICAgekluZGV4ID0gKDEwMCAtIE1hdGguZmxvb3Iod2lkdGgpKSB8fCAxMDA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAgICAgICAgIGxlZnQgKyAnJScsXG4gICAgICAgICAgICB3aWR0aDogICAgICAgIHdpZHRoICsgJyUnLFxuICAgICAgICAgICAgekluZGV4OiAgICAgICB6SW5kZXgsXG4gICAgICAgICAgICBzaG93VG9vbHRpcDogIHRoaXMucGx1Z2luLm9wdGlvbnMuc2hvd01hcmtlclNoYXBlQW5kVG9vbHRpcHMsXG4gICAgICAgICAgICB0b29sdGlwUmlnaHQ6IGxlZnQgPiA1MCxcbiAgICAgICAgICAgIHRvb2x0aXBUaW1lOiAgVXRpbHMuaHVtYW5UaW1lKHRoaXMucmFuZ2UpLFxuICAgICAgICAgICAgdG9vbHRpcEJvZHk6ICAhdGhpcy5jb21tZW50ID8gbnVsbCA6IHRoaXMuY29tbWVudC5ib2R5LFxuICAgICAgICAgICAgcmFuZ2VTaG93OiAgICAhIXRoaXMucmFuZ2UuZW5kLFxuICAgICAgICAgICAgaWQ6ICAgICAgICAgICB0aGlzLmNvbXBvbmVudElkXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGxpc3RlbmVycyBvbiB0ZWFyZG93biBhbmQgcmVtb3ZlIERPTSBub2Rlc1xuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgdGhpcy4kZWxcbiAgICAgICAgICAgIC5vZmYoJ21vdXNlZW50ZXIudmFjLW1hcmtlcicpXG4gICAgICAgICAgICAub2ZmKCdtb3VzZWxlYXZlLnZhYy1tYXJrZXInKVxuICAgICAgICAgICAgLm9mZignY2xpY2sudmFjLW1hcmtlcicpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgbWFpbiAnYW5ub3RhdGlvbiB0b2dnbGUnIGJ1dHRvbiBpbiB0aGUgcGxheWVyIGNvbnRyb2xzLCBpbmNsdWRpbmcgbm90aWZpZXIgZm9yICMgYW5ub3RhdGlvbnNcbiovXG5cbmNvbnN0IFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIiksXG4gICAgICB0ZW1wbGF0ZU5hbWUgPSBcInBsYXllcl9idXR0b25cIjtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQbGF5ZXJCdXR0b24gZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgdGhpcy5pbml0QVBJKHRoaXMsICdQbGF5ZXJCdXR0b24nKTtcblxuICAgICAgICB0aGlzLiRlbC5vbignY2xpY2sudmFjLXBsYXllci1idXR0b24nLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbi50b2dnbGVBbm5vdGF0aW9uTW9kZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgYnV0dG9uIHRvIHBsYXllclxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGxldCBidG4gPSB0aGlzLnBsYXllci5nZXRDaGlsZCgnY29udHJvbEJhcicpLmFkZENoaWxkKCdidXR0b24nLCB7fSk7XG4gICAgICAgIGJ0bi5jb250cm9sVGV4dChcIlRvZ2dsZSBBbmltYXRpb25zXCIpO1xuICAgICAgICB0aGlzLiRlbCA9ICQoYnRuLmVsKCkpO1xuICAgICAgICB0aGlzLiRlbC5hZGRDbGFzcygndmFjLXBsYXllci1idG4nKS5maW5kKFwiLnZqcy1pY29uLXBsYWNlaG9sZGVyXCIpLmh0bWwodGhpcy5yZW5kZXJUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucyBkaXNwbGF5ZWQgaW4gdGhlIGJ1YmJsZVxuICAgIHVwZGF0ZU51bUFubm90YXRpb25zICgpIHtcbiAgICAgICAgbGV0IG51bSA9IHRoaXMucGx1Z2luLmFubm90YXRpb25TdGF0ZS5hbm5vdGF0aW9ucy5sZW5ndGgsXG4gICAgICAgICAgICAkYnViYmxlID0gdGhpcy4kZWwuZmluZChcImJcIik7XG4gICAgICAgICRidWJibGUudGV4dChudW0pO1xuICAgICAgICBudW0gPiAwID8gJGJ1YmJsZS5yZW1vdmVDbGFzcyh0aGlzLlVJX0NMQVNTRVMuaGlkZGVuKSA6ICRidWJibGUuYWRkQ2xhc3ModGhpcy5VSV9DTEFTU0VTLmhpZGRlbik7XG4gICAgfVxuXG4gICAgLy8gVW5iaW5kIGV2ZW50IGxpc3RlbmVycyBvbiB0ZWFyZG93biBhbmQgcmVtb3ZlIERPTSBub2Rlc1xuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgdGhpcy4kZWwub2ZmKCdjbGljay52YWMtcGxheWVyLWJ1dHRvbicpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBDb21wb25lbnQgZm9yIGEgc2hhcGUgdGhhdCBjYW4gYmUgZHJ1Zy9zaXplZCBvbiB0b3Agb2YgdGhlIHZpZGVvIHdoaWxlIGFkZGluZyBhIG5ldyBhbm5vdGF0aW9uXG4qL1xuXG5jb25zdCAgIFNoYXBlID0gcmVxdWlyZShcIi4vc2hhcGVcIiksXG4gICAgICAgIFV0aWxzID0gcmVxdWlyZSgnLi8uLi9saWIvdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBTZWxlY3RhYmxlU2hhcGUgZXh0ZW5kcyBTaGFwZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuJHBhcmVudCA9IHRoaXMuJHBsYXllci5maW5kKFwiLnZhYy12aWRlby1jb3Zlci1jYW52YXNcIik7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQmluZCBhbGwgbmVlZGVkIGV2ZW50cyBmb3IgZHJhZyBhY3Rpb25cbiAgICBiaW5kRXZlbnRzICgpIHtcbiAgICAgICAgLy8gT24gbW91c2Vkb3duIGluaXRpYWxpemUgZHJhZ1xuICAgICAgICB0aGlzLiRwYXJlbnQub24oXCJtb3VzZWRvd24udmFjLXNlbGVjdGFibGUtc2hhcGVcIiwgKGUpID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGEgZmV3IGNvbmRpdGlvbnMgdG8gc2VlIGlmIHdlIHNob3VsZCAqbm90KiBzdGFydCBkcmFnXG4gICAgICAgICAgICBpZiggISgkKGUudGFyZ2V0KS5oYXNDbGFzcygndmFjLXZpZGVvLWNvdmVyLWNhbnZhcycpKSApIHJldHVybjsgLy9kaWRuJ3QgY2xpY2sgb24gb3ZlcmxheVxuICAgICAgICAgICAgaWYoICQoZS50YXJnZXQpLmhhc0NsYXNzKCd2YWMtc2hhcGUnKSApIHJldHVybjsgLy91c2VyIGNsaWNrZWQgb24gYW5ub3RhdGlvblxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgb2xkIHNoYXBlIGlmIG9uZSBleGlzdGVkXG4gICAgICAgICAgICBpZih0aGlzLiRlbCkgdGhpcy4kZWwucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIC8vIERlZmluZSBkZWZhdWx0IHN0YXJ0aW5nIHNoYXBlIChqdXN0IHgveSBjb29yZHMgb2Ygd2hlcmUgdXNlciBjbGlja2VkIG5vIHdpZHRoL2hlaWdodCB5ZXQpXG4gICAgICAgICAgICBsZXQgc2hhcGUgPSB7XG4gICAgICAgICAgICAgICAgeDE6IHRoaXMueENvb3JkVG9QZXJjZW50KGUucGFnZVgpLFxuICAgICAgICAgICAgICAgIHkxOiB0aGlzLllDb29yZFRvUGVyY2VudChlLnBhZ2VZKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNoYXBlLngyID0gc2hhcGUueDE7XG4gICAgICAgICAgICBzaGFwZS55MiA9IHNoYXBlLnkyO1xuICAgICAgICAgICAgdGhpcy5zaGFwZSA9IHNoYXBlO1xuXG4gICAgICAgICAgICAvLyBTYXZlIG9yaWdpbiBwb2ludHMgZm9yIGZ1dHVyZSB1c2VcbiAgICAgICAgICAgIHRoaXMub3JpZ2luWCA9IHNoYXBlLngxO1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5ZID0gc2hhcGUueTE7XG5cbiAgICAgICAgICAgIC8vIERyYXcgc2hhcGUgYW5kIHN0YXJ0IGRyYWcgc3RhdGVcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ01vdmVkID0gZmFsc2U7IC8vIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHVzZXIgYWN0dWFsbHkgZHJhZ2dlZCBvciBqdXN0IGNsaWNrZWRcblxuICAgICAgICAgICAgLy8gQmluZCBldmVudCBvbiBkb2MgbW91c2Vtb3ZlIHRvIHRyYWNrIGRyYWcsIHRocm90dGxlZCB0byBvbmNlIGVhY2ggMTAwbXNcbiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKGBtb3VzZW1vdmUudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9YCwgVXRpbHMudGhyb3R0bGUodGhpcy5vbkRyYWcuYmluZCh0aGlzKSwgMTAwKSApO1xuXG4gICAgICAgICAgICAvLyBBZGQgZHJhZyBjbGFzcyB0byBjdXJzb3IgdG9vbHRpcCBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpbi5vcHRpb25zLnNob3dDb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci10b29sLXRpcCcpLmFkZENsYXNzKCd2YWMtY3Vyc29yLWRyYWdnaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE9uIG1vdXNldXAsIGlmIGR1cmluZyBkcmFnIGNhbmNlbCBkcmFnIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICAkKGRvY3VtZW50KS5vbihgbW91c2V1cC52YWMtc3NoYXBlLSR7dGhpcy5wbGF5ZXJJZH1gLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZW1vdmUudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9YCk7XG5cbiAgICAgICAgICAgIGlmKCF0aGlzLmRyYWdNb3ZlZCl7XG4gICAgICAgICAgICAgICAgLy9jbGVhciBzaGFwZSBpZiBpdCdzIGp1c3QgYSBjbGljayAoYW5kIG5vdCBhIGRyYWcpXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYodGhpcy4kZWwpIHRoaXMuJGVsLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBkcmFnIGNsYXNzIGZyb20gY3Vyc29yIHRvb2x0aXAgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZighdGhpcy5wbHVnaW4ub3B0aW9ucy5zaG93Q29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy1jdXJzb3ItdG9vbC10aXAnKS5yZW1vdmVDbGFzcygndmFjLWN1cnNvci1kcmFnZ2luZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBPbiBlYWNoIGludGVyYXRpb24gb2YgZHJhZyBhY3Rpb24gKG1vdXNlIG1vdmVtZW50KSwgcmVjYWxjIHBvc2l0aW9uIGFuZCByZWRyYXcgc2hhcGVcbiAgICBvbkRyYWcgKGUpIHtcbiAgICAgICAgdGhpcy5kcmFnTW92ZWQgPSB0cnVlO1xuXG4gICAgICAgIGxldCB4UGVyID0gdGhpcy54Q29vcmRUb1BlcmNlbnQoZS5wYWdlWCksXG4gICAgICAgICAgICB5UGVyID0gdGhpcy5ZQ29vcmRUb1BlcmNlbnQoZS5wYWdlWSk7XG5cbiAgICAgICAgaWYoeFBlciA8IHRoaXMub3JpZ2luWCl7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLngyID0gdGhpcy5vcmlnaW5YO1xuICAgICAgICAgICAgdGhpcy5zaGFwZS54MSA9IE1hdGgubWF4KDAsIHhQZXIpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueDIgPSBNYXRoLm1pbigxMDAsIHhQZXIpO1xuICAgICAgICAgICAgdGhpcy5zaGFwZS54MSA9IHRoaXMub3JpZ2luWDtcbiAgICAgICAgfVxuICAgICAgICBpZih5UGVyIDwgdGhpcy5vcmlnaW5ZKXtcbiAgICAgICAgICAgIHRoaXMuc2hhcGUueTIgPSB0aGlzLm9yaWdpblk7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLnkxID0gTWF0aC5tYXgoMCwgeVBlcik7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zaGFwZS55MiA9IE1hdGgubWluKDEwMCwgeVBlcik7XG4gICAgICAgICAgICB0aGlzLnNoYXBlLnkxID0gdGhpcy5vcmlnaW5ZO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0RGltc0Zyb21TaGFwZSgpO1xuXG4gICAgICAgIHRoaXMucGx1Z2luLmZpcmUoJ2FkZGluZ0Fubm90YXRpb25EYXRhQ2hhbmdlZCcsIHsgc2hhcGU6IHRoaXMuc2hhcGUgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBwaXhlbC1iYXNlZCB4IHBvc2l0aW9uIChyZWxhdGl2ZSB0byBkb2N1bWVudCkgdG8gcGVyY2VudGFnZSBpbiB2aWRlb1xuICAgIHhDb29yZFRvUGVyY2VudCAoeCkge1xuICAgICAgICB4ID0geCAtIHRoaXMuJHBhcmVudC5vZmZzZXQoKS5sZWZ0OyAvL3BpeGVsIHBvc2l0aW9uXG4gICAgICAgIGxldCBtYXggPSB0aGlzLiRwYXJlbnQuaW5uZXJXaWR0aCgpO1xuICAgICAgICByZXR1cm4gTnVtYmVyKCgoeCAvIG1heCkgKiAxMDApLnRvRml4ZWQoMikpOyAvL3JvdW5kIHRvIDIgZGVjaW1hbCBwbGFjZXNcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHBpeGVsLWJhc2VkIHkgcG9zaXRpb24gKHJlbGF0aXZlIHRvIGRvY3VtZW50KSB0byBwZXJjZW50YWdlIGluIHZpZGVvXG4gICAgWUNvb3JkVG9QZXJjZW50ICh5KSB7XG4gICAgICAgIHkgPSB5IC0gdGhpcy4kcGFyZW50Lm9mZnNldCgpLnRvcDsgLy9waXhlbCBwb3NpdGlvblxuICAgICAgICBsZXQgbWF4ID0gdGhpcy4kcGFyZW50LmlubmVySGVpZ2h0KCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIoKCh5IC8gbWF4KSAqIDEwMCkudG9GaXhlZCgyKSk7IC8vcm91bmQgdG8gMiBkZWNpbWFsIHBsYWNlc1xuICAgIH1cblxuICAgIC8vIFVuYmluZCBldmVudHMgYW5kIHJlbW92ZSBlbGVtZW50XG4gICAgdGVhcmRvd24gKCkge1xuICAgICAgICB0aGlzLiRwYXJlbnQub2ZmKCdtb3VzZWRvd24udmFjLXNlbGVjdGFibGUtc2hhcGUnKTtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKGBtb3VzZXVwLnZhYy1zc2hhcGUtJHt0aGlzLnBsYXllcklkfSBtb3VzZW1vdmUudmFjLXNzaGFwZS0ke3RoaXMucGxheWVySWR9YCk7XG4gICAgICAgIHN1cGVyLnRlYXJkb3duKCk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIENvbXBvbmVudCBmb3IgbWFuYWdpbmcgYSBzaGFwZSAoaS5lLiBib3ggZHJhd24gb24gdGhlIHBsYXllcikgZm9yIGFuIGFubm90YXRpb25cbiovXG5cbmNvbnN0IFBsYXllclVJQ29tcG9uZW50ID0gcmVxdWlyZShcIi4vLi4vbGliL3BsYXllcl91aV9jb21wb25lbnRcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgU2hhcGUgZXh0ZW5kcyBQbGF5ZXJVSUNvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGxheWVyLCBzaGFwZT1udWxsKSB7XG4gICAgICAgIHN1cGVyKHBsYXllcik7XG4gICAgICAgIHRoaXMuc2hhcGUgPSBzaGFwZTtcbiAgICAgICAgdGhpcy4kcGFyZW50ID0gdGhpcy4kcGxheWVyO1xuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHNoYXBlIGVsZW1lbnQgb24gdGhlICRwYXJlbnRcbiAgICByZW5kZXIgKCkge1xuICAgICAgICBpZighdGhpcy5zaGFwZSkgcmV0dXJuO1xuICAgICAgICBpZih0aGlzLiRlbCkgdGhpcy4kZWwucmVtb3ZlKCk7XG5cbiAgICAgICAgdGhpcy4kZWwgPSAkKFwiPGRpdi8+XCIpLmFkZENsYXNzKFwidmFjLXNoYXBlXCIpO1xuICAgICAgICB0aGlzLnNldERpbXNGcm9tU2hhcGUoKTtcbiAgICAgICAgdGhpcy4kcGFyZW50LmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgfVxuXG4gICAgLy8gU2V0L3VwZGF0ZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgc2hhcGUgYmFzZWQgIG9uIHRoaXMuc2hhcGVcbiAgICBzZXREaW1zRnJvbVNoYXBlICgpIHtcbiAgICAgICAgdGhpcy4kZWwuY3NzKHtcbiAgICAgICAgICAgIGxlZnQ6ICAgdGhpcy5zaGFwZS54MSArIFwiJVwiLFxuICAgICAgICAgICAgdG9wOiAgICB0aGlzLnNoYXBlLnkxICsgXCIlXCIsXG4gICAgICAgICAgICB3aWR0aDogICh0aGlzLnNoYXBlLngyLXRoaXMuc2hhcGUueDEpICsgXCIlXCIsXG4gICAgICAgICAgICBoZWlnaHQ6ICh0aGlzLnNoYXBlLnkyLXRoaXMuc2hhcGUueTEpICsgXCIlXCJcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuICAgIExvYWQgcGx1Z2luIGFuZCByZWdpc3RlciB0byBnbG9iYWwgdmlkZW9qc1xuKi9cblxuKCgkLCB2aWRlb2pzKSA9PiB7XG4gICAgY29uc3QgQW5ub3RhdGlvbkNvbW1lbnRzID0gcmVxdWlyZSgnLi9hbm5vdGF0aW9uX2NvbW1lbnRzLmpzJyk7XG4gICAgdmlkZW9qcy5yZWdpc3RlclBsdWdpbihcbiAgICAgICAgJ2Fubm90YXRpb25Db21tZW50cycsXG4gICAgICAgIEFubm90YXRpb25Db21tZW50cyh2aWRlb2pzKVxuICAgICk7XG59KShqUXVlcnksIHdpbmRvdy52aWRlb2pzKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qXG4gICAgQ2xhc3NlcyBmb3IgcmVnaXN0ZXJpbmcgYW5kIGhhbmRsaW5nIGN1c3RvbSBldmVudHMgZm9yIGV4dGVybmFsIGludGVyYWN0aW9uIHN1cHBvcnQuXG4gICAgV2lsbCBiZSBib3VuZCB0byBwbHVnaW4gb2JqZWN0IGFzIGEgbWVzc2FnZSBnYXRld2F5IGJldHdlZW4gZXh0ZXJuYWwgZWxlbWVudHMgYW5kIHRoZSBwbHVnaW4uXG4qL1xuXG5jb25zdCBMb2dnZXIgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5cbi8qXG4gICAgQSBjZW50cmFsaXplZCBjb2xsZWN0aW9uIG9mIGV2ZW50IGNhbGxiYWNrcyBvcmdhbml6ZWQgYnkgY29tcG9uZW50IGFuZCBuYW1lXG4gICAgTWFpbiByZWZlcmVuY2UgZm9yIGV4dGVybmFsIGV2ZW50IGFwaVxuICAgIFRoZXNlIGV2ZW50cyB3aWxsIGJlIGJvdW5kIHRvIHRoZSBwbHVnaW4gb24gaW5pdGlhbGl6YXRpb24gb2YgdGhlaXIgcmVzcGVjdGl2ZSBjb21wb25lbnRzXG4gICAgTk9URSAtICdzZWxmJyBhcyBzZWNvbmQgcGFyYW0gaW4gZWFjaCBmdW5jdGlvbiBpcyBhIHdvcmthcm91bmQgZm9yIHRyYW5zcGlsZXIgbm90IHByb3Blcmx5XG4gICAga2VlcGluZyB0aGlzICwgc28gd2UgcGFzcyBpbiBpbnN0YW5jZSB0byB1c2UgYXMgdGhpcyBmb3IgZWFjaCBmbiAtIGNhbid0IHJlbHkgb24gYmluZFxuICAgIGJlY2F1c2UgdGhpcyBpcyByZXdyaXR0ZW4gZnJvbSBzeW1ib2wgcmVnaXN0cnkgaW4gdHJhbnNwaWxlciBhbmQgaXQncyBub3QgcHJlc2VudFxuKi9cblxuY29uc3QgRXZlbnRSZWdpc3RyeSA9IHtcbiAgICBBbm5vdGF0aW9uU3RhdGU6IHtcbiAgICAgICAgb3BlbkFubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLm9wZW5Bbm5vdGF0aW9uQnlJZChldmVudC5kZXRhaWwuaWQpO1xuICAgICAgICB9LFxuICAgICAgICBjbG9zZUFjdGl2ZUFubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLmNsZWFyQWN0aXZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG5ld0Fubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLmNyZWF0ZUFuZEFkZEFubm90YXRpb24oZXZlbnQuZGV0YWlsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveUFubm90YXRpb246IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLmRlc3Ryb3lBbm5vdGF0aW9uQnlJZChldmVudC5kZXRhaWwuaWQpO1xuICAgICAgICB9LFxuICAgICAgICBuZXdDb21tZW50OiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBsZXQgYW5ub3RhdGlvbiA9IF90aGlzLmZpbmRBbm5vdGF0aW9uKGV2ZW50LmRldGFpbC5hbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgaWYoYW5ub3RhdGlvbikgYW5ub3RhdGlvbi5jb21tZW50TGlzdC5jcmVhdGVDb21tZW50KGV2ZW50LmRldGFpbC5ib2R5KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveUNvbW1lbnQ6IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIGxldCBjb21tZW50ID0gX3RoaXMuZmluZENvbW1lbnQoZXZlbnQuZGV0YWlsLmlkKTtcbiAgICAgICAgICAgIGlmKGNvbW1lbnQpIGNvbW1lbnQuY29tbWVudExpc3QuZGVzdHJveUNvbW1lbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBDb250cm9sczoge1xuICAgICAgICBhZGRpbmdBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5zdGFydEFkZE5ldygpO1xuICAgICAgICB9LFxuICAgICAgICBjYW5jZWxBZGRpbmdBbm5vdGF0aW9uOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy5jYW5jZWxBZGROZXcoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUGxheWVyQnV0dG9uOiB7XG4gICAgICAgIG9uU3RhdGVDaGFuZ2VkOiAoZXZlbnQsIF90aGlzKSA9PiB7XG4gICAgICAgICAgICBfdGhpcy51cGRhdGVOdW1Bbm5vdGF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBBbm5vdGF0aW9uQ29tbWVudHM6IHtcbiAgICAgICAgdG9nZ2xlQW5ub3RhdGlvbk1vZGU6IChldmVudCwgX3RoaXMpID0+IHtcbiAgICAgICAgICAgIF90aGlzLnRvZ2dsZUFubm90YXRpb25Nb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEV2ZW50RGlzcGF0Y2hlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAocGx1Z2luKSB7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLnBsdWdpblJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGVuZGluZ0V2dHMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMuZXZlbnRSZWdpc3RyeSA9IEV2ZW50UmVnaXN0cnk7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBFdmVudFJlZ2lzdHJ5IHRvIG1hc3MgcmVnaXN0ZXIgZXZlbnRzIG9uIGVhY2ggY29tcG9uZW50IGluaXRpYWxpemF0aW9uXG4gICAgcmVnaXN0ZXJMaXN0ZW5lcnNGb3IgKG9iaiwgY2xhc3NOYW1lKSB7XG4gICAgICAgIGxldCBtYXRjaGluZ0V2ZW50cyA9IHRoaXMuZXZlbnRSZWdpc3RyeVtjbGFzc05hbWVdO1xuICAgICAgICBpZiAobWF0Y2hpbmdFdmVudHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1hdGNoaW5nRXZlbnRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCByZWdpc3RlciBhZ2FpbiBpZiBhbHJlYWR5IGluIGNhY2hlZCBjb2xsZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCF+dGhpcy5yZWdpc3RlcmVkTGlzdGVuZXJzLmluZGV4T2Yoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSBtYXRjaGluZ0V2ZW50c1trZXldLmJpbmQob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVyKGtleSwgKChldnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLnBsdWdpblJlYWR5KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0NhbGxiYWNrKGtleSwgY2xhc3NOYW1lLCBldnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXZ0LCBvYmopO1xuICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJpbmQgYSBsaXN0ZW5lciB0byB0aGUgcGx1Z2luXG4gICAgcmVnaXN0ZXJMaXN0ZW5lciAodHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wbHVnaW4ub24odHlwZSwgY2FsbGJhY2spO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMucHVzaCh0eXBlKTtcbiAgICB9XG5cbiAgICAvLyBVbmJpbmQgYSBsaXN0ZW5lciBmcm9tIHRoZSBwbHVnaW5cbiAgICB1bnJlZ2lzdGVyTGlzdGVuZXIgKHR5cGUpIHtcbiAgICAgICAgdGhpcy5wbHVnaW4ub2ZmKHR5cGUpO1xuICAgICAgICBsZXQgaSA9IHRoaXMucmVnaXN0ZXJlZExpc3RlbmVycy5pbmRleE9mKHR5cGUpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyZWRMaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgYW4gZXZlbnQgb24gdGhlIHBsdWdpblxuICAgIGZpcmUgKHR5cGUsIGRhdGEpIHtcbiAgICAgICAgaWYoIXRoaXMucGx1Z2luUmVhZHkpIHJldHVybjtcbiAgICAgICAgTG9nZ2VyLmxvZyhcImV2dC1kaXNwYXRjaC1GSVJFXCIsIHR5cGUsIGRhdGEpO1xuICAgICAgICBsZXQgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgJ2RldGFpbCc6IGRhdGEgfSk7XG4gICAgICAgIHRoaXMucGx1Z2luLnRyaWdnZXIoZXZ0KTtcbiAgICB9XG5cbiAgICB0ZWFyZG93biAoKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZExpc3RlbmVycy5mb3JFYWNoKCh0eXBlKSA9PiB7IHRoaXMudW5yZWdpc3Rlckxpc3RlbmVyKHR5cGUpIH0pO1xuICAgIH1cblxuICAgIGxvZ0NhbGxiYWNrIChldmVudE5hbWUsIGNsYXNzTmFtZSwgZXZlbnQpIHtcbiAgICAgICAgTG9nZ2VyLmxvZyhcImV2dC1kaXNwYXRjaC1SRUNFSVZFXCIsIGAke2V2ZW50TmFtZX0gKCR7Y2xhc3NOYW1lfSlgLCBldmVudCk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuLypcblx0R2VuZXJhbCBsb2dnaW5nIGxpYnJhcnksIGNoZWNraW5nIHRvIHNlZSBpZiB3aW5kb3cuVkFDX0RFQlVHIGlzIHByZXNlbnQgYW5kIHRydWUgdG8gZW5hYmxlIGRlYnVnZ2luZ1xuKi9cblxuLy8gUHJlZml4IGZvciBhcHBlbmRpbmcgdG8gYWxsIGxvZ2dlciBtZXNzYWdlc1xuY29uc3QgTE9HX1BSRUZJWCA9IFwiOjpWQUM6OlwiO1xuXG4vLyBBcmUgd2UgaW4gZGVidWcgbW9kZT9cbmZ1bmN0aW9uIGRlYnVnKCl7XG5cdHJldHVybiAhIXdpbmRvdy5WQUNfREVCVUc7XG59XG5cbi8vIEJ1aWxkIGFyZ3VtZW50cyBmb3IgY29uc29sZSBmbiwgYWRkaW5nIHByZWZpeFxuZnVuY3Rpb24gYnVpbGRBcmdzKGFyZ3Mpe1xuXHRyZXR1cm4gW0xPR19QUkVGSVhdLmNvbmNhdChhcmdzKTtcbn1cblxuLy8gTG9nIG1lc3NhZ2UvZGF0YVxubW9kdWxlLmV4cG9ydHMubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZighZGVidWcoKSkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nLmFwcGx5KG51bGwsIGJ1aWxkQXJncyhhcmdzKSk7XG59XG5cbi8vIEVycm9yIG1lc3NhZ2UvZGF0YVxubW9kdWxlLmV4cG9ydHMuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmKCFkZWJ1ZygpKSByZXR1cm47XG4gICAgY29uc29sZS5lcnJvci5hcHBseShudWxsLCBidWlsZEFyZ3MoYXJncykpO1xufVxuXG4vLyBJbmZvIG1lc3NhZ2UvZGF0YVxubW9kdWxlLmV4cG9ydHMuaW5mbyA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYoIWRlYnVnKCkpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8uYXBwbHkobnVsbCwgYnVpbGRBcmdzKGFyZ3MpKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBCYXNlIGNsYXNzIGFsbCBwbGF5ZXIgY29tcG9uZW50cyBpbnRlcml0IGZyb20gLSBpdCBpbmNsdWRlcyBsb3RzIG9mIGhlbHBlciBmdW5jdGlvbnMgKHRvIGdldCByZWZlcmVuY2UgdG9cbiAgICB0aGUgcGxheWVyLCB0aGUgcGx1Z2luLCB2aWRlbyBzdGF0ZSwgZXRjKVxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQbGF5ZXJDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IgKHBsYXllcikge1xuICAgICAgICB0aGlzLl9wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gYXR0cmlidXRlIHRvIGdldCByZWZlcmVuY2UgdG8gdGhlIG1haW4gcGx1Z2luIG9iamVjdCAobWFpbi5qcyBpbnN0YW5jZSlcbiAgICBnZXQgcGx1Z2luICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmFubm90YXRpb25Db21tZW50cygpO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGphdmFzY3JpcHQgaW5zdGFuY2VcbiAgICBnZXQgcGxheWVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXllcjtcbiAgICB9XG5cbiAgICAvLyBhdHRyaWJ1dGUgdG8gZ2V0IHZpZGVvIGR1cmF0aW9uIChpbiBzZWNvbmRzKVxuICAgIGdldCBkdXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5kdXJhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGN1cnJlbnQgdGltZVxuICAgIGdldCBjdXJyZW50VGltZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5jdXJyZW50VGltZSgpO1xuICAgIH1cblxuICAgIC8vIHNldCBjdXJyZW50IHRpbWUgb2YgcGxheWVyXG4gICAgc2V0IGN1cnJlbnRUaW1lICh0aW1lKSB7XG4gICAgICAgIHRoaXMucGxheWVyLmN1cnJlbnRUaW1lKHRpbWUpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGFsbCBldmVudHMgaW4gdGhlIEV2ZW50UmVnaXN0cnkgbWF0Y2hpbmcgdGhpcyBjbGFzc05hbWVcbiAgICBpbml0QVBJIChvYmosIGNsYXNzTmFtZSkge1xuICAgICAgICB0aGlzLnBsdWdpbi5ldmVudERpc3BhdGNoZXIucmVnaXN0ZXJMaXN0ZW5lcnNGb3Iob2JqLCBjbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vIE51bGxpZnkgcGxheWVyIHJlZmVyZW5jZSBzbyBvYmplY3RzIGNhbiBiZSByZW1vdmVkIHNhZmVseVxuICAgIC8vIEFsbCBjb21wb25lbnRzIHNob3VsZCBjYWxsIHN1cGVyLnRlYXJkb3duKCkgd2l0aGluIHRoZWlyIHRlYXJkb3duIGZ1bmNzXG4gICAgdGVhcmRvd24gKGRlc3Ryb3k9ZmFsc2UpIHtcbiAgICAgICAgaWYoZGVzdHJveSkgdGhpcy5fcGxheWVyID0gbnVsbDtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG4gICAgQmFzZSBjbGFzcyBhbGwgcGxheWVyIFVJIGNvbXBvbmVudHMgaW50ZXJpdCBmcm9tIC0gaXQgaW5jbHVkZXMgbG90cyBvZiBoZWxwZXIgZnVuY3Rpb25zICh0byBnZXQgcmVmZXJlbmNlIHRvXG4gICAgdGhlIHBsYXllciAkZWwsIHZhcmlvdXMgY2xhc3Nlcy9oZWxwZXJzLCB0ZW1wbGF0ZSByZW5kZXJpbmcsIGV0YylcbiovXG5cbmNvbnN0IFBsYXllckNvbXBvbmVudCA9IHJlcXVpcmUoXCIuL3BsYXllcl9jb21wb25lbnRcIiksXG4gICAgICBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycy9ydW50aW1lJyksXG4gICAgICBUZW1wbGF0ZXMgPSByZXF1aXJlKCcuLy4uL2NvbXBpbGVkL3RlbXBsYXRlcycpLFxuICAgICAgVXRpbHMgPSByZXF1aXJlKCcuLy4uL2xpYi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFBsYXllclVJQ29tcG9uZW50IGV4dGVuZHMgUGxheWVyQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yIChwbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIocGxheWVyKTtcbiAgICB9XG5cbiAgICAvLyBoZWxwZXJzIHRvIGdldCB2YXJpb3VzIFVJIGNvbXBvbmVudHMgb2YgdGhlIHBsYXllciBxdWlja2x5LCBrZWVwaW5nIGNvbW1vbmx5IHJldXNlZCBjbGFzcyBuYW1lc1xuICAgIC8vIGNvbnNvbGlkYXRlZCBpbiBjYXNlIG9mIG5lZWQgdG8gY2hhbmdlIGluIHRoZSBmdXR1cmUgKGFuZCBmb3IgcXVpY2sgYWNjZXNzKVxuICAgIGdldCAkVUkgKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBjb21tZW50c0NvbnRhaW5lcjogICAgICB0aGlzLiRwbGF5ZXIuZmluZChcIi52YWMtY29tbWVudHMtY29udGFpbmVyXCIpLCAgICAgICAvLyBvdXRlciBjb250YWluZXIgZm9yIGFsbCBjb21tZW50c1xuICAgICAgICAgICAgY29udHJvbEVsZW1lbnRzOiAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLWNvbnRyb2xcIiksICAgICAgICAgICAgICAgICAgLy8gRWFjaCBvZiBtdWx0aXBsZSBjb250cm9sIGVsZW1lbnRzIGluIHRoZSBjb250cm9sIGJhclxuICAgICAgICAgICAgbmV3Q29tbWVudFRleHRhcmVhOiAgICAgdGhpcy4kcGxheWVyLmZpbmQoXCIudmFjLXZpZGVvLXdyaXRlLW5ldyB0ZXh0YXJlYVwiKSwgLy8gVGV4dGFyZWEgZm9yIHdyaXRpbmcgYSBuZXcgY29tbWVudFxuICAgICAgICAgICAgdGltZWxpbmU6ICAgICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52anMtcHJvZ3Jlc3MtY29udHJvbCcpLCAgICAgICAgIC8vIFRpbWVsaW5lIGVsZW1lbnRcbiAgICAgICAgICAgIG1hcmtlckN1cnNvckhlbHBUZXh0OiAgIHRoaXMuJHBsYXllci5maW5kKCcudmFjLWN1cnNvci1oZWxwLXRleHQnKSwgICAgICAgICAvLyBIZWxwIHRleHQgdGhhdCBhcHBlYXJzIHdpdGggJ2NsaWNrL2RyYWcuLicgb24gdGltZWxpbmVcbiAgICAgICAgICAgIGNvbnRyb2xCYXI6ICAgICAgICAgICAgIHRoaXMuJHBsYXllci5maW5kKCcudmpzLWNvbnRyb2wtYmFyJyksICAgICAgICAgICAgICAvLyBDb25yb2wgYmFyIHdyYXBwZXIgZm9yIHZqc1xuICAgICAgICAgICAgbWFya2VyV3JhcDogICAgICAgICAgICAgdGhpcy4kcGxheWVyLmZpbmQoJy52YWMtbWFya2VyLXdyYXAnKSwgICAgICAgICAgICAgIC8vIHdyYXBwZXIgZWxlbWVudCB0byBwbGFjZSBtYXJrZXJzIGluIG9uIHRpbWVsaW5lXG4gICAgICAgICAgICBjb3ZlckNhbnZhczogICAgICAgICAgICB0aGlzLiRwbGF5ZXIuZmluZCgnLnZhYy12aWRlby1jb3Zlci1jYW52YXMnKSAgICAgICAgLy8gUGxheWVyIGNvdmVyIGR1cmluZyBhZGRpbmcgYW5ub3RhdGlvbiBzdGF0ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB1dGlsaXR5IGNsYXNzZXMgdXNlZCBpbiB2YXJpb3VzIGNvbXBvbmVudHNcbiAgICBnZXQgVUlfQ0xBU1NFUyAoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIGhpZGRlbjogXCJ2YWMtaGlkZGVuXCIsXG4gICAgICAgICAgICBhY3RpdmU6IFwidmFjLWFjdGl2ZVwiXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGpxdWVyeSBlbGVtZW50XG4gICAgZ2V0ICRwbGF5ZXIgKCkge1xuICAgICAgICByZXR1cm4gJCh0aGlzLnBsYXllci5lbCgpKTtcbiAgICB9XG5cblxuICAgIC8vIGF0dHJpYnV0ZSB0byBnZXQgcGxheWVyIGlkIGZyb20gRE9NXG4gICAgZ2V0IHBsYXllcklkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHBsYXllci5hdHRyKCdpZCcpO1xuICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZSBhIHBzZXVkby1ndWlkIElEIGZvciB0aGlzIGNvbXBvbmVudCwgdG8gdXNlIGFzIGFuIElEIGluIHRoZSBET01cbiAgICBnZXQgY29tcG9uZW50SWQgKCkge1xuICAgICAgICB0aGlzLmNpZF8gPSB0aGlzLmNpZF8gfHwgVXRpbHMuZ3VpZCgpXG4gICAgICAgIHJldHVybiB0aGlzLmNpZF87XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBwbGF5L2NvbnRyb2wgYWN0aW9ucyBvbiB0aGUgY3VycmVudCBwbGF5ZXJcbiAgICBkaXNhYmxlUGxheWluZ0FuZENvbnRyb2wgKCkge1xuICAgICAgICB0aGlzLiRwbGF5ZXIuYWRkQ2xhc3MoJ3ZhYy1kaXNhYmxlLXBsYXknKTtcbiAgICAgICAgLy9UT0RPIC0gY2F0Y2ggc3BhY2ViYXIgYmVpbmcgaGl0XG4gICAgICAgIC8vVE9ETyAtIHByZXZlbnQgc2NydWJiaW5nIGFuZCB0aW1lbGluZSBjbGljayB0byBzZWVrXG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHBsYXkvY29udHJvbCBhY3Rpb25zIG9uIHRoZSBjb250cm9sbGVyXG4gICAgZW5hYmxlUGxheWluZ0FuZENvbnRyb2wgKCkge1xuICAgICAgICB0aGlzLiRwbGF5ZXIucmVtb3ZlQ2xhc3MoJ3ZhYy1kaXNhYmxlLXBsYXknKTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgYSBoYW5kbGViYXJzIHRlbXBsYXRlIHdpdGggbG9jYWwgZGF0YSBwYXNzZWQgaW4gdmlhIGtleS92YWwgaW4gb2JqZWN0XG4gICAgcmVuZGVyVGVtcGxhdGUgKHRlbXBsYXRlTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIYW5kbGViYXJzSGVscGVycygpO1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVzW3RlbXBsYXRlTmFtZV0ob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVzY2FwZWQgYnJlYWtsaW5lcyBpbiBIYW5kbGViYXJzXG4gICAgcmVnaXN0ZXJIYW5kbGViYXJzSGVscGVycyAoKSB7XG4gICAgICAgIGlmKCdicmVha2xpbmVzJyBpbiBIYW5kbGViYXJzLmhlbHBlcnMpIHJldHVybjtcblxuICAgICAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdicmVha2xpbmVzJywgKHRleHQpID0+IHtcbiAgICAgICAgICAgIHRleHQgPSBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24odGV4dCk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2dtLCAnPGJyPicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFByb3ZpZGUgYmFzaWMgdGVhcmRvd24gZnVuY3Rpb24gdG8gaW5oZXJpdFxuICAgIHRlYXJkb3duICgpIHtcbiAgICAgICAgaWYodGhpcy4kZWwpIHRoaXMuJGVsLnJlbW92ZSgpO1xuICAgICAgICBzdXBlci50ZWFyZG93bigpO1xuICAgIH1cbn1cbiIsIi8qXG4gICAgQ29sbGVjdGlvbiBvZiBwb2x5ZmlsbHMgbmVlZGVkZiBvciBJRTEwKyBzdXBwb3J0XG4qL1xuXG4vLyBBcnJheS5wcm90b3R5cGUuZmluZCgpIGZvciBJRTEwK1xucmVxdWlyZSgnaWUtYXJyYXktZmluZC1wb2x5ZmlsbCcpO1xuLy8gT2JqZWN0LmFzc2lnbiBmb3IgSUUxMCtcbnJlcXVpcmUoJ2VzNi1vYmplY3QtYXNzaWduJykucG9seWZpbGwoKTtcblxuLy8gQWxsb3cgdXNlIG9mIG9iamVjdC5jb25zdHJ1Y3Rvci5zdGF0aWNGdW5jKCkgaW4gSUVcbi8vIE5vdCB5ZXQgc3VwcG9ydGVkIGJ5IGJhYmVsXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9lZG9hcmRvY2F2YXp6YS80NzI0Njg1Njc1OWYyMjczZTQ4YlxuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIE9iamVjdC5zZXRQcm90b3R5cGVPZiA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBfZXhjbHVkZSA9IFsnbGVuZ3RoJywgJ25hbWUnLCAnYXJndW1lbnRzJywgJ2NhbGxlcicsICdwcm90b3R5cGUnXTtcblxuICAgICAgICBmdW5jdGlvbiBiaW5kRnVuY3Rpb24oY3R4LCBmbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYmluZFByb3BlcnR5KGN0eCwgcHJvcCwgcGFyZW50RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgaWYgKCFwYXJlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGN0eC5fX3Byb3RvX19bcHJvcF07XG4gICAgICAgICAgICAgICAgcGFyZW50RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4WydfXycgKyBwcm9wXSB8fCBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHhbJ19fJyArIHByb3BdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgcHJvcCwge1xuICAgICAgICAgICAgICAgIGdldDogcGFyZW50RGVzY3JpcHRvci5nZXQgPyBwYXJlbnREZXNjcmlwdG9yLmdldC5iaW5kKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2V0OiBwYXJlbnREZXNjcmlwdG9yLnNldCA/IHBhcmVudERlc2NyaXB0b3Iuc2V0LmJpbmQoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpdGVyYXRlUHJvcHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN1cGVyQ2xhc3MpLFxuICAgICAgICAgICAgICAgIHByb3RvO1xuXG4gICAgICAgICAgICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHByb3BzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBzdXBlckNsYXNzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX2V4Y2x1ZGUuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN1YkNsYXNzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VwZXJEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdXBlckNsYXNzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3VwZXJEZXNjcmlwdG9yLmdldCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc3VwZXJDbGFzc1twcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkNsYXNzW3Byb3BdID0gYmluZEZ1bmN0aW9uKHN1YkNsYXNzLCBzdXBlckNsYXNzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN1cGVyRGVzY3JpcHRvci5nZXQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRQcm9wZXJ0eShzdWJDbGFzcywgcHJvcCwgc3VwZXJEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFByb3BlcnR5KHN1YkNsYXNzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm90bykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdGVQcm9wcyhzdWJDbGFzcywgcHJvdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mID0gaXRlcmF0ZVByb3BzO1xuICAgIH1cbn0pKCk7XG5cbi8vIFVzZSBDdXN0b21FdmVudCBpbiBJRVxuKGZ1bmN0aW9uICgpIHtcbiAgaWYgKCB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIgKSByZXR1cm4gZmFsc2U7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKCBldmVudCwgcGFyYW1zICkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoICdDdXN0b21FdmVudCcgKTtcbiAgICBldnQuaW5pdEN1c3RvbUV2ZW50KCBldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsICk7XG4gICAgcmV0dXJuIGV2dDtcbiAgIH1cblxuICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuXG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgICBHZW5lYWwgdXRpbGl0eSBmdW5jdGlvbnMsIHNvdXJjZWQgZnJvbSB1bmRlcnNjb3JlICYgc2NyYXRjaCBidWlsdCBhcyBuZWVkZWRcbiovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gICAgLy8gQ2xvbmUgYW4gb2JqZWN0XG4gICAgY2xvbmVPYmplY3Q6IChvYmopID0+IE9iamVjdC5hc3NpZ24oe30sIG9iaiksXG5cbiAgICAvLyBfdGhyb3R0bGUgZnJvbSB1bmRlcnNjb3JlXG4gICAgdGhyb3R0bGU6IChmdW5jLCB3YWl0LCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgICAgIHZhciB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZpb3VzID0gMDtcbiAgICAgICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBEYXRlLm5vdygpO1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gbm93O1xuICAgICAgICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICAgICAgICBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCByZW1haW5pbmcgPiB3YWl0KSB7XG4gICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFsbCBrZXlzIG9mIGFuIG9iamVjdCB0byBpbnRcbiAgICBwYXJzZUludE9iajogKG9iaikgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYocGFyc2VJbnQob2JqW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBwYXJzZUludChvYmpba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICAvLyBDb252ZXJ0IGEgcmFuZ2Uge3N0YXJ0OiBpbnQsIChvcHRpb25hbCkgZW5kOiBpbnR9IHRvIGh1bWFuIHJlYWRhYmxlIHRpbWVcbiAgICBodW1hblRpbWU6IChyYW5nZSkgPT4ge1xuICAgICAgICBmdW5jdGlvbiByZWFkYWJsZShzZWMpe1xuICAgICAgICAgICAgbGV0IG1pbnMgPSBNYXRoLmZsb29yKHNlYy82MCksXG4gICAgICAgICAgICBzZWNzID0gU3RyaW5nKHNlYyAlIDYwKTtcbiAgICAgICAgICAgIHJldHVybiBtaW5zICsgXCI6XCIgKyAoc2Vjcy5sZW5ndGg9PTEgPyBcIjBcIiA6IFwiXCIpICsgc2VjcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGltZSA9IFtyZWFkYWJsZShyYW5nZS5zdGFydCldO1xuICAgICAgICBpZihyYW5nZS5lbmQpIHRpbWUucHVzaChyZWFkYWJsZShyYW5nZS5lbmQpKTtcbiAgICAgICAgcmV0dXJuIHRpbWUuam9pbihcIi1cIik7XG4gICAgfSxcblxuICAgIC8vIFBzZWR1by1yYW5kb20gZ3VpZCBnZW5lcmF0b3JcbiAgICBndWlkOiAoKSA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIHM0KCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM0KCkgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyAgczQoKSArICctJyArIHM0KCkgKyBzNCgpICsgczQoKTtcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBvZiBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHZpc2libGVcbiAgICAvLyBjbG9uZXMgZWwgYW5kIHRyaWNrcyBET00gaW50byByZW5kZXJpbmcgaXQgdyB0aGUgY29ycmVjdCBzaXplXG4gICAgLy8gYmV3YXJlIHRoZSBjb250YWluZXIgbWF5IGJlIGltcG9ydGFudCBmb3Igc2NvcGVkIHN0eWxlc1xuICAgIGFyZWFPZkhpZGRlbkVsOiAoJGVsLCAkY29udGFpbmVyLCBoaWRlQ2xhc3M9JycpID0+IHtcbiAgICAgICAgbGV0ICRjbG9uZSA9ICRlbC5jbG9uZSgpLFxuICAgICAgICAgICAgZGF0YSA9IHt9O1xuICAgICAgICAkY2xvbmUuY3NzKHtcbiAgICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgICAgICAgfSk7XG4gICAgICAgICRjbG9uZS5yZW1vdmVDbGFzcyhoaWRlQ2xhc3MpO1xuICAgICAgICAkY29udGFpbmVyLmFwcGVuZCgkY2xvbmUpO1xuICAgICAgICBkYXRhLndpZHRoID0gJGNsb25lLm91dGVyV2lkdGgoKTtcbiAgICAgICAgZGF0YS5oZWlnaHQgPSAkY2xvbmUub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgJGNsb25lLnJlbW92ZSgpO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgYSB2YWx1ZSAobikgaXMgd2l0aGluIGEgcmFuZ2UgKHN0YXJ0IDw9IG4gPD0gZW5kKVxuICAgIGlzV2l0aGluUmFuZ2U6IChzdGFydCwgZW5kLCBuKSA9PiB7XG4gICAgICAgIGVuZCA9IGVuZCB8fCBzdGFydCArIDE7IC8vIGZvciByYW5nZXMgd2l0aCBOTyBlbmQgZGVmaW5lZCwgYXNzdW1lIGEgMXMgcmFuZ2VcbiAgICAgICAgcmV0dXJuIG4gPj0gc3RhcnQgJiYgbiA8PSBlbmQ7XG4gICAgfVxufTtcbiJdfQ=="} \ No newline at end of file diff --git a/build/videojs-annotation-comments.min.js b/build/videojs-annotation-comments.min.js deleted file mode 100644 index b9d3170..0000000 --- a/build/videojs-annotation-comments.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(){function t(e,n,i){function r(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n||t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a= 2.0.0-beta.1",7:">= 4.0.0"};n.REVISION_CHANGES=p;var m="[object Object]";r.prototype={constructor:r,logger:h["default"],log:h["default"].log,registerHelper:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple helpers");o.extend(this.helpers,t)}else this.helpers[t]=e},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,e){if(o.toString.call(t)===m)o.extend(this.partials,t);else{if("undefined"==typeof e)throw new s["default"]('Attempting to register a partial called "'+t+'" as undefined');this.partials[t]=e}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple decorators");o.extend(this.decorators,t)}else this.decorators[t]=e},unregisterDecorator:function(t){delete this.decorators[t]}};var v=h["default"].log;n.log=v,n.createFrame=o.createFrame,n.logger=h["default"]},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t){a["default"](t)}n.__esModule=!0,n.registerDefaultDecorators=r;var o=t("./decorators/inline"),a=i(o)},{"./decorators/inline":5}],5:[function(t,e,n){"use strict";n.__esModule=!0;var i=t("../utils");n["default"]=function(t){t.registerDecorator("inline",function(t,e,n,r){var o=t;return e.partials||(e.partials={},o=function(r,o){var a=n.partials;n.partials=i.extend({},a,e.partials);var s=t(r,o);return n.partials=a,s}),e.partials[r.args[0]]=r.fn,o})},e.exports=n["default"]},{"../utils":19}],6:[function(t,e,n){"use strict";function i(t,e){var n=e&&e.loc,o=void 0,a=void 0;n&&(o=n.start.line,a=n.start.column,t+=" - "+o+":"+a);for(var s=Error.prototype.constructor.call(this,t),l=0;l0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var a=i.createFrame(n.data);a.contextPath=i.appendContextPath(n.data.contextPath,n.name),n={data:a}}return o(e,n)})},e.exports=n["default"]},{"../utils":19}],9:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}n.__esModule=!0;var r=t("../utils"),o=t("../exception"),a=i(o);n["default"]=function(t){t.registerHelper("each",function(t,e){function n(e,n,o){u&&(u.key=e,u.index=n,u.first=0===n,u.last=!!o,c&&(u.contextPath=c+e)),l+=i(t[e],{data:u,blockParams:r.blockParams([t[e],e],[c+e,null])})}if(!e)throw new a["default"]("Must pass iterator to #each");var i=e.fn,o=e.inverse,s=0,l="",u=void 0,c=void 0;if(e.data&&e.ids&&(c=r.appendContextPath(e.data.contextPath,e.ids[0])+"."),r.isFunction(t)&&(t=t.call(this)),e.data&&(u=r.createFrame(e.data)),t&&"object"==typeof t)if(r.isArray(t))for(var h=t.length;s=0?e:parseInt(t,10)}return t},log:function(t){if(t=r.lookupLevel(t),"undefined"!=typeof console&&r.lookupLevel(r.level)<=t){var e=r.methodMap[t];console[e]||(e="log");for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o":">",'"':""","'":"'","`":"`","=":"="},d=/[&<>"'`=]/g,f=/[&<>"'`=]/,p=Object.prototype.toString;n.toString=p;var m=function(t){return"function"==typeof t};m(/x/)&&(n.isFunction=m=function(t){return"function"==typeof t&&"[object Function]"===p.call(t)}),n.isFunction=m;var v=Array.isArray||function(t){return!(!t||"object"!=typeof t)&&"[object Array]"===p.call(t)};n.isArray=v},{}],20:[function(t,e,n){e.exports=t("./dist/cjs/handlebars.runtime")["default"]},{"./dist/cjs/handlebars.runtime":2}],21:[function(t,e,n){"use strict";Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError("this is null or not defined");var e=Object(this),n=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r0)for(n=0;n0?"future":"past"];return x(n)?n(e):n.replace(/%s/i,e)}function L(t,e){var n=t.toLowerCase();Ri[n]=Ri[n+"s"]=Ri[e]=t}function F(t){return"string"==typeof t?Ri[t]||Ri[t.toLowerCase()]:void 0}function H(t){var e,n,i={};for(n in t)h(t,n)&&(e=F(n),e&&(i[e]=t[n]));return i}function N(t,e){Wi[t]=e}function R(t){var e=[];for(var n in t)e.push({unit:n,priority:Wi[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function W(t,e,n){var i=""+Math.abs(t),r=e-i.length,o=t>=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+i}function U(t,e,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),t&&(zi[t]=r),e&&(zi[e[0]]=function(){return W(r.apply(this,arguments),e[1],e[2])}),n&&(zi[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function V(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,n,i=t.match(Ui);for(e=0,n=i.length;e=0&&Vi.test(t);)t=t.replace(Vi,n),Vi.lastIndex=0,i-=1;return t}function Z(t,e,n){cr[t]=x(e)?e:function(t,i){return t&&n?n:e}}function q(t,e){return h(cr,t)?cr[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return J(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,r){return e||n||i||r}))}function J(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function kt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function St(t,e,n){var i=7+e-n,r=(7+kt(t,0,i).getUTCDay()-e)%7;return-r+i-1}function Ot(t,e,n,i,r){var o,a,s=(7+n-i)%7,l=St(t,i,r),u=1+7*(e-1)+s+l;return u<=0?(o=t-1,a=et(o)+u):u>et(t)?(o=t+1,a=u-et(t)):(o=t,a=u),{year:o,dayOfYear:a}}function Mt(t,e,n){var i,r,o=St(t.year(),e,n),a=Math.floor((t.dayOfYear()-o-1)/7)+1;return a<1?(r=t.year()-1,i=a+Dt(r,e,n)):a>Dt(t.year(),e,n)?(i=a-Dt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function Dt(t,e,n){var i=St(t,e,n),r=St(t+1,e,n);return(et(t)-i+r)/7}function xt(t){return Mt(t,this._week.dow,this._week.doy).week}function Ct(){return this._week.dow}function Pt(){return this._week.doy}function Tt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Yt(t){var e=Mt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function At(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function jt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Et(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone}function $t(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function It(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Lt(t,e,n){var i,r,o,a=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)o=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:null):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null):"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null)))}function Ft(t,e,n){var i,r,o;if(this._weekdaysParseExact)return Lt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Ht(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=At(t,this.localeData()),this.add(t-e,"d")):e}function Nt(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Rt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=jt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function Wt(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(h(this,"_weekdaysRegex")||(this._weekdaysRegex=Ar),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ut(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(h(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=jr),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Vt(t){return this._weekdaysParseExact?(h(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(h(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Er),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Gt(){function t(t,e){return e.length-t.length}var e,n,i,r,o,a=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(i),s.push(r),l.push(o),u.push(i),u.push(r),u.push(o);for(a.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=J(s[e]),l[e]=J(l[e]),u[e]=J(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i"); -}function zt(){return this.hours()%12||12}function Bt(){return this.hours()||24}function Zt(t,e){U(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Jt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Qt(t){return t?t.toLowerCase().replace("_","-"):t}function Kt(t){for(var e,n,i,r,o=0;o0;){if(i=te(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&S(r,n,!0)>=e-1)break;e--}o++}return $r}function te(n){var i=null;if(!Hr[n]&&"undefined"!=typeof e&&e&&e.exports)try{i=$r._abbr;var r=t;r("./locale/"+n),ee(i)}catch(o){}return Hr[n]}function ee(t,e){var n;return t&&(n=s(e)?re(t):ne(t,e),n?$r=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),$r._abbr}function ne(t,e){if(null!==e){var n,i=Fr;if(e.abbr=t,null!=Hr[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=Hr[t]._config;else if(null!=e.parentLocale)if(null!=Hr[e.parentLocale])i=Hr[e.parentLocale]._config;else{if(n=te(e.parentLocale),null==n)return Nr[e.parentLocale]||(Nr[e.parentLocale]=[]),Nr[e.parentLocale].push({name:t,config:e}),null;i=n._config}return Hr[t]=new T(P(i,e)),Nr[t]&&Nr[t].forEach(function(t){ne(t.name,t.config)}),ee(t),Hr[t]}return delete Hr[t],null}function ie(t,e){if(null!=e){var n,i,r=Fr;i=te(t),null!=i&&(r=i._config),e=P(r,e),n=new T(e),n.parentLocale=Hr[t],Hr[t]=n,ee(t)}else null!=Hr[t]&&(null!=Hr[t].parentLocale?Hr[t]=Hr[t].parentLocale:null!=Hr[t]&&delete Hr[t]);return Hr[t]}function re(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return $r;if(!r(t)){if(e=te(t))return e;t=[t]}return Kt(t)}function oe(){return Ei(Hr)}function ae(t){var e,n=t._a;return n&&m(t).overflow===-2&&(e=n[fr]<0||n[fr]>11?fr:n[pr]<1||n[pr]>ct(n[dr],n[fr])?pr:n[mr]<0||n[mr]>24||24===n[mr]&&(0!==n[vr]||0!==n[yr]||0!==n[gr])?mr:n[vr]<0||n[vr]>59?vr:n[yr]<0||n[yr]>59?yr:n[gr]<0||n[gr]>999?gr:-1,m(t)._overflowDayOfYear&&(epr)&&(e=pr),m(t)._overflowWeeks&&e===-1&&(e=_r),m(t)._overflowWeekday&&e===-1&&(e=br),m(t).overflow=e),t}function se(t,e,n){return null!=t?t:null!=e?e:n}function le(t){var e=new Date(n.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function ue(t){var e,n,i,r,o,a=[];if(!t._d){for(i=le(t),t._w&&null==t._a[pr]&&null==t._a[fr]&&ce(t),null!=t._dayOfYear&&(o=se(t._a[dr],i[dr]),(t._dayOfYear>et(o)||0===t._dayOfYear)&&(m(t)._overflowDayOfYear=!0),n=kt(o,0,t._dayOfYear),t._a[fr]=n.getUTCMonth(),t._a[pr]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=i[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[mr]&&0===t._a[vr]&&0===t._a[yr]&&0===t._a[gr]&&(t._nextDay=!0,t._a[mr]=0),t._d=(t._useUTC?kt:wt).apply(null,a),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[mr]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==r&&(m(t).weekdayMismatch=!0)}}function ce(t){var e,n,i,r,o,a,s,l;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)o=1,a=4,n=se(e.GG,t._a[dr],Mt(xe(),1,4).year),i=se(e.W,1),r=se(e.E,1),(r<1||r>7)&&(l=!0);else{o=t._locale._week.dow,a=t._locale._week.doy;var u=Mt(xe(),o,a);n=se(e.gg,t._a[dr],u.year),i=se(e.w,u.week),null!=e.d?(r=e.d,(r<0||r>6)&&(l=!0)):null!=e.e?(r=e.e+o,(e.e<0||e.e>6)&&(l=!0)):r=o}i<1||i>Dt(n,o,a)?m(t)._overflowWeeks=!0:null!=l?m(t)._overflowWeekday=!0:(s=Ot(n,i,r,o,a),t._a[dr]=s.year,t._dayOfYear=s.dayOfYear)}function he(t){var e,n,i,r,o,a,s=t._i,l=Rr.exec(s)||Wr.exec(s);if(l){for(m(t).iso=!0,e=0,n=Vr.length;e0&&m(t).unusedInput.push(a),s=s.slice(s.indexOf(i)+i.length),u+=i.length),zi[o]?(i?m(t).empty=!1:m(t).unusedTokens.push(o),tt(o,i,t)):t._strict&&!i&&m(t).unusedTokens.push(o);m(t).charsLeftOver=l-u,s.length>0&&m(t).unusedInput.push(s),t._a[mr]<=12&&m(t).bigHour===!0&&t._a[mr]>0&&(m(t).bigHour=void 0),m(t).parsedDateParts=t._a.slice(0),m(t).meridiem=t._meridiem,t._a[mr]=be(t._locale,t._a[mr],t._meridiem),ue(t),ae(t)}function be(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function we(t){var e,n,i,r,o;if(0===t._f.length)return m(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ze(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(g(t,this),t=Oe(t),t._a){var e=t._isUTC?f(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&S(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Je(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Qe(t,e){var n,i,r,o=t,a=null;return $e(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(o={},e?o[e]=t:o.milliseconds=t):(a=to.exec(t))?(n="-"===a[1]?-1:1,o={y:0,d:k(a[pr])*n,h:k(a[mr])*n,m:k(a[vr])*n,s:k(a[yr])*n,ms:k(Ie(1e3*a[gr]))*n}):(a=eo.exec(t))?(n="-"===a[1]?-1:("+"===a[1],1),o={y:Ke(a[2],n),M:Ke(a[3],n),w:Ke(a[4],n),d:Ke(a[5],n),h:Ke(a[6],n),m:Ke(a[7],n),s:Ke(a[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(r=en(xe(o.from),xe(o.to)),o={},o.ms=r.milliseconds,o.M=r.months),i=new Ee(o),$e(t)&&h(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function tn(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function en(t,e){var n;return t.isValid()&&e.isValid()?(e=He(e,t),t.isBefore(e)?n=tn(t,e):(n=tn(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(t,e){return function(n,i){var r,o;return null===i||isNaN(+i)||(D(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=i,i=o),n="string"==typeof n?+n:n,r=Qe(n,i),rn(this,r,t),this}}function rn(t,e,i,r){var o=e._milliseconds,a=Ie(e._days),s=Ie(e._months);t.isValid()&&(r=null==r||r,s&&mt(t,ot(t,"Month")+s*i),a&&at(t,"Date",ot(t,"Date")+a*i),o&&t._d.setTime(t._d.valueOf()+o*i),r&&n.updateOffset(t,a||s))}function on(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(t,e){var i=t||xe(),r=He(i,this).startOf("day"),o=n.calendarFormat(this,r)||"sameElse",a=e&&(x(e[o])?e[o].call(this,i):e[o]);return this.format(a||this.localeData().calendar(o,this,xe(i)))}function sn(){return new _(this)}function ln(t,e){var n=b(t)?t:xe(t);return!(!this.isValid()||!n.isValid())&&(e=F(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()9999?z(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",z(n,"Z")):z(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function gn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",r="-MM-DD[T]HH:mm:ss.SSS",o=e+'[")]';return this.format(n+i+r+o)}function _n(t){t||(t=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var e=z(this,t);return this.localeData().postformat(e)}function bn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function wn(t){return this.from(xe(),t)}function kn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Sn(t){return this.to(xe(),t)}function On(t){var e;return void 0===t?this._locale._abbr:(e=re(t),null!=e&&(this._locale=e),this)}function Mn(){return this._locale}function Dn(t){switch(t=F(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function xn(t){return t=F(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Cn(){return this._d.valueOf()-6e4*(this._offset||0)}function Pn(){return Math.floor(this.valueOf()/1e3)}function Tn(){return new Date(this.valueOf())}function Yn(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function An(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function jn(){return this.isValid()?this.toISOString():null}function En(){return v(this)}function $n(){return d({},m(this))}function In(){return m(this).overflow}function Ln(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Fn(t,e){U(0,[t,t.length],0,e)}function Hn(t){return Un.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Nn(t){return Un.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Rn(){return Dt(this.year(),1,4)}function Wn(){var t=this.localeData()._week;return Dt(this.year(),t.dow,t.doy)}function Un(t,e,n,i,r){var o;return null==t?Mt(this,i,r).year:(o=Dt(t,i,r),e>o&&(e=o),Vn.call(this,t,e,n,i,r))}function Vn(t,e,n,i,r){var o=Ot(t,e,n,i,r),a=kt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Gn(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function zn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Bn(t,e){e[gr]=k(1e3*("0."+t))}function Zn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Xn(t){return xe(1e3*t)}function Jn(){return xe.apply(null,arguments).parseZone()}function Qn(t){return t}function Kn(t,e,n,i){var r=re(),o=f().set(i,e);return r[n](o,t)}function ti(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Kn(t,e,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=Kn(t,i,n,"month");return r}function ei(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var r=re(),o=t?r._week.dow:0;if(null!=n)return Kn(e,(n+o)%7,i,"day");var a,s=[];for(a=0;a<7;a++)s[a]=Kn(e,(a+o)%7,i,"day");return s}function ni(t,e){return ti(t,e,"months")}function ii(t,e){return ti(t,e,"monthsShort")}function ri(t,e,n){return ei(t,e,n,"weekdays")}function oi(t,e,n){return ei(t,e,n,"weekdaysShort")}function ai(t,e,n){return ei(t,e,n,"weekdaysMin")}function si(){var t=this._data;return this._milliseconds=fo(this._milliseconds),this._days=fo(this._days),this._months=fo(this._months),t.milliseconds=fo(t.milliseconds),t.seconds=fo(t.seconds),t.minutes=fo(t.minutes),t.hours=fo(t.hours),t.months=fo(t.months),t.years=fo(t.years),this}function li(t,e,n,i){var r=Qe(e,n);return t._milliseconds+=i*r._milliseconds,t._days+=i*r._days,t._months+=i*r._months,t._bubble()}function ui(t,e){return li(this,t,e,1)}function ci(t,e){return li(this,t,e,-1)}function hi(t){return t<0?Math.floor(t):Math.ceil(t)}function di(){var t,e,n,i,r,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*hi(pi(s)+a),a=0,s=0),l.milliseconds=o%1e3,t=w(o/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,a+=w(n/24),r=w(fi(a)),s+=r,a-=hi(pi(r)),i=w(s/12),s%=12,l.days=a,l.months=s,l.years=i,this}function fi(t){return 4800*t/146097}function pi(t){return 146097*t/4800}function mi(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(t=F(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+fi(e),"month"===t?n:n/12;switch(e=this._days+Math.round(pi(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function vi(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN}function yi(t){return function(){return this.as(t)}}function gi(){return Qe(this)}function _i(t){return t=F(t),this.isValid()?this[t+"s"]():NaN}function bi(t){return function(){return this.isValid()?this._data[t]:NaN}}function wi(){return w(this.days()/7)}function ki(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}function Si(t,e,n){var i=Qe(t).abs(),r=Po(i.as("s")),o=Po(i.as("m")),a=Po(i.as("h")),s=Po(i.as("d")),l=Po(i.as("M")),u=Po(i.as("y")),c=r<=To.ss&&["s",r]||r0,c[4]=n,ki.apply(null,c)}function Oi(t){return void 0===t?Po:"function"==typeof t&&(Po=t,!0)}function Mi(t,e){return void 0!==To[t]&&(void 0===e?To[t]:(To[t]=e,"s"===t&&(To.ss=e-1),!0))}function Di(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=Si(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function xi(t){return(t>0)-(t<0)||+t}function Ci(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=Yo(this._milliseconds)/1e3,r=Yo(this._days),o=Yo(this._months);t=w(i/60),e=w(t/60),i%=60,t%=60,n=w(o/12),o%=12;var a=n,s=o,l=r,u=e,c=t,h=i?i.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var f=d<0?"-":"",p=xi(this._months)!==xi(d)?"-":"",m=xi(this._days)!==xi(d)?"-":"",v=xi(this._milliseconds)!==xi(d)?"-":"";return f+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?m+l+"D":"")+(u||c||h?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(h?v+h+"S":"")}var Pi,Ti;Ti=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var wr,kr=rt("FullYear",!0);wr=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:y()}),Jr=function(){return Date.now?Date.now():+new Date},Qr=["year","quarter","month","week","day","hour","minute","second","millisecond"];Le("Z",":"),Le("ZZ",""),Z("Z",sr),Z("ZZ",sr),Q(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Fe(sr,t)});var Kr=/([\+\-]|\d\d)/gi;n.updateOffset=function(){};var to=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,eo=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Qe.fn=Ee.prototype,Qe.invalid=je;var no=nn(1,"add"),io=nn(-1,"subtract");n.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",n.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ro=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Fn("gggg","weekYear"),Fn("ggggg","weekYear"),Fn("GGGG","isoWeekYear"),Fn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),Z("G",or),Z("g",or),Z("GG",Qi,Zi),Z("gg",Qi,Zi),Z("GGGG",nr,Xi),Z("gggg",nr,Xi),Z("GGGGG",ir,Ji),Z("ggggg",ir,Ji),K(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=k(t)}),K(["gg","GG"],function(t,e,i,r){e[r]=n.parseTwoDigitYear(t)}),U("Q",0,"Qo","quarter"),L("quarter","Q"),N("quarter",7),Z("Q",Bi),Q("Q",function(t,e){e[fr]=3*(k(t)-1)}),U("D",["DD",2],"Do","date"),L("date","D"),N("date",9),Z("D",Qi),Z("DD",Qi,Zi),Z("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),Q(["D","DD"],pr),Q("Do",function(t,e){e[pr]=k(t.match(Qi)[0])});var oo=rt("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),N("dayOfYear",4),Z("DDD",er),Z("DDDD",qi),Q(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),U("m",["mm",2],0,"minute"),L("minute","m"),N("minute",14),Z("m",Qi),Z("mm",Qi,Zi),Q(["m","mm"],vr);var ao=rt("Minutes",!1);U("s",["ss",2],0,"second"),L("second","s"),N("second",15),Z("s",Qi),Z("ss",Qi,Zi),Q(["s","ss"],yr);var so=rt("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond(); -}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),N("millisecond",16),Z("S",er,Bi),Z("SS",er,Zi),Z("SSS",er,qi);var lo;for(lo="SSSS";lo.length<=9;lo+="S")Z(lo,rr);for(lo="S";lo.length<=9;lo+="S")Q(lo,Bn);var uo=rt("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var co=_.prototype;co.add=no,co.calendar=an,co.clone=sn,co.diff=pn,co.endOf=xn,co.format=_n,co.from=bn,co.fromNow=wn,co.to=kn,co.toNow=Sn,co.get=st,co.invalidAt=In,co.isAfter=ln,co.isBefore=un,co.isBetween=cn,co.isSame=hn,co.isSameOrAfter=dn,co.isSameOrBefore=fn,co.isValid=En,co.lang=ro,co.locale=On,co.localeData=Mn,co.max=Xr,co.min=qr,co.parsingFlags=$n,co.set=lt,co.startOf=Dn,co.subtract=io,co.toArray=Yn,co.toObject=An,co.toDate=Tn,co.toISOString=yn,co.inspect=gn,co.toJSON=jn,co.toString=vn,co.unix=Pn,co.valueOf=Cn,co.creationData=Ln,co.year=kr,co.isLeapYear=it,co.weekYear=Hn,co.isoWeekYear=Nn,co.quarter=co.quarters=Gn,co.month=vt,co.daysInMonth=yt,co.week=co.weeks=Tt,co.isoWeek=co.isoWeeks=Yt,co.weeksInYear=Wn,co.isoWeeksInYear=Rn,co.date=oo,co.day=co.days=Ht,co.weekday=Nt,co.isoWeekday=Rt,co.dayOfYear=zn,co.hour=co.hours=Lr,co.minute=co.minutes=ao,co.second=co.seconds=so,co.millisecond=co.milliseconds=uo,co.utcOffset=Re,co.utc=Ue,co.local=Ve,co.parseZone=Ge,co.hasAlignedHourOffset=ze,co.isDST=Be,co.isLocal=qe,co.isUtcOffset=Xe,co.isUtc=Je,co.isUTC=Je,co.zoneAbbr=Zn,co.zoneName=qn,co.dates=M("dates accessor is deprecated. Use date instead.",oo),co.months=M("months accessor is deprecated. Use month instead",vt),co.years=M("years accessor is deprecated. Use year instead",kr),co.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",We),co.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ze);var ho=T.prototype;ho.calendar=Y,ho.longDateFormat=A,ho.invalidDate=j,ho.ordinal=E,ho.preparse=Qn,ho.postformat=Qn,ho.relativeTime=$,ho.pastFuture=I,ho.set=C,ho.months=ht,ho.monthsShort=dt,ho.monthsParse=pt,ho.monthsRegex=_t,ho.monthsShortRegex=gt,ho.week=xt,ho.firstDayOfYear=Pt,ho.firstDayOfWeek=Ct,ho.weekdays=Et,ho.weekdaysMin=It,ho.weekdaysShort=$t,ho.weekdaysParse=Ft,ho.weekdaysRegex=Wt,ho.weekdaysShortRegex=Ut,ho.weekdaysMinRegex=Vt,ho.isPM=Xt,ho.meridiem=Jt,ee("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),n.lang=M("moment.lang is deprecated. Use moment.locale instead.",ee),n.langData=M("moment.langData is deprecated. Use moment.localeData instead.",re);var fo=Math.abs,po=yi("ms"),mo=yi("s"),vo=yi("m"),yo=yi("h"),go=yi("d"),_o=yi("w"),bo=yi("M"),wo=yi("y"),ko=bi("milliseconds"),So=bi("seconds"),Oo=bi("minutes"),Mo=bi("hours"),Do=bi("days"),xo=bi("months"),Co=bi("years"),Po=Math.round,To={ss:44,s:45,m:45,h:22,d:26,M:11},Yo=Math.abs,Ao=Ee.prototype;return Ao.isValid=Ae,Ao.abs=si,Ao.add=ui,Ao.subtract=ci,Ao.as=mi,Ao.asMilliseconds=po,Ao.asSeconds=mo,Ao.asMinutes=vo,Ao.asHours=yo,Ao.asDays=go,Ao.asWeeks=_o,Ao.asMonths=bo,Ao.asYears=wo,Ao.valueOf=vi,Ao._bubble=di,Ao.clone=gi,Ao.get=_i,Ao.milliseconds=ko,Ao.seconds=So,Ao.minutes=Oo,Ao.hours=Mo,Ao.days=Do,Ao.weeks=wi,Ao.months=xo,Ao.years=Co,Ao.humanize=Di,Ao.toISOString=Ci,Ao.toString=Ci,Ao.toJSON=Ci,Ao.locale=On,Ao.localeData=Mn,Ao.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ci),Ao.lang=ro,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",or),Z("X",lr),Q("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),Q("x",function(t,e,n){n._d=new Date(k(t))}),n.version="2.22.1",i(xe),n.fn=co,n.min=Pe,n.max=Te,n.now=Jr,n.utc=f,n.unix=Xn,n.months=ni,n.isDate=u,n.locale=ee,n.invalid=y,n.duration=Qe,n.isMoment=b,n.weekdays=ri,n.parseZone=Jn,n.localeData=re,n.isDuration=$e,n.monthsShort=ii,n.weekdaysMin=ai,n.defineLocale=ne,n.updateLocale=ie,n.locales=oe,n.weekdaysShort=oi,n.normalizeUnits=F,n.relativeTimeRounding=Oi,n.relativeTimeThreshold=Mi,n.calendarFormat=on,n.prototype=co,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},n})},{}],23:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n=3?o.postLoadDataConstructor():t.on("loadeddata",o.postLoadDataConstructor.bind(o)),o}return o(e,t),a(e,[{key:"postLoadDataConstructor",value:function(){this.annotationState=new c(this.player),this.annotationState.annotations=this.options.annotationsObjects,this.controls=new u(this.player,this.options.bindArrowKeys),this.bindEvents(),this.setBounds(!1),this.options.startInAnnotationMode&&this.toggleAnnotationMode(),this.pluginReady()}},{key:"bindEvents",value:function(){var t=this;$(window).on("resize.vac-window-resize",l.throttle(this.setBounds.bind(this),500)),this.player.on("fullscreenchange",l.throttle(this.setBounds.bind(this),500)),this.options.showFullScreen||this.player.on("fullscreenchange",function(){t.player.isFullscreen_?(t.preFullscreenAnnotationsEnabled=t.active,$(t.player.el()).addClass("vac-disable-fullscreen")):$(t.player.el()).removeClass("vac-disable-fullscreen"),t.preFullscreenAnnotationsEnabled&&t.toggleAnnotationMode()}.bind(this))}},{key:"fire",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.eventDispatcher.fire(t,e)}},{key:"toggleAnnotationMode",value:function(){this.active=!this.active,this.player.toggleClass("vac-active"),this.annotationState.enabled=this.active,this.active?this.fire("annotationModeEnabled"):this.fire("annotationModeDisabled"),this.options.showControls&&(this.active?this.controls.render():this.controls.clear(!0))}},{key:"setBounds",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.bounds={};var e=$(this.player.el()),n=e.find(".vjs-control-bar");this.bounds.left=e.offset().left,this.bounds.top=e.offset().top,this.bounds.right=this.bounds.left+e.width(),this.bounds.bottom=this.bounds.top+e.height(),this.bounds.bottomWithoutControls=this.bounds.bottom-n.height(),t&&this.fire("playerBoundsChanged",this.bounds)}},{key:"onReady",value:function(t){return this.eventDispatcher.pluginReady?t():void this._readyCallbacks.push(t)}},{key:"pluginReady",value:function(){for(this.eventDispatcher.pluginReady=!0;this._readyCallbacks.length;)this._readyCallbacks.pop()()}},{key:"dispose",value:function(){this.controls=this.controls.teardown(),this.annotationState=this.annotationState.teardown(),this.eventDispatcher=this.eventDispatcher.teardown(),this.teardown(),this.player&&(this.player.annotationComments=null,$(this.player.el()).removeClass("vac-active"),$(this.player.el()).find("[class^='vac-']").remove()),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"dispose",this).call(this)}},{key:"teardown",value:function(){this.player&&this.player.off("fullscreenchange"),$(window).off("resize.vac-window-resize")}}]),e}(n)}},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":36,"./lib/polyfills":40,"./lib/utils":41}],24:[function(t,e,n){var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=t("handlebars/runtime");n.comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",h=t.escapeExpression;return'
\n
\n
'+h(t.lambda(null!=(a=null!=e?e.meta:e)?a.user_name:a,e))+'
\n
'+h((s=null!=(s=n.timeSince||(null!=e?e.timeSince:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"timeSince",hash:{},data:o}):s))+'\n   X\n
\n
\n
\n '+h((n.breaklines||e&&e.breaklines||u).call(l,null!=e?e.body:e,{name:"breaklines",hash:{},data:o}))+"\n
\n
\n"},useData:!0}),n.comment_list=r.template({1:function(t,e,n,i,r,o){var a;return" "+(null!=(a=t.lambda(o[0][0],e))?a:"")+"\n"},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r,o){var a,s,l=null!=e?e:t.nullContext||{};return'
\n'},useData:!0,useBlockParams:!0}),n.controls=r.template({1:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(2,r,0),inverse:t.noop,data:r}))?o:""},2:function(t,e,n,i,r){var o;return'
\n \n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showNav:e,{name:"if",hash:{},fn:t.program(3,r,0),inverse:t.noop,data:r}))?o:"")+"
\n"},3:function(t,e,n,i,r){return'
\n
Prev
\n
Next
\n
\n'},5:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return'
\n
\n
Click and drag to select
\n
\n
\n'+(null!=(o=n["if"].call(a,null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.writingComment:e,{name:"if",hash:{},fn:t.program(9,r,0),inverse:t.noop,data:r}))?o:"")},6:function(t,e,n,i,r){var o;return'
\n Select shape + range\n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.internalCommenting:e,{name:"if",hash:{},fn:t.program(7,r,0),inverse:t.noop,data:r}))?o:"")+'
\n
-1 sec
\n
+1 sec
\n
\n
\n'},7:function(t,e,n,i,r){return' \n cancel\n'},9:function(t,e,n,i,r){var o;return'
\n
\n
\n
New Annotation @ '+t.escapeExpression((o=null!=(o=n.rangeStr||(null!=e?e.rangeStr:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"rangeStr",hash:{},data:r}):o))+'
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n'},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return(null!=(o=n.unless.call(a,null!=e?e.adding:e,{name:"unless",hash:{},fn:t.program(1,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.adding:e,{name:"if",hash:{},fn:t.program(5,r,0),inverse:t.noop,data:r}))?o:"")},useData:!0}),n.draggable_marker=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n'},useData:!0}),n.marker=r.template({1:function(t,e,n,i,r){return"vac-ranged-marker"},3:function(t,e,n,i,r){var o;return"width:"+t.escapeExpression((o=null!=(o=n.width||(null!=e?e.width:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"width",hash:{},data:r}):o))+";"},5:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.tooltipBody:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:""},6:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",h=t.escapeExpression;return'
\n \n '+h((s=null!=(s=n.tooltipTime||(null!=e?e.tooltipTime:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipTime",hash:{},data:o}):s))+" - "+h((s=null!=(s=n.tooltipBody||(null!=e?e.tooltipBody:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipBody",hash:{},data:o}):s))+"\n \n
\n"},7:function(t,e,n,i,r){return"vac-right-side"},compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",h=t.escapeExpression;return'
\n'+(null!=(a=n["if"].call(l,null!=e?e.showTooltip:e,{name:"if",hash:{},fn:t.program(5,o,0),inverse:t.noop,data:o}))?a:"")+"
\n"},useData:!0}),n.marker_wrap=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'
\n\t
\n
'},useData:!0}),n.new_comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n'},useData:!0}),n.player_button=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'\n\n\t\n\t \n\t \n\t\n'},useData:!0})},{"handlebars/runtime":20}],25:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0],e=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.isOpen=!0;var r=i||!u.isWithinRange(this.range.start,this.range.end,Math.floor(this.currentTime)),o=n&&this.plugin.options.showMarkerShapeAndTooltips;this.marker.setActive(o),!n&&this.plugin.options.showCommentList&&this.commentList.render(),(!n||n&&this.plugin.options.showMarkerShapeAndTooltips)&&(this.annotationShape.render(),this.shape&&this.annotationShape.$el.on("click.vac-annotation",function(){e.plugin.annotationState.openAnnotation(e,!1,!1,!1)})),t&&this.player.pause(),r&&(this.currentTime=this.range.start),this.plugin.fire("annotationOpened",{annotation:this.data,triggered_by_timeline:n})}},{key:"close",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isOpen&&(this.isOpen=!1,this.marker.deactivate(),this.commentList.teardown(!1),this.annotationShape.$el&&this.annotationShape.$el.off("click.vac-annotation"),this.annotationShape.teardown(),t&&this.plugin.annotationState.clearActive(),this.plugin.fire("annotationClosed",this.data))}},{key:"buildSecondsActiveArray",value:function(){var t=[];if(this.range.end)for(var e=this.range.start;e<=this.range.end;e++)t.push(e);else{var n=this.range.start;t.push(n),n0&&void 0!==arguments[0])||arguments[0];this.close(!0),this.marker.teardown(),this.commentList&&this.commentList.teardown(t),t&&this.plugin.annotationState.removeAnnotation(this),this.annotationShape&&this.annotationShape.teardown(),t&&s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return{id:this.id,range:this.range,shape:this.shape,comments:this.commentList.data}}},{key:"isActive",get:function(){return this.plugin.annotationState.activeAnnotation===this}}],[{key:"newFromData",value:function(t,n,i,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,a=d.dataObj(i,r);t&&(t=u.parseIntObj(t)),n&&(n=u.parseIntObj(n));var s={id:o,range:t,shape:n,comments:[a]};return new e(s,r.player)}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils.js":41,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(t,e,n){"use strict";function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);ee.range.start?1:0})}},{key:"addNewAnnotation",value:function(t){this._annotations.push(t),this.openAnnotation(t,!0,!0,!1,!0),this.stateChanged()}},{key:"createAndAddAnnotation",value:function(t){this.plugin.controls.uiState.adding&&this.plugin.controls.cancelAddNew();var e=h.newFromData(t.range,t.shape,t.commentStr||"",this.plugin,t.id);this.addNewAnnotation(e)}},{key:"destroyAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&e.teardown()}},{key:"removeAnnotation",value:function(t){var e=t.id,n=this._annotations.indexOf(t);this._annotations.splice(n,1),this.stateChanged(),this.plugin.fire("annotationDeleted",{id:e})}},{key:"setLiveAnnotation",value:function(){if(this.enabled){var t=Math.floor(this.currentTime);if(this.skipLiveCheck)return void(t!==this.lastVideoTime&&(this.skipLiveCheck=!1));var e=this.activeAnnotationsForTime(t);if(!e.length)return this.activeAnnotation.close();var n=this.annotations[e[e.length-1]];if(this.activeAnnotation.range){if(n===this.activeAnnotation)return;var i=n.range.start,r=this.activeAnnotation.range.start;if(i===r&&i===t)return}this.openAnnotation(n,!1,!1,!0)}}},{key:"activeAnnotationsForTime",value:function(t){return this.annotations.length?this.annotationTimeMap[t]||[]:[]}},{key:"rebuildAnnotationTimeMap",value:function(){var t=this,e={};this.annotations.forEach(function(n){n.secondsActive.forEach(function(i){var r=e[i]||[];r.push(t.annotations.indexOf(n)),e[i]=r})}),this.annotationTimeMap=e}},{key:"clearActive",value:function(){this.activeAnnotation.close(!1),this._activeAnnotation=null}},{key:"openAnnotation",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.plugin.active||this.plugin.toggleAnnotationMode(),this.skipLiveCheck=e,this.clearActive(),t.open(n,i,r),this.activeAnnotation=t,this.lastVideoTime=this.activeAnnotation.range.start}},{key:"openAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&this.openAnnotation(e)}},{key:"findAnnotation",value:function(t){return this.annotations.find(function(e){return e.id==t})}},{key:"findComment",value:function(t){var e,n=this.annotations.map(function(t){return t.commentList.comments});return n=(e=[]).concat.apply(e,i(n)),n.find(function(e){return e.id==t})}},{key:"nextAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=t===this.annotations.length-1?0:t+1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=0;in)return this.openAnnotation(this.annotations[i],!0);this.openAnnotation(this.annotations[0],!0)}},{key:"prevAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=0===t?this.annotations.length-1:t-1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=this.annotations.length-1;i>=0;i--)if(this.annotations[i].range.start0&&void 0!==arguments[0]?arguments[0]:null;this._activeAnnotation=t},get:function(){return this._activeAnnotation||{close:function(){}}}},{key:"data",get:function(){return this._annotations.map(function(t){return t.data})}}]),e}(c)},{"./../lib/player_component":38,"./../lib/utils":41,"./annotation":25}],27:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this,t)}},{key:"data",get:function(){return{id:this.id,meta:this.meta,body:this.body}}},{key:"HTML",get:function(){return this.$el[0].outerHTML}}],[{key:"newFromData",value:function(t,n,i){var r=this.dataObj(t,i);return new e(r,i.player)}},{key:"dataObj",value:function(t,e){return{meta:Object.assign({datetime:c().toISOString()},e.meta),id:u.guid(),body:t}}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41,moment:22}],28:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){ -if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;na-10&&"down"==o&&(e.stop(),e.animate({scrollTop:n+40},100),t.preventDefault())}},{key:"sortComments",value:function(){this.comments.sort(function(t,e){return t.timestampe.timestamp?1:0})}},{key:"handleDeleteAnnotationClick",value:function(t){var e=this,n=$("").addClass("vac-delete-confirm").text("CONFIRM");n.on("click.comment",function(){n.off("click.comment"),e.annotation.teardown()}),$(t.target).replaceWith(n)}},{key:"unbindCommentFormEvents",value:function(){this.$newCommentForm&&this.$newCommentForm.off("click.vac-comment")}},{key:"teardown",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.$el&&this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"),this.comments.forEach(function(e){return e.teardown(t)}),t&&(this.comments=[]),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return this.comments.map(function(t){return t.data})}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./comment":27}],29:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this.uiState.adding&&(this.restoreNormalUI(),this.marker.teardown(),this.selectableShape.teardown()),this.uiState=u.cloneObject(m),this.$player.find(".vac-video-cover-canvas").off("mousedown.vac-cursor-tooltip").off("mouseup.vac-cursor-tooltip")),this.$tooltip_=null,this.$UI.controlElements.remove()}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.clear(t);var e=Object.assign({rangeStr:this.marker?u.humanTime(this.marker.range):null,showNav:this.plugin.annotationState.annotations.length>1},this.uiState,{internalCommenting:this.internalCommenting,showControls:this.showControls}),n=this.renderTemplate(p,e);this.$player.append(n),this.playerButton&&this.playerButton.updateNumAnnotations()}},{key:"cancelAddNew",value:function(){(this.uiState.adding||this.uiState.writingComment)&&(this.render(!0),this.marker.teardown(),this.marker=null)}},{key:"startAddNew",value:function(){this.plugin.active||this.plugin.toggleAnnotationMode(),this.player.pause(),this.setAddingUI(),this.uiState.adding=!0,this.render();var t={start:parseInt(this.currentTime,10),stop:parseInt(this.currentTime,10)};this.marker=new c(this.player,t),this.selectableShape=new h(this.player),this.showControls||this.bindCursorTooltip(),this.plugin.fire("enteredAddingAnnotation",{range:t})}},{key:"writeComment",value:function(){this.uiState.writingComment=!0,this.render()}},{key:"saveNew",value:function(){var t=this.$UI.newCommentTextarea.val();if(t){var e=f.newFromData(this.marker.range,this.selectableShape.shape,t,this.plugin);this.plugin.annotationState.addNewAnnotation(e),this.cancelAddNew()}}},{key:"setAddingUI",value:function(){this.plugin.annotationState.enabled=!1,this.disablePlayingAndControl()}},{key:"restoreNormalUI",value:function(){this.plugin.annotationState.enabled=this.plugin.active,this.enablePlayingAndControl(),$(document).off("mousemove.vac-tooltip-"+this.playerId)}},{key:"handleArrowKeys",value:function(t){if(this.plugin.active){var e=t.which;37==e&&this.plugin.annotationState.prevAnnotation(),39==e&&this.plugin.annotationState.nextAnnotation()}}},{key:"bindCursorTooltip",value:function(){var t=this;this.tooltipArea=u.areaOfHiddenEl(this.$tooltip,this.$UI.coverCanvas,this.UI_CLASSES.hidden),this.plugin.setBounds(!1),$(document).on("mousemove.vac-tooltip-"+this.playerId,u.throttle(function(e){if(t.plugin.bounds){var n=e.pageX,i=e.pageY,r=nt.plugin.bounds.right||it.plugin.bounds.bottom,o=!r&&i>=t.plugin.bounds.bottomWithoutControls,a=t.$tooltip.hasClass("vac-marker-hover");if(r)return void t.$tooltip.addClass(t.UI_CLASSES.hidden);var s=n-t.plugin.bounds.left,l=i-t.plugin.bounds.top,u=10,c=t.$player.width(),h=t.$player.height()-t.$UI.controlBar.height(),d=s+t.tooltipArea.width+2*u>=c,f=l+t.tooltipArea.height+2*u>=h,p=d?c-t.tooltipArea.width-u:s+u,m=f?h-t.tooltipArea.height-u:l+u;o&&!a||t.$tooltip.hasClass("vac-cursor-dragging")?t.$tooltip.addClass(t.UI_CLASSES.hidden):t.$tooltip.removeClass(t.UI_CLASSES.hidden),t.$tooltip.css({left:p+"px",top:m+"px"})}}.bind(this),50))}},{key:"$tooltip",get:function(){return this.$tooltip_=this.$tooltip_||this.$player.find(".vac-cursor-tool-tip"),this.$tooltip_}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;nthis.rangePin?this.range={start:this.rangePin,end:n}:this.range={start:n,end:this.rangePin},this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}},{key:"percentValFromXpos",value:function(t){var e=Math.max(0,t-this.$parent.offset().left),n=this.$parent.innerWidth(),i=e/n;return i>1&&(i=1),i<0&&(i=0),i}},{key:"teardown",value:function(){$(document).off("mousemove.vac-dmarker-"+this.playerId+" mouseup.vac-dmarker-"+this.playerId),this.$el.off("mouseenter.vac-cursor-tool-tip"),this.$el.off("mouseleave.vac-cursor-tool-tip"),this.$el.off("mousedown.vac-marker"),this.$el.remove()}},{key:"scrubStart",value:function(t){var e=this.range.start+t;this.currentTime=e,this.range.start=e,this.rangePin=e,this.teardown(),this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}}]),e}(s)},{"./../lib/utils":41,"./marker":31}],31:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:null;i(this,e);var a=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return a.range=n,a.comment=o,a.templateName=c,a.$UI.markerWrap.length||a.$UI.timeline.append(a.renderTemplate(h)),a}return o(e,t),a(e,[{key:"setActive",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$el.addClass(this.UI_CLASSES.active),t&&this.$el.addClass("vac-force-tooltip")}},{key:"deactivate",value:function(){this.$el.removeClass(this.UI_CLASSES.active+" vac-force-tooltip")}},{key:"render",value:function(){this.$UI.timeline.find('[data-marker-id="'+this.componentId+'"]').remove(),this.$el=$(this.renderTemplate(this.templateName,this.markerTemplateData)),this.$UI.markerWrap.append(this.$el),this.bindMarkerEvents()}},{key:"bindMarkerEvents",value:function(){var t=this;this.$el.on("mouseenter.vac-marker",function(){t.$el.addClass("vac-hovering").closest(".vac-marker-wrap").addClass("vac-dim-all")}).on("mouseleave.vac-marker",function(){t.$el.removeClass("vac-hovering").closest(".vac-marker-wrap").removeClass("vac-dim-all")})}},{key:"teardown",value:function(){this.$el.off("mouseenter.vac-marker").off("mouseleave.vac-marker").off("click.vac-marker"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"markerTemplateData",get:function(){var t=this.range.start/this.duration*100,e=this.range.end/this.duration*100-t,n=100-Math.floor(e)||100;return{left:t+"%",width:e+"%",zIndex:n,showTooltip:this.plugin.options.showMarkerShapeAndTooltips,tooltipRight:t>50,tooltipTime:u.humanTime(this.range),tooltipBody:this.comment?this.comment.body:null,rangeShow:!!this.range.end,id:this.componentId}}}]),e}(l)},{"./../lib/player_ui_component":39,"./../lib/utils":41}],32:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0?e.removeClass(this.UI_CLASSES.hidden):e.addClass(this.UI_CLASSES.hidden)}},{key:"teardown",value:function(){this.$el.off("click.vac-player-button"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}}]),e}(l)},{"./../lib/player_ui_component":39}],33:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var o=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return o.shape=n,o.$parent=o.$player,o}return o(e,t),a(e,[{key:"render",value:function(){this.shape&&(this.$el&&this.$el.remove(),this.$el=$("
").addClass("vac-shape"),this.setDimsFromShape(),this.$parent.append(this.$el))}},{key:"setDimsFromShape",value:function(){this.$el.css({left:this.shape.x1+"%",top:this.shape.y1+"%",width:this.shape.x2-this.shape.x1+"%",height:this.shape.y2-this.shape.y1+"%"})}}]),e}(s)},{"./../lib/player_ui_component":39}],35:[function(t,e,n){"use strict";!function(e,n){var i=t("./annotation_comments.js");n.registerPlugin("annotationComments",i(n))}(jQuery,window.videojs)},{"./annotation_comments.js":23}],36:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this._player=null)}},{key:"plugin",get:function(){return this.player.annotationComments()}},{key:"player",get:function(){return this._player}},{key:"duration",get:function(){return this.player.duration()}},{key:"currentTime",get:function(){return this.player.currentTime()},set:function(t){this.player.currentTime(t)}}]),t}()},{}],39:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return this.registerHandlebarsHelpers(),c[t](e)}},{key:"registerHandlebarsHelpers",value:function(){"breaklines"in u.helpers||u.registerHelper("breaklines",function(t){return t=u.Utils.escapeExpression(t),t=t.replace(/(\r\n|\n|\r)/gm,"
"),new u.SafeString(t)})}},{key:"teardown",value:function(){this.$el&&this.$el.remove(),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"$UI",get:function(){return Object.freeze({commentsContainer:this.$player.find(".vac-comments-container"),controlElements:this.$player.find(".vac-control"),newCommentTextarea:this.$player.find(".vac-video-write-new textarea"),timeline:this.$player.find(".vjs-progress-control"),markerCursorHelpText:this.$player.find(".vac-cursor-help-text"),controlBar:this.$player.find(".vjs-control-bar"),markerWrap:this.$player.find(".vac-marker-wrap"),coverCanvas:this.$player.find(".vac-video-cover-canvas")})}},{key:"UI_CLASSES",get:function(){return Object.freeze({hidden:"vac-hidden",active:"vac-active"})}},{key:"$player",get:function(){return $(this.player.el())}},{key:"playerId",get:function(){return this.$player.attr("id")}},{key:"componentId",get:function(){return this.cid_=this.cid_||h.guid(),this.cid_}}]),e}(l)},{"./../compiled/templates":24,"./../lib/utils":41,"./player_component":38,"handlebars/runtime":20}],40:[function(t,e,n){t("ie-array-find-polyfill"),t("es6-object-assign").polyfill(),function(){if("undefined"==typeof Object.setPrototypeOf&&"function"==typeof Object.getOwnPropertyNames){var t=function(t,e){return function(){return e.apply(this,arguments)}},e=function(t,e,n){if(!n){var i=t.__proto__[e];n={get:function(){return t["__"+e]||i},set:function(n){t["__"+e]=n}}}Object.defineProperty(t,e,{ -get:n.get?n.get.bind(t):void 0,set:n.set?n.set.bind(t):void 0,configurable:!0})},n=function r(n,o){var a,s=Object.getOwnPropertyNames(o);n.__proto__=o;for(var l=0,u=s.length;le?(a&&(clearTimeout(a),a=null),s=u,o=t.apply(i,r),a||(i=r=null)):a||n.trailing===!1||(a=setTimeout(l,c)),o}},parseIntObj:function(t){return Object.keys(t).forEach(function(e){parseInt(t[e])&&(t[e]=parseInt(t[e]))}),t},humanTime:function(t){function e(t){var e=Math.floor(t/60),n=String(t%60);return e+":"+(1==n.length?"0":"")+n}var n=[e(t.start)];return t.end&&n.push(e(t.end)),n.join("-")},guid:function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},areaOfHiddenEl:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=t.clone(),r={};return i.css({visibility:"hidden",display:"inline-block"}),i.removeClass(n),e.append(i),r.width=i.outerWidth(),r.height=i.outerHeight(),i.remove(),r},isWithinRange:function(t,e,n){return e=e||t+1,n>=t&&n<=e}}},{}]},{},[35]); \ No newline at end of file diff --git a/docs/build/videojs-annotation-comments.cjs.min.js b/docs/build/videojs-annotation-comments.cjs.min.js deleted file mode 100644 index 6a6aa40..0000000 --- a/docs/build/videojs-annotation-comments.cjs.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.AnnotationComments=t()}}(function(){var t;return function(){function t(e,n,i){function r(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};e[a][0].call(c.exports,function(t){var n=e[a][1][t];return r(n||t)},c,c.exports,t,e,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a= 2.0.0-beta.1",7:">= 4.0.0"};n.REVISION_CHANGES=p;var m="[object Object]";r.prototype={constructor:r,logger:d["default"],log:d["default"].log,registerHelper:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple helpers");o.extend(this.helpers,t)}else this.helpers[t]=e},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,e){if(o.toString.call(t)===m)o.extend(this.partials,t);else{if("undefined"==typeof e)throw new s["default"]('Attempting to register a partial called "'+t+'" as undefined');this.partials[t]=e}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,e){if(o.toString.call(t)===m){if(e)throw new s["default"]("Arg not supported with multiple decorators");o.extend(this.decorators,t)}else this.decorators[t]=e},unregisterDecorator:function(t){delete this.decorators[t]}};var v=d["default"].log;n.log=v,n.createFrame=o.createFrame,n.logger=d["default"]},{"./decorators":4,"./exception":6,"./helpers":7,"./logger":15,"./utils":19}],4:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function r(t){a["default"](t)}n.__esModule=!0,n.registerDefaultDecorators=r;var o=t("./decorators/inline"),a=i(o)},{"./decorators/inline":5}],5:[function(t,e,n){"use strict";n.__esModule=!0;var i=t("../utils");n["default"]=function(t){t.registerDecorator("inline",function(t,e,n,r){var o=t;return e.partials||(e.partials={},o=function(r,o){var a=n.partials;n.partials=i.extend({},a,e.partials);var s=t(r,o);return n.partials=a,s}),e.partials[r.args[0]]=r.fn,o})},e.exports=n["default"]},{"../utils":19}],6:[function(t,e,n){"use strict";function i(t,e){var n=e&&e.loc,o=void 0,a=void 0;n&&(o=n.start.line,a=n.start.column,t+=" - "+o+":"+a);for(var s=Error.prototype.constructor.call(this,t),l=0;l0?(n.ids&&(n.ids=[n.name]),t.helpers.each(e,n)):r(this);if(n.data&&n.ids){var a=i.createFrame(n.data);a.contextPath=i.appendContextPath(n.data.contextPath,n.name),n={data:a}}return o(e,n)})},e.exports=n["default"]},{"../utils":19}],9:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}n.__esModule=!0;var r=t("../utils"),o=t("../exception"),a=i(o);n["default"]=function(t){t.registerHelper("each",function(t,e){function n(e,n,o){u&&(u.key=e,u.index=n,u.first=0===n,u.last=!!o,c&&(u.contextPath=c+e)),l+=i(t[e],{data:u,blockParams:r.blockParams([t[e],e],[c+e,null])})}if(!e)throw new a["default"]("Must pass iterator to #each");var i=e.fn,o=e.inverse,s=0,l="",u=void 0,c=void 0;if(e.data&&e.ids&&(c=r.appendContextPath(e.data.contextPath,e.ids[0])+"."),r.isFunction(t)&&(t=t.call(this)),e.data&&(u=r.createFrame(e.data)),t&&"object"==typeof t)if(r.isArray(t))for(var d=t.length;s=0?e:parseInt(t,10)}return t},log:function(t){if(t=r.lookupLevel(t),"undefined"!=typeof console&&r.lookupLevel(r.level)<=t){var e=r.methodMap[t];console[e]||(e="log");for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o":">",'"':""","'":"'","`":"`","=":"="},h=/[&<>"'`=]/g,f=/[&<>"'`=]/,p=Object.prototype.toString;n.toString=p;var m=function(t){return"function"==typeof t};m(/x/)&&(n.isFunction=m=function(t){return"function"==typeof t&&"[object Function]"===p.call(t)}),n.isFunction=m;var v=Array.isArray||function(t){return!(!t||"object"!=typeof t)&&"[object Array]"===p.call(t)};n.isArray=v},{}],20:[function(t,e,n){e.exports=t("./dist/cjs/handlebars.runtime")["default"]},{"./dist/cjs/handlebars.runtime":2}],21:[function(t,e,n){"use strict";Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError("this is null or not defined");var e=Object(this),n=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r0)for(n=0;n0?"future":"past"];return x(n)?n(e):n.replace(/%s/i,e)}function L(t,e){var n=t.toLowerCase();Ri[n]=Ri[n+"s"]=Ri[e]=t}function F(t){return"string"==typeof t?Ri[t]||Ri[t.toLowerCase()]:void 0}function H(t){var e,n,i={};for(n in t)d(t,n)&&(e=F(n),e&&(i[e]=t[n]));return i}function N(t,e){Wi[t]=e}function R(t){var e=[];for(var n in t)e.push({unit:n,priority:Wi[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function W(t,e,n){var i=""+Math.abs(t),r=e-i.length,o=t>=0;return(o?n?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+i}function U(t,e,n,i){var r=i;"string"==typeof i&&(r=function(){return this[i]()}),t&&(zi[t]=r),e&&(zi[e[0]]=function(){return W(r.apply(this,arguments),e[1],e[2])}),n&&(zi[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function V(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function G(t){var e,n,i=t.match(Ui);for(e=0,n=i.length;e=0&&Vi.test(t);)t=t.replace(Vi,n),Vi.lastIndex=0,i-=1;return t}function Z(t,e,n){cr[t]=x(e)?e:function(t,i){return t&&n?n:e}}function q(t,e){return d(cr,t)?cr[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return J(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,r){return e||n||i||r}))}function J(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),l(e)&&(i=function(t,n){n[e]=k(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function kt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function St(t,e,n){var i=7+e-n,r=(7+kt(t,0,i).getUTCDay()-e)%7;return-r+i-1}function Ot(t,e,n,i,r){var o,a,s=(7+n-i)%7,l=St(t,i,r),u=1+7*(e-1)+s+l;return u<=0?(o=t-1,a=et(o)+u):u>et(t)?(o=t+1,a=u-et(t)):(o=t,a=u),{year:o,dayOfYear:a}}function Mt(t,e,n){var i,r,o=St(t.year(),e,n),a=Math.floor((t.dayOfYear()-o-1)/7)+1;return a<1?(r=t.year()-1,i=a+Dt(r,e,n)):a>Dt(t.year(),e,n)?(i=a-Dt(t.year(),e,n),r=t.year()+1):(r=t.year(),i=a),{week:i,year:r}}function Dt(t,e,n){var i=St(t,e,n),r=St(t+1,e,n);return(et(t)-i+r)/7}function xt(t){return Mt(t,this._week.dow,this._week.doy).week}function Ct(){return this._week.dow}function Pt(){return this._week.doy}function Tt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Yt(t){var e=Mt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function At(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function jt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Et(t,e){return t?r(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:r(this._weekdays)?this._weekdays:this._weekdays.standalone}function $t(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function It(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Lt(t,e,n){var i,r,o,a=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)o=f([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:null):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null):"dddd"===e?(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):"ddd"===e?(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:null))):(r=wr.call(this._minWeekdaysParse,a),r!==-1?r:(r=wr.call(this._weekdaysParse,a),r!==-1?r:(r=wr.call(this._shortWeekdaysParse,a),r!==-1?r:null)))}function Ft(t,e,n){var i,r,o;if(this._weekdaysParseExact)return Lt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(r=f([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(o="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[i]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Ht(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=At(t,this.localeData()),this.add(t-e,"d")):e}function Nt(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Rt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=jt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Ar),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ut(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=jr),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Vt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Gt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Er),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Gt(){function t(t,e){return e.length-t.length}var e,n,i,r,o,a=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=f([2e3,1]).day(e),i=this.weekdaysMin(n,""),r=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(i),s.push(r),l.push(o),u.push(i),u.push(r),u.push(o);for(a.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=J(s[e]),l[e]=J(l[e]),u[e]=J(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"), -this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function zt(){return this.hours()%12||12}function Bt(){return this.hours()||24}function Zt(t,e){U(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Jt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Qt(t){return t?t.toLowerCase().replace("_","-"):t}function Kt(t){for(var e,n,i,r,o=0;o0;){if(i=te(r.slice(0,e).join("-")))return i;if(n&&n.length>=e&&S(r,n,!0)>=e-1)break;e--}o++}return $r}function te(t){var i=null;if(!Hr[t]&&"undefined"!=typeof n&&n&&n.exports)try{i=$r._abbr;var r=e;r("./locale/"+t),ee(i)}catch(o){}return Hr[t]}function ee(t,e){var n;return t&&(n=s(e)?re(t):ne(t,e),n?$r=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),$r._abbr}function ne(t,e){if(null!==e){var n,i=Fr;if(e.abbr=t,null!=Hr[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=Hr[t]._config;else if(null!=e.parentLocale)if(null!=Hr[e.parentLocale])i=Hr[e.parentLocale]._config;else{if(n=te(e.parentLocale),null==n)return Nr[e.parentLocale]||(Nr[e.parentLocale]=[]),Nr[e.parentLocale].push({name:t,config:e}),null;i=n._config}return Hr[t]=new T(P(i,e)),Nr[t]&&Nr[t].forEach(function(t){ne(t.name,t.config)}),ee(t),Hr[t]}return delete Hr[t],null}function ie(t,e){if(null!=e){var n,i,r=Fr;i=te(t),null!=i&&(r=i._config),e=P(r,e),n=new T(e),n.parentLocale=Hr[t],Hr[t]=n,ee(t)}else null!=Hr[t]&&(null!=Hr[t].parentLocale?Hr[t]=Hr[t].parentLocale:null!=Hr[t]&&delete Hr[t]);return Hr[t]}function re(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return $r;if(!r(t)){if(e=te(t))return e;t=[t]}return Kt(t)}function oe(){return Ei(Hr)}function ae(t){var e,n=t._a;return n&&m(t).overflow===-2&&(e=n[fr]<0||n[fr]>11?fr:n[pr]<1||n[pr]>ct(n[hr],n[fr])?pr:n[mr]<0||n[mr]>24||24===n[mr]&&(0!==n[vr]||0!==n[yr]||0!==n[gr])?mr:n[vr]<0||n[vr]>59?vr:n[yr]<0||n[yr]>59?yr:n[gr]<0||n[gr]>999?gr:-1,m(t)._overflowDayOfYear&&(epr)&&(e=pr),m(t)._overflowWeeks&&e===-1&&(e=_r),m(t)._overflowWeekday&&e===-1&&(e=br),m(t).overflow=e),t}function se(t,e,n){return null!=t?t:null!=e?e:n}function le(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function ue(t){var e,n,i,r,o,a=[];if(!t._d){for(i=le(t),t._w&&null==t._a[pr]&&null==t._a[fr]&&ce(t),null!=t._dayOfYear&&(o=se(t._a[hr],i[hr]),(t._dayOfYear>et(o)||0===t._dayOfYear)&&(m(t)._overflowDayOfYear=!0),n=kt(o,0,t._dayOfYear),t._a[fr]=n.getUTCMonth(),t._a[pr]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=i[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[mr]&&0===t._a[vr]&&0===t._a[yr]&&0===t._a[gr]&&(t._nextDay=!0,t._a[mr]=0),t._d=(t._useUTC?kt:wt).apply(null,a),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[mr]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==r&&(m(t).weekdayMismatch=!0)}}function ce(t){var e,n,i,r,o,a,s,l;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)o=1,a=4,n=se(e.GG,t._a[hr],Mt(xe(),1,4).year),i=se(e.W,1),r=se(e.E,1),(r<1||r>7)&&(l=!0);else{o=t._locale._week.dow,a=t._locale._week.doy;var u=Mt(xe(),o,a);n=se(e.gg,t._a[hr],u.year),i=se(e.w,u.week),null!=e.d?(r=e.d,(r<0||r>6)&&(l=!0)):null!=e.e?(r=e.e+o,(e.e<0||e.e>6)&&(l=!0)):r=o}i<1||i>Dt(n,o,a)?m(t)._overflowWeeks=!0:null!=l?m(t)._overflowWeekday=!0:(s=Ot(n,i,r,o,a),t._a[hr]=s.year,t._dayOfYear=s.dayOfYear)}function de(t){var e,n,i,r,o,a,s=t._i,l=Rr.exec(s)||Wr.exec(s);if(l){for(m(t).iso=!0,e=0,n=Vr.length;e0&&m(e).unusedInput.push(a),s=s.slice(s.indexOf(i)+i.length),u+=i.length),zi[o]?(i?m(e).empty=!1:m(e).unusedTokens.push(o),tt(o,i,e)):e._strict&&!i&&m(e).unusedTokens.push(o);m(e).charsLeftOver=l-u,s.length>0&&m(e).unusedInput.push(s),e._a[mr]<=12&&m(e).bigHour===!0&&e._a[mr]>0&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[mr]=be(e._locale,e._a[mr],e._meridiem),ue(e),ae(e)}function be(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function we(t){var e,n,i,r,o;if(0===t._f.length)return m(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ze(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(g(t,this),t=Oe(t),t._a){var e=t._isUTC?f(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&S(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Je(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Qe(t,e){var n,i,r,o=t,a=null;return $e(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(o={},e?o[e]=t:o.milliseconds=t):(a=to.exec(t))?(n="-"===a[1]?-1:1,o={y:0,d:k(a[pr])*n,h:k(a[mr])*n,m:k(a[vr])*n,s:k(a[yr])*n,ms:k(Ie(1e3*a[gr]))*n}):(a=eo.exec(t))?(n="-"===a[1]?-1:("+"===a[1],1),o={y:Ke(a[2],n),M:Ke(a[3],n),w:Ke(a[4],n),d:Ke(a[5],n),h:Ke(a[6],n),m:Ke(a[7],n),s:Ke(a[8],n)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(r=en(xe(o.from),xe(o.to)),o={},o.ms=r.milliseconds,o.M=r.months),i=new Ee(o),$e(t)&&d(t,"_locale")&&(i._locale=t._locale),i}function Ke(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function tn(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function en(t,e){var n;return t.isValid()&&e.isValid()?(e=He(e,t),t.isBefore(e)?n=tn(t,e):(n=tn(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(t,e){return function(n,i){var r,o;return null===i||isNaN(+i)||(D(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=i,i=o),n="string"==typeof n?+n:n,r=Qe(n,i),rn(this,r,t),this}}function rn(e,n,i,r){var o=n._milliseconds,a=Ie(n._days),s=Ie(n._months);e.isValid()&&(r=null==r||r,s&&mt(e,ot(e,"Month")+s*i),a&&at(e,"Date",ot(e,"Date")+a*i),o&&e._d.setTime(e._d.valueOf()+o*i),r&&t.updateOffset(e,a||s))}function on(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(e,n){var i=e||xe(),r=He(i,this).startOf("day"),o=t.calendarFormat(this,r)||"sameElse",a=n&&(x(n[o])?n[o].call(this,i):n[o]);return this.format(a||this.localeData().calendar(o,this,xe(i)))}function sn(){return new _(this)}function ln(t,e){var n=b(t)?t:xe(t);return!(!this.isValid()||!n.isValid())&&(e=F(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()9999?z(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",z(n,"Z")):z(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function gn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',i=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",r="-MM-DD[T]HH:mm:ss.SSS",o=e+'[")]';return this.format(n+i+r+o)}function _n(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=z(this,e);return this.localeData().postformat(n)}function bn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function wn(t){return this.from(xe(),t)}function kn(t,e){return this.isValid()&&(b(t)&&t.isValid()||xe(t).isValid())?Qe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Sn(t){return this.to(xe(),t)}function On(t){var e;return void 0===t?this._locale._abbr:(e=re(t),null!=e&&(this._locale=e),this)}function Mn(){return this._locale}function Dn(t){switch(t=F(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function xn(t){return t=F(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Cn(){return this._d.valueOf()-6e4*(this._offset||0)}function Pn(){return Math.floor(this.valueOf()/1e3)}function Tn(){return new Date(this.valueOf())}function Yn(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function An(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function jn(){return this.isValid()?this.toISOString():null}function En(){return v(this)}function $n(){return h({},m(this))}function In(){return m(this).overflow}function Ln(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Fn(t,e){U(0,[t,t.length],0,e)}function Hn(t){return Un.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Nn(t){return Un.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Rn(){return Dt(this.year(),1,4)}function Wn(){var t=this.localeData()._week;return Dt(this.year(),t.dow,t.doy)}function Un(t,e,n,i,r){var o;return null==t?Mt(this,i,r).year:(o=Dt(t,i,r),e>o&&(e=o),Vn.call(this,t,e,n,i,r))}function Vn(t,e,n,i,r){var o=Ot(t,e,n,i,r),a=kt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Gn(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function zn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Bn(t,e){e[gr]=k(1e3*("0."+t))}function Zn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Xn(t){return xe(1e3*t)}function Jn(){return xe.apply(null,arguments).parseZone()}function Qn(t){return t}function Kn(t,e,n,i){var r=re(),o=f().set(i,e);return r[n](o,t)}function ti(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Kn(t,e,n,"month");var i,r=[];for(i=0;i<12;i++)r[i]=Kn(t,i,n,"month");return r}function ei(t,e,n,i){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var r=re(),o=t?r._week.dow:0;if(null!=n)return Kn(e,(n+o)%7,i,"day");var a,s=[];for(a=0;a<7;a++)s[a]=Kn(e,(a+o)%7,i,"day");return s}function ni(t,e){return ti(t,e,"months")}function ii(t,e){return ti(t,e,"monthsShort")}function ri(t,e,n){return ei(t,e,n,"weekdays")}function oi(t,e,n){return ei(t,e,n,"weekdaysShort")}function ai(t,e,n){return ei(t,e,n,"weekdaysMin")}function si(){var t=this._data;return this._milliseconds=fo(this._milliseconds),this._days=fo(this._days),this._months=fo(this._months),t.milliseconds=fo(t.milliseconds),t.seconds=fo(t.seconds),t.minutes=fo(t.minutes),t.hours=fo(t.hours),t.months=fo(t.months),t.years=fo(t.years),this}function li(t,e,n,i){var r=Qe(e,n);return t._milliseconds+=i*r._milliseconds,t._days+=i*r._days,t._months+=i*r._months,t._bubble()}function ui(t,e){return li(this,t,e,1)}function ci(t,e){return li(this,t,e,-1)}function di(t){return t<0?Math.floor(t):Math.ceil(t)}function hi(){var t,e,n,i,r,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*di(pi(s)+a),a=0,s=0),l.milliseconds=o%1e3,t=w(o/1e3),l.seconds=t%60,e=w(t/60),l.minutes=e%60,n=w(e/60),l.hours=n%24,a+=w(n/24),r=w(fi(a)),s+=r,a-=di(pi(r)),i=w(s/12),s%=12,l.days=a,l.months=s,l.years=i,this}function fi(t){return 4800*t/146097}function pi(t){return 146097*t/4800}function mi(t){if(!this.isValid())return NaN;var e,n,i=this._milliseconds;if(t=F(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+fi(e),"month"===t?n:n/12;switch(e=this._days+Math.round(pi(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function vi(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN}function yi(t){return function(){return this.as(t)}}function gi(){return Qe(this)}function _i(t){return t=F(t),this.isValid()?this[t+"s"]():NaN}function bi(t){return function(){return this.isValid()?this._data[t]:NaN}}function wi(){return w(this.days()/7)}function ki(t,e,n,i,r){return r.relativeTime(e||1,!!n,t,i)}function Si(t,e,n){var i=Qe(t).abs(),r=Po(i.as("s")),o=Po(i.as("m")),a=Po(i.as("h")),s=Po(i.as("d")),l=Po(i.as("M")),u=Po(i.as("y")),c=r<=To.ss&&["s",r]||r0,c[4]=n,ki.apply(null,c)}function Oi(t){return void 0===t?Po:"function"==typeof t&&(Po=t,!0)}function Mi(t,e){return void 0!==To[t]&&(void 0===e?To[t]:(To[t]=e,"s"===t&&(To.ss=e-1),!0))}function Di(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=Si(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function xi(t){return(t>0)-(t<0)||+t}function Ci(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n,i=Yo(this._milliseconds)/1e3,r=Yo(this._days),o=Yo(this._months);t=w(i/60),e=w(t/60),i%=60,t%=60,n=w(o/12),o%=12;var a=n,s=o,l=r,u=e,c=t,d=i?i.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var f=h<0?"-":"",p=xi(this._months)!==xi(h)?"-":"",m=xi(this._days)!==xi(h)?"-":"",v=xi(this._milliseconds)!==xi(h)?"-":"";return f+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?m+l+"D":"")+(u||c||d?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(d?v+d+"S":"")}var Pi,Ti;Ti=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var wr,kr=rt("FullYear",!0);wr=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;ethis?this:t:y()}),Jr=function(){return Date.now?Date.now():+new Date},Qr=["year","quarter","month","week","day","hour","minute","second","millisecond"];Le("Z",":"),Le("ZZ",""),Z("Z",sr),Z("ZZ",sr),Q(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Fe(sr,t)});var Kr=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var to=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,eo=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Qe.fn=Ee.prototype,Qe.invalid=je;var no=nn(1,"add"),io=nn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ro=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Fn("gggg","weekYear"),Fn("ggggg","weekYear"),Fn("GGGG","isoWeekYear"),Fn("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),N("weekYear",1),N("isoWeekYear",1),Z("G",or),Z("g",or),Z("GG",Qi,Zi),Z("gg",Qi,Zi),Z("GGGG",nr,Xi),Z("gggg",nr,Xi),Z("GGGGG",ir,Ji),Z("ggggg",ir,Ji),K(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=k(t)}),K(["gg","GG"],function(e,n,i,r){n[r]=t.parseTwoDigitYear(e)}),U("Q",0,"Qo","quarter"),L("quarter","Q"),N("quarter",7),Z("Q",Bi),Q("Q",function(t,e){e[fr]=3*(k(t)-1)}),U("D",["DD",2],"Do","date"),L("date","D"),N("date",9),Z("D",Qi),Z("DD",Qi,Zi),Z("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),Q(["D","DD"],pr),Q("Do",function(t,e){e[pr]=k(t.match(Qi)[0])});var oo=rt("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),N("dayOfYear",4),Z("DDD",er),Z("DDDD",qi),Q(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),U("m",["mm",2],0,"minute"),L("minute","m"),N("minute",14),Z("m",Qi),Z("mm",Qi,Zi),Q(["m","mm"],vr);var ao=rt("Minutes",!1);U("s",["ss",2],0,"second"),L("second","s"),N("second",15),Z("s",Qi),Z("ss",Qi,Zi),Q(["s","ss"],yr);var so=rt("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100); -}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),N("millisecond",16),Z("S",er,Bi),Z("SS",er,Zi),Z("SSS",er,qi);var lo;for(lo="SSSS";lo.length<=9;lo+="S")Z(lo,rr);for(lo="S";lo.length<=9;lo+="S")Q(lo,Bn);var uo=rt("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var co=_.prototype;co.add=no,co.calendar=an,co.clone=sn,co.diff=pn,co.endOf=xn,co.format=_n,co.from=bn,co.fromNow=wn,co.to=kn,co.toNow=Sn,co.get=st,co.invalidAt=In,co.isAfter=ln,co.isBefore=un,co.isBetween=cn,co.isSame=dn,co.isSameOrAfter=hn,co.isSameOrBefore=fn,co.isValid=En,co.lang=ro,co.locale=On,co.localeData=Mn,co.max=Xr,co.min=qr,co.parsingFlags=$n,co.set=lt,co.startOf=Dn,co.subtract=io,co.toArray=Yn,co.toObject=An,co.toDate=Tn,co.toISOString=yn,co.inspect=gn,co.toJSON=jn,co.toString=vn,co.unix=Pn,co.valueOf=Cn,co.creationData=Ln,co.year=kr,co.isLeapYear=it,co.weekYear=Hn,co.isoWeekYear=Nn,co.quarter=co.quarters=Gn,co.month=vt,co.daysInMonth=yt,co.week=co.weeks=Tt,co.isoWeek=co.isoWeeks=Yt,co.weeksInYear=Wn,co.isoWeeksInYear=Rn,co.date=oo,co.day=co.days=Ht,co.weekday=Nt,co.isoWeekday=Rt,co.dayOfYear=zn,co.hour=co.hours=Lr,co.minute=co.minutes=ao,co.second=co.seconds=so,co.millisecond=co.milliseconds=uo,co.utcOffset=Re,co.utc=Ue,co.local=Ve,co.parseZone=Ge,co.hasAlignedHourOffset=ze,co.isDST=Be,co.isLocal=qe,co.isUtcOffset=Xe,co.isUtc=Je,co.isUTC=Je,co.zoneAbbr=Zn,co.zoneName=qn,co.dates=M("dates accessor is deprecated. Use date instead.",oo),co.months=M("months accessor is deprecated. Use month instead",vt),co.years=M("years accessor is deprecated. Use year instead",kr),co.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",We),co.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ze);var ho=T.prototype;ho.calendar=Y,ho.longDateFormat=A,ho.invalidDate=j,ho.ordinal=E,ho.preparse=Qn,ho.postformat=Qn,ho.relativeTime=$,ho.pastFuture=I,ho.set=C,ho.months=dt,ho.monthsShort=ht,ho.monthsParse=pt,ho.monthsRegex=_t,ho.monthsShortRegex=gt,ho.week=xt,ho.firstDayOfYear=Pt,ho.firstDayOfWeek=Ct,ho.weekdays=Et,ho.weekdaysMin=It,ho.weekdaysShort=$t,ho.weekdaysParse=Ft,ho.weekdaysRegex=Wt,ho.weekdaysShortRegex=Ut,ho.weekdaysMinRegex=Vt,ho.isPM=Xt,ho.meridiem=Jt,ee("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=M("moment.lang is deprecated. Use moment.locale instead.",ee),t.langData=M("moment.langData is deprecated. Use moment.localeData instead.",re);var fo=Math.abs,po=yi("ms"),mo=yi("s"),vo=yi("m"),yo=yi("h"),go=yi("d"),_o=yi("w"),bo=yi("M"),wo=yi("y"),ko=bi("milliseconds"),So=bi("seconds"),Oo=bi("minutes"),Mo=bi("hours"),Do=bi("days"),xo=bi("months"),Co=bi("years"),Po=Math.round,To={ss:44,s:45,m:45,h:22,d:26,M:11},Yo=Math.abs,Ao=Ee.prototype;return Ao.isValid=Ae,Ao.abs=si,Ao.add=ui,Ao.subtract=ci,Ao.as=mi,Ao.asMilliseconds=po,Ao.asSeconds=mo,Ao.asMinutes=vo,Ao.asHours=yo,Ao.asDays=go,Ao.asWeeks=_o,Ao.asMonths=bo,Ao.asYears=wo,Ao.valueOf=vi,Ao._bubble=hi,Ao.clone=gi,Ao.get=_i,Ao.milliseconds=ko,Ao.seconds=So,Ao.minutes=Oo,Ao.hours=Mo,Ao.days=Do,Ao.weeks=wi,Ao.months=xo,Ao.years=Co,Ao.humanize=Di,Ao.toISOString=Ci,Ao.toString=Ci,Ao.toJSON=Ci,Ao.locale=On,Ao.localeData=Mn,Ao.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ci),Ao.lang=ro,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",or),Z("X",lr),Q("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),Q("x",function(t,e,n){n._d=new Date(k(t))}),t.version="2.22.1",i(xe),t.fn=co,t.min=Pe,t.max=Te,t.now=Jr,t.utc=f,t.unix=Xn,t.months=ni,t.isDate=u,t.locale=ee,t.invalid=y,t.duration=Qe,t.isMoment=b,t.weekdays=ri,t.parseZone=Jn,t.localeData=re,t.isDuration=$e,t.monthsShort=ii,t.weekdaysMin=ai,t.defineLocale=ne,t.updateLocale=ie,t.locales=oe,t.weekdaysShort=oi,t.normalizeUnits=F,t.relativeTimeRounding=Oi,t.relativeTimeThreshold=Mi,t.calendarFormat=on,t.prototype=co,t.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},t})},{}],23:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n=3?o.postLoadDataConstructor():t.on("loadeddata",o.postLoadDataConstructor.bind(o)),o}return o(e,t),a(e,[{key:"postLoadDataConstructor",value:function(){this.annotationState=new c(this.player),this.annotationState.annotations=this.options.annotationsObjects,this.controls=new u(this.player,this.options.bindArrowKeys),this.bindEvents(),this.setBounds(!1),this.options.startInAnnotationMode&&this.toggleAnnotationMode(),this.pluginReady()}},{key:"bindEvents",value:function(){var t=this;$(window).on("resize.vac-window-resize",l.throttle(this.setBounds.bind(this),500)),this.player.on("fullscreenchange",l.throttle(this.setBounds.bind(this),500)),this.options.showFullScreen||this.player.on("fullscreenchange",function(){t.player.isFullscreen_?(t.preFullscreenAnnotationsEnabled=t.active,$(t.player.el()).addClass("vac-disable-fullscreen")):$(t.player.el()).removeClass("vac-disable-fullscreen"),t.preFullscreenAnnotationsEnabled&&t.toggleAnnotationMode()}.bind(this))}},{key:"fire",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.eventDispatcher.fire(t,e)}},{key:"toggleAnnotationMode",value:function(){this.active=!this.active,this.player.toggleClass("vac-active"),this.annotationState.enabled=this.active,this.active?this.fire("annotationModeEnabled"):this.fire("annotationModeDisabled"),this.options.showControls&&(this.active?this.controls.render():this.controls.clear(!0))}},{key:"setBounds",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.bounds={};var e=$(this.player.el()),n=e.find(".vjs-control-bar");this.bounds.left=e.offset().left,this.bounds.top=e.offset().top,this.bounds.right=this.bounds.left+e.width(),this.bounds.bottom=this.bounds.top+e.height(),this.bounds.bottomWithoutControls=this.bounds.bottom-n.height(),t&&this.fire("playerBoundsChanged",this.bounds)}},{key:"onReady",value:function(t){return this.eventDispatcher.pluginReady?t():void this._readyCallbacks.push(t)}},{key:"pluginReady",value:function(){for(this.eventDispatcher.pluginReady=!0;this._readyCallbacks.length;)this._readyCallbacks.pop()()}},{key:"dispose",value:function(){this.controls=this.controls.teardown(),this.annotationState=this.annotationState.teardown(),this.eventDispatcher=this.eventDispatcher.teardown(),this.teardown(),this.player&&(this.player.annotationComments=null,$(this.player.el()).removeClass("vac-active"),$(this.player.el()).find("[class^='vac-']").remove()),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"dispose",this).call(this)}},{key:"teardown",value:function(){this.player&&this.player.off("fullscreenchange"),$(window).off("resize.vac-window-resize")}}]),e}(n)}},{"./components/annotation_state":26,"./components/controls":29,"./lib/event_dispatcher":35,"./lib/polyfills":39,"./lib/utils":40}],24:[function(t,e,n){"use strict";var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=t("handlebars/runtime");n.comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n
\n
'+d(t.lambda(null!=(a=null!=e?e.meta:e)?a.user_name:a,e))+'
\n
'+d((s=null!=(s=n.timeSince||(null!=e?e.timeSince:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"timeSince",hash:{},data:o}):s))+'\n   X\n
\n
\n
\n '+d((n.breaklines||e&&e.breaklines||u).call(l,null!=e?e.body:e,{name:"breaklines",hash:{},data:o}))+"\n
\n
\n"},useData:!0}),n.comment_list=r.template({1:function(t,e,n,i,r,o){var a;return" "+(null!=(a=t.lambda(o[0][0],e))?a:"")+"\n"},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r,o){var a,s,l=null!=e?e:t.nullContext||{};return'
\n'},useData:!0,useBlockParams:!0}),n.controls=r.template({1:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(2,r,0),inverse:t.noop,data:r}))?o:""},2:function(t,e,n,i,r){var o;return'
\n \n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.showNav:e,{name:"if",hash:{},fn:t.program(3,r,0),inverse:t.noop,data:r}))?o:"")+"
\n"},3:function(t,e,n,i,r){return'
\n
Prev
\n
Next
\n
\n'},5:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return'
\n
\n
Click and drag to select
\n
\n
\n'+(null!=(o=n["if"].call(a,null!=e?e.showControls:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.writingComment:e,{name:"if",hash:{},fn:t.program(9,r,0),inverse:t.noop,data:r}))?o:"")},6:function(t,e,n,i,r){var o;return'
\n Select shape + range\n'+(null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.internalCommenting:e,{name:"if",hash:{},fn:t.program(7,r,0),inverse:t.noop,data:r}))?o:"")+'
\n
-1 sec
\n
+1 sec
\n
\n
\n'},7:function(t,e,n,i,r){return' \n cancel\n'},9:function(t,e,n,i,r){var o;return'
\n
\n
\n
New Annotation @ '+t.escapeExpression((o=null!=(o=n.rangeStr||(null!=e?e.rangeStr:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"rangeStr",hash:{},data:r}):o))+'
\n
\n \n
\n \n Cancel\n
\n
\n
\n
\n
\n'},compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){var o,a=null!=e?e:t.nullContext||{};return(null!=(o=n.unless.call(a,null!=e?e.adding:e,{name:"unless",hash:{},fn:t.program(1,r,0),inverse:t.noop,data:r}))?o:"")+"\n"+(null!=(o=n["if"].call(a,null!=e?e.adding:e,{name:"if",hash:{},fn:t.program(5,r,0),inverse:t.noop,data:r}))?o:"")},useData:!0}),n.draggable_marker=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n'},useData:!0}),n.marker=r.template({1:function(t,e,n,i,r){return"vac-ranged-marker"},3:function(t,e,n,i,r){var o;return"width:"+t.escapeExpression((o=null!=(o=n.width||(null!=e?e.width:e))?o:n.helperMissing,"function"==typeof o?o.call(null!=e?e:t.nullContext||{},{name:"width",hash:{},data:r}):o))+";"},5:function(t,e,n,i,r){var o;return null!=(o=n["if"].call(null!=e?e:t.nullContext||{},null!=e?e.tooltipBody:e,{name:"if",hash:{},fn:t.program(6,r,0),inverse:t.noop,data:r}))?o:""},6:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n \n '+d((s=null!=(s=n.tooltipTime||(null!=e?e.tooltipTime:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipTime",hash:{},data:o}):s))+" - "+d((s=null!=(s=n.tooltipBody||(null!=e?e.tooltipBody:e))?s:u,("undefined"==typeof s?"undefined":i(s))===c?s.call(l,{name:"tooltipBody",hash:{},data:o}):s))+"\n \n
\n"},7:function(t,e,n,i,r){return"vac-right-side"},compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s,l=null!=e?e:t.nullContext||{},u=n.helperMissing,c="function",d=t.escapeExpression;return'
\n'+(null!=(a=n["if"].call(l,null!=e?e.showTooltip:e,{name:"if",hash:{},fn:t.program(5,o,0),inverse:t.noop,data:o}))?a:"")+"
\n"},useData:!0}),n.marker_wrap=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'
\n\t
\n
'},useData:!0}),n.new_comment=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,r,o){var a,s=null!=e?e:t.nullContext||{},l=n.helperMissing,u="function",c=t.escapeExpression;return'
\n
\n
\n \n
\n \n Cancel\n
\n
\n
\n'},useData:!0}),n.player_button=r.template({compiler:[7,">= 4.0.0"],main:function(t,e,n,i,r){return'\n\n\t\n\t \n\t \n\t\n'},useData:!0})},{"handlebars/runtime":20}],25:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0],e=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.isOpen=!0;var r=i||!u.isWithinRange(this.range.start,this.range.end,Math.floor(this.currentTime)),o=n&&this.plugin.options.showMarkerShapeAndTooltips;this.marker.setActive(o),!n&&this.plugin.options.showCommentList&&this.commentList.render(),(!n||n&&this.plugin.options.showMarkerShapeAndTooltips)&&(this.annotationShape.render(),this.shape&&this.annotationShape.$el.on("click.vac-annotation",function(){e.plugin.annotationState.openAnnotation(e,!1,!1,!1)})),t&&this.player.pause(),r&&(this.currentTime=this.range.start),this.plugin.fire("annotationOpened",{annotation:this.data,triggered_by_timeline:n})}},{key:"close",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isOpen&&(this.isOpen=!1,this.marker.deactivate(),this.commentList.teardown(!1),this.annotationShape.$el&&this.annotationShape.$el.off("click.vac-annotation"),this.annotationShape.teardown(),t&&this.plugin.annotationState.clearActive(),this.plugin.fire("annotationClosed",this.data))}},{key:"buildSecondsActiveArray",value:function(){var t=[];if(this.range.end)for(var e=this.range.start;e<=this.range.end;e++)t.push(e);else{var n=this.range.start;t.push(n),n0&&void 0!==arguments[0])||arguments[0];this.close(!0),this.marker.teardown(),this.commentList&&this.commentList.teardown(t),t&&this.plugin.annotationState.removeAnnotation(this),this.annotationShape&&this.annotationShape.teardown(),t&&s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return{id:this.id,range:this.range,shape:this.shape,comments:this.commentList.data}}},{key:"isActive",get:function(){return this.plugin.annotationState.activeAnnotation===this}}],[{key:"newFromData",value:function(t,n,i,r){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,a=h.dataObj(i,r);t&&(t=u.parseIntObj(t)),n&&(n=u.parseIntObj(n));var s={id:o,range:t,shape:n,comments:[a]};return new e(s,r.player)}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils.js":40,"./comment":27,"./comment_list":28,"./marker":31,"./shape":34}],26:[function(t,e,n){"use strict";function i(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);ee.range.start?1:0})}},{key:"addNewAnnotation",value:function(t){this._annotations.push(t),this.openAnnotation(t,!0,!0,!1,!0),this.stateChanged()}},{key:"createAndAddAnnotation",value:function(t){this.plugin.controls.uiState.adding&&this.plugin.controls.cancelAddNew();var e=d.newFromData(t.range,t.shape,t.commentStr||"",this.plugin,t.id);this.addNewAnnotation(e)}},{key:"destroyAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&e.teardown()}},{key:"removeAnnotation",value:function(t){var e=t.id,n=this._annotations.indexOf(t);this._annotations.splice(n,1),this.stateChanged(),this.plugin.fire("annotationDeleted",{id:e})}},{key:"setLiveAnnotation",value:function(){if(this.enabled){var t=Math.floor(this.currentTime);if(this.skipLiveCheck)return void(t!==this.lastVideoTime&&(this.skipLiveCheck=!1));var e=this.activeAnnotationsForTime(t);if(!e.length)return this.activeAnnotation.close();var n=this.annotations[e[e.length-1]];if(this.activeAnnotation.range){if(n===this.activeAnnotation)return;var i=n.range.start,r=this.activeAnnotation.range.start;if(i===r&&i===t)return}this.openAnnotation(n,!1,!1,!0)}}},{key:"activeAnnotationsForTime",value:function(t){return this.annotations.length?this.annotationTimeMap[t]||[]:[]}},{key:"rebuildAnnotationTimeMap",value:function(){var t=this,e={};this.annotations.forEach(function(n){n.secondsActive.forEach(function(i){var r=e[i]||[];r.push(t.annotations.indexOf(n)),e[i]=r})}),this.annotationTimeMap=e}},{key:"clearActive",value:function(){this.activeAnnotation.close(!1),this._activeAnnotation=null}},{key:"openAnnotation",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.plugin.active||this.plugin.toggleAnnotationMode(),this.skipLiveCheck=e,this.clearActive(),t.open(n,i,r),this.activeAnnotation=t,this.lastVideoTime=this.activeAnnotation.range.start}},{key:"openAnnotationById",value:function(t){var e=this.findAnnotation(t);e&&this.openAnnotation(e)}},{key:"findAnnotation",value:function(t){return this.annotations.find(function(e){return e.id==t})}},{key:"findComment",value:function(t){var e,n=this.annotations.map(function(t){return t.commentList.comments});return n=(e=[]).concat.apply(e,i(n)),n.find(function(e){return e.id==t})}},{key:"nextAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=t===this.annotations.length-1?0:t+1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=0;in)return this.openAnnotation(this.annotations[i],!0);this.openAnnotation(this.annotations[0],!0)}},{key:"prevAnnotation",value:function(){if(this._activeAnnotation){var t=this.annotations.indexOf(this._activeAnnotation),e=0===t?this.annotations.length-1:t-1;return this.openAnnotation(this.annotations[e],!0)}for(var n=Math.floor(this.currentTime),i=this.annotations.length-1;i>=0;i--)if(this.annotations[i].range.start0&&void 0!==arguments[0]?arguments[0]:null;this._activeAnnotation=t},get:function(){return this._activeAnnotation||{close:function(){}}}},{key:"data",get:function(){return this._annotations.map(function(t){return t.data})}}]),e}(c)},{"./../lib/player_component":37,"./../lib/utils":40,"./annotation":25}],27:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this,t)}},{key:"data",get:function(){return{id:this.id,meta:this.meta,body:this.body}}},{key:"HTML",get:function(){return this.$el[0].outerHTML}}],[{key:"newFromData",value:function(t,n,i){var r=this.dataObj(t,i);return new e(r,i.player)}},{key:"dataObj",value:function(t,e){return{meta:Object.assign({ -datetime:c().toISOString()},e.meta),id:u.guid(),body:t}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,moment:22}],28:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;na-10&&"down"==o&&(e.stop(),e.animate({scrollTop:n+40},100),t.preventDefault())}},{key:"sortComments",value:function(){this.comments.sort(function(t,e){return t.timestampe.timestamp?1:0})}},{key:"handleDeleteAnnotationClick",value:function(t){var e=this,n=$("").addClass("vac-delete-confirm").text("CONFIRM");n.on("click.comment",function(){n.off("click.comment"),e.annotation.teardown()}),$(t.target).replaceWith(n)}},{key:"unbindCommentFormEvents",value:function(){this.$newCommentForm&&this.$newCommentForm.off("click.vac-comment")}},{key:"teardown",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.$el&&this.$el.off("click.vac-comment mousewheel.vac-comment DOMMouseScroll.vac-comment"),this.comments.forEach(function(e){return e.teardown(t)}),t&&(this.comments=[]),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"data",get:function(){return this.comments.map(function(t){return t.data})}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./comment":27}],29:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this.uiState.adding&&(this.restoreNormalUI(),this.marker.teardown(),this.selectableShape.teardown()),this.uiState=u.cloneObject(m),this.$player.find(".vac-video-cover-canvas").off("mousedown.vac-cursor-tooltip").off("mouseup.vac-cursor-tooltip")),this.$tooltip_=null,this.$UI.controlElements.remove()}},{key:"render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.clear(t);var e=Object.assign({rangeStr:this.marker?u.humanTime(this.marker.range):null,showNav:this.plugin.annotationState.annotations.length>1},this.uiState,{internalCommenting:this.internalCommenting,showControls:this.showControls}),n=this.renderTemplate(p,e);this.$player.append(n),this.playerButton&&this.playerButton.updateNumAnnotations()}},{key:"cancelAddNew",value:function(){(this.uiState.adding||this.uiState.writingComment)&&(this.render(!0),this.marker.teardown(),this.marker=null)}},{key:"startAddNew",value:function(){this.plugin.active||this.plugin.toggleAnnotationMode(),this.player.pause(),this.setAddingUI(),this.uiState.adding=!0,this.render();var t={start:parseInt(this.currentTime,10),stop:parseInt(this.currentTime,10)};this.marker=new c(this.player,t),this.selectableShape=new d(this.player),this.showControls||this.bindCursorTooltip(),this.plugin.fire("enteredAddingAnnotation",{range:t})}},{key:"writeComment",value:function(){this.uiState.writingComment=!0,this.render()}},{key:"saveNew",value:function(){var t=this.$UI.newCommentTextarea.val();if(t){var e=f.newFromData(this.marker.range,this.selectableShape.shape,t,this.plugin);this.plugin.annotationState.addNewAnnotation(e),this.cancelAddNew()}}},{key:"setAddingUI",value:function(){this.plugin.annotationState.enabled=!1,this.disablePlayingAndControl()}},{key:"restoreNormalUI",value:function(){this.plugin.annotationState.enabled=this.plugin.active,this.enablePlayingAndControl(),$(document).off("mousemove.vac-tooltip-"+this.playerId)}},{key:"handleArrowKeys",value:function(t){if(this.plugin.active){var e=t.which;37==e&&this.plugin.annotationState.prevAnnotation(),39==e&&this.plugin.annotationState.nextAnnotation()}}},{key:"bindCursorTooltip",value:function(){var t=this;this.tooltipArea=u.areaOfHiddenEl(this.$tooltip,this.$UI.coverCanvas,this.UI_CLASSES.hidden),this.plugin.setBounds(!1),$(document).on("mousemove.vac-tooltip-"+this.playerId,u.throttle(function(e){if(t.plugin.bounds){var n=e.pageX,i=e.pageY,r=nt.plugin.bounds.right||it.plugin.bounds.bottom,o=!r&&i>=t.plugin.bounds.bottomWithoutControls,a=t.$tooltip.hasClass("vac-marker-hover");if(r)return void t.$tooltip.addClass(t.UI_CLASSES.hidden);var s=n-t.plugin.bounds.left,l=i-t.plugin.bounds.top,u=10,c=t.$player.width(),d=t.$player.height()-t.$UI.controlBar.height(),h=s+t.tooltipArea.width+2*u>=c,f=l+t.tooltipArea.height+2*u>=d,p=h?c-t.tooltipArea.width-u:s+u,m=f?d-t.tooltipArea.height-u:l+u;o&&!a||t.$tooltip.hasClass("vac-cursor-dragging")?t.$tooltip.addClass(t.UI_CLASSES.hidden):t.$tooltip.removeClass(t.UI_CLASSES.hidden),t.$tooltip.css({left:p+"px",top:m+"px"})}}.bind(this),50))}},{key:"$tooltip",get:function(){return this.$tooltip_=this.$tooltip_||this.$player.find(".vac-cursor-tool-tip"),this.$tooltip_}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40,"./annotation":25,"./draggable_marker.js":30,"./player_button":32,"./selectable_shape.js":33}],30:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;nthis.rangePin?this.range={start:this.rangePin,end:n}:this.range={start:n,end:this.rangePin},this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}},{key:"percentValFromXpos",value:function(t){var e=Math.max(0,t-this.$parent.offset().left),n=this.$parent.innerWidth(),i=e/n;return i>1&&(i=1),i<0&&(i=0),i}},{key:"teardown",value:function(){$(document).off("mousemove.vac-dmarker-"+this.playerId+" mouseup.vac-dmarker-"+this.playerId),this.$el.off("mouseenter.vac-cursor-tool-tip"),this.$el.off("mouseleave.vac-cursor-tool-tip"),this.$el.off("mousedown.vac-marker"),this.$el.remove()}},{key:"scrubStart",value:function(t){var e=this.range.start+t;this.currentTime=e,this.range.start=e,this.rangePin=e,this.teardown(),this.render(),this.plugin.fire("addingAnnotationDataChanged",{range:this.range})}}]),e}(s)},{"./../lib/utils":40,"./marker":31}],31:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:null;i(this,e);var a=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return a.range=n,a.comment=o,a.templateName=c,a.$UI.markerWrap.length||a.$UI.timeline.append(a.renderTemplate(d)),a}return o(e,t),a(e,[{key:"setActive",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.$el.addClass(this.UI_CLASSES.active),t&&this.$el.addClass("vac-force-tooltip")}},{key:"deactivate",value:function(){this.$el.removeClass(this.UI_CLASSES.active+" vac-force-tooltip")}},{key:"render",value:function(){this.$UI.timeline.find('[data-marker-id="'+this.componentId+'"]').remove(),this.$el=$(this.renderTemplate(this.templateName,this.markerTemplateData)),this.$UI.markerWrap.append(this.$el),this.bindMarkerEvents()}},{key:"bindMarkerEvents",value:function(){var t=this;this.$el.on("mouseenter.vac-marker",function(){t.$el.addClass("vac-hovering").closest(".vac-marker-wrap").addClass("vac-dim-all")}).on("mouseleave.vac-marker",function(){t.$el.removeClass("vac-hovering").closest(".vac-marker-wrap").removeClass("vac-dim-all")})}},{key:"teardown",value:function(){this.$el.off("mouseenter.vac-marker").off("mouseleave.vac-marker").off("click.vac-marker"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"markerTemplateData",get:function(){var t=this.range.start/this.duration*100,e=this.range.end/this.duration*100-t,n=100-Math.floor(e)||100;return{left:t+"%",width:e+"%",zIndex:n,showTooltip:this.plugin.options.showMarkerShapeAndTooltips,tooltipRight:t>50,tooltipTime:u.humanTime(this.range),tooltipBody:this.comment?this.comment.body:null,rangeShow:!!this.range.end,id:this.componentId}}}]),e}(l)},{"./../lib/player_ui_component":38,"./../lib/utils":40}],32:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n0?e.removeClass(this.UI_CLASSES.hidden):e.addClass(this.UI_CLASSES.hidden)}},{key:"teardown",value:function(){this.$el.off("click.vac-player-button"),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}}]),e}(l)},{"./../lib/player_ui_component":38}],33:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var o=r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return o.shape=n,o.$parent=o.$player,o}return o(e,t),a(e,[{key:"render",value:function(){this.shape&&(this.$el&&this.$el.remove(),this.$el=$("
").addClass("vac-shape"),this.setDimsFromShape(),this.$parent.append(this.$el))}},{key:"setDimsFromShape",value:function(){this.$el.css({left:this.shape.x1+"%",top:this.shape.y1+"%",width:this.shape.x2-this.shape.x1+"%",height:this.shape.y2-this.shape.y1+"%"})}}]),e}(s)},{"./../lib/player_ui_component":38}],35:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];t&&(this._player=null)}},{key:"plugin",get:function(){return this.player.annotationComments()}},{key:"player",get:function(){return this._player}},{key:"duration",get:function(){return this.player.duration()}},{key:"currentTime",get:function(){return this.player.currentTime()},set:function(t){this.player.currentTime(t)}}]),t}()},{}],38:[function(t,e,n){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};return this.registerHandlebarsHelpers(),c[t](e)}},{key:"registerHandlebarsHelpers",value:function(){"breaklines"in u.helpers||u.registerHelper("breaklines",function(t){return t=u.Utils.escapeExpression(t),t=t.replace(/(\r\n|\n|\r)/gm,"
"),new u.SafeString(t)})}},{key:"teardown",value:function(){this.$el&&this.$el.remove(),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"teardown",this).call(this)}},{key:"$UI",get:function(){return Object.freeze({commentsContainer:this.$player.find(".vac-comments-container"),controlElements:this.$player.find(".vac-control"),newCommentTextarea:this.$player.find(".vac-video-write-new textarea"),timeline:this.$player.find(".vjs-progress-control"),markerCursorHelpText:this.$player.find(".vac-cursor-help-text"),controlBar:this.$player.find(".vjs-control-bar"),markerWrap:this.$player.find(".vac-marker-wrap"),coverCanvas:this.$player.find(".vac-video-cover-canvas")})}},{key:"UI_CLASSES",get:function(){return Object.freeze({hidden:"vac-hidden",active:"vac-active"})}},{key:"$player",get:function(){return $(this.player.el())}},{key:"playerId",get:function(){return this.$player.attr("id")}},{key:"componentId",get:function(){return this.cid_=this.cid_||d.guid(),this.cid_}}]),e}(l)},{"./../compiled/templates":24,"./../lib/utils":40,"./player_component":37,"handlebars/runtime":20}],39:[function(t,e,n){"use strict";t("ie-array-find-polyfill"),t("es6-object-assign").polyfill(),function(){if("undefined"==typeof Object.setPrototypeOf&&"function"==typeof Object.getOwnPropertyNames){var t=function(t,e){return function(){return e.apply(this,arguments)}},e=function(t,e,n){if(!n){var i=t.__proto__[e]; -n={get:function(){return t["__"+e]||i},set:function(n){t["__"+e]=n}}}Object.defineProperty(t,e,{get:n.get?n.get.bind(t):void 0,set:n.set?n.set.bind(t):void 0,configurable:!0})},n=function r(n,o){var a,s=Object.getOwnPropertyNames(o);n.__proto__=o;for(var l=0,u=s.length;le?(a&&(clearTimeout(a),a=null),s=u,o=t.apply(i,r),a||(i=r=null)):a||n.trailing===!1||(a=setTimeout(l,c)),o}},parseIntObj:function(t){return Object.keys(t).forEach(function(e){parseInt(t[e])&&(t[e]=parseInt(t[e]))}),t},humanTime:function(t){function e(t){var e=Math.floor(t/60),n=String(t%60);return e+":"+(1==n.length?"0":"")+n}var n=[e(t.start)];return t.end&&n.push(e(t.end)),n.join("-")},guid:function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},areaOfHiddenEl:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=t.clone(),r={};return i.css({visibility:"hidden",display:"inline-block"}),i.removeClass(n),e.append(i),r.width=i.outerWidth(),r.height=i.outerHeight(),i.remove(),r},isWithinRange:function(t,e,n){return e=e||t+1,n>=t&&n<=e}}},{}]},{},[23])(23)}); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index c575bb7..1f22b0d 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,173 +1,201 @@ -const gulp = require('gulp'), - sourcemaps = require('gulp-sourcemaps'), - source = require('vinyl-source-stream'), - buffer = require('vinyl-buffer'), - browserify = require('browserify'), - watchify = require('watchify'), - insert = require('gulp-insert'), - babelify = require('babelify'), - stripComments = require('gulp-strip-comments'), - rename = require('gulp-rename'), - webserver = require('gulp-webserver'), - uglify = require('gulp-uglify'), - gutil = require('gulp-util'), - sass = require('gulp-sass'), - debug = require('gulp-debug'), - pump = require('pump'), - mocha = require('gulp-mocha'), - jshint = require('gulp-jshint'), - stylish = require('jshint-stylish'), - handlebars = require('gulp-handlebars'), - wrap = require('gulp-wrap'), - concat = require('gulp-concat'), - declare = require('gulp-declare'), - autoprefixer = require('gulp-autoprefixer'); - -const FILENAME = "videojs-annotation-comments.js", - CJSFILENAME = "videojs-annotation-comments.cjs.js" - PACKAGE = require('./package.json'); +const gulp = require("gulp"), + sourcemaps = require("gulp-sourcemaps"), + source = require("vinyl-source-stream"), + buffer = require("vinyl-buffer"), + browserify = require("browserify"), + watchify = require("watchify"), + insert = require("gulp-insert"), + babelify = require("babelify"), + stripComments = require("gulp-strip-comments"), + rename = require("gulp-rename"), + webserver = require("gulp-webserver"), + uglify = require("gulp-uglify"), + gutil = require("gulp-util"), + sass = require("gulp-sass"), + debug = require("gulp-debug"), + pump = require("pump"), + mocha = require("gulp-mocha"), + jshint = require("gulp-jshint"), + stylish = require("jshint-stylish"), + handlebars = require("gulp-handlebars"), + wrap = require("gulp-wrap"), + concat = require("gulp-concat"), + declare = require("gulp-declare"), + autoprefixer = require("gulp-autoprefixer"); + +const FILENAME = "videojs-annotation-comments.js"; +const CJSFILENAME = "videojs-annotation-comments.cjs.js"; +const PACKAGE = require("./package.json"); //compilation function for browserify/bundler/transpilation -function compile(watch, cb){ - var bundler = { - processor: watchify( - browserify('./src/js/index.js', { debug: true }) - .transform(babelify) - ), - filename: FILENAME - }; - - var bundlerCjs = { - processor: watchify( - browserify('./src/js/annotation_comments.js', { debug: true, standalone: 'AnnotationComments' }) - .transform( - babelify, - { - presets: ["es2015"], - plugins: ["babel-plugin-transform-es2015-modules-simple-commonjs"] - } - ) - ), - filename: CJSFILENAME - }; - - function rebundle() { - for (b of [bundler, bundlerCjs]) { - b.processor.bundle() - .on('log', gutil.log) - .on('error', gutil.log.bind(gutil.colors.red, 'Browserify Error')) - .pipe(source('src/js/index.js')) - .pipe(rename(b.filename)) - .pipe(buffer()) - .pipe(sourcemaps.init({ loadMaps: true })) - .pipe(sourcemaps.write('./')) - .pipe(gulp.dest('./build')); - } - } - - if (watch) { - rebundle(); - bundler.processor.on('update', function() { - console.log('-> bundling...'); - rebundle(); - }); - } else { - rebundle(); - cb(); +function compile(watch, cb) { + var bundlerDefault = { + entry: "./src/js/index.js", + browserifyOptions: { debug: true }, + transformOptions: {}, + filename: FILENAME + }; + + var bundlerCjs = { + entry: "./src/js/annotation_comments.js", + browserifyOptions: { + debug: true, + standalone: "AnnotationComments" + }, + transformOptions: { + presets: ["es2015"], + plugins: ["babel-plugin-transform-es2015-modules-simple-commonjs"] + }, + filename: CJSFILENAME + }; + + function buildStream(bundler) { + return browserify(bundler.entry, bundler.browserifyOptions).transform( + babelify, + bundler.transformOptions + ); + } + + function rebundle(bundlers, watch) { + for (b of bundlers) { + var browserifyStream = watch ? watchify(buildStream(b)) : buildStream(b); + + browserifyStream + .bundle() + .on("log", gutil.log) + .on("error", gutil.log.bind(gutil.colors.red, "Browserify Error")) + .pipe(source("src/js/index.js")) + .pipe(buffer()) + .pipe(rename(b.filename)) + .pipe(sourcemaps.init({ loadMaps: true })) + .pipe(sourcemaps.write("./")) + .pipe(gulp.dest("./build")); } + } + + if (watch) { + rebundle([bundlerDefault], true); + buildStream(bundlerDefault).on("update", function() { + console.log("-> bundling..."); + rebundle([bundlerDefault]); + }); + } else { + rebundle([bundlerDefault, bundlerCjs], false); + cb(); + } } -// Get bundler from bundlify -function getBundler(path, options){ - var bundler = browserify(path, { debug: options.debug, cache: {}, packageCache: {} }); - bundler.transform(babelify, {presets: ["es2015"]}) - bundler.on('log', gutil.log); - bundler.on('error', gutil.log.bind(gutil.colors.red, 'Browserify Error')); - return bundler; -}; - -gulp.task('dev_webserver', () => { - console.log(":::: > Test page at http://localhost:3004/test.html"); - return gulp.src(['build','test','node_modules']) - .pipe(webserver({ port: 3004 })); +gulp.task("dev_webserver", () => { + console.log(":::: > Test page at http://localhost:3004/test.html"); + return gulp + .src(["build", "test", "node_modules"]) + .pipe(webserver({ port: 3004 })); }); -gulp.task('sass', () => { - return gulp.src('src/css/*.scss') - .pipe(sass().on('error', sass.logError)) - .pipe(autoprefixer({ - browsers: ['defaults','not ie <= 9'], - cascade: false - })) - .pipe(sourcemaps.write('.')) - .pipe(gulp.dest('./build/css')) - .pipe(gulp.dest('./docs/build/css')); +gulp.task("sass", () => { + return gulp + .src("src/css/*.scss") + .pipe(sass().on("error", sass.logError)) + .pipe( + autoprefixer({ + browsers: ["defaults", "not ie <= 9"], + cascade: false + }) + ) + .pipe(sourcemaps.write(".")) + .pipe(gulp.dest("./build/css")) + .pipe(gulp.dest("./docs/build/css")); }); -gulp.task('templates:watch', () => { - gulp.watch('./src/templates/**/*.hbs', ['templates']); +gulp.task("templates:watch", () => { + gulp.watch("./src/templates/**/*.hbs", ["templates"]); }); -gulp.task('sass:watch', () => { - gulp.watch('./src/css/**/*.scss', ['sass']); +gulp.task("sass:watch", () => { + gulp.watch("./src/css/**/*.scss", ["sass"]); }); -gulp.task('templates',() => { - gulp.src('./src/templates/**/*.hbs') - .pipe(handlebars({ - handlebars: require('handlebars') - })) - .pipe(wrap('Handlebars.template(<%= contents %>)')) - .pipe(declare({ - root: 'exports', - noRedeclare: true, // Avoid duplicate declarations - processName: function(filePath) { - // Allow nesting based on path using gulp-declare's processNameByPath() - // You can remove this option completely if you aren't using nested folders - // Drop the templates/ folder from the namespace path by removing it from the filePath - return declare.processNameByPath(filePath.replace('src/templates/', '')); - } - })) - .pipe(concat('templates.js')) - .pipe(wrap('var Handlebars = require("handlebars/runtime");\n <%= contents %>')) - .pipe(gulp.dest('./src/js/compiled/')); +gulp.task("transpile:watch", () => { + gulp.watch("./src/js/**/*", ["transpile"]); +}); + +gulp.task("templates", () => { + gulp + .src("./src/templates/**/*.hbs") + .pipe( + handlebars({ + handlebars: require("handlebars") + }) + ) + .pipe(wrap("Handlebars.template(<%= contents %>)")) + .pipe( + declare({ + root: "exports", + noRedeclare: true, // Avoid duplicate declarations + processName: function(filePath) { + // Allow nesting based on path using gulp-declare's processNameByPath() + // You can remove this option completely if you aren't using nested folders + // Drop the templates/ folder from the namespace path by removing it from the filePath + return declare.processNameByPath( + filePath.replace("src/templates/", "") + ); + } + }) + ) + .pipe(concat("templates.js")) + .pipe( + wrap('var Handlebars = require("handlebars/runtime");\n <%= contents %>') + ) + .pipe(gulp.dest("./src/js/compiled/")); }); -gulp.task('build', ['templates', 'sass', 'transpile'], (cb) => { - pump([ - gulp.src('build/videojs-annotation-comments.js'), - rename(FILENAME.replace(".js",".min.js")), - stripComments(), - uglify(), - gulp.dest('./build') - ]); - - pump([ - gulp.src('build/videojs-annotation-comments.cjs.js'), - rename(CJSFILENAME.replace(".js",".min.js")), - stripComments(), - uglify(), - gulp.dest('./build'), - gulp.dest('./docs/build') - ], cb); +gulp.task("build", ["templates", "sass", "transpile"], cb => { + pump([ + gulp.src("build/videojs-annotation-comments.js"), + rename(FILENAME.replace(".js", ".min.js")), + stripComments(), + uglify(), + gulp.dest("./build") + ]); + + pump( + [ + gulp.src("build/videojs-annotation-comments.cjs.js"), + rename(CJSFILENAME.replace(".js", ".min.js")), + stripComments(), + uglify(), + gulp.dest("./build"), + gulp.dest("./docs/build") + ], + cb + ); }); -gulp.task('test', () => { - gulp.src(['test/mocha/components/*.js'], { read: false }) - .pipe(mocha({ compilers: ['js:babel-core/register'] })); +gulp.task("test", () => { + gulp.src(["test/mocha/components/*.js"], { read: false }).pipe(mocha()); }); -gulp.task('tdd', function() { - gulp.watch(['src/**/*.js', 'src/**/.hbs', 'test/mocha/components/*.js'], ['test']); +gulp.task("tdd", function() { + gulp.watch( + ["src/**/*.js", "src/**/.hbs", "test/mocha/components/*.js"], + ["test"] + ); }); -gulp.task('lint', function() { - return gulp.src('./src/*/*.js') - .pipe(jshint('.jshintrc')) +gulp.task("lint", function() { + return gulp + .src("./src/*/*.js") + .pipe(jshint(".jshintrc")) .pipe(jshint.reporter(stylish)); }); -gulp.task('transpile', (cb) => compile(false, cb) ); -gulp.task('bundle_watch', (cb) => compile(true, cb) ); -gulp.task('watch', ['bundle_watch', 'dev_webserver', 'sass', 'sass:watch', 'templates', 'templates:watch', 'tdd']); -gulp.task('default', ['watch']); +gulp.task("transpile", cb => compile(false, cb)); +gulp.task("bundle_watch", cb => compile(true, cb)); +gulp.task("watch", [ + "dev_webserver", + "templates:watch", + "sass:watch", + "transpile:watch", + "tdd" +]); +gulp.task("default", ["watch"]); diff --git a/license.md b/license.md deleted file mode 100644 index 4249b7d..0000000 --- a/license.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright Contently, Inc. 2017 - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b2c5b09..0000000 --- a/package-lock.json +++ /dev/null @@ -1,16798 +0,0 @@ -{ - "name": "@contently/videojs-annotation-comments", - "version": "1.1.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@gulp-sourcemaps/identity-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz", - "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", - "dev": true - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@octokit/endpoint": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.1.1.tgz", - "integrity": "sha512-KPkoTvKwCTetu/UqonLs1pfwFO5HAqTv/Ksp9y4NAg//ZgUCpvJsT4Hrst85uEzJvkB8+LxKyR4Bfv2X8O4cmQ==", - "dev": true, - "requires": { - "deepmerge": "3.0.0", - "is-plain-object": "^2.0.4", - "universal-user-agent": "^2.0.1", - "url-template": "^2.0.8" - } - }, - "@octokit/request": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.2.1.tgz", - "integrity": "sha512-enwbVOl3vWWIUuEj0LJRq+mxWNyv95fa13GJitz7qGt/ycYCwtSoVssW3pCqvxS4GlJfHfO2OA+8czIcEF522A==", - "dev": true, - "requires": { - "@octokit/endpoint": "^3.1.1", - "is-plain-object": "^2.0.4", - "node-fetch": "^2.3.0", - "universal-user-agent": "^2.0.1" - } - }, - "@octokit/rest": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.10.0.tgz", - "integrity": "sha512-RoMHiaiwnYSYyUPr3WGXlhefTMp1r+Mu0Pma2OhqZILxKtOtjW6ZviTvLoG+SR3EEefLIpzufF9B00R+GQG93A==", - "dev": true, - "requires": { - "@octokit/request": "2.2.1", - "before-after-hook": "^1.2.0", - "btoa-lite": "^1.0.0", - "lodash.get": "^4.4.2", - "lodash.pick": "^4.4.0", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "octokit-pagination-methods": "^1.1.0", - "universal-user-agent": "^2.0.0", - "url-template": "^2.0.8" - } - }, - "@semantic-release/changelog": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-3.0.2.tgz", - "integrity": "sha512-pDUaBNAuPAqQ+ArHwvR160RG2LbfyIVz9EJXgxH0V547rlx/hCs0Sp7L4Rtzi5Z+d6CHcv9g2ynxplE1xAzp2g==", - "dev": true, - "requires": { - "@semantic-release/error": "^2.1.0", - "aggregate-error": "^2.0.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "@semantic-release/commit-analyzer": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.1.0.tgz", - "integrity": "sha512-2lb+t6muGenI86mYGpZYOgITx9L3oZYF697tJoqXeQEk0uw0fm+OkkOuDTBA3Oax9ftoNIrCKv9bwgYvxrbM6w==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "import-from": "^2.1.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "dev": true - }, - "@semantic-release/github": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.2.9.tgz", - "integrity": "sha512-6d0U2ySf3/dvGZTdFu4OM82HMmnSpCKfqkD9zuwc7/H5cleY7moxYMzRTRgeQKP/LskHdFrNjED/x27vKvc5nw==", - "dev": true, - "requires": { - "@octokit/rest": "^16.0.1", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^2.0.0", - "bottleneck": "^2.0.1", - "debug": "^4.0.0", - "dir-glob": "^2.0.0", - "fs-extra": "^7.0.0", - "globby": "^9.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "issue-parser": "^3.0.0", - "lodash": "^4.17.4", - "mime": "^2.0.3", - "p-filter": "^1.0.0", - "p-retry": "^3.0.0", - "parse-github-url": "^1.0.1", - "url-join": "^4.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "@semantic-release/npm": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.1.3.tgz", - "integrity": "sha512-DpHWUMuBVuHTLuAwT8xAfbBdf62OrghDxdBiVA2Cp52WblZihPMTBz/WtCJYWlvcdv1e1K9aAoSNoVImHfAU3w==", - "dev": true, - "requires": { - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^2.0.0", - "execa": "^1.0.0", - "fs-extra": "^7.0.0", - "lodash": "^4.17.4", - "nerf-dart": "^1.0.0", - "normalize-url": "^4.0.0", - "npm": "^6.3.0", - "rc": "^1.2.8", - "read-pkg": "^4.0.0", - "registry-auth-token": "^3.3.1" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } - } - }, - "@semantic-release/release-notes-generator": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.1.4.tgz", - "integrity": "sha512-pWPouZujddgb6t61t9iA9G3yIfp3TeQ7bPbV1ixYSeP6L7gI1+Du82fY/OHfEwyifpymLUQW0XnIKgKct5IMMw==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^4.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "debug": "^4.0.0", - "get-stream": "^4.0.0", - "import-from": "^2.1.0", - "into-stream": "^4.0.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - }, - "acorn-node": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.3.0.tgz", - "integrity": "sha512-efP54n3d1aLfjL2UMdaXa6DsswwzJeI5rqhbFvXMrKiJ6eJFpf+7R0zN7t8IC+XKn2YOAFAv6xbBNgHUkoHWLw==", - "dev": true, - "requires": { - "acorn": "^5.4.1", - "xtend": "^4.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", - "dev": true - } - } - }, - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "aggregate-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-2.0.0.tgz", - "integrity": "sha512-xA1VQPApQdDehIIpS3gBFkMGDRb9pDYwZPVUOoX8A0lU3GB0mjiACqsa9ByBurU53erhjamf5I4VNRitCfXhjg==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^3.0.0" - }, - "dependencies": { - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", - "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", - "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", - "dev": true, - "requires": { - "acorn": "^4.0.3" - } - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", - "dev": true, - "requires": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.17", - "postcss-value-parser": "^3.2.3" - } - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-modules-simple-commonjs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-simple-commonjs/-/babel-plugin-transform-es2015-modules-simple-commonjs-0.3.0.tgz", - "integrity": "sha1-wV71BpZ8Hui3KQzt7Nukr2WB7h4=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.8.0", - "babel-runtime": "^6.3.19", - "babel-template": "^6.3.13", - "better-log": "^1.3.1" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", - "dev": true, - "requires": { - "regenerator-transform": "0.9.11" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-es2015-script": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-es2015-script/-/babel-preset-es2015-script-1.1.0.tgz", - "integrity": "sha1-c32jmRPctFAO5NsTLELNPPcQZOU=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.3.13", - "babel-plugin-transform-es2015-arrow-functions": "^6.3.13", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.3.13", - "babel-plugin-transform-es2015-block-scoping": "^6.14.0", - "babel-plugin-transform-es2015-classes": "^6.14.0", - "babel-plugin-transform-es2015-computed-properties": "^6.3.13", - "babel-plugin-transform-es2015-destructuring": "^6.9.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.6.0", - "babel-plugin-transform-es2015-for-of": "^6.6.0", - "babel-plugin-transform-es2015-function-name": "^6.9.0", - "babel-plugin-transform-es2015-literals": "^6.3.13", - "babel-plugin-transform-es2015-object-super": "^6.3.13", - "babel-plugin-transform-es2015-parameters": "^6.9.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.3.13", - "babel-plugin-transform-es2015-spread": "^6.3.13", - "babel-plugin-transform-es2015-sticky-regex": "^6.3.13", - "babel-plugin-transform-es2015-template-literals": "^6.6.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.6.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.3.13", - "babel-plugin-transform-regenerator": "^6.14.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "core-js": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "dev": true, - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "before-after-hook": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.2.tgz", - "integrity": "sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w==", - "dev": true - }, - "better-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/better-log/-/better-log-1.3.3.tgz", - "integrity": "sha1-IZocA4Oo+cRBaJfto6z5tNaZDo8=", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "binaryextensions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", - "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", - "dev": true - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.8.4.tgz", - "integrity": "sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg=", - "dev": true, - "requires": { - "bytes": "1.0.0", - "depd": "0.4.5", - "iconv-lite": "0.4.4", - "media-typer": "0.3.0", - "on-finished": "2.1.0", - "qs": "2.2.4", - "raw-body": "1.3.0", - "type-is": "~1.5.1" - }, - "dependencies": { - "depd": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.5.tgz", - "integrity": "sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E=", - "dev": true - }, - "ee-first": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.5.tgz", - "integrity": "sha1-jJshKJjYzZ8alDZlDOe+ICyen/A=", - "dev": true - }, - "on-finished": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.0.tgz", - "integrity": "sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0=", - "dev": true, - "requires": { - "ee-first": "1.0.5" - } - }, - "qs": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.4.tgz", - "integrity": "sha1-Lp+800tUDjQhySTs0B6QqpdTGcg=", - "dev": true - } - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "bottleneck": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.15.3.tgz", - "integrity": "sha512-2sHF/gMwTshF//gQninQBEHDNBXuvDLfSczPHpDc2U/9SC+P/97Zt01hy7UTEV0atSZ9BQBIHsdju/6wn7m4+w==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" - } - }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "buffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", - "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "bufferstreams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", - "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=", - "dev": true, - "requires": { - "readable-stream": "^1.0.33" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cached-path-relative": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", - "dev": true - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000832", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000832.tgz", - "integrity": "sha512-WMC2GiGTPxGywFL70h+CnP7GAYo6LM6JSI1sF13vAZfXCzOeunHzl20DpfbDGMdvtT2wpqvabY96MHEp/la+BQ==", - "dev": true - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.0.0.tgz", - "integrity": "sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A==", - "dev": true - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", - "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^1.0.6", - "through2": "^2.0.1" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^3.0.0" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - } - } - }, - "connect-livereload": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.4.1.tgz", - "integrity": "sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "consolidate": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", - "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "conventional-changelog-angular": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.2.tgz", - "integrity": "sha512-yx7m7lVrXmt4nKWQgWZqxSALEiAKZhOAcbxdUaU9575mB0CzXVbgrgpfSnSP7OqWDUTYGD0YVJ0MSRdyOPgAwA==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "q": "^1.5.1" - } - }, - "conventional-changelog-writer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.2.tgz", - "integrity": "sha512-d8/FQY/fix2xXEBUhOo8u3DCbyEw3UOQgYHxLsPDw+wHUDma/GQGAGsGtoH876WyNs32fViHmTOUrgRKVLvBug==", - "dev": true, - "requires": { - "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.1", - "dateformat": "^3.0.0", - "handlebars": "^4.0.2", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.2.1", - "meow": "^4.0.0", - "semver": "^5.5.0", - "split": "^1.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz", - "integrity": "sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A==", - "dev": true, - "requires": { - "is-subset": "^0.1.1", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz", - "integrity": "sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.0", - "lodash": "^4.2.1", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0", - "trim-off-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-1.6.0.tgz", - "integrity": "sha1-8DJLvumXcRAeezraES8xPDk9uO0=", - "dev": true, - "requires": { - "each-props": "^1.2.1", - "is-plain-object": "^2.0.1" - } - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", - "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "create-ecdh": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", - "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true, - "optional": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "dargs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", - "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", - "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", - "dev": true - }, - "deap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz", - "integrity": "sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decomment": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.1.tgz", - "integrity": "sha512-9vwabbCoArDvgbZnFqWcGPVvSIIvWTNu1yaAc3Tg3q5pOzORo6nANO3TPwBuiKwN7stMDZJgNnR6USU3H6EQrQ==", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deepmerge": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.0.0.tgz", - "integrity": "sha512-a8z8bkgHsAML+uHLqmMS83HHlpy3PvZOOuiTQqaa3wu8ZVg3h0hqHk6aCsGdOnZV2XMM/FRimNGjUh0KCcmHBw==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detective": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", - "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.1.tgz", - "integrity": "sha512-UN6X6XwRjllabfRhBdkVSo63uurJ8nSvMGrwl94EYVz6g+exhTV+yVSYk5VC/xl3MBFBTtC0J20uFKce4Brrng==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - } - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "each-props": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz", - "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.44", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.44.tgz", - "integrity": "sha1-72sVCmDVIwgjiMra2ICF7NL9RoQ=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", - "dev": true - }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - } - } - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "env-ci": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.2.0.tgz", - "integrity": "sha512-TFjNiDlXrL8/pfHswdvJGEZzJcq3aBPb8Eka83hlGLwuNw9F9BC9S9ETlkfkItLRT9k5JgpGgeP+rL6/3cEbcw==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "java-properties": "^0.2.9" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.42", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", - "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es5-shim": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.10.tgz", - "integrity": "sha512-vmryBdqKRO8Ei9LJ4yyEk/EOmAOGIagcHDYPpTAi6pot4IMHS1AC2q5cTKPmydpijg2iX8DVmCuqgrNxIWj8Yg==", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", - "dev": true - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", - "dev": true - } - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz", - "integrity": "sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.2", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.6.3.tgz", - "integrity": "sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - }, - "dependencies": { - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "optional": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "optional": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true, - "optional": true - }, - "fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "faye-websocket": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz", - "integrity": "sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=", - "dev": true, - "requires": { - "websocket-driver": ">=0.3.6" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "optional": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - } - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "find-versions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", - "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", - "dev": true, - "requires": { - "array-uniq": "^2.0.0", - "semver-regex": "^2.0.0" - }, - "dependencies": { - "array-uniq": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", - "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", - "dev": true - } - } - }, - "findup-sync": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", - "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", - "dev": true, - "requires": { - "detect-file": "^0.1.0", - "is-glob": "^2.0.1", - "micromatch": "^2.3.7", - "resolve-dir": "^0.1.0" - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - } - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", - "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", - "dev": true - }, - "for-each": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", - "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", - "dev": true, - "requires": { - "is-function": "~1.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", - "dev": true - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "optional": true - } - } - }, - "fs-readfile-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz", - "integrity": "sha1-gAI4I5gfn//+AWCei+Zo9prknnA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", - "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.9.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minipass": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", - "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz", - "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "tar": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", - "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "~0.1.0" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", - "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", - "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - }, - "dependencies": { - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - } - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.0.0.tgz", - "integrity": "sha512-q0qiO/p1w/yJ0hk8V9x1UXlgsXUxlGd0AHUOXZVXBO6aznDtpx7M8D1kBrCAItoPm+4l8r6ATXV1JpjY2SBQOw==", - "dev": true, - "requires": { - "array-union": "^1.0.2", - "dir-glob": "^2.2.1", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "gulp-autoprefixer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-4.1.0.tgz", - "integrity": "sha1-Bkr3PMAsrayP800L+T/9+5TqEqo=", - "dev": true, - "requires": { - "autoprefixer": "^7.0.0", - "fancy-log": "^1.3.2", - "plugin-error": "^0.1.2", - "postcss": "^6.0.1", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - } - } - }, - "gulp-babel": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz", - "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==", - "dev": true, - "requires": { - "babel-core": "^6.23.1", - "object-assign": "^4.0.1", - "plugin-error": "^1.0.1", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - } - } - }, - "gulp-cli": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-1.4.0.tgz", - "integrity": "sha1-b1u+LNC9tISdEs+eEkalhh+LT4g=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "chalk": "^1.1.0", - "copy-props": "^1.4.1", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.3.0", - "lodash.isfunction": "^3.0.8", - "lodash.isplainobject": "^4.0.4", - "lodash.sortby": "^4.5.0", - "matchdep": "^1.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "semver-greatest-satisfied-range": "^1.0.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.9", - "wreck": "^6.3.0", - "yargs": "^3.28.0" - } - }, - "gulp-concat": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", - "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", - "dev": true, - "requires": { - "concat-with-sourcemaps": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulp-debug": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/gulp-debug/-/gulp-debug-3.2.0.tgz", - "integrity": "sha512-2LZzP+ydczqz1rhqq/NYxvVvYTmOa0IgBl2B1sQTdkQgku9ayOUM/KHuGPjF4QA5aO1VcG+Sskw7iCcRUqHKkA==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "fancy-log": "^1.3.2", - "plur": "^2.0.0", - "stringify-object": "^3.0.0", - "through2": "^2.0.0", - "tildify": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "gulp-declare": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gulp-declare/-/gulp-declare-0.3.0.tgz", - "integrity": "sha1-hoMPxvqojgY4IWLIZkuOlJV6/Nk=", - "dev": true, - "requires": { - "nsdeclare": "^0.1.0", - "vinyl-map": "^1.0.1", - "xtend": "^4.0.0" - } - }, - "gulp-delete-lines": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/gulp-delete-lines/-/gulp-delete-lines-0.0.7.tgz", - "integrity": "sha1-USFDQpznrn8uCoown3oPYeoGlVU=", - "dev": true, - "requires": { - "event-stream": "~3.1.0", - "gulp-util": ">=2.2.0" - } - }, - "gulp-handlebars": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp-handlebars/-/gulp-handlebars-4.0.0.tgz", - "integrity": "sha1-tf9GpBl+fMyfJZpQkqLCn0eVOyk=", - "dev": true, - "requires": { - "gulp-util": "^3.0.4", - "handlebars": "^3.0.0", - "through2": "^0.6.3" - }, - "dependencies": { - "handlebars": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.6.tgz", - "integrity": "sha512-LxzdOvkYFsdL6ZT92igXthJIZLYKBSowtrM3oxfMdOwjv0dRWk6EK4PygNgXc0xwjH38BWMCSnktrOpKbec+Qw==", - "dev": true, - "requires": { - "optimist": "^0.6.1", - "source-map": "^0.1.40", - "uglify-js": "^2.6" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-insert": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/gulp-insert/-/gulp-insert-0.5.0.tgz", - "integrity": "sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI=", - "dev": true, - "requires": { - "readable-stream": "^1.0.26-4", - "streamqueue": "0.0.6" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "gulp-jshint": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-2.1.0.tgz", - "integrity": "sha512-sP3NK8Y/1e58O0PH9t6s7DAr/lKDSUbIY207oWSeufM6/VclB7jJrIBcPCsyhrFTCDUl9DauePbt6VqP2vPM5w==", - "dev": true, - "requires": { - "lodash": "^4.12.0", - "minimatch": "^3.0.3", - "plugin-error": "^0.1.2", - "rcloader": "^0.2.2", - "through2": "^2.0.0" - } - }, - "gulp-mocha": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-4.3.1.tgz", - "integrity": "sha1-d5ULQ7z/gWWVdnwHNOD9p9Fz3Nk=", - "dev": true, - "requires": { - "dargs": "^5.1.0", - "execa": "^0.6.0", - "gulp-util": "^3.0.0", - "mocha": "^3.0.0", - "npm-run-path": "^2.0.2", - "through2": "^2.0.3" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "gulp-rename": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true - }, - "gulp-replace": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", - "integrity": "sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=", - "dev": true, - "requires": { - "istextorbinary": "1.0.2", - "readable-stream": "^2.0.1", - "replacestream": "^4.0.0" - } - }, - "gulp-sass": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-3.2.1.tgz", - "integrity": "sha512-UATbRpSDsyXCnpYSPBUEvdvtSEzksJs7/oQ0CujIpzKqKrO6vlnYwhX2UTsGrf4rNLwqlSSaM271It0uHYvJ3Q==", - "dev": true, - "requires": { - "gulp-util": "^3.0", - "lodash.clonedeep": "^4.3.2", - "node-sass": "^4.8.3", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - } - }, - "gulp-sourcemaps": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz", - "integrity": "sha1-y7IAhFCxvM5s0jv5gze+dRv24wo=", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "gulp-strip-comments": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/gulp-strip-comments/-/gulp-strip-comments-2.5.2.tgz", - "integrity": "sha512-lb1bW7rsPWDD8f4ZPSguDvmCdjKmjr5HR4yZb9ros3sLl5AfW7oUj8KzY9/VRisT7dG8dL7hVHzNpQEVxfwZGQ==", - "dev": true, - "requires": { - "decomment": "^0.9.0", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - } - }, - "gulp-uglify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", - "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", - "dev": true, - "requires": { - "deap": "^1.0.0", - "fancy-log": "^1.0.0", - "gulp-util": "^3.0.0", - "isobject": "^2.0.0", - "through2": "^2.0.0", - "uglify-js": "2.6.4", - "uglify-save-license": "^0.4.1", - "vinyl-sourcemaps-apply": "^0.2.0" - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "gulp-webserver": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/gulp-webserver/-/gulp-webserver-0.9.1.tgz", - "integrity": "sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ=", - "dev": true, - "requires": { - "connect": "^3.0.1", - "connect-livereload": "^0.4.0", - "gulp-util": "^2.2.19", - "isarray": "0.0.1", - "node.extend": "^1.0.10", - "open": "^0.0.5", - "proxy-middleware": "^0.5.0", - "serve-index": "^1.1.4", - "serve-static": "^1.3.0", - "through2": "^0.5.1", - "tiny-lr": "0.1.4", - "watch": "^0.11.0" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", - "dev": true, - "requires": { - "chalk": "^0.5.0", - "dateformat": "^1.0.7-1.2.3", - "lodash._reinterpolate": "^2.4.1", - "lodash.template": "^2.4.1", - "minimist": "^0.2.0", - "multipipe": "^0.1.0", - "through2": "^0.5.0", - "vinyl": "^0.2.1" - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", - "dev": true - }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", - "dev": true, - "requires": { - "lodash._escapehtmlchar": "~2.4.1", - "lodash._reunescapedhtml": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", - "dev": true, - "requires": { - "lodash._escapestringchar": "~2.4.1", - "lodash._reinterpolate": "~2.4.1", - "lodash.defaults": "~2.4.1", - "lodash.escape": "~2.4.1", - "lodash.keys": "~2.4.1", - "lodash.templatesettings": "~2.4.1", - "lodash.values": "~2.4.1" - } - }, - "lodash.templatesettings": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~2.4.1", - "lodash.escape": "~2.4.1" - } - }, - "minimist": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", - "dev": true, - "requires": { - "clone-stats": "~0.0.1" - } - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "gulp-wrap": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/gulp-wrap/-/gulp-wrap-0.13.0.tgz", - "integrity": "sha1-kPsLSieiZkM4Mv98YSLbXB7olMY=", - "dev": true, - "requires": { - "consolidate": "^0.14.1", - "es6-promise": "^3.1.2", - "fs-readfile-promise": "^2.0.1", - "gulp-util": "^3.0.3", - "js-yaml": "^3.2.6", - "lodash": "^4.11.1", - "node.extend": "^1.1.2", - "through2": "^2.0.1", - "tryit": "^1.0.1", - "vinyl-bufferstream": "^1.0.1" - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "^1.0.2" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "optional": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hook-std": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.2.0.tgz", - "integrity": "sha512-yntre2dbOAjgQ5yoRykyON0D9T96BfshR8IuiL/r3celeHD8I/76w4qo8m3z99houR4Z678jakV3uXrQdSvW/w==", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz", - "integrity": "sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g=", - "dev": true - }, - "ie-array-find-polyfill": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ie-array-find-polyfill/-/ie-array-find-polyfill-1.1.0.tgz", - "integrity": "sha1-UHjlM/Amgx2iK9dHZRPZRg1loUI=", - "dev": true - }, - "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "individual": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz", - "integrity": "sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "insert-module-globals": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.6.tgz", - "integrity": "sha512-R3sidKJr3SsggqQQ5cEwQb3pWG8RNx0UnpyeiOSR6jorRIeAOzH2gkTWnNdMnyRiVbjrG047K7UCtlMkQ1Mo9w==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "lexical-scope": "^1.2.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - } - } - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "into-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-4.0.0.tgz", - "integrity": "sha512-i29KNyE5r0Y/UQzcQ0IbZO1MYJ53Jn0EcFRZPj5FzWKYH17kDFEOwuA+3jroymOI06SW1dEDnly9A1CAreC5dg==", - "dev": true, - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^2.0.0" - } - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", - "dev": true - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "dev": true, - "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true, - "requires": { - "is-unc-path": "^0.1.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.0" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "issue-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.1.tgz", - "integrity": "sha512-5wdT3EE8Kq38x/hJD8QZCJ9scGoOZ5QnzwXyClkviSWTS+xOCE6hJ0qco3H5n5jCsFqpbofZCcMWqlXJzF72VQ==", - "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "istextorbinary": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", - "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", - "dev": true, - "requires": { - "binaryextensions": "~1.0.0", - "textextensions": "~1.0.0" - } - }, - "java-properties": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", - "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", - "dev": true - }, - "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "jshint": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz", - "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.10", - "minimatch": "~3.0.2", - "phantom": "~4.0.1", - "phantomjs-prebuilt": "~2.1.7", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x", - "unicode-5.2.0": "^0.7.5" - } - }, - "jshint-stylish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.0.1.tgz", - "integrity": "sha1-hFvzg4blVVH/n4QMx3Jfeoi1stQ=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "log-symbols": "^1.0.0", - "plur": "^1.0.0", - "string-length": "^1.0.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.6" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "optional": true - } - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true, - "optional": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.9" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "optional": true - } - } - }, - "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "isarray": "^2.0.4", - "stream-splicer": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", - "dev": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lexical-scope": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", - "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", - "dev": true, - "requires": { - "astw": "^2.0.0" - } - }, - "liftoff": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", - "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^0.4.2", - "fined": "^1.0.1", - "flagged-respawn": "^0.3.2", - "lodash.isplainobject": "^4.0.4", - "lodash.isstring": "^4.0.1", - "lodash.mapvalues": "^4.4.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._escapehtmlchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1" - } - }, - "lodash._escapestringchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._htmlescapes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", - "dev": true - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._reunescapedhtml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1", - "lodash.keys": "~2.4.1" - }, - "dependencies": { - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } - } - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1", - "lodash.keys": "~2.4.1" - }, - "dependencies": { - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } - } - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true - }, - "lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true - }, - "lodash.values": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", - "dev": true, - "requires": { - "lodash.keys": "~2.4.1" - }, - "dependencies": { - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - } - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "^3.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "macos-release": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz", - "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.0.tgz", - "integrity": "sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g==", - "dev": true - }, - "marked-terminal": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.2.0.tgz", - "integrity": "sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.1.0", - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "cli-table": "^0.3.1", - "node-emoji": "^1.4.1", - "supports-hyperlinks": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "matchdep": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-1.0.1.tgz", - "integrity": "sha1-pXozgESR+64girqPaDgEN6vC3KU=", - "dev": true, - "requires": { - "findup-sync": "~0.3.0", - "micromatch": "^2.3.7", - "resolve": "~1.1.6", - "stack-trace": "0.0.9" - }, - "dependencies": { - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - }, - "dependencies": { - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - } - } - }, - "memoizee": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz", - "integrity": "sha512-sprBu6nwxBWBvBOh5v2jcsGqiGLlL2xr2dLub3vR8dnE8YB17omwtm/0NSHl8jjNbcsJd5GMWJAnTSVe/O0Wfg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.30", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.2" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "module-deps": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", - "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "moment": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", - "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "mute-stdout": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", - "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "natives": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", - "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", - "dev": true - }, - "new-from": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/new-from/-/new-from-0.0.3.tgz", - "integrity": "sha1-HErRNhPePhXWMhtw7Vwjk36iXmc=", - "dev": true, - "requires": { - "readable-stream": "~1.1.8" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-emoji": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", - "dev": true, - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", - "dev": true - }, - "node-sass": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", - "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "lodash.mergewith": "^4.6.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.10.0", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "2.87.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "requires": { - "mime-db": "~1.36.0" - } - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - } - } - }, - "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", - "dev": true, - "requires": { - "is": "^3.1.0" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.1.0.tgz", - "integrity": "sha512-X781mkWeK6PDMAZJfGn/wnwil4dV6pIdF9euiNqtA89uJvZuNDJO2YyJxiwpPhTQcF5pYUU1v+kcOxzYV6rZlA==", - "dev": true - }, - "npm": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.6.0.tgz", - "integrity": "sha512-Q6Lb4YPWIGsyVzfxcZrTu6VQcMEvCHOBlSE0fbuNHj6CYCUuanMUf6HgNyj4QekWTORxQpOgOgaca2YEQ721Ug==", - "dev": true, - "requires": { - "JSONStream": "^1.3.5", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "^2.0.0", - "archy": "~1.0.0", - "bin-links": "^1.1.2", - "bluebird": "^3.5.3", - "byte-size": "^5.0.1", - "cacache": "^11.3.2", - "call-limit": "~1.1.0", - "chownr": "^1.1.1", - "ci-info": "^2.0.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.1", - "cmd-shim": "~2.0.2", - "columnify": "~1.5.4", - "config-chain": "^1.1.12", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.0.1", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.7.1", - "iferr": "^1.0.2", - "imurmurhash": "*", - "inflight": "~1.0.6", - "inherits": "~2.0.3", - "ini": "^1.3.5", - "init-package-json": "^1.10.3", - "is-cidr": "^3.0.0", - "json-parse-better-errors": "^1.0.2", - "lazy-property": "~1.0.0", - "libcipm": "^3.0.2", - "libnpm": "^2.0.1", - "libnpmaccess": "*", - "libnpmhook": "^5.0.2", - "libnpmorg": "*", - "libnpmsearch": "*", - "libnpmteam": "*", - "libnpx": "^10.2.0", - "lock-verify": "^2.0.2", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^4.1.5", - "meant": "~1.0.1", - "mississippi": "^3.0.0", - "mkdirp": "~0.5.1", - "move-concurrently": "^1.0.1", - "node-gyp": "^3.8.0", - "nopt": "~4.0.1", - "normalize-package-data": "~2.4.0", - "npm-audit-report": "^1.3.2", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "~3.0.0", - "npm-lifecycle": "^2.1.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.2.0", - "npm-pick-manifest": "^2.2.3", - "npm-profile": "*", - "npm-registry-fetch": "^3.8.0", - "npm-user-validate": "~1.0.0", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "^1.5.1", - "osenv": "^0.1.5", - "pacote": "^9.3.0", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.2.0", - "qw": "~1.0.1", - "read": "~1.0.7", - "read-cmd-shim": "~1.0.1", - "read-installed": "~4.0.3", - "read-package-json": "^2.0.13", - "read-package-tree": "^5.2.1", - "readable-stream": "^3.1.1", - "readdir-scoped-modules": "*", - "request": "^2.88.0", - "retry": "^0.12.0", - "rimraf": "^2.6.3", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "sha": "~2.0.1", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.1", - "stringify-package": "^1.0.0", - "tar": "^4.4.8", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "^1.1.1", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.2", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.6.0", - "write-file-atomic": "^2.3.0" - }, - "dependencies": { - "JSONStream": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "agent-base": { - "version": "4.2.0", - "bundled": true, - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.4.1", - "bundled": true, - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "5.5.2", - "bundled": true, - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-align": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "asap": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "asn1": { - "version": "0.2.4", - "bundled": true, - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "bundled": true, - "dev": true - }, - "aws4": { - "version": "1.8.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bin-links": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "cmd-shim": "^2.0.2", - "gentle-fs": "^2.0.0", - "graceful-fs": "^4.1.11", - "write-file-atomic": "^2.3.0" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.3", - "bundled": true, - "dev": true - }, - "boxen": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "builtins": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "byline": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "byte-size": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "cacache": { - "version": "11.3.2", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "unique-filename": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } - }, - "call-limit": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "chalk": { - "version": "2.4.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "cidr-regex": { - "version": "2.0.10", - "bundled": true, - "dev": true, - "requires": { - "ip-regex": "^2.1.0" - } - }, - "cli-boxes": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "cli-columns": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - } - }, - "cli-table3": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "cmd-shim": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" - } - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "color-convert": { - "version": "1.9.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "colors": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true - }, - "columnify": { - "version": "1.5.4", - "bundled": true, - "dev": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "bundled": true, - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "config-chain": { - "version": "1.1.12", - "bundled": true, - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "cyclist": { - "version": "0.2.2", - "bundled": true, - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true - }, - "defaults": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "detect-newline": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "bundled": true, - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "duplexify": { - "version": "3.6.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "editor": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "encoding": { - "version": "0.1.12", - "bundled": true, - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "err-code": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "errno": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es6-promise": { - "version": "4.2.4", - "bundled": true, - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "execa": { - "version": "0.7.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "figgy-pudding": { - "version": "3.5.1", - "bundled": true, - "dev": true - }, - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "form-data": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs-vacuum": { - "version": "1.2.10", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "genfun": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "gentle-fs": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.2", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true, - "dev": true - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-dirs": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "got": { - "version": "6.7.1", - "bundled": true, - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true, - "dev": true - }, - "http-proxy-agent": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "bundled": true, - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "iferr": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "import-lazy": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true - }, - "init-package-json": { - "version": "1.10.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "ip": { - "version": "1.1.5", - "bundled": true, - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-ci": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "ci-info": "^1.0.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "bundled": true, - "dev": true - } - } - }, - "is-cidr": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "cidr-regex": "^2.0.10" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-redirect": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true, - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true, - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "latest-version": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-property": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "libcipm": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "ini": "^1.3.5", - "lock-verify": "^2.0.2", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^2.0.3", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^9.1.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" - } - }, - "libnpm": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.3", - "find-npm-prefix": "^1.0.2", - "libnpmaccess": "^3.0.1", - "libnpmconfig": "^1.2.1", - "libnpmhook": "^5.0.2", - "libnpmorg": "^1.0.0", - "libnpmpublish": "^1.1.0", - "libnpmsearch": "^2.0.0", - "libnpmteam": "^1.0.1", - "lock-verify": "^2.0.2", - "npm-lifecycle": "^2.1.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "npm-profile": "^4.0.1", - "npm-registry-fetch": "^3.8.0", - "npmlog": "^4.1.2", - "pacote": "^9.2.3", - "read-package-json": "^2.0.13", - "stringify-package": "^1.0.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "libnpmhook": { - "version": "5.0.2", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^3.8.0" - } - } - } - }, - "libnpmaccess": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^3.8.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "libnpmconfig": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "find-up": "^3.0.0", - "ini": "^1.3.5" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "libnpmhook": { - "version": "5.0.2", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^3.8.0" - } - }, - "libnpmorg": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^3.8.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "libnpmpublish": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^3.8.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "libnpmsearch": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^3.8.0" - } - }, - "libnpmteam": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^3.8.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "libnpx": { - "version": "10.2.0", - "bundled": true, - "dev": true, - "requires": { - "dotenv": "^5.0.1", - "npm-package-arg": "^6.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.0", - "update-notifier": "^2.3.0", - "which": "^1.3.0", - "y18n": "^4.0.0", - "yargs": "^11.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lock-verify": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^5.1.2 || 6", - "semver": "^5.4.1" - } - }, - "lockfile": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "requires": { - "signal-exit": "^3.0.2" - } - }, - "lodash._baseindexof": { - "version": "3.1.0", - "bundled": true, - "dev": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0" - } - }, - "lodash._createset": { - "version": "4.0.3", - "bundled": true, - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true, - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "bundled": true, - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "bundled": true, - "dev": true - }, - "lodash.union": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "bundled": true, - "dev": true - }, - "lodash.without": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "make-fetch-happen": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - } - }, - "meant": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "mime-db": { - "version": "1.35.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.19", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "~1.35.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "minizlib": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mississippi": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "move-concurrently": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "bundled": true, - "dev": true - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node-gyp": { - "version": "3.8.0", - "bundled": true, - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - } - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-audit-report": { - "version": "1.3.2", - "bundled": true, - "dev": true, - "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" - } - }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "npm-cache-filename": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "npm-install-checks": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" - } - }, - "npm-lifecycle": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.11", - "node-gyp": "^3.8.0", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "npm-logical-tree": { - "version": "1.2.1", - "bundled": true, - "dev": true - }, - "npm-package-arg": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "2.2.3", - "bundled": true, - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "npm-profile": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.2 || 2", - "figgy-pudding": "^3.4.1", - "npm-registry-fetch": "^3.8.0" - } - }, - "npm-registry-fetch": { - "version": "3.8.0", - "bundled": true, - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", - "npm-package-arg": "^6.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.1", - "bundled": true, - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "package-json": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pacote": { - "version": "9.3.0", - "bundled": true, - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "cacache": "^11.3.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^4.0.1", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^2.2.3", - "npm-registry-fetch": "^3.8.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.8", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "bundled": true, - "dev": true - } - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "read": "1" - } - }, - "proto-list": { - "version": "1.2.4", - "bundled": true, - "dev": true - }, - "protoduck": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "prr": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "psl": { - "version": "1.1.29", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "bundled": true, - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "qs": { - "version": "6.5.2", - "bundled": true, - "dev": true - }, - "query-string": { - "version": "6.2.0", - "bundled": true, - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "strict-uri-encode": "^2.0.0" - } - }, - "qw": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "read": { - "version": "1.0.7", - "bundled": true, - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "read-installed": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - } - }, - "read-package-json": { - "version": "2.0.13", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.2.1", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" - } - }, - "readable-stream": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "bundled": true, - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "request": { - "version": "2.88.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "retry": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-queue": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.1.1" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^5.0.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "sha": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slash": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "smart-buffer": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "socks": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" - } - }, - "socks-proxy-agent": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" - } - }, - "sorted-object": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "sorted-union-stream": { - "version": "2.1.3", - "bundled": true, - "dev": true, - "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" - }, - "dependencies": { - "from2": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" - } - }, - "isarray": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true, - "dev": true - } - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "sshpk": { - "version": "1.14.2", - "bundled": true, - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-iterate": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strict-uri-encode": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-package": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } - }, - "term-size": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "through": { - "version": "2.3.8", - "bundled": true, - "dev": true - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "timed-out": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "bundled": true, - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "umask": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "unzip-response": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "util-extend": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "worker-farm": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "xtend": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "11.0.0", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nsdeclare": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/nsdeclare/-/nsdeclare-0.1.0.tgz", - "integrity": "sha1-ENqhU2QjgtPPLAGpFvTrIKEosZ8=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", - "integrity": "sha1-tTkr7peC2m2ft9avr1OXefEjTCs=", - "dev": true, - "requires": { - "isobject": "^2.1.0" - } - }, - "octokit-pagination-methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", - "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "open": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", - "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true, - "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", - "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", - "dev": true, - "requires": { - "macos-release": "^2.0.0", - "windows-release": "^3.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "outpipe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", - "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", - "dev": true, - "requires": { - "shell-quote": "^1.4.2" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", - "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", - "dev": true, - "requires": { - "p-map": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - }, - "dependencies": { - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - } - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-filepath": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", - "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "dev": true, - "requires": { - "is-absolute": "^0.2.3", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", - "dev": true, - "requires": { - "for-each": "^0.3.2", - "trim": "0.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "phantom": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz", - "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==", - "dev": true, - "optional": true, - "requires": { - "phantomjs-prebuilt": "^2.1.16", - "split": "^1.0.1", - "winston": "^2.4.0" - }, - "dependencies": { - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "optional": true, - "requires": { - "through": "2" - } - } - } - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "dev": true, - "optional": true, - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", - "dev": true, - "optional": true - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - } - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true, - "optional": true - }, - "proxy-middleware": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.5.1.tgz", - "integrity": "sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true, - "optional": true - }, - "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - }, - "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.0.tgz", - "integrity": "sha1-l4IwoValVI9C7vFN4i0PT2EAg9E=", - "dev": true, - "requires": { - "bytes": "1", - "iconv-lite": "0.4.4" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "rcfinder": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", - "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", - "dev": true, - "requires": { - "lodash.clonedeep": "^4.3.2" - } - }, - "rcloader": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.2.2.tgz", - "integrity": "sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc=", - "dev": true, - "requires": { - "lodash.assign": "^4.2.0", - "lodash.isobject": "^3.0.2", - "lodash.merge": "^4.6.0", - "rcfinder": "^0.1.6" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regenerator-transform": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "replacestream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.2.tgz", - "integrity": "sha1-DEFAcH5PAyP1DeBEhRcIz1i8N70=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true, - "optional": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "optional": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "requires": { - "mime-db": "~1.36.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "optional": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "optional": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true, - "optional": true - } - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "optional": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rust-result": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz", - "integrity": "sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=", - "dev": true, - "requires": { - "individual": "^2.0.0" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "safe-json-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz", - "integrity": "sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=", - "dev": true, - "requires": { - "rust-result": "^1.0.0" - } - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "semantic-release": { - "version": "15.13.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.13.3.tgz", - "integrity": "sha512-cax0xPPTtsxHlrty2HxhPql2TTvS74Ni2O8BzwFHxNY/mviVKEhI4OxHzBYJkpVxx1fMVj36+oH7IlP+SJtPNA==", - "dev": true, - "requires": { - "@semantic-release/commit-analyzer": "^6.1.0", - "@semantic-release/error": "^2.2.0", - "@semantic-release/github": "^5.1.0", - "@semantic-release/npm": "^5.0.5", - "@semantic-release/release-notes-generator": "^7.1.2", - "aggregate-error": "^2.0.0", - "cosmiconfig": "^5.0.1", - "debug": "^4.0.0", - "env-ci": "^3.0.0", - "execa": "^1.0.0", - "figures": "^2.0.0", - "find-versions": "^3.0.0", - "get-stream": "^4.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^1.1.0", - "hosted-git-info": "^2.7.1", - "lodash": "^4.17.4", - "marked": "^0.6.0", - "marked-terminal": "^3.2.0", - "p-locate": "^3.0.0", - "p-reduce": "^1.0.0", - "read-pkg-up": "^4.0.0", - "resolve-from": "^4.0.0", - "semver": "^5.4.1", - "signale": "^1.2.1", - "yargs": "^12.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "requires": { - "mime-db": "~1.36.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "signale": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz", - "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "split": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", - "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", - "dev": true - }, - "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.3", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "streamqueue": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/streamqueue/-/streamqueue-0.0.6.tgz", - "integrity": "sha1-ZvX17JTpuK8knkrsLdH3Qb/pTeM=", - "dev": true, - "requires": { - "readable-stream": "^1.0.26-2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.2.tgz", - "integrity": "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^2.0.1", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "supports-hyperlinks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", - "dev": true, - "requires": { - "has-flag": "^2.0.0", - "supports-color": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - } - } - } - } - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", - "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", - "dev": true - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true, - "optional": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, - "timers-ext": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.5.tgz", - "integrity": "sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg==", - "dev": true, - "requires": { - "es5-ext": "~0.10.14", - "next-tick": "1" - } - }, - "tiny-lr": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.1.4.tgz", - "integrity": "sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00=", - "dev": true, - "requires": { - "body-parser": "~1.8.0", - "debug": "~0.8.1", - "faye-websocket": "~0.7.2", - "parseurl": "~1.3.0", - "qs": "~2.2.3" - }, - "dependencies": { - "debug": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", - "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", - "dev": true - }, - "qs": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.5.tgz", - "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=", - "dev": true - } - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", - "dev": true, - "requires": { - "glob": "^6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "tsml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tsml/-/tsml-1.0.1.tgz", - "integrity": "sha1-ifghi52eJX9H1/a1bQHFpNLGj8M=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", - "integrity": "sha1-uTaKWTzG730GReeLL0xky+zQXpA=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.0.9" - }, - "dependencies": { - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", - "dev": true - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "dev": true, - "requires": { - "mime-db": "~1.12.0" - } - } - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-save-license": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", - "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz", - "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==", - "dev": true - }, - "unicode-5.2.0": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz", - "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - }, - "universal-user-agent": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.3.tgz", - "integrity": "sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g==", - "dev": true, - "requires": { - "os-name": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", - "dev": true - }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "video.js": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/video.js/-/video.js-6.9.0.tgz", - "integrity": "sha512-54s7ZZKiY8dTMxBM6IkGMUeG0Yjq8RfyOn7bdU88nL6eWw1I+zLPY4fUVEFwGtxNAzZxGj7VVhVsCM/38QM9GA==", - "dev": true, - "requires": { - "babel-runtime": "^6.9.2", - "global": "4.3.2", - "safe-json-parse": "4.0.0", - "tsml": "1.0.1", - "videojs-font": "2.1.0", - "videojs-ie8": "1.1.2", - "videojs-vtt.js": "0.12.6", - "xhr": "2.4.0" - } - }, - "videojs-font": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-2.1.0.tgz", - "integrity": "sha1-olkwpn9snPvyu4jay4xrRR8JM3k=", - "dev": true - }, - "videojs-ie8": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/videojs-ie8/-/videojs-ie8-1.1.2.tgz", - "integrity": "sha1-oj09hgitcZK2nGB3/E64SJmNNdk=", - "dev": true, - "requires": { - "es5-shim": "^4.5.1" - } - }, - "videojs-vtt.js": { - "version": "0.12.6", - "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz", - "integrity": "sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==", - "dev": true, - "requires": { - "global": "^4.3.1" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", - "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", - "dev": true, - "requires": { - "bl": "^1.2.1", - "through2": "^2.0.3" - } - }, - "vinyl-bufferstream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz", - "integrity": "sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo=", - "dev": true, - "requires": { - "bufferstreams": "1.0.1" - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "vinyl-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vinyl-map/-/vinyl-map-1.0.2.tgz", - "integrity": "sha1-qLKWAl+XP6fK1igXlnpI8dF2v3w=", - "dev": true, - "requires": { - "bl": "^1.1.2", - "new-from": "0.0.3", - "through2": "^0.4.1" - }, - "dependencies": { - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "vinyl-source-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", - "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", - "dev": true, - "requires": { - "through2": "^2.0.3", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - } - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, - "watch": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.11.0.tgz", - "integrity": "sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY=", - "dev": true - }, - "watchify": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.0.tgz", - "integrity": "sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA==", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "browserify": "^16.1.0", - "chokidar": "^1.0.0", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "detective": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", - "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "module-deps": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", - "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", - "dev": true - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "windows-release": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", - "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", - "dev": true, - "requires": { - "execa": "^0.10.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } - } - }, - "winston": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", - "dev": true, - "optional": true, - "requires": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", - "dev": true, - "optional": true - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "wreck": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", - "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", - "dev": true, - "requires": { - "boom": "2.x.x", - "hoek": "2.x.x" - } - }, - "xhr": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.0.tgz", - "integrity": "sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=", - "dev": true, - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "optional": true, - "requires": { - "fd-slicer": "~1.0.1" - } - } - } -} diff --git a/package.json b/package.json index bb08256..6ed48e8 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,31 @@ { "name": "@contently/videojs-annotation-comments", - "version": "1.1.1", + "version": "1.1.4", "description": "A plugin for video.js to add support for timeline moment/range comments and annotations", "repository": "git@github.com:contently/videojs-annotation-comments.git", "main": "build/videojs-annotation-comments.cjs.js", + "style": "build/css/annotations.css", + "files": [ + "build" + ], "scripts": { - "test": "./node_modules/gulp/bin/gulp.js test" + "test": "gulp test", + "watch": "gulp watch", + "build": "gulp build" }, "author": "Evan Carothers (@ecaroth) & Jack Pope (@jackpope)", "copyright": "Copyright Contently, Inc. ", "license": "Apache-2.0", "devDependencies": { - "@semantic-release/changelog": "^3.0.2", + "@semantic-release/changelog": "^3.0.5", + "@semantic-release/git": "^7.0.18", "babel-core": "^6.26.3", "babel-plugin-transform-es2015-modules-simple-commonjs": "^0.3.0", "babel-preset-es2015": "^6.24.1", "babel-preset-es2015-script": "^1.1.0", "babelify": "^7.3.0", - "browserify": "^16.2.3", - "chai": "^4.1.2", + "browserify": "^16.5.0", + "chai": "^4.2.0", "es6-object-assign": "^1.1.0", "gulp": "^3.9.1", "gulp-autoprefixer": "^4.1.0", @@ -32,7 +39,7 @@ "gulp-insert": "^0.5.0", "gulp-jshint": "^2.1.0", "gulp-mocha": "^4.3.1", - "gulp-rename": "^1.2.2", + "gulp-rename": "^1.4.0", "gulp-replace": "^0.5.4", "gulp-sass": "^3.2.1", "gulp-sourcemaps": "^2.6.4", @@ -45,16 +52,20 @@ "ie-array-find-polyfill": "^1.1.0", "jshint": "^2.9.6", "jshint-stylish": "~2.0.1", - "mocha": "^4.0.0", - "moment": "^2.22.1", + "mocha": "^6.2.0", + "moment": "^2.24.0", "pump": "^1.0.3", - "semantic-release": "^15.13.3", - "underscore": "^1.9.0", - "video.js": "^6.9.0", + "semantic-release": "^15.13.21", + "underscore": "^1.9.1", + "video.js": "^7.6.5", "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^1.1.2", "watchify": "^3.11.0" }, + "peerDependencies": { + "jquery": "^3", + "video.js": "^7" + }, "babel": { "presets": [ "es2015" @@ -67,7 +78,21 @@ "@semantic-release/release-notes-generator", "@semantic-release/changelog", "@semantic-release/npm", - "@semantic-release/github" + "@semantic-release/github", + [ + "@semantic-release/git", + { + "assets": [ + "CHANGELOG.md", + "package.json", + "yarn.lock" + ], + "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + } + ] ] + }, + "dependencies": { + "mitt": "^1.2.0" } } diff --git a/src/js/annotation_comments.js b/src/js/annotation_comments.js index e2e877b..711b81e 100644 --- a/src/js/annotation_comments.js +++ b/src/js/annotation_comments.js @@ -31,7 +31,7 @@ module.exports = (videojs) => { options = Object.assign(Utils.cloneObject(DEFAULT_OPTIONS), options); super(player, options); - this.eventDispatcher = new EventDispatcher(this); + this.eventDispatcher = new EventDispatcher(); this.eventDispatcher.registerListenersFor(this, 'AnnotationComments'); this.player = player; @@ -96,6 +96,11 @@ module.exports = (videojs) => { this.eventDispatcher.fire(type, data); } + // A wrapper func to make it easier to listen to API events from the client + registerListener (type, callback) { + this.eventDispatcher.registerListener(type, callback, false); + } + // Toggle annotations mode on/off toggleAnnotationMode() { this.active = !this.active; diff --git a/src/js/lib/event_dispatcher.js b/src/js/lib/event_dispatcher.js index 5a947f8..76d4a48 100644 --- a/src/js/lib/event_dispatcher.js +++ b/src/js/lib/event_dispatcher.js @@ -5,6 +5,7 @@ */ const Logger = require("./logger"); +const mitt = require("mitt"); /* A centralized collection of event callbacks organized by component and name @@ -60,12 +61,12 @@ const EventRegistry = { module.exports = class EventDispatcher { - constructor (plugin) { - this.plugin = plugin; + constructor () { this.pluginReady = false; this.pendingEvts = []; this.registeredListeners = []; this.eventRegistry = EventRegistry; + this.eventEmitter = mitt(); } // Use the EventRegistry to mass register events on each component initialization @@ -86,25 +87,26 @@ module.exports = class EventDispatcher { } } - // Bind a listener to the plugin - registerListener (type, callback) { - this.plugin.on(type, callback); - this.registeredListeners.push(type); + // Bind a listener + // Register internal listeners to make sure callbacks are not duped as modules are reloaded + // register = false for consumer usage with more flexibility + registerListener (type, callback, register = true) { + this.eventEmitter.on(type, callback); + if (register) this.registeredListeners.push(type); } - // Unbind a listener from the plugin + // Unbind a listener unregisterListener (type) { - this.plugin.off(type); + this.eventEmitter.off(type); let i = this.registeredListeners.indexOf(type); this.registeredListeners.splice(i, 1); } - // Trigger an event on the plugin + // Trigger an event fire (type, data) { if(!this.pluginReady) return; Logger.log("evt-dispatch-FIRE", type, data); - let evt = new CustomEvent(type, { 'detail': data }); - this.plugin.trigger(evt); + this.eventEmitter.emit(type, { detail: data }); } teardown () { diff --git a/test/mocha/components/event_dispatcher_test.js b/test/mocha/components/event_dispatcher_test.js index c212688..3a0bce6 100644 --- a/test/mocha/components/event_dispatcher_test.js +++ b/test/mocha/components/event_dispatcher_test.js @@ -3,7 +3,6 @@ const EventDispatcher = require("../../../src/js/lib/event_dispatcher"), expect = require('chai').expect; -const MockedPlugin = { on: (type, callback) => {} }; const MockedEventRegistry = { ClassOne: { myFirstEvent: () => {}, @@ -18,15 +17,14 @@ describe('EventDispatcher', () => { describe('constructor', () => { it('creates an EventDispatcher instance w a listener cache and a plugin reference', () => { - let eventDispatcher = new EventDispatcher(MockedPlugin); - expect(eventDispatcher.plugin).to.deep.equal(MockedPlugin); + let eventDispatcher = new EventDispatcher(); expect(eventDispatcher.registeredListeners).to.be.an("array").that.is.empty; }); }); describe('registerListener', () => { it('caches the type as a registered listener', () => { - let eventDispatcher = new EventDispatcher(MockedPlugin); + let eventDispatcher = new EventDispatcher(); eventDispatcher.registerListener('my-type', (changeMe) => { changeMe = 'changed' }); expect(eventDispatcher.registeredListeners).to.include('my-type'); }); @@ -34,7 +32,7 @@ describe('EventDispatcher', () => { describe('registerListenersFor', () => { it('iterates through the registry and registers listeners based on object type', () => { - let eventDispatcher = new EventDispatcher(MockedPlugin); + let eventDispatcher = new EventDispatcher(); eventDispatcher.eventRegistry = MockedEventRegistry; eventDispatcher.registerListenersFor({}, 'ClassOne'); @@ -47,7 +45,7 @@ describe('EventDispatcher', () => { }); it('does not create duplicate event listeners', () => { - let eventDispatcher = new EventDispatcher(MockedPlugin); + let eventDispatcher = new EventDispatcher(); eventDispatcher.eventRegistry = MockedEventRegistry; eventDispatcher.registerListenersFor({}, 'ClassOne'); diff --git a/test/test_api.html b/test/test_api.html index 744ea37..6dcb403 100644 --- a/test/test_api.html +++ b/test/test_api.html @@ -270,23 +270,23 @@ plugin.fire("destroyComment", {id: id}); }); - plugin.on("annotationOpened", function(event) { + plugin.registerListener("annotationOpened", function(event) { var id = event.detail.annotation.id; $("#annotation-opened-id").html(id); }); - plugin.on("addingAnnotationDataChanged", function(event) { + plugin.registerListener("addingAnnotationDataChanged", function(event) { console.log(event.detail); }); - plugin.on("enteredAddingAnnotation", function(event) { + plugin.registerListener("enteredAddingAnnotation", function(event) { var range = event.detail.range; console.log("Starting add annotation process"); $("#new-annotation-form").removeClass("hidden"); $("#new-annotation-range-start").val(range.start); }); - plugin.on("addingAnnotationDataChanged", function(event) { + plugin.registerListener("addingAnnotationDataChanged", function(event) { if(event.detail.shape) { $("#new-annotation-shape-x1").val(event.detail.shape.x1); $("#new-annotation-shape-x2").val(event.detail.shape.x2); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..2de6955 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,10388 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.4.5": + version "7.5.5" + resolved "https://npm-registry.prod.contently.systems/@babel%2fruntime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" + integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== + dependencies: + regenerator-runtime "^0.13.2" + +"@gulp-sourcemaps/identity-map@1.X": + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/@gulp-sourcemaps%2fidentity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9" + integrity sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ== + dependencies: + acorn "^5.0.3" + css "^2.2.1" + normalize-path "^2.1.1" + source-map "^0.6.0" + through2 "^2.0.3" + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/@gulp-sourcemaps%2fmap-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o= + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://npm-registry.prod.contently.systems/@mrmlnc%2freaddir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://npm-registry.prod.contently.systems/@nodelib%2ffs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@octokit/endpoint@^5.1.0": + version "5.1.8" + resolved "https://npm-registry.prod.contently.systems/@octokit%2fendpoint/-/endpoint-5.1.8.tgz#5c8c204aece0eb6f030df1e97a11b8096ba198b8" + integrity sha512-BVVNVVeVGySIF6nvoaO6AaickboZr7A1O6z1wmnMRslewi6O+KILSp0ZsXbkgLnP8V8pa7WM9+wSYYczIUBm5w== + dependencies: + deepmerge "3.3.0" + is-plain-object "^3.0.0" + universal-user-agent "^2.1.0" + url-template "^2.0.8" + +"@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/@octokit%2frequest-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be" + integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig== + dependencies: + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^4.0.1": + version "4.1.1" + resolved "https://npm-registry.prod.contently.systems/@octokit%2frequest/-/request-4.1.1.tgz#614262214f48417b4d3b14e047d09a9c8e2f7a09" + integrity sha512-LOyL0i3oxRo418EXRSJNk/3Q4I0/NKawTn6H/CQp+wnrG1UFLGu080gSsgnWobhPo5BpUNgSQ5BRk5FOOJhD1Q== + dependencies: + "@octokit/endpoint" "^5.1.0" + "@octokit/request-error" "^1.0.1" + deprecation "^2.0.0" + is-plain-object "^3.0.0" + node-fetch "^2.3.0" + once "^1.4.0" + universal-user-agent "^2.1.0" + +"@octokit/rest@^16.27.0": + version "16.28.2" + resolved "https://npm-registry.prod.contently.systems/@octokit%2frest/-/rest-16.28.2.tgz#3fc3b8700046ab29ab1e2a4bdf49f89e94f7ba27" + integrity sha512-csuYiHvJ1P/GFDadVn0QhwO83R1+YREjcwCY7ZIezB6aJTRIEidJZj+R7gAkUhT687cqYb4cXTZsDVu9F+Fmug== + dependencies: + "@octokit/request" "^4.0.1" + "@octokit/request-error" "^1.0.2" + atob-lite "^2.0.0" + before-after-hook "^1.4.0" + btoa-lite "^1.0.0" + deprecation "^2.0.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + lodash.uniq "^4.5.0" + octokit-pagination-methods "^1.1.0" + once "^1.4.0" + universal-user-agent "^2.0.0" + url-template "^2.0.8" + +"@semantic-release/changelog@^3.0.5": + version "3.0.5" + resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fchangelog/-/changelog-3.0.5.tgz#37423eee40f550acb8e09ff1d951ba79263e3b2d" + integrity sha512-/U44eK5qL2olevbEi+GrJxq1lNGUABChqK58A3SkiDsZS6AoGO8CJHQ7OG0zx+spxwkY4TevZ85Whz/hYyO+5w== + dependencies: + "@semantic-release/error" "^2.1.0" + aggregate-error "^3.0.0" + fs-extra "^8.0.0" + lodash "^4.17.4" + +"@semantic-release/commit-analyzer@^6.1.0": + version "6.2.0" + resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fcommit-analyzer/-/commit-analyzer-6.2.0.tgz#5cd25ce67ba9ba5b46e47457505e63629e186695" + integrity sha512-oUtPydYcbtJsEY6WCPi4wynTgRecK5zCkKaGmHi+9Xl7d6jGf7LomnJCg++6dNF1tyavrbGMSdXTCPH6Dx9LbA== + dependencies: + conventional-changelog-angular "^5.0.0" + conventional-commits-filter "^2.0.0" + conventional-commits-parser "^3.0.0" + debug "^4.0.0" + import-from "^3.0.0" + lodash "^4.17.4" + +"@semantic-release/error@^2.1.0", "@semantic-release/error@^2.2.0": + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/@semantic-release%2ferror/-/error-2.2.0.tgz#ee9d5a09c9969eade1ec864776aeda5c5cddbbf0" + integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg== + +"@semantic-release/git@^7.0.18": + version "7.0.18" + resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fgit/-/git-7.0.18.tgz#f37c076bc094762cb343dab49ab893d31de961e8" + integrity sha512-VwnsGUXpNdvPcsq05BQyLBZxGUlEiJCMKNi8ttLvZZAhjI1mAp9dwypOeyxSJ5eFQ+iGMBLdoKF1LL0pmA/d0A== + dependencies: + "@semantic-release/error" "^2.1.0" + aggregate-error "^3.0.0" + debug "^4.0.0" + dir-glob "^3.0.0" + execa "^3.2.0" + fs-extra "^8.0.0" + globby "^10.0.0" + lodash "^4.17.4" + micromatch "^4.0.0" + p-reduce "^2.0.0" + +"@semantic-release/github@^5.1.0": + version "5.4.0" + resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fgithub/-/github-5.4.0.tgz#b170d1ceb3f682604cb4a2aff39bf5906159c91d" + integrity sha512-qtaV/8xIu2a8jt6lACFps0gVDfJby1h7Ra5On3VF60PkrKft87ru9sywAl9gtTfSfOyUlFaNCNlf3mvDaekpzQ== + dependencies: + "@octokit/rest" "^16.27.0" + "@semantic-release/error" "^2.2.0" + aggregate-error "^3.0.0" + bottleneck "^2.18.1" + debug "^4.0.0" + dir-glob "^2.0.0" + fs-extra "^8.0.0" + globby "^9.0.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + issue-parser "^4.0.0" + lodash "^4.17.4" + mime "^2.4.3" + p-filter "^2.0.0" + p-retry "^4.0.0" + parse-github-url "^1.0.1" + url-join "^4.0.0" + +"@semantic-release/npm@^5.0.5": + version "5.1.9" + resolved "https://npm-registry.prod.contently.systems/@semantic-release%2fnpm/-/npm-5.1.9.tgz#30d775433c91f32d7365382574aeda3b1422a5df" + integrity sha512-Hcwhiu7zC0hD0ZPTkEE5bsK9l0z7Ou+N/mcSpYT1kq96ETMQtyZee0gjxXiAGaIHJ7wlMuUhHbYp7iAaI1965w== + dependencies: + "@semantic-release/error" "^2.2.0" + aggregate-error "^3.0.0" + execa "^1.0.0" + fs-extra "^8.0.0" + lodash "^4.17.4" + nerf-dart "^1.0.0" + normalize-url "^4.0.0" + npm "^6.8.0" + rc "^1.2.8" + read-pkg "^5.0.0" + registry-auth-token "^3.3.1" + +"@semantic-release/release-notes-generator@^7.1.2": + version "7.2.0" + resolved "https://npm-registry.prod.contently.systems/@semantic-release%2frelease-notes-generator/-/release-notes-generator-7.2.0.tgz#d09f9f97a0f33149411c36843d1378d3c290ada8" + integrity sha512-CQAN6ViNL27p0TivCabpuDSjLl9eaP5yHRwSVYLLGg6RXu972PFk3DqOKuMQHsyDAx7wze2vU8qESt6/Mt6AuQ== + dependencies: + conventional-changelog-angular "^5.0.0" + conventional-changelog-writer "^4.0.0" + conventional-commits-filter "^2.0.0" + conventional-commits-parser "^3.0.0" + debug "^4.0.0" + get-stream "^5.0.0" + import-from "^3.0.0" + into-stream "^5.0.0" + lodash "^4.17.4" + +"@types/events@*": + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/@types%2fevents/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://npm-registry.prod.contently.systems/@types%2fglob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://npm-registry.prod.contently.systems/@types%2fminimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "12.0.8" + resolved "https://npm-registry.prod.contently.systems/@types%2fnode/-/node-12.0.8.tgz#551466be11b2adc3f3d47156758f610bd9f6b1d8" + integrity sha512-b8bbUOTwzIY3V5vDTY1fIJ+ePKDUBqt2hC2woVGotdQQhG/2Sh62HOKHrT7ab+VerXAcPyAiTEipPu/FsreUtg== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://npm-registry.prod.contently.systems/@types%2fnormalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/retry@^0.12.0": + version "0.12.0" + resolved "https://npm-registry.prod.contently.systems/@types%2fretry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@videojs/http-streaming@1.10.3": + version "1.10.3" + resolved "https://npm-registry.prod.contently.systems/@videojs%2fhttp-streaming/-/http-streaming-1.10.3.tgz#0c028443b9a3c96da85e5995748ed94280884584" + integrity sha512-fxXtwVrQBdhOFh6GymPAPCb4utCI01Zs5fdyZgtR6FSsaz/zGmnzfNS5GvNjBi/hZviMsbNPFaOTTFMMNLNA3A== + dependencies: + aes-decrypter "3.0.0" + global "^4.3.0" + m3u8-parser "4.3.0" + mpd-parser "0.8.1" + mux.js "5.1.3" + url-toolkit "^2.1.3" + video.js "^6.8.0 || ^7.0.0" + +"@videojs/http-streaming@1.10.6": + version "1.10.6" + resolved "https://npm-registry.prod.contently.systems/@videojs%2fhttp-streaming/-/http-streaming-1.10.6.tgz#a9119b1828b354c5cc17b42ea051cc7bcce2dca0" + integrity sha512-uPBuunHnxWeFRYxRX0j6h1IIWv3+QKvSkZGmW9TvqxWBqeNGSrQymR6tm1nVjQ2HhMVxVphQTUhUTTPDVWqmQg== + dependencies: + aes-decrypter "3.0.0" + global "^4.3.0" + m3u8-parser "4.4.0" + mpd-parser "0.8.1" + mux.js "5.2.1" + url-toolkit "^2.1.3" + video.js "^6.8.0 || ^7.0.0" + +JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: + version "1.3.5" + resolved "https://npm-registry.prod.contently.systems/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1, abbrev@~1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4: + version "1.3.7" + resolved "https://npm-registry.prod.contently.systems/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: + version "1.7.0" + resolved "https://npm-registry.prod.contently.systems/acorn-node/-/acorn-node-1.7.0.tgz#aac6a559d27af6176b076ab6fb13c5974c213e3b" + integrity sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw== + dependencies: + acorn "^6.1.1" + acorn-dynamic-import "^4.0.0" + acorn-walk "^6.1.1" + xtend "^4.0.1" + +acorn-walk@^6.1.1: + version "6.1.1" + resolved "https://npm-registry.prod.contently.systems/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@5.X, acorn@^5.0.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.1.1: + version "6.1.1" + resolved "https://npm-registry.prod.contently.systems/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + +aes-decrypter@3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/aes-decrypter/-/aes-decrypter-3.0.0.tgz#7848a1c145b9fdbf57ae3e2b5b1bc7cf0644a8fb" + integrity sha1-eEihwUW5/b9Xrj4rWxvHzwZEqPs= + dependencies: + commander "^2.9.0" + global "^4.3.2" + pkcs7 "^1.0.2" + +agent-base@4, agent-base@^4.1.0: + version "4.3.0" + resolved "https://npm-registry.prod.contently.systems/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +agent-base@~4.2.1: + version "4.2.1" + resolved "https://npm-registry.prod.contently.systems/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.4.1: + version "3.5.2" + resolved "https://npm-registry.prod.contently.systems/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" + integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" + integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== + dependencies: + clean-stack "^2.0.0" + indent-string "^3.2.0" + +ajv@^6.5.5: + version "6.10.0" + resolved "https://npm-registry.prod.contently.systems/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://npm-registry.prod.contently.systems/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^3.1.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://npm-registry.prod.contently.systems/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://npm-registry.prod.contently.systems/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://npm-registry.prod.contently.systems/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + +ansistyles@~0.1.3: + version "0.1.3" + resolved "https://npm-registry.prod.contently.systems/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1, aproba@^1.1.2: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +"aproba@^1.1.2 || 2", aproba@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +archy@^1.0.0, archy@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://npm-registry.prod.contently.systems/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://npm-registry.prod.contently.systems/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argv-formatter@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" + integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk= + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= + +array-each@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-map@~0.0.0: + version "0.0.0" + resolved "https://npm-registry.prod.contently.systems/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://npm-registry.prod.contently.systems/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://npm-registry.prod.contently.systems/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-union@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-uniq@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/array-uniq/-/array-uniq-2.1.0.tgz#46603d5e28e79bfd02b046fcc1d77c6820bd8e98" + integrity sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ== + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://npm-registry.prod.contently.systems/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@^2.0.0: + version "2.0.6" + resolved "https://npm-registry.prod.contently.systems/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://npm-registry.prod.contently.systems/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://npm-registry.prod.contently.systems/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.4.0: + version "1.5.0" + resolved "https://npm-registry.prod.contently.systems/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://npm-registry.prod.contently.systems/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async@~0.2.6: + version "0.2.10" + resolved "https://npm-registry.prod.contently.systems/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://npm-registry.prod.contently.systems/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= + +atob@^2.1.1: + version "2.1.2" + resolved "https://npm-registry.prod.contently.systems/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^7.0.0: + version "7.2.6" + resolved "https://npm-registry.prod.contently.systems/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc" + integrity sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ== + dependencies: + browserslist "^2.11.3" + caniuse-lite "^1.0.30000805" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.17" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://npm-registry.prod.contently.systems/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://npm-registry.prod.contently.systems/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.14, babel-core@^6.23.1, babel-core@^6.26.0, babel-core@^6.26.3: + version "6.26.3" + resolved "https://npm-registry.prod.contently.systems/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://npm-registry.prod.contently.systems/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://npm-registry.prod.contently.systems/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13: + version "6.22.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13: + version "6.22.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: + version "6.22.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.14.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.14.0, babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.9.0: + version "6.23.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0: + version "6.23.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13: + version "6.22.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-simple-commonjs@^0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-simple-commonjs/-/babel-plugin-transform-es2015-modules-simple-commonjs-0.3.0.tgz#c15ef506967c1ee8b7290cedecdba4af6581ee1e" + integrity sha1-wV71BpZ8Hui3KQzt7Nukr2WB7h4= + dependencies: + babel-plugin-transform-strict-mode "^6.8.0" + babel-runtime "^6.3.19" + babel-template "^6.3.13" + better-log "^1.3.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.9.0: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13: + version "6.22.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0: + version "6.22.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0: + version "6.23.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-regenerator@^6.14.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1, babel-plugin-transform-strict-mode@^6.8.0: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-es2015-script@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/babel-preset-es2015-script/-/babel-preset-es2015-script-1.1.0.tgz#737da39913dcb4500ee4db132c42cd3cf71064e5" + integrity sha1-c32jmRPctFAO5NsTLELNPPcQZOU= + dependencies: + babel-plugin-check-es2015-constants "^6.3.13" + babel-plugin-transform-es2015-arrow-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoping "^6.14.0" + babel-plugin-transform-es2015-classes "^6.14.0" + babel-plugin-transform-es2015-computed-properties "^6.3.13" + babel-plugin-transform-es2015-destructuring "^6.9.0" + babel-plugin-transform-es2015-duplicate-keys "^6.6.0" + babel-plugin-transform-es2015-for-of "^6.6.0" + babel-plugin-transform-es2015-function-name "^6.9.0" + babel-plugin-transform-es2015-literals "^6.3.13" + babel-plugin-transform-es2015-object-super "^6.3.13" + babel-plugin-transform-es2015-parameters "^6.9.0" + babel-plugin-transform-es2015-shorthand-properties "^6.3.13" + babel-plugin-transform-es2015-spread "^6.3.13" + babel-plugin-transform-es2015-sticky-regex "^6.3.13" + babel-plugin-transform-es2015-template-literals "^6.6.0" + babel-plugin-transform-es2015-typeof-symbol "^6.6.0" + babel-plugin-transform-es2015-unicode-regex "^6.3.13" + babel-plugin-transform-regenerator "^6.14.0" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://npm-registry.prod.contently.systems/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + integrity sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk= + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.3.19: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.13: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://npm-registry.prod.contently.systems/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babelify@^7.3.0: + version "7.3.0" + resolved "https://npm-registry.prod.contently.systems/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= + dependencies: + babel-core "^6.0.14" + object-assign "^4.0.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://npm-registry.prod.contently.systems/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://npm-registry.prod.contently.systems/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://npm-registry.prod.contently.systems/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= + +before-after-hook@^1.4.0: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" + integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== + +better-log@^1.3.1: + version "1.3.3" + resolved "https://npm-registry.prod.contently.systems/better-log/-/better-log-1.3.3.tgz#219a1c0383a8f9c4416897eda3acf9b4d6990e8f" + integrity sha1-IZocA4Oo+cRBaJfto6z5tNaZDo8= + +bin-links@^1.1.2: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" + integrity sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg== + dependencies: + bluebird "^3.5.0" + cmd-shim "^2.0.2" + gentle-fs "^2.0.0" + graceful-fs "^4.1.11" + write-file-atomic "^2.3.0" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://npm-registry.prod.contently.systems/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binaryextensions@~1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" + integrity sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U= + +bl@^1.1.2, bl@^1.2.1: + version "1.2.2" + resolved "https://npm-registry.prod.contently.systems/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +block-stream@*: + version "0.0.9" + resolved "https://npm-registry.prod.contently.systems/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: + version "3.5.5" + resolved "https://npm-registry.prod.contently.systems/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://npm-registry.prod.contently.systems/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@~1.8.0: + version "1.8.4" + resolved "https://npm-registry.prod.contently.systems/body-parser/-/body-parser-1.8.4.tgz#d497e04bc13b3f9a8bd8c70bb0cdc16f2e028898" + integrity sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg= + dependencies: + bytes "1.0.0" + depd "0.4.5" + iconv-lite "0.4.4" + media-typer "0.3.0" + on-finished "2.1.0" + qs "2.2.4" + raw-body "1.3.0" + type-is "~1.5.1" + +boom@2.x.x: + version "2.10.1" + resolved "https://npm-registry.prod.contently.systems/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= + dependencies: + hoek "2.x.x" + +bottleneck@^2.18.1: + version "2.19.1" + resolved "https://npm-registry.prod.contently.systems/bottleneck/-/bottleneck-2.19.1.tgz#f7657aed83edff1fa41d438cdbdf3e0931a1d3f0" + integrity sha512-TrdmthuOG5SpYfFQTprSQOtqQUTreAgPkCFfow/aVOnryRRpIwiwfiQmmJUiiHUKgPV7LBNlfGecJ5hCVs30gw== + +boxen@^1.2.1: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://npm-registry.prod.contently.systems/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://npm-registry.prod.contently.systems/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://npm-registry.prod.contently.systems/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-pack@^6.0.1: + version "6.1.0" + resolved "https://npm-registry.prod.contently.systems/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^1.11.0, browser-resolve@^1.7.0: + version "1.11.3" + resolved "https://npm-registry.prod.contently.systems/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://npm-registry.prod.contently.systems/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://npm-registry.prod.contently.systems/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@~0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserify@^16.1.0: + version "16.2.3" + resolved "https://npm-registry.prod.contently.systems/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" + integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp "^0.5.0" + module-deps "^6.0.0" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserify@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.0.tgz#a1c2bc0431bec11fd29151941582e3f645ede881" + integrity sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp "^0.5.0" + module-deps "^6.0.0" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserslist@^2.11.3: + version "2.11.3" + resolved "https://npm-registry.prod.contently.systems/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== + dependencies: + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" + +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^5.0.2: + version "5.2.1" + resolved "https://npm-registry.prod.contently.systems/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +bufferstreams@1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/bufferstreams/-/bufferstreams-1.0.1.tgz#cfb1ad9568d3ba3cfe935ba9abdd952de88aab2a" + integrity sha1-z7GtlWjTujz+k1upq92VLeiKqyo= + dependencies: + readable-stream "^1.0.33" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +byline@^5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" + integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + +byte-size@^5.0.1: + version "5.0.1" + resolved "https://npm-registry.prod.contently.systems/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" + integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== + +bytes@1, bytes@1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g= + +cacache@^11.0.1, cacache@^11.3.2: + version "11.3.3" + resolved "https://npm-registry.prod.contently.systems/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" + integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" + integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + +call-limit@~1.1.0: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" + integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ== + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://npm-registry.prod.contently.systems/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^2.0.0, camelcase@^2.0.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://npm-registry.prod.contently.systems/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805: + version "1.0.30000976" + resolved "https://npm-registry.prod.contently.systems/caniuse-lite/-/caniuse-lite-1.0.30000976.tgz#d30fe12662cb2a21e130d307db9907513ca830a2" + integrity sha512-tleNB1IwPRqZiod6nUNum63xQCMN96BUO2JTeiwuRM7p9d616EHsMBjBWJMudX39qCaPuWY8KEWzMZq7A9XQMQ== + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +cardinal@^2.1.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://npm-registry.prod.contently.systems/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +center-align@^0.1.1: + version "0.1.3" + resolved "https://npm-registry.prod.contently.systems/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai@^4.2.0: + version "4.2.0" + resolved "https://npm-registry.prod.contently.systems/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@^0.5.0: + version "0.5.1" + resolved "https://npm-registry.prod.contently.systems/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1: + version "2.4.2" + resolved "https://npm-registry.prod.contently.systems/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +chokidar@^2.1.1: + version "2.1.6" + resolved "https://npm-registry.prod.contently.systems/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://npm-registry.prod.contently.systems/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cidr-regex@^2.0.10: + version "2.0.10" + resolved "https://npm-registry.prod.contently.systems/cidr-regex/-/cidr-regex-2.0.10.tgz#af13878bd4ad704de77d6dc800799358b3afa70d" + integrity sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q== + dependencies: + ip-regex "^2.1.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://npm-registry.prod.contently.systems/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" + integrity sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA== + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-columns@^3.1.2: + version "3.1.2" + resolved "https://npm-registry.prod.contently.systems/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" + integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4= + dependencies: + string-width "^2.0.0" + strip-ansi "^3.0.1" + +cli-table3@^0.5.0, cli-table3@^0.5.1: + version "0.5.1" + resolved "https://npm-registry.prod.contently.systems/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://npm-registry.prod.contently.systems/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= + dependencies: + colors "1.0.3" + +cli@~1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" + integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ= + dependencies: + exit "0.1.2" + glob "^7.1.1" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.0.3, cliui@^3.2.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= + +clone@^1.0.0, clone@^1.0.2: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.1: + version "2.1.2" + resolved "https://npm-registry.prod.contently.systems/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +cmd-shim@^2.0.2, cmd-shim@~2.0.2: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + integrity sha1-b8vamUg6j9FdfTChlspp1oii79s= + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://npm-registry.prod.contently.systems/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-support@^1.1.3: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colors@1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.1.2: + version "1.3.3" + resolved "https://npm-registry.prod.contently.systems/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + +columnify@~1.5.4: + version "1.5.4" + resolved "https://npm-registry.prod.contently.systems/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://npm-registry.prod.contently.systems/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://npm-registry.prod.contently.systems/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://npm-registry.prod.contently.systems/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.9.0, commander@~2.20.0: + version "2.20.0" + resolved "https://npm-registry.prod.contently.systems/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +compare-func@^1.3.1: + version "1.3.2" + resolved "https://npm-registry.prod.contently.systems/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://npm-registry.prod.contently.systems/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-with-sourcemaps@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" + integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== + dependencies: + source-map "^0.6.1" + +config-chain@^1.1.12: + version "1.1.12" + resolved "https://npm-registry.prod.contently.systems/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://npm-registry.prod.contently.systems/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect-livereload@^0.4.0: + version "0.4.1" + resolved "https://npm-registry.prod.contently.systems/connect-livereload/-/connect-livereload-0.4.1.tgz#0f8a1a816bc9baffae4637ccea917462fe35917a" + integrity sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo= + +connect@^3.0.1: + version "3.7.0" + resolved "https://npm-registry.prod.contently.systems/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-browserify@1.1.x, console-browserify@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +consolidate@^0.14.1: + version "0.14.5" + resolved "https://npm-registry.prod.contently.systems/consolidate/-/consolidate-0.14.5.tgz#5a25047bc76f73072667c8cb52c989888f494c63" + integrity sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM= + dependencies: + bluebird "^3.1.1" + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +conventional-changelog-angular@^5.0.0: + version "5.0.3" + resolved "https://npm-registry.prod.contently.systems/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0" + integrity sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA== + dependencies: + compare-func "^1.3.1" + q "^1.5.1" + +conventional-changelog-writer@^4.0.0: + version "4.0.3" + resolved "https://npm-registry.prod.contently.systems/conventional-changelog-writer/-/conventional-changelog-writer-4.0.3.tgz#916a2b302d0bb5ef18efd236a034c13fb273cde1" + integrity sha512-bIlpSiQtQZ1+nDVHEEh798Erj2jhN/wEjyw9sfxY9es6h7pREE5BNJjfv0hXGH/FTrAsEpHUq4xzK99eePpwuA== + dependencies: + compare-func "^1.3.1" + conventional-commits-filter "^2.0.1" + dateformat "^3.0.0" + handlebars "^4.1.0" + json-stringify-safe "^5.0.1" + lodash "^4.2.1" + meow "^4.0.0" + semver "^5.5.0" + split "^1.0.0" + through2 "^2.0.0" + +conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz#55a135de1802f6510b6758e0a6aa9e0b28618db3" + integrity sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A== + dependencies: + is-subset "^0.1.1" + modify-values "^1.0.0" + +conventional-commits-parser@^3.0.0: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz#fe1c49753df3f98edb2285a5e485e11ffa7f2e4c" + integrity sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.0" + lodash "^4.2.1" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + trim-off-newlines "^1.0.0" + +convert-source-map@1.X, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://npm-registry.prod.contently.systems/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://npm-registry.prod.contently.systems/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-props@^1.4.1: + version "1.6.0" + resolved "https://npm-registry.prod.contently.systems/copy-props/-/copy-props-1.6.0.tgz#f0324bbee99771101e7b3ada112f313c393db8ed" + integrity sha1-8DJLvumXcRAeezraES8xPDk9uO0= + dependencies: + each-props "^1.2.1" + is-plain-object "^2.0.1" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.9" + resolved "https://npm-registry.prod.contently.systems/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.1: + version "5.2.1" + resolved "https://npm-registry.prod.contently.systems/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://npm-registry.prod.contently.systems/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://npm-registry.prod.contently.systems/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://npm-registry.prod.contently.systems/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://npm-registry.prod.contently.systems/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css@2.X, css@^2.2.1: + version "2.2.4" + resolved "https://npm-registry.prod.contently.systems/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://npm-registry.prod.contently.systems/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://npm-registry.prod.contently.systems/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + +d@1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dargs@^5.1.0: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" + integrity sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk= + +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://npm-registry.prod.contently.systems/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://npm-registry.prod.contently.systems/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= + +dateformat@^3.0.0: + version "3.0.3" + resolved "https://npm-registry.prod.contently.systems/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +deap@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/deap/-/deap-1.0.1.tgz#0646e9e1a095ffe8a9e404d68d1f76dcf57e66fb" + integrity sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw== + +debug-fabulous@1.X: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" + integrity sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg== + dependencies: + debug "3.X" + memoizee "0.4.X" + object-assign "4.X" + +debug@2.6.8: + version "2.6.8" + resolved "https://npm-registry.prod.contently.systems/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= + dependencies: + ms "2.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://npm-registry.prod.contently.systems/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.1.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@3.2.6, debug@3.X, debug@^3.1.0, debug@^3.2.6: + version "3.2.6" + resolved "https://npm-registry.prod.contently.systems/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.0: + version "4.1.1" + resolved "https://npm-registry.prod.contently.systems/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@~0.8.1: + version "0.8.1" + resolved "https://npm-registry.prod.contently.systems/debug/-/debug-0.8.1.tgz#20ff4d26f5e422cb68a1bacbbb61039ad8c1c130" + integrity sha1-IP9NJvXkIstoobrLu2EDmtjBwTA= + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decomment@^0.9.0: + version "0.9.2" + resolved "https://npm-registry.prod.contently.systems/decomment/-/decomment-0.9.2.tgz#4dffdfbe96a32b0fdf301f758b7f92f7fbe82ab4" + integrity sha512-sblyUmOJZxiL7oJ2ogJS6jtl/67+CTOW87SrYE/96u3PhDYikYoLCdLzcnceToiQejOLlqNnLCkaxx/+nE/ehg== + dependencies: + esprima "4.0.1" + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://npm-registry.prod.contently.systems/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@3.3.0: + version "3.3.0" + resolved "https://npm-registry.prod.contently.systems/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + +defaults@^1.0.0, defaults@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://npm-registry.prod.contently.systems/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@0.4.5: + version "0.4.5" + resolved "https://npm-registry.prod.contently.systems/depd/-/depd-0.4.5.tgz#1a664b53388b4a6573e8ae67b5f767c693ca97f1" + integrity sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E= + +depd@~1.1.2: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk= + +deprecation@^2.0.0: + version "2.3.1" + resolved "https://npm-registry.prod.contently.systems/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +deps-sort@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" + integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= + dependencies: + JSONStream "^1.0.3" + shasum "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-indent@~5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@2.X, detect-newline@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detective@^5.0.2: + version "5.2.0" + resolved "https://npm-registry.prod.contently.systems/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +dezalgo@^1.0.0, dezalgo@~1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + +diff@3.2.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= + +diff@3.5.0: + version "3.5.0" + resolved "https://npm-registry.prod.contently.systems/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://npm-registry.prod.contently.systems/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0, dir-glob@^2.2.2: + version "2.2.2" + resolved "https://npm-registry.prod.contently.systems/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.0, dir-glob@^3.0.1: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dom-serializer@0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + +domain-browser@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://npm-registry.prod.contently.systems/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domhandler@2.3: + version "2.3.0" + resolved "https://npm-registry.prod.contently.systems/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= + dependencies: + domelementtype "1" + +domutils@1.5: + version "1.5.1" + resolved "https://npm-registry.prod.contently.systems/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://npm-registry.prod.contently.systems/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +dotenv@^5.0.1: + version "5.0.1" + resolved "https://npm-registry.prod.contently.systems/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://npm-registry.prod.contently.systems/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + +duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://npm-registry.prod.contently.systems/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-props@^1.2.1: + version "1.3.2" + resolved "https://npm-registry.prod.contently.systems/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editor@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I= + +ee-first@1.0.5: + version "1.0.5" + resolved "https://npm-registry.prod.contently.systems/ee-first/-/ee-first-1.0.5.tgz#8c9b212898d8cd9f1a9436650ce7be202c9e9ff0" + integrity sha1-jJshKJjYzZ8alDZlDOe+ICyen/A= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.30: + version "1.3.167" + resolved "https://npm-registry.prod.contently.systems/electron-to-chromium/-/electron-to-chromium-1.3.167.tgz#6c22e5384a6b54fb13136ca5b3ade5daac9bf894" + integrity sha512-84IjpeRudjP43Q0+K7tlS7ESoHOl0W6CIdzs5reS9p+sAjCQEDiaAyiXN2v1qLUdL+Of6ZSaH4Cq6bl+sfzy8A== + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://npm-registry.prod.contently.systems/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://npm-registry.prod.contently.systems/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.12" + resolved "https://npm-registry.prod.contently.systems/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://npm-registry.prod.contently.systems/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://npm-registry.prod.contently.systems/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8= + dependencies: + once "~1.3.0" + +entities@1.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= + +entities@^1.1.1: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +env-ci@^4.0.0: + version "4.1.1" + resolved "https://npm-registry.prod.contently.systems/env-ci/-/env-ci-4.1.1.tgz#b8438fc7258a0dc7a4f4c4816de730767946a718" + integrity sha512-eTgpkALDeYRGNhYM2fO9LKsWDifoUgKL7hxpPZqFMP2IU7f+r89DtKqCmk3yQB/jxS8CmZTfKnWO5TiIDFs9Hw== + dependencies: + execa "^1.0.0" + java-properties "^1.0.0" + +err-code@^1.0.0: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + +errno@~0.1.7: + version "0.1.7" + resolved "https://npm-registry.prod.contently.systems/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://npm-registry.prod.contently.systems/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.5.0, es-abstract@^1.5.1: + version "1.13.0" + resolved "https://npm-registry.prod.contently.systems/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.50" + resolved "https://npm-registry.prod.contently.systems/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" + integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://npm-registry.prod.contently.systems/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://npm-registry.prod.contently.systems/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://npm-registry.prod.contently.systems/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://npm-registry.prod.contently.systems/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.2: + version "2.0.3" + resolved "https://npm-registry.prod.contently.systems/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://npm-registry.prod.contently.systems/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima@4.0.1, esprima@^4.0.0, esprima@~4.0.0: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esutils@^2.0.2: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@~1.8.1: + version "1.8.1" + resolved "https://npm-registry.prod.contently.systems/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://npm-registry.prod.contently.systems/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@~3.1.0: + version "3.1.7" + resolved "https://npm-registry.prod.contently.systems/event-stream/-/event-stream-3.1.7.tgz#b4c540012d0fe1498420f3d8946008db6393c37a" + integrity sha1-tMVAAS0P4UmEIPPYlGAI22OTw3o= + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.2" + stream-combiner "~0.0.4" + through "~2.3.1" + +events@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.6.0: + version "0.6.3" + resolved "https://npm-registry.prod.contently.systems/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" + integrity sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://npm-registry.prod.contently.systems/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^3.2.0: + version "3.3.0" + resolved "https://npm-registry.prod.contently.systems/execa/-/execa-3.3.0.tgz#7e348eef129a1937f21ecbbd53390942653522c1" + integrity sha512-j5Vit5WZR/cbHlqU97+qcnw9WHRCIL4V1SVe75VcHcD1JRBdt8fv0zw89b7CQHQdUHTt2VjuhcF5ibAgVOxqpg== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@0.1.2, exit@0.1.x: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://npm-registry.prod.contently.systems/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://npm-registry.prod.contently.systems/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://npm-registry.prod.contently.systems/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://npm-registry.prod.contently.systems/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^0.3.1: + version "0.3.2" + resolved "https://npm-registry.prod.contently.systems/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://npm-registry.prod.contently.systems/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fancy-log@^1.0.0, fancy-log@^1.1.0, fancy-log@^1.3.2: + version "1.3.3" + resolved "https://npm-registry.prod.contently.systems/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://npm-registry.prod.contently.systems/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-glob@^3.0.3: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/fast-glob/-/fast-glob-3.1.0.tgz#77375a7e3e6f6fc9b18f061cddd28b8d1eec75ae" + integrity sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fastq@^1.6.0: + version "1.6.0" + resolved "https://npm-registry.prod.contently.systems/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + +faye-websocket@~0.7.2: + version "0.7.3" + resolved "https://npm-registry.prod.contently.systems/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" + integrity sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE= + dependencies: + websocket-driver ">=0.3.6" + +figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://npm-registry.prod.contently.systems/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" + integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== + dependencies: + escape-string-regexp "^1.0.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://npm-registry.prod.contently.systems/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://npm-registry.prod.contently.systems/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= + +find-npm-prefix@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" + integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA== + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-versions@^3.0.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/find-versions/-/find-versions-3.1.0.tgz#10161f29cf3eb4350dec10a29bdde75bff0df32d" + integrity sha512-NCTfNiVzeE/xL+roNDffGuRbrWI6atI18lTJ22vKp7rs2OhYzMK3W1dIdO2TUndH/QMcacM4d1uWwgcZcHK69Q== + dependencies: + array-uniq "^2.1.0" + semver-regex "^2.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@~0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" + integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY= + dependencies: + glob "~5.0.0" + +fined@^1.0.1: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flat@^4.1.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://npm-registry.prod.contently.systems/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://npm-registry.prod.contently.systems/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://npm-registry.prod.contently.systems/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://npm-registry.prod.contently.systems/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://npm-registry.prod.contently.systems/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" + integrity sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0= + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.10" + +from2@^2.1.0, from2@^2.3.0: + version "2.3.0" + resolved "https://npm-registry.prod.contently.systems/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +from@~0: + version "0.1.7" + resolved "https://npm-registry.prod.contently.systems/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= + +fs-extra@^8.0.0: + version "8.0.1" + resolved "https://npm-registry.prod.contently.systems/fs-extra/-/fs-extra-8.0.1.tgz#90294081f978b1f182f347a440a209154344285b" + integrity sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.6" + resolved "https://npm-registry.prod.contently.systems/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + dependencies: + minipass "^2.2.1" + +fs-readfile-promise@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz#80023823981f9ffffe01609e8be668f69ae49e70" + integrity sha1-gAI4I5gfn//+AWCei+Zo9prknnA= + dependencies: + graceful-fs "^4.1.2" + +fs-vacuum@^1.2.10, fs-vacuum@~1.2.10: + version "1.2.10" + resolved "https://npm-registry.prod.contently.systems/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" + integrity sha1-t2Kb7AekAxolSP35n17PHMizHjY= + dependencies: + graceful-fs "^4.1.2" + path-is-inside "^1.0.1" + rimraf "^2.5.2" + +fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10: + version "1.0.10" + resolved "https://npm-registry.prod.contently.systems/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.9" + resolved "https://npm-registry.prod.contently.systems/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://npm-registry.prod.contently.systems/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://npm-registry.prod.contently.systems/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://npm-registry.prod.contently.systems/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8= + dependencies: + globule "~0.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +genfun@^5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" + integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== + +gentle-fs@^2.0.0, gentle-fs@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/gentle-fs/-/gentle-fs-2.0.1.tgz#585cfd612bfc5cd52471fdb42537f016a5ce3687" + integrity sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew== + dependencies: + aproba "^1.1.2" + fs-vacuum "^1.2.10" + graceful-fs "^4.1.11" + iferr "^0.1.5" + mkdirp "^0.5.1" + path-is-inside "^1.0.2" + read-cmd-shim "^1.0.1" + slide "^1.1.6" + +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://npm-registry.prod.contently.systems/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" + integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://npm-registry.prod.contently.systems/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://npm-registry.prod.contently.systems/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-log-parser@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" + integrity sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo= + dependencies: + argv-formatter "~1.0.0" + spawn-error-forwarder "~1.0.0" + split2 "~1.0.0" + stream-combiner2 "~1.1.1" + through2 "~2.0.0" + traverse "~0.6.6" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://npm-registry.prod.contently.systems/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs= + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://npm-registry.prod.contently.systems/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs= + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://npm-registry.prod.contently.systems/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= + dependencies: + find-index "^0.1.1" + +glob@7.1.1: + version "7.1.1" + resolved "https://npm-registry.prod.contently.systems/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.3: + version "7.1.3" + resolved "https://npm-registry.prod.contently.systems/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^4.3.1: + version "4.5.3" + resolved "https://npm-registry.prod.contently.systems/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.4" + resolved "https://npm-registry.prod.contently.systems/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://npm-registry.prod.contently.systems/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +glob@~5.0.0: + version "5.0.15" + resolved "https://npm-registry.prod.contently.systems/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global@4.3.2, global@~4.3.0: + version "4.3.2" + resolved "https://npm-registry.prod.contently.systems/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +global@^4.3.0, global@^4.3.1, global@^4.3.2: + version "4.4.0" + resolved "https://npm-registry.prod.contently.systems/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^9.18.0: + version "9.18.0" + resolved "https://npm-registry.prod.contently.systems/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globby@^10.0.0: + version "10.0.1" + resolved "https://npm-registry.prod.contently.systems/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22" + integrity sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +globby@^9.0.0: + version "9.2.0" + resolved "https://npm-registry.prod.contently.systems/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +globule@~0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU= + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" + integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== + dependencies: + sparkles "^1.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://npm-registry.prod.contently.systems/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@4.X, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://npm-registry.prod.contently.systems/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://npm-registry.prod.contently.systems/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg= + dependencies: + natives "^1.1.0" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://npm-registry.prod.contently.systems/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +growl@1.10.5: + version "1.10.5" + resolved "https://npm-registry.prod.contently.systems/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +growl@1.9.2: + version "1.9.2" + resolved "https://npm-registry.prod.contently.systems/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= + +gulp-autoprefixer@^4.1.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/gulp-autoprefixer/-/gulp-autoprefixer-4.1.0.tgz#064af73cc02cadac8ff34d0bf93ffdfb94ea12aa" + integrity sha1-Bkr3PMAsrayP800L+T/9+5TqEqo= + dependencies: + autoprefixer "^7.0.0" + fancy-log "^1.3.2" + plugin-error "^0.1.2" + postcss "^6.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-babel@^6.1.3: + version "6.1.3" + resolved "https://npm-registry.prod.contently.systems/gulp-babel/-/gulp-babel-6.1.3.tgz#5aad8acb0db6b7f2f0be19eeee9528f2064df631" + integrity sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ== + dependencies: + babel-core "^6.23.1" + object-assign "^4.0.1" + plugin-error "^1.0.1" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-cli@^1.4.0: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/gulp-cli/-/gulp-cli-1.4.0.tgz#6f5bbe2cd0bdb4849d12cf9e1246a5861f8b4f88" + integrity sha1-b1u+LNC9tISdEs+eEkalhh+LT4g= + dependencies: + archy "^1.0.0" + chalk "^1.1.0" + copy-props "^1.4.1" + fancy-log "^1.1.0" + gulplog "^1.0.0" + interpret "^1.0.0" + liftoff "^2.3.0" + lodash.isfunction "^3.0.8" + lodash.isplainobject "^4.0.4" + lodash.sortby "^4.5.0" + matchdep "^1.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + semver-greatest-satisfied-range "^1.0.0" + tildify "^1.0.0" + v8flags "^2.0.9" + wreck "^6.3.0" + yargs "^3.28.0" + +gulp-concat@^2.6.1: + version "2.6.1" + resolved "https://npm-registry.prod.contently.systems/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" + integrity sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M= + dependencies: + concat-with-sourcemaps "^1.0.0" + through2 "^2.0.0" + vinyl "^2.0.0" + +gulp-debug@^3.2.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/gulp-debug/-/gulp-debug-3.2.0.tgz#45aba4439fa79fe0788f6a411ee0778f4492dfa5" + integrity sha512-2LZzP+ydczqz1rhqq/NYxvVvYTmOa0IgBl2B1sQTdkQgku9ayOUM/KHuGPjF4QA5aO1VcG+Sskw7iCcRUqHKkA== + dependencies: + chalk "^2.3.0" + fancy-log "^1.3.2" + plur "^2.0.0" + stringify-object "^3.0.0" + through2 "^2.0.0" + tildify "^1.1.2" + +gulp-declare@^0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/gulp-declare/-/gulp-declare-0.3.0.tgz#86830fc6faa88e06382162c8664b8e94957afcd9" + integrity sha1-hoMPxvqojgY4IWLIZkuOlJV6/Nk= + dependencies: + nsdeclare "^0.1.0" + vinyl-map "^1.0.1" + xtend "^4.0.0" + +gulp-delete-lines@0.0.7: + version "0.0.7" + resolved "https://npm-registry.prod.contently.systems/gulp-delete-lines/-/gulp-delete-lines-0.0.7.tgz#512143429ce7ae7f2e0a8a309f7a0f61ea069555" + integrity sha1-USFDQpznrn8uCoown3oPYeoGlVU= + dependencies: + event-stream "~3.1.0" + gulp-util ">=2.2.0" + +gulp-handlebars@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/gulp-handlebars/-/gulp-handlebars-4.0.0.tgz#b5ff46a4197e7ccc9f259a5092a2c29f47953b29" + integrity sha1-tf9GpBl+fMyfJZpQkqLCn0eVOyk= + dependencies: + gulp-util "^3.0.4" + handlebars "^3.0.0" + through2 "^0.6.3" + +gulp-insert@^0.5.0: + version "0.5.0" + resolved "https://npm-registry.prod.contently.systems/gulp-insert/-/gulp-insert-0.5.0.tgz#32313f13e4a23cf5acca5ce5f0c080923c778602" + integrity sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI= + dependencies: + readable-stream "^1.0.26-4" + streamqueue "0.0.6" + +gulp-jshint@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/gulp-jshint/-/gulp-jshint-2.1.0.tgz#bfaf927f78eee263c5bbac5f63e314d44a7bd41e" + integrity sha512-sP3NK8Y/1e58O0PH9t6s7DAr/lKDSUbIY207oWSeufM6/VclB7jJrIBcPCsyhrFTCDUl9DauePbt6VqP2vPM5w== + dependencies: + lodash "^4.12.0" + minimatch "^3.0.3" + plugin-error "^0.1.2" + rcloader "^0.2.2" + through2 "^2.0.0" + +gulp-mocha@^4.3.1: + version "4.3.1" + resolved "https://npm-registry.prod.contently.systems/gulp-mocha/-/gulp-mocha-4.3.1.tgz#77950b43bcff816595767c0734e0fda7d173dcd9" + integrity sha1-d5ULQ7z/gWWVdnwHNOD9p9Fz3Nk= + dependencies: + dargs "^5.1.0" + execa "^0.6.0" + gulp-util "^3.0.0" + mocha "^3.0.0" + npm-run-path "^2.0.2" + through2 "^2.0.3" + +gulp-rename@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd" + integrity sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg== + +gulp-replace@^0.5.4: + version "0.5.4" + resolved "https://npm-registry.prod.contently.systems/gulp-replace/-/gulp-replace-0.5.4.tgz#69a67914bbd13c562bff14f504a403796aa0daa9" + integrity sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk= + dependencies: + istextorbinary "1.0.2" + readable-stream "^2.0.1" + replacestream "^4.0.0" + +gulp-sass@^3.2.1: + version "3.2.1" + resolved "https://npm-registry.prod.contently.systems/gulp-sass/-/gulp-sass-3.2.1.tgz#2e3688a96fd8be1c0c01340750c191b2e79fab94" + integrity sha512-UATbRpSDsyXCnpYSPBUEvdvtSEzksJs7/oQ0CujIpzKqKrO6vlnYwhX2UTsGrf4rNLwqlSSaM271It0uHYvJ3Q== + dependencies: + gulp-util "^3.0" + lodash.clonedeep "^4.3.2" + node-sass "^4.8.3" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-sourcemaps@^2.6.4: + version "2.6.5" + resolved "https://npm-registry.prod.contently.systems/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6" + integrity sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg== + dependencies: + "@gulp-sourcemaps/identity-map" "1.X" + "@gulp-sourcemaps/map-sources" "1.X" + acorn "5.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "1.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "~0.6.0" + strip-bom-string "1.X" + through2 "2.X" + +gulp-strip-comments@^2.5.2: + version "2.5.2" + resolved "https://npm-registry.prod.contently.systems/gulp-strip-comments/-/gulp-strip-comments-2.5.2.tgz#d97e1d8b0be205600b1a2923d4f8b6b558bfbfc6" + integrity sha512-lb1bW7rsPWDD8f4ZPSguDvmCdjKmjr5HR4yZb9ros3sLl5AfW7oUj8KzY9/VRisT7dG8dL7hVHzNpQEVxfwZGQ== + dependencies: + decomment "^0.9.0" + plugin-error "^0.1.2" + through2 "^2.0.3" + +gulp-uglify@^1.5.4: + version "1.5.4" + resolved "https://npm-registry.prod.contently.systems/gulp-uglify/-/gulp-uglify-1.5.4.tgz#524788d87666d09f9d0c21fb2177f90039a658c9" + integrity sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk= + dependencies: + deap "^1.0.0" + fancy-log "^1.0.0" + gulp-util "^3.0.0" + isobject "^2.0.0" + through2 "^2.0.0" + uglify-js "2.6.4" + uglify-save-license "^0.4.1" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@>=2.2.0, gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.3, gulp-util@^3.0.4, gulp-util@^3.0.8: + version "3.0.8" + resolved "https://npm-registry.prod.contently.systems/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@^2.2.19: + version "2.2.20" + resolved "https://npm-registry.prod.contently.systems/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw= + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp-webserver@^0.9.1: + version "0.9.1" + resolved "https://npm-registry.prod.contently.systems/gulp-webserver/-/gulp-webserver-0.9.1.tgz#e09992165d97c5865616d642a1601529b0367064" + integrity sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ= + dependencies: + connect "^3.0.1" + connect-livereload "^0.4.0" + gulp-util "^2.2.19" + isarray "0.0.1" + node.extend "^1.0.10" + open "^0.0.5" + proxy-middleware "^0.5.0" + serve-index "^1.1.4" + serve-static "^1.3.0" + through2 "^0.5.1" + tiny-lr "0.1.4" + watch "^0.11.0" + +gulp-wrap@^0.13.0: + version "0.13.0" + resolved "https://npm-registry.prod.contently.systems/gulp-wrap/-/gulp-wrap-0.13.0.tgz#90fb0b4a27a266433832ff7c6122db5c1ee894c6" + integrity sha1-kPsLSieiZkM4Mv98YSLbXB7olMY= + dependencies: + consolidate "^0.14.1" + es6-promise "^3.1.2" + fs-readfile-promise "^2.0.1" + gulp-util "^3.0.3" + js-yaml "^3.2.6" + lodash "^4.11.1" + node.extend "^1.1.2" + through2 "^2.0.1" + tryit "^1.0.1" + vinyl-bufferstream "^1.0.1" + +gulp@^3.9.1: + version "3.9.1" + resolved "https://npm-registry.prod.contently.systems/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= + dependencies: + glogg "^1.0.0" + +handlebars@^3.0.0: + version "3.0.6" + resolved "https://npm-registry.prod.contently.systems/handlebars/-/handlebars-3.0.6.tgz#61cf316cf98395971d38c66523fa530b8a3c7ed2" + integrity sha512-LxzdOvkYFsdL6ZT92igXthJIZLYKBSowtrM3oxfMdOwjv0dRWk6EK4PygNgXc0xwjH38BWMCSnktrOpKbec+Qw== + dependencies: + optimist "^0.6.1" + source-map "^0.1.40" + optionalDependencies: + uglify-js "^2.6" + +handlebars@^4.0.11, handlebars@^4.1.0: + version "4.1.2" + resolved "https://npm-registry.prod.contently.systems/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://npm-registry.prod.contently.systems/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4= + dependencies: + sparkles "^1.0.0" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0, has-unicode@~2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://npm-registry.prod.contently.systems/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://npm-registry.prod.contently.systems/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://npm-registry.prod.contently.systems/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= + +he@1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://npm-registry.prod.contently.systems/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hook-std@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" + integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g== + +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: + version "2.7.1" + resolved "https://npm-registry.prod.contently.systems/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +hosted-git-info@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/hosted-git-info/-/hosted-git-info-3.0.0.tgz#dd8af49cd01e73cc8e61ba13e217a772fd4ecd2d" + integrity sha512-zYSx1cP4MLsvKtTg8DF/PI6e6FHZ3wcawcTGsrLU2TM+UfD4jmSrn2wdQT16TFbH3lO4PIdjLG0E+cuYDgFD9g== + dependencies: + lru-cache "^5.1.1" + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= + +htmlparser2@3.8.x: + version "3.8.3" + resolved "https://npm-registry.prod.contently.systems/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +http-cache-semantics@^3.8.1: + version "3.8.1" + resolved "https://npm-registry.prod.contently.systems/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://npm-registry.prod.contently.systems/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.2" + resolved "https://npm-registry.prod.contently.systems/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://npm-registry.prod.contently.systems/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://npm-registry.prod.contently.systems/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.4: + version "0.4.4" + resolved "https://npm-registry.prod.contently.systems/iconv-lite/-/iconv-lite-0.4.4.tgz#e95f2e41db0735fc21652f7827a5ee32e63c83a8" + integrity sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g= + +iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://npm-registry.prod.contently.systems/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ie-array-find-polyfill@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/ie-array-find-polyfill/-/ie-array-find-polyfill-1.1.0.tgz#5078e533f026831da22bd7476513d9460d65a142" + integrity sha1-UHjlM/Amgx2iK9dHZRPZRg1loUI= + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://npm-registry.prod.contently.systems/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://npm-registry.prod.contently.systems/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +iferr@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d" + integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg== + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.3: + version "4.0.6" + resolved "https://npm-registry.prod.contently.systems/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1: + version "5.1.4" + resolved "https://npm-registry.prod.contently.systems/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0, indent-string@^3.2.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +individual@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97" + integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c= + +inflight@^1.0.4, inflight@~1.0.6: + version "1.0.6" + resolved "https://npm-registry.prod.contently.systems/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://npm-registry.prod.contently.systems/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://npm-registry.prod.contently.systems/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +init-package-json@^1.10.3: + version "1.10.3" + resolved "https://npm-registry.prod.contently.systems/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" + integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw== + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://npm-registry.prod.contently.systems/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= + dependencies: + source-map "~0.5.3" + +insert-module-globals@^7.0.0: + version "7.2.0" + resolved "https://npm-registry.prod.contently.systems/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" + integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + +interpret@^1.0.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +into-stream@^5.0.0: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/into-stream/-/into-stream-5.1.0.tgz#b05f37d8fed05c06a0b43b556d74e53e5af23878" + integrity sha512-cbDhb8qlxKMxPBk/QxTtYg1DQ4CwXmadu7quG3B7nrJsgSncEreF2kwWKZFdnjc/lSNNIkFPsjI7SM0Cx/QXPw== + dependencies: + from2 "^2.3.0" + p-is-promise "^2.0.0" + +invariant@^2.2.2: + version "2.2.4" + resolved "https://npm-registry.prod.contently.systems/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.5: + version "1.1.5" + resolved "https://npm-registry.prod.contently.systems/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +irregular-plurals@^1.0.0: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" + integrity sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y= + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://npm-registry.prod.contently.systems/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.0, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://npm-registry.prod.contently.systems/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@~2.0.3: + version "2.0.3" + resolved "https://npm-registry.prod.contently.systems/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== + +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "https://npm-registry.prod.contently.systems/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-cidr@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/is-cidr/-/is-cidr-3.0.0.tgz#1acf35c9e881063cd5f696d48959b30fed3eed56" + integrity sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q== + dependencies: + cidr-regex "^2.0.10" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://npm-registry.prod.contently.systems/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://npm-registry.prod.contently.systems/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://npm-registry.prod.contently.systems/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-function@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://npm-registry.prod.contently.systems/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0, is-obj@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://npm-registry.prod.contently.systems/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" + integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== + dependencies: + isobject "^4.0.0" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-promise@^2.1: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-subset@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-text-path@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is@^3.2.1: + version "3.3.0" + resolved "https://npm-registry.prod.contently.systems/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" + integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg== + +isarray@0.0.1: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isobject@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +issue-parser@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/issue-parser/-/issue-parser-4.0.0.tgz#397817323abbb70c7c29cea2ff62448cf83b686c" + integrity sha512-1RmmAXHl5+cqTZ9dRr861xWy0Gkc9TWTEklgjKv+nhlB1dY1NmGBV8b20jTWRL5cPGpOIXkz84kEcDBM8Nc0cw== + dependencies: + lodash.capitalize "^4.2.1" + lodash.escaperegexp "^4.1.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.uniqby "^4.7.0" + +istextorbinary@1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" + integrity sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8= + dependencies: + binaryextensions "~1.0.0" + textextensions "~1.0.0" + +java-properties@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/java-properties/-/java-properties-1.0.1.tgz#ea0b5986c0894d73cf2a44de8bd216c459a07a94" + integrity sha512-HbTaaXlIHoDVNXjmp4flOBWOfYBkrVN8dD1tp4m+95M/ADSDW/BxWbiwyVIhw/2+5d0cof4PHZCbE7+S1ukTQw== + +js-base64@^2.1.8: + version "2.5.1" + resolved "https://npm-registry.prod.contently.systems/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@3.13.1, js-yaml@^3.13.1, js-yaml@^3.2.6: + version "3.13.1" + resolved "https://npm-registry.prod.contently.systems/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://npm-registry.prod.contently.systems/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +jshint-stylish@~2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/jshint-stylish/-/jshint-stylish-2.0.1.tgz#845bf38386e55551ff9f840cc7725f7a88b5b2d4" + integrity sha1-hFvzg4blVVH/n4QMx3Jfeoi1stQ= + dependencies: + chalk "^1.0.0" + log-symbols "^1.0.0" + plur "^1.0.0" + string-length "^1.0.0" + text-table "^0.2.0" + +jshint@^2.9.6: + version "2.10.2" + resolved "https://npm-registry.prod.contently.systems/jshint/-/jshint-2.10.2.tgz#ed6626c4f8223c98e94aaea62767435427a49a3d" + integrity sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA== + dependencies: + cli "~1.0.0" + console-browserify "1.1.x" + exit "0.1.x" + htmlparser2 "3.8.x" + lodash "~4.17.11" + minimatch "~3.0.2" + shelljs "0.3.x" + strip-json-comments "1.0.x" + +json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://npm-registry.prod.contently.systems/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://npm-registry.prod.contently.systems/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://npm-registry.prod.contently.systems/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@3.3.2: + version "3.3.2" + resolved "https://npm-registry.prod.contently.systems/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + +json5@^0.5.1: + version "0.5.1" + resolved "https://npm-registry.prod.contently.systems/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://npm-registry.prod.contently.systems/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://npm-registry.prod.contently.systems/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://npm-registry.prod.contently.systems/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +keycode@^2.2.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" + integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://npm-registry.prod.contently.systems/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +labeled-stream-splicer@^2.0.0: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" + integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== + dependencies: + inherits "^2.0.1" + stream-splicer "^2.0.0" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lazy-property@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" + integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc= + +lcid@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +libcipm@^3.0.3: + version "3.0.3" + resolved "https://npm-registry.prod.contently.systems/libcipm/-/libcipm-3.0.3.tgz#2e764effe0b90d458790dab3165794c804075ed3" + integrity sha512-71V5CpTI+zFydTc5IjJ/tx8JHbXEJvmYF2zaSVW1V3X1rRnRjXqh44iuiyry1xgi3ProUQ1vX1uwFiWs00+2og== + dependencies: + bin-links "^1.1.2" + bluebird "^3.5.1" + figgy-pudding "^3.5.1" + find-npm-prefix "^1.0.2" + graceful-fs "^4.1.11" + ini "^1.3.5" + lock-verify "^2.0.2" + mkdirp "^0.5.1" + npm-lifecycle "^2.0.3" + npm-logical-tree "^1.2.1" + npm-package-arg "^6.1.0" + pacote "^9.1.0" + read-package-json "^2.0.13" + rimraf "^2.6.2" + worker-farm "^1.6.0" + +libnpm@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/libnpm/-/libnpm-2.0.1.tgz#a48fcdee3c25e13c77eb7c60a0efe561d7fb0d8f" + integrity sha512-qTKoxyJvpBxHZQB6k0AhSLajyXq9ZE/lUsZzuHAplr2Bpv9G+k4YuYlExYdUCeVRRGqcJt8hvkPh4tBwKoV98w== + dependencies: + bin-links "^1.1.2" + bluebird "^3.5.3" + find-npm-prefix "^1.0.2" + libnpmaccess "^3.0.1" + libnpmconfig "^1.2.1" + libnpmhook "^5.0.2" + libnpmorg "^1.0.0" + libnpmpublish "^1.1.0" + libnpmsearch "^2.0.0" + libnpmteam "^1.0.1" + lock-verify "^2.0.2" + npm-lifecycle "^2.1.0" + npm-logical-tree "^1.2.1" + npm-package-arg "^6.1.0" + npm-profile "^4.0.1" + npm-registry-fetch "^3.8.0" + npmlog "^4.1.2" + pacote "^9.2.3" + read-package-json "^2.0.13" + stringify-package "^1.0.0" + +libnpmaccess@^3.0.1: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/libnpmaccess/-/libnpmaccess-3.0.1.tgz#5b3a9de621f293d425191aa2e779102f84167fa8" + integrity sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA== + dependencies: + aproba "^2.0.0" + get-stream "^4.0.0" + npm-package-arg "^6.1.0" + npm-registry-fetch "^3.8.0" + +libnpmconfig@^1.2.1: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/libnpmconfig/-/libnpmconfig-1.2.1.tgz#c0c2f793a74e67d4825e5039e7a02a0044dfcbc0" + integrity sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA== + dependencies: + figgy-pudding "^3.5.1" + find-up "^3.0.0" + ini "^1.3.5" + +libnpmhook@^5.0.2: + version "5.0.2" + resolved "https://npm-registry.prod.contently.systems/libnpmhook/-/libnpmhook-5.0.2.tgz#d12817b0fb893f36f1d5be20017f2aea25825d94" + integrity sha512-vLenmdFWhRfnnZiNFPNMog6CK7Ujofy2TWiM2CrpZUjBRIhHkJeDaAbJdYCT6W4lcHtyrJR8yXW8KFyq6UAp1g== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpmorg@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/libnpmorg/-/libnpmorg-1.0.0.tgz#979b868c48ba28c5820e3bb9d9e73c883c16a232" + integrity sha512-o+4eVJBoDGMgRwh2lJY0a8pRV2c/tQM/SxlqXezjcAg26Qe9jigYVs+Xk0vvlYDWCDhP0g74J8UwWeAgsB7gGw== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpmpublish@^1.1.0: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/libnpmpublish/-/libnpmpublish-1.1.1.tgz#ff0c6bb0b4ad2bda2ad1f5fba6760a4af37125f0" + integrity sha512-nefbvJd/wY38zdt+b9SHL6171vqBrMtZ56Gsgfd0duEKb/pB8rDT4/ObUQLrHz1tOfht1flt2zM+UGaemzAG5g== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + lodash.clonedeep "^4.5.0" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + npm-registry-fetch "^3.8.0" + semver "^5.5.1" + ssri "^6.0.1" + +libnpmsearch@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/libnpmsearch/-/libnpmsearch-2.0.1.tgz#eccc73a8fbf267d765d18082b85daa2512501f96" + integrity sha512-K0yXyut9MHHCAH+DOiglQCpmBKPZXSUu76+BE2maSEfQN15OwNaA/Aiioe9lRFlVFOr7WcuJCY+VSl+gLi9NTA== + dependencies: + figgy-pudding "^3.5.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpmteam@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/libnpmteam/-/libnpmteam-1.0.1.tgz#ff704b1b6c06ea674b3b1101ac3e305f5114f213" + integrity sha512-gDdrflKFCX7TNwOMX1snWojCoDE5LoRWcfOC0C/fqF7mBq8Uz9zWAX4B2RllYETNO7pBupBaSyBDkTAC15cAMg== + dependencies: + aproba "^2.0.0" + figgy-pudding "^3.4.1" + get-stream "^4.0.0" + npm-registry-fetch "^3.8.0" + +libnpx@^10.2.0: + version "10.2.0" + resolved "https://npm-registry.prod.contently.systems/libnpx/-/libnpx-10.2.0.tgz#1bf4a1c9f36081f64935eb014041da10855e3102" + integrity sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ== + dependencies: + dotenv "^5.0.1" + npm-package-arg "^6.0.0" + rimraf "^2.6.2" + safe-buffer "^5.1.0" + update-notifier "^2.3.0" + which "^1.3.0" + y18n "^4.0.0" + yargs "^11.0.0" + +liftoff@^2.1.0, liftoff@^2.3.0: + version "2.5.0" + resolved "https://npm-registry.prod.contently.systems/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lock-verify@^2.0.2, lock-verify@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/lock-verify/-/lock-verify-2.1.0.tgz#fff4c918b8db9497af0c5fa7f6d71555de3ceb47" + integrity sha512-vcLpxnGvrqisKvLQ2C2v0/u7LVly17ak2YSgoK4PrdsYBXQIax19vhKiLfvKNFx7FRrpTnitrpzF/uuCMuorIg== + dependencies: + npm-package-arg "^6.1.0" + semver "^5.4.1" + +lockfile@^1.0.4: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://npm-registry.prod.contently.systems/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://npm-registry.prod.contently.systems/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + integrity sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg= + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://npm-registry.prod.contently.systems/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0= + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I= + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://npm-registry.prod.contently.systems/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs= + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://npm-registry.prod.contently.systems/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo= + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0= + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI= + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c= + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0, lodash._root@~3.0.0: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://npm-registry.prod.contently.systems/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.capitalize@^4.2.1: + version "4.2.1" + resolved "https://npm-registry.prod.contently.systems/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" + integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= + +lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: + version "4.5.0" + resolved "https://npm-registry.prod.contently.systems/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://npm-registry.prod.contently.systems/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ= + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q= + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://npm-registry.prod.contently.systems/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://npm-registry.prod.contently.systems/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://npm-registry.prod.contently.systems/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + +lodash.isfunction@^3.0.8: + version "3.0.9" + resolved "https://npm-registry.prod.contently.systems/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.isplainobject@^4.0.4, lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://npm-registry.prod.contently.systems/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://npm-registry.prod.contently.systems/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://npm-registry.prod.contently.systems/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= + +lodash.merge@^4.6.0: + version "4.6.1" + resolved "https://npm-registry.prod.contently.systems/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://npm-registry.prod.contently.systems/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://npm-registry.prod.contently.systems/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + +lodash.sortby@^4.5.0: + version "4.7.0" + resolved "https://npm-registry.prod.contently.systems/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0= + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://npm-registry.prod.contently.systems/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://npm-registry.prod.contently.systems/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk= + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://npm-registry.prod.contently.systems/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + +lodash.union@~4.6.0: + version "4.6.0" + resolved "https://npm-registry.prod.contently.systems/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + +lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: + version "4.5.0" + resolved "https://npm-registry.prod.contently.systems/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://npm-registry.prod.contently.systems/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://npm-registry.prod.contently.systems/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ= + dependencies: + lodash.keys "~2.4.1" + +lodash.without@~4.4.0: + version "4.4.0" + resolved "https://npm-registry.prod.contently.systems/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + +lodash@^4.0.0, lodash@^4.11.1, lodash@^4.12.0, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.10, lodash@~4.17.11: + version "4.17.11" + resolved "https://npm-registry.prod.contently.systems/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +lodash@^4.17.15: + version "4.17.15" + resolved "https://npm-registry.prod.contently.systems/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@~1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE= + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +longest@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://npm-registry.prod.contently.systems/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@2: + version "2.7.3" + resolved "https://npm-registry.prod.contently.systems/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= + +lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://npm-registry.prod.contently.systems/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://npm-registry.prod.contently.systems/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-queue@0.1: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + dependencies: + es5-ext "~0.10.2" + +m3u8-parser@4.3.0: + version "4.3.0" + resolved "https://npm-registry.prod.contently.systems/m3u8-parser/-/m3u8-parser-4.3.0.tgz#4b4e988f87b6d8b2401d209a1d17798285a9da04" + integrity sha512-bVbjuBMoVIgFL1vpXVIxjeaoB5TPDJRb0m5qiTdM738SGqv/LAmsnVVPlKjM4fulm/rr1XZsKM+owHm+zvqxYA== + dependencies: + global "^4.3.2" + +m3u8-parser@4.4.0: + version "4.4.0" + resolved "https://npm-registry.prod.contently.systems/m3u8-parser/-/m3u8-parser-4.4.0.tgz#adf606c0af6d97f6750095a42006c2ae03dde177" + integrity sha512-iH2AygTFILtato+XAgnoPYzLHM4R3DjATj7Ozbk7EHdB2XoLF2oyOUguM7Kc4UVHbQHHL/QPaw98r7PbWzG0gg== + dependencies: + global "^4.3.2" + +macos-release@^2.2.0: + version "2.3.0" + resolved "https://npm-registry.prod.contently.systems/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-fetch-happen@^4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" + integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ== + dependencies: + agentkeepalive "^3.4.1" + cacache "^11.0.1" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + lru-cache "^4.1.2" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^6.0.0" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://npm-registry.prod.contently.systems/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://npm-registry.prod.contently.systems/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +marked-terminal@^3.2.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/marked-terminal/-/marked-terminal-3.2.0.tgz#3fc91d54569332bcf096292af178d82219000474" + integrity sha512-Yr1yVS0BbDG55vx7be1D0mdv+jGs9AW563o/Tt/7FTsId2J0yqhrTeXAqq/Q0DyyXltIn6CSxzesQuFqXgafjQ== + dependencies: + ansi-escapes "^3.1.0" + cardinal "^2.1.1" + chalk "^2.4.1" + cli-table "^0.3.1" + node-emoji "^1.4.1" + supports-hyperlinks "^1.0.1" + +marked@^0.7.0: + version "0.7.0" + resolved "https://npm-registry.prod.contently.systems/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" + integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== + +matchdep@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/matchdep/-/matchdep-1.0.1.tgz#a57a33804491fbae208aba8f68380437abc2dca5" + integrity sha1-pXozgESR+64girqPaDgEN6vC3KU= + dependencies: + findup-sync "~0.3.0" + micromatch "^2.3.7" + resolve "~1.1.6" + stack-trace "0.0.9" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://npm-registry.prod.contently.systems/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +meant@~1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" + integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + +mem@^4.0.0: + version "4.3.0" + resolved "https://npm-registry.prod.contently.systems/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memoizee@0.4.X: + version "0.4.14" + resolved "https://npm-registry.prod.contently.systems/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" + integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + dependencies: + d "1" + es5-ext "^0.10.45" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.5" + +meow@^3.3.0, meow@^3.7.0: + version "3.7.0" + resolved "https://npm-registry.prod.contently.systems/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^4.0.0: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" + integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist "^1.1.3" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3: + version "1.2.3" + resolved "https://npm-registry.prod.contently.systems/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + +merge2@^1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://npm-registry.prod.contently.systems/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://npm-registry.prod.contently.systems/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0, micromatch@^4.0.2: + version "4.0.2" + resolved "https://npm-registry.prod.contently.systems/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.40.0: + version "1.40.0" + resolved "https://npm-registry.prod.contently.systems/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + +mime-db@~1.12.0: + version "1.12.0" + resolved "https://npm-registry.prod.contently.systems/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" + integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc= + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.24" + resolved "https://npm-registry.prod.contently.systems/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + +mime-types@~2.0.9: + version "2.0.14" + resolved "https://npm-registry.prod.contently.systems/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" + integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY= + dependencies: + mime-db "~1.12.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://npm-registry.prod.contently.systems/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.3: + version "2.4.4" + resolved "https://npm-registry.prod.contently.systems/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://npm-registry.prod.contently.systems/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://npm-registry.prod.contently.systems/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://npm-registry.prod.contently.systems/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://npm-registry.prod.contently.systems/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784= + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://npm-registry.prod.contently.systems/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.1, minipass@^2.3.5: + version "2.3.5" + resolved "https://npm-registry.prod.contently.systems/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mitt@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://npm-registry.prod.contently.systems/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://npm-registry.prod.contently.systems/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mocha@^3.0.0: + version "3.5.3" + resolved "https://npm-registry.prod.contently.systems/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.8" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + he "1.1.1" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +mocha@^6.2.0: + version "6.2.0" + resolved "https://npm-registry.prod.contently.systems/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" + integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" + mkdirp "0.5.1" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.2.2" + yargs-parser "13.0.0" + yargs-unparser "1.5.0" + +modify-values@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + +module-deps@^6.0.0: + version "6.2.1" + resolved "https://npm-registry.prod.contently.systems/module-deps/-/module-deps-6.2.1.tgz#cfe558784060e926824f474b4e647287837cda50" + integrity sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.2" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.0.2" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +moment@^2.24.0: + version "2.24.0" + resolved "https://npm-registry.prod.contently.systems/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +mpd-parser@0.8.1: + version "0.8.1" + resolved "https://npm-registry.prod.contently.systems/mpd-parser/-/mpd-parser-0.8.1.tgz#db299dbec337999fbbbace989d227c7b03dc8ea7" + integrity sha512-WBTJ1bKk8OLUIxBh6s1ju1e2yz/5CzhPbgi6P3F3kJHKhGy1Z+ElvEnuzEbtC/dnbRcJtMXazE3f93N5LLdp9Q== + dependencies: + global "^4.3.2" + url-toolkit "^2.1.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.0.0, ms@^2.1.1: + version "2.1.2" + resolved "https://npm-registry.prod.contently.systems/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s= + dependencies: + duplexer2 "0.0.2" + +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + +mute-stream@~0.0.4: + version "0.0.8" + resolved "https://npm-registry.prod.contently.systems/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mux.js@5.1.3: + version "5.1.3" + resolved "https://npm-registry.prod.contently.systems/mux.js/-/mux.js-5.1.3.tgz#1a59b8979a6780be5bcb63983c7e883c90cd615b" + integrity sha512-FhDcysLvAkO9H8ftBJ2sK1O4Rmz0AWnMS+2uqP7WjrnaAyE/ox11GEiZkRzrWIdp8at9R9qBHDqdURY3/h/xTg== + +mux.js@5.2.1: + version "5.2.1" + resolved "https://npm-registry.prod.contently.systems/mux.js/-/mux.js-5.2.1.tgz#6698761fc88da5acecea0758ac25f11d3a08bee8" + integrity sha512-1t2payD3Y8izfZRq7tfUQlhL2fKzjeLr9v1/2qNCTkEQnd9Abtn1JgzsBgGZubEXh6lM5L8B0iLGoWQiukjtbQ== + +nan@^2.12.1, nan@^2.13.2: + version "2.14.0" + resolved "https://npm-registry.prod.contently.systems/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://npm-registry.prod.contently.systems/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natives@^1.1.0: + version "1.1.6" + resolved "https://npm-registry.prod.contently.systems/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== + +needle@^2.2.1: + version "2.4.0" + resolved "https://npm-registry.prod.contently.systems/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://npm-registry.prod.contently.systems/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.0: + version "2.6.1" + resolved "https://npm-registry.prod.contently.systems/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nerf-dart@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" + integrity sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo= + +new-from@0.0.3: + version "0.0.3" + resolved "https://npm-registry.prod.contently.systems/new-from/-/new-from-0.0.3.tgz#1c4ad13613de3e15d6321b70ed5c23937ea25e67" + integrity sha1-HErRNhPePhXWMhtw7Vwjk36iXmc= + dependencies: + readable-stream "~1.1.8" + +next-tick@1, next-tick@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://npm-registry.prod.contently.systems/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-emoji@^1.4.1: + version "1.10.0" + resolved "https://npm-registry.prod.contently.systems/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" + integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + dependencies: + lodash.toarray "^4.4.0" + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://npm-registry.prod.contently.systems/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-fetch-npm@^2.0.2: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" + integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + +node-fetch@^2.3.0: + version "2.6.0" + resolved "https://npm-registry.prod.contently.systems/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://npm-registry.prod.contently.systems/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-gyp@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/node-gyp/-/node-gyp-4.0.0.tgz#972654af4e5dd0cd2a19081b4b46fe0442ba6f45" + integrity sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA== + dependencies: + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^4.4.8" + which "1" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://npm-registry.prod.contently.systems/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-sass@^4.8.3: + version "4.12.0" + resolved "https://npm-registry.prod.contently.systems/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" + integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.11" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node.extend@^1.0.10, node.extend@^1.1.2: + version "1.1.8" + resolved "https://npm-registry.prod.contently.systems/node.extend/-/node.extend-1.1.8.tgz#0aab3e63789f4e6d68b42bc00073ad1881243cf0" + integrity sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA== + dependencies: + has "^1.0.3" + is "^3.2.1" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://npm-registry.prod.contently.systems/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@^4.0.1, nopt@~4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://npm-registry.prod.contently.systems/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^4.0.0: + version "4.3.0" + resolved "https://npm-registry.prod.contently.systems/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + +npm-audit-report@^1.3.2: + version "1.3.2" + resolved "https://npm-registry.prod.contently.systems/npm-audit-report/-/npm-audit-report-1.3.2.tgz#303bc78cd9e4c226415076a4f7e528c89fc77018" + integrity sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw== + dependencies: + cli-table3 "^0.5.0" + console-control-strings "^1.1.0" + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://npm-registry.prod.contently.systems/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-cache-filename@~1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" + integrity sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE= + +npm-install-checks@~3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" + integrity sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc= + dependencies: + semver "^2.3.0 || 3.x || 4 || 5" + +npm-lifecycle@^2.0.3, npm-lifecycle@^2.1.0: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/npm-lifecycle/-/npm-lifecycle-2.1.1.tgz#0027c09646f0fd346c5c93377bdaba59c6748fdf" + integrity sha512-+Vg6I60Z75V/09pdcH5iUo/99Q/vop35PaI99elvxk56azSVVsdsSsS/sXqKDNwbRRNN1qSxkcO45ZOu0yOWew== + dependencies: + byline "^5.0.0" + graceful-fs "^4.1.15" + node-gyp "^4.0.0" + resolve-from "^4.0.0" + slide "^1.1.6" + uid-number "0.0.6" + umask "^1.1.0" + which "^1.3.1" + +npm-logical-tree@^1.2.1: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz#44610141ca24664cad35d1e607176193fd8f5b88" + integrity sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg== + +"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: + version "6.1.0" + resolved "https://npm-registry.prod.contently.systems/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" + integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== + dependencies: + hosted-git-info "^2.6.0" + osenv "^0.1.5" + semver "^5.5.0" + validate-npm-package-name "^3.0.0" + +npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.1: + version "1.4.1" + resolved "https://npm-registry.prod.contently.systems/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-pick-manifest@^2.2.3: + version "2.2.3" + resolved "https://npm-registry.prod.contently.systems/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" + integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== + dependencies: + figgy-pudding "^3.5.1" + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-profile@^4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/npm-profile/-/npm-profile-4.0.1.tgz#d350f7a5e6b60691c7168fbb8392c3603583f5aa" + integrity sha512-NQ1I/1Q7YRtHZXkcuU1/IyHeLy6pd+ScKg4+DQHdfsm769TGq6HPrkbuNJVJS4zwE+0mvvmeULzQdWn2L2EsVA== + dependencies: + aproba "^1.1.2 || 2" + figgy-pudding "^3.4.1" + npm-registry-fetch "^3.8.0" + +npm-registry-fetch@^3.8.0, npm-registry-fetch@^3.9.0: + version "3.9.0" + resolved "https://npm-registry.prod.contently.systems/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz#44d841780e2833f06accb34488f8c7450d1a6856" + integrity sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw== + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^4.1.3" + make-fetch-happen "^4.0.1" + npm-package-arg "^6.1.0" + +npm-run-path@^2.0.0, npm-run-path@^2.0.2: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/npm-run-path/-/npm-run-path-4.0.0.tgz#d644ec1bd0569187d2a52909971023a0a58e8438" + integrity sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ== + dependencies: + path-key "^3.0.0" + +npm-user-validate@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" + integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= + +npm@^6.8.0: + version "6.9.0" + resolved "https://npm-registry.prod.contently.systems/npm/-/npm-6.9.0.tgz#5296720486814a64a7fb082de00c4b5cfd11211f" + integrity sha512-91V+zB5hDxO+Jyp2sUKS7juHlIM95dGQxTeQtmZI1nAI/7kjWXFipPrtwwKjhyKmV4GsS2LzJhrxRjGWsU9z/w== + dependencies: + JSONStream "^1.3.5" + abbrev "~1.1.1" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + aproba "^2.0.0" + archy "~1.0.0" + bin-links "^1.1.2" + bluebird "^3.5.3" + byte-size "^5.0.1" + cacache "^11.3.2" + call-limit "~1.1.0" + chownr "^1.1.1" + ci-info "^2.0.0" + cli-columns "^3.1.2" + cli-table3 "^0.5.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "^1.1.12" + detect-indent "~5.0.0" + detect-newline "^2.1.0" + dezalgo "~1.0.3" + editor "~1.0.0" + figgy-pudding "^3.5.1" + find-npm-prefix "^1.0.2" + fs-vacuum "~1.2.10" + fs-write-stream-atomic "~1.0.10" + gentle-fs "^2.0.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + has-unicode "~2.0.1" + hosted-git-info "^2.7.1" + iferr "^1.0.2" + inflight "~1.0.6" + inherits "~2.0.3" + ini "^1.3.5" + init-package-json "^1.10.3" + is-cidr "^3.0.0" + json-parse-better-errors "^1.0.2" + lazy-property "~1.0.0" + libcipm "^3.0.3" + libnpm "^2.0.1" + libnpmhook "^5.0.2" + libnpx "^10.2.0" + lock-verify "^2.1.0" + lockfile "^1.0.4" + lodash._baseuniq "~4.6.0" + lodash.clonedeep "~4.5.0" + lodash.union "~4.6.0" + lodash.uniq "~4.5.0" + lodash.without "~4.4.0" + lru-cache "^4.1.5" + meant "~1.0.1" + mississippi "^3.0.0" + mkdirp "~0.5.1" + move-concurrently "^1.0.1" + node-gyp "^3.8.0" + nopt "~4.0.1" + normalize-package-data "^2.5.0" + npm-audit-report "^1.3.2" + npm-cache-filename "~1.0.2" + npm-install-checks "~3.0.0" + npm-lifecycle "^2.1.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.4.1" + npm-pick-manifest "^2.2.3" + npm-registry-fetch "^3.9.0" + npm-user-validate "~1.0.0" + npmlog "~4.1.2" + once "~1.4.0" + opener "^1.5.1" + osenv "^0.1.5" + pacote "^9.5.0" + path-is-inside "~1.0.2" + promise-inflight "~1.0.1" + qrcode-terminal "^0.12.0" + query-string "^6.2.0" + qw "~1.0.1" + read "~1.0.7" + read-cmd-shim "~1.0.1" + read-installed "~4.0.3" + read-package-json "^2.0.13" + read-package-tree "^5.2.2" + readable-stream "^3.1.1" + request "^2.88.0" + retry "^0.12.0" + rimraf "^2.6.3" + safe-buffer "^5.1.2" + semver "^5.6.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.1" + sorted-union-stream "~2.1.3" + ssri "^6.0.1" + stringify-package "^1.0.0" + tar "^4.4.8" + text-table "~0.2.0" + tiny-relative-date "^1.3.0" + uid-number "0.0.6" + umask "~1.1.0" + unique-filename "^1.1.1" + unpipe "~1.0.0" + update-notifier "^2.5.0" + uuid "^3.3.2" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "~3.0.0" + which "^1.3.1" + worker-farm "^1.6.0" + write-file-atomic "^2.4.2" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2: + version "4.1.2" + resolved "https://npm-registry.prod.contently.systems/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nsdeclare@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/nsdeclare/-/nsdeclare-0.1.0.tgz#10daa153642382d3cf2c01a916f4eb20a128b19f" + integrity sha1-ENqhU2QjgtPPLAGpFvTrIKEosZ8= + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://npm-registry.prod.contently.systems/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://npm-registry.prod.contently.systems/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@4.X, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://npm-registry.prod.contently.systems/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://npm-registry.prod.contently.systems/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@4.1.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://npm-registry.prod.contently.systems/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +octokit-pagination-methods@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" + integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== + +on-finished@2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/on-finished/-/on-finished-2.1.0.tgz#0c539f09291e8ffadde0c8a25850fb2cedc7022d" + integrity sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0= + dependencies: + ee-first "1.0.5" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://npm-registry.prod.contently.systems/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://npm-registry.prod.contently.systems/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +open@^0.0.5: + version "0.0.5" + resolved "https://npm-registry.prod.contently.systems/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw= + +opener@^1.5.1: + version "1.5.1" + resolved "https://npm-registry.prod.contently.systems/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +optimist@^0.6.1: + version "0.6.1" + resolved "https://npm-registry.prod.contently.systems/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://npm-registry.prod.contently.systems/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4= + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= + +os-browserify@~0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-name@^3.0.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0, osenv@^0.1.4, osenv@^0.1.5: + version "0.1.5" + resolved "https://npm-registry.prod.contently.systems/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +outpipe@^1.1.0: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= + dependencies: + shell-quote "^1.4.2" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-filter@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-finally@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" + integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.0.0, p-locate@^4.1.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-reduce@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-retry@^4.0.0: + version "4.1.0" + resolved "https://npm-registry.prod.contently.systems/p-retry/-/p-retry-4.1.0.tgz#9ce7cef2069e84bf590df3b8ec18d740109338d6" + integrity sha512-oepllyG9gX1qH4Sm20YAKxg1GA7L7puhvGnTfimi31P07zSIj7SDV6YtuAx9nbJF51DES+2CIIRkXs8GKqWJxA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pacote@^9.1.0, pacote@^9.2.3, pacote@^9.5.0: + version "9.5.1" + resolved "https://npm-registry.prod.contently.systems/pacote/-/pacote-9.5.1.tgz#adb0d23daeef6d0b813ab5891d0c6459ccec998d" + integrity sha512-Zqvczvf/zZ7QNosdE9uTC7SRuvSs9tFqRkF6cJl+2HH7COBnx4BRAGpeXJlrbN+mM0CMHpbi620xdEHhCflghA== + dependencies: + bluebird "^3.5.3" + cacache "^11.3.2" + figgy-pudding "^3.5.1" + get-stream "^4.1.0" + glob "^7.1.3" + lru-cache "^5.1.1" + make-fetch-happen "^4.0.1" + minimatch "^3.0.4" + minipass "^2.3.5" + mississippi "^3.0.0" + mkdirp "^0.5.1" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.1.12" + npm-pick-manifest "^2.2.3" + npm-registry-fetch "^3.8.0" + osenv "^0.1.5" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^5.0.1" + rimraf "^2.6.2" + safe-buffer "^5.1.2" + semver "^5.6.0" + ssri "^6.0.1" + tar "^4.4.8" + unique-filename "^1.1.1" + which "^1.3.1" + +pako@~1.0.5: + version "1.0.10" + resolved "https://npm-registry.prod.contently.systems/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0: + version "5.1.4" + resolved "https://npm-registry.prod.contently.systems/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-github-url@^1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" + integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://npm-registry.prod.contently.systems/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-headers@^2.0.0: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34" + integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg== + dependencies: + for-each "^0.3.3" + string.prototype.trim "^1.1.2" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseurl@~1.3.0, parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://npm-registry.prod.contently.systems/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@~0.0.0: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" + integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://npm-registry.prod.contently.systems/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://npm-registry.prod.contently.systems/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://npm-registry.prod.contently.systems/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= + dependencies: + through "~2.3" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://npm-registry.prod.contently.systems/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.5: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" + integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://npm-registry.prod.contently.systems/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://npm-registry.prod.contently.systems/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkcs7@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/pkcs7/-/pkcs7-1.0.2.tgz#b6dba527528c2942bfc122ce2dafcdb5e59074e7" + integrity sha1-ttulJ1KMKUK/wSLOLa/NteWQdOc= + +pkg-conf@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +plur@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" + integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= + +plur@^2.0.0: + version "2.1.2" + resolved "https://npm-registry.prod.contently.systems/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" + integrity sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo= + dependencies: + irregular-plurals "^1.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-value-parser@^3.2.3: + version "3.3.1" + resolved "https://npm-registry.prod.contently.systems/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss@^6.0.1, postcss@^6.0.17: + version "6.0.23" + resolved "https://npm-registry.prod.contently.systems/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://npm-registry.prod.contently.systems/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10, process@~0.11.0: + version "0.11.10" + resolved "https://npm-registry.prod.contently.systems/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +process@~0.5.1: + version "0.5.2" + resolved "https://npm-registry.prod.contently.systems/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= + +promise-inflight@^1.0.1, promise-inflight@~1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + +promzard@^0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= + dependencies: + read "1" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://npm-registry.prod.contently.systems/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +protoduck@^5.0.1: + version "5.0.1" + resolved "https://npm-registry.prod.contently.systems/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" + integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== + dependencies: + genfun "^5.0.0" + +proxy-middleware@^0.5.0: + version "0.5.1" + resolved "https://npm-registry.prod.contently.systems/proxy-middleware/-/proxy-middleware-0.5.1.tgz#da24d5d58c1ddf13dad237c7eca503849eaea903" + integrity sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM= + +prr@~1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.1.33" + resolved "https://npm-registry.prod.contently.systems/psl/-/psl-1.1.33.tgz#5533d9384ca7aab86425198e10e8053ebfeab661" + integrity sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://npm-registry.prod.contently.systems/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://npm-registry.prod.contently.systems/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://npm-registry.prod.contently.systems/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.3.2, punycode@^1.4.1: + version "1.4.1" + resolved "https://npm-registry.prod.contently.systems/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.5.1: + version "1.5.1" + resolved "https://npm-registry.prod.contently.systems/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qrcode-terminal@^0.12.0: + version "0.12.0" + resolved "https://npm-registry.prod.contently.systems/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" + integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== + +qs@2.2.4: + version "2.2.4" + resolved "https://npm-registry.prod.contently.systems/qs/-/qs-2.2.4.tgz#2e9fbcd34b540e3421c924ecd01e90aa975319c8" + integrity sha1-Lp+800tUDjQhySTs0B6QqpdTGcg= + +qs@~2.2.3: + version "2.2.5" + resolved "https://npm-registry.prod.contently.systems/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" + integrity sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw= + +qs@~6.5.2: + version "6.5.2" + resolved "https://npm-registry.prod.contently.systems/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^6.2.0: + version "6.8.1" + resolved "https://npm-registry.prod.contently.systems/query-string/-/query-string-6.8.1.tgz#62c54a7ef37d01b538c8fd56f95740c81d438a26" + integrity sha512-g6y0Lbq10a5pPQpjlFuojfMfV1Pd2Jw9h75ypiYPPia3Gcq2rgkKiIwbkS6JxH7c5f5u/B/sB+d13PU+g1eu4Q== + dependencies: + decode-uri-component "^0.2.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + +qw@~1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/qw/-/qw-1.0.1.tgz#efbfdc740f9ad054304426acb183412cc8b996d4" + integrity sha1-77/cdA+a0FQwRCassYNBLMi5ltQ= + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://npm-registry.prod.contently.systems/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://npm-registry.prod.contently.systems/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/raw-body/-/raw-body-1.3.0.tgz#978230a156a5548f42eef14de22d0f4f610083d1" + integrity sha1-l4IwoValVI9C7vFN4i0PT2EAg9E= + dependencies: + bytes "1" + iconv-lite "0.4.4" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: + version "1.2.8" + resolved "https://npm-registry.prod.contently.systems/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +rcfinder@^0.1.6: + version "0.1.9" + resolved "https://npm-registry.prod.contently.systems/rcfinder/-/rcfinder-0.1.9.tgz#f3e80f387ddf9ae80ae30a4100329642eae81115" + integrity sha1-8+gPOH3fmugK4wpBADKWQuroERU= + dependencies: + lodash.clonedeep "^4.3.2" + +rcloader@^0.2.2: + version "0.2.2" + resolved "https://npm-registry.prod.contently.systems/rcloader/-/rcloader-0.2.2.tgz#58d2298b462d0b9bfd2133d2a1ec74fbd705c717" + integrity sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc= + dependencies: + lodash.assign "^4.2.0" + lodash.isobject "^3.0.2" + lodash.merge "^4.6.0" + rcfinder "^0.1.6" + +read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + integrity sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs= + dependencies: + graceful-fs "^4.1.2" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://npm-registry.prod.contently.systems/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + integrity sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc= + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= + dependencies: + readable-stream "^2.0.2" + +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13: + version "2.0.13" + resolved "https://npm-registry.prod.contently.systems/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a" + integrity sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg== + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.1" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@^5.2.2: + version "5.2.2" + resolved "https://npm-registry.prod.contently.systems/read-package-tree/-/read-package-tree-5.2.2.tgz#4b6a0ef2d943c1ea36a578214c9a7f6b7424f7a8" + integrity sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^6.0.0: + version "6.0.0" + resolved "https://npm-registry.prod.contently.systems/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" + integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== + dependencies: + find-up "^4.0.0" + read-pkg "^5.1.1" + type-fest "^0.5.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.0.0, read-pkg@^5.1.1: + version "5.1.1" + resolved "https://npm-registry.prod.contently.systems/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" + integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^4.0.0" + type-fest "^0.4.1" + +read@1, read@~1.0.1, read@~1.0.7: + version "1.0.7" + resolved "https://npm-registry.prod.contently.systems/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@1.1: + version "1.1.13" + resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: + version "1.0.34" + resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^1.0.26-2, readable-stream@^1.0.26-4, readable-stream@^1.0.33, readable-stream@~1.1.10, readable-stream@~1.1.8, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://npm-registry.prod.contently.systems/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://npm-registry.prod.contently.systems/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://npm-registry.prod.contently.systems/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redent@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= + dependencies: + esprima "~4.0.0" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://npm-registry.prod.contently.systems/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://npm-registry.prod.contently.systems/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://npm-registry.prod.contently.systems/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://npm-registry.prod.contently.systems/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1, registry-auth-token@^3.3.1: + version "3.4.0" + resolved "https://npm-registry.prod.contently.systems/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://npm-registry.prod.contently.systems/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://npm-registry.prod.contently.systems/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://npm-registry.prod.contently.systems/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +replacestream@^4.0.0: + version "4.0.3" + resolved "https://npm-registry.prod.contently.systems/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" + integrity sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA== + dependencies: + escape-string-regexp "^1.0.3" + object-assign "^4.0.1" + readable-stream "^2.0.2" + +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://npm-registry.prod.contently.systems/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7, resolve@~1.1.6: + version "1.1.7" + resolved "https://npm-registry.prod.contently.systems/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.4.0: + version "1.11.1" + resolved "https://npm-registry.prod.contently.systems/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://npm-registry.prod.contently.systems/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.10.0: + version "0.10.1" + resolved "https://npm-registry.prod.contently.systems/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + +retry@^0.12.0: + version "0.12.0" + resolved "https://npm-registry.prod.contently.systems/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +reusify@^1.0.0: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +right-align@^0.1.1: + version "0.1.3" + resolved "https://npm-registry.prod.contently.systems/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.6.3" + resolved "https://npm-registry.prod.contently.systems/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://npm-registry.prod.contently.systems/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rust-result@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72" + integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I= + dependencies: + individual "^2.0.0" + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://npm-registry.prod.contently.systems/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-json-parse@4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac" + integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw= + dependencies: + rust-result "^1.0.0" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://npm-registry.prod.contently.systems/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://npm-registry.prod.contently.systems/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://npm-registry.prod.contently.systems/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://npm-registry.prod.contently.systems/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +semantic-release@^15.13.21: + version "15.13.21" + resolved "https://npm-registry.prod.contently.systems/semantic-release/-/semantic-release-15.13.21.tgz#d021c75f889cff75ae3410736942bee6c4557da7" + integrity sha512-3S9thQas28iv3NeHUqQVsDnxMcBGQICdxabeNnJ8BnbRBvCkgqCg3v9zo/+O5a8GCyxrgjtwJ2iWozL8SiIq1w== + dependencies: + "@semantic-release/commit-analyzer" "^6.1.0" + "@semantic-release/error" "^2.2.0" + "@semantic-release/github" "^5.1.0" + "@semantic-release/npm" "^5.0.5" + "@semantic-release/release-notes-generator" "^7.1.2" + aggregate-error "^3.0.0" + cosmiconfig "^5.0.1" + debug "^4.0.0" + env-ci "^4.0.0" + execa "^1.0.0" + figures "^3.0.0" + find-versions "^3.0.0" + get-stream "^5.0.0" + git-log-parser "^1.2.0" + hook-std "^2.0.0" + hosted-git-info "^3.0.0" + lodash "^4.17.15" + marked "^0.7.0" + marked-terminal "^3.2.0" + p-locate "^4.0.0" + p-reduce "^2.0.0" + read-pkg-up "^6.0.0" + resolve-from "^5.0.0" + semver "^6.0.0" + signale "^1.2.1" + yargs "^13.1.0" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +semver-greatest-satisfied-range@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + +semver-regex@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== + +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://npm-registry.prod.contently.systems/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^4.1.0: + version "4.3.6" + resolved "https://npm-registry.prod.contently.systems/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= + +semver@^5.7.0: + version "5.7.1" + resolved "https://npm-registry.prod.contently.systems/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0: + version "6.1.1" + resolved "https://npm-registry.prod.contently.systems/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + +semver@~5.3.0: + version "5.3.0" + resolved "https://npm-registry.prod.contently.systems/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.17.1: + version "0.17.1" + resolved "https://npm-registry.prod.contently.systems/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://npm-registry.prod.contently.systems/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= + +serve-index@^1.1.4: + version "1.9.1" + resolved "https://npm-registry.prod.contently.systems/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@^1.3.0: + version "1.14.1" + resolved "https://npm-registry.prod.contently.systems/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://npm-registry.prod.contently.systems/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.11" + resolved "https://npm-registry.prod.contently.systems/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sha@~2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" + integrity sha1-YDCCL70smCOUn49y7WQR7lzyWq4= + dependencies: + graceful-fs "^4.1.2" + readable-stream "^2.0.2" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.4.2, shell-quote@^1.6.1: + version "1.6.1" + resolved "https://npm-registry.prod.contently.systems/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shelljs@0.3.x: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" + integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +signale@^1.2.1: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" + integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== + dependencies: + chalk "^2.3.2" + figures "^2.0.0" + pkg-conf "^2.1.0" + +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +slash@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: + version "1.1.6" + resolved "https://npm-registry.prod.contently.systems/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +smart-buffer@4.0.2: + version "4.0.2" + resolved "https://npm-registry.prod.contently.systems/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d" + integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://npm-registry.prod.contently.systems/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socks-proxy-agent@^4.0.0: + version "4.0.2" + resolved "https://npm-registry.prod.contently.systems/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== + dependencies: + agent-base "~4.2.1" + socks "~2.3.2" + +socks@~2.3.2: + version "2.3.2" + resolved "https://npm-registry.prod.contently.systems/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" + integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ== + dependencies: + ip "^1.1.5" + smart-buffer "4.0.2" + +sorted-object@~2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" + integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw= + +sorted-union-stream@~2.1.3: + version "2.1.3" + resolved "https://npm-registry.prod.contently.systems/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" + integrity sha1-x3lMfgd4gAUv9xqNSi27Sppjisc= + dependencies: + from2 "^1.3.0" + stream-iterate "^1.1.0" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.2" + resolved "https://npm-registry.prod.contently.systems/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://npm-registry.prod.contently.systems/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://npm-registry.prod.contently.systems/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.1.40: + version "0.1.43" + resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.7" + resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://npm-registry.prod.contently.systems/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + +spawn-error-forwarder@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" + integrity sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://npm-registry.prod.contently.systems/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^2.0.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + +split2@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/split2/-/split2-1.0.0.tgz#52e2e221d88c75f9a73f90556e263ff96772b314" + integrity sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ= + dependencies: + through2 "~2.0.0" + +split@0.2: + version "0.2.10" + resolved "https://npm-registry.prod.contently.systems/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" + integrity sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc= + dependencies: + through "2" + +split@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://npm-registry.prod.contently.systems/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.0, ssri@^6.0.1: + version "6.0.1" + resolved "https://npm-registry.prod.contently.systems/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stack-trace@0.0.9: + version "0.0.9" + resolved "https://npm-registry.prod.contently.systems/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://npm-registry.prod.contently.systems/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://npm-registry.prod.contently.systems/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.0: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1, stream-combiner2@~1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://npm-registry.prod.contently.systems/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= + dependencies: + duplexer "~0.1.1" + +stream-consume@~0.1.0: + version "0.1.1" + resolved "https://npm-registry.prod.contently.systems/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" + integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg== + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://npm-registry.prod.contently.systems/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.0.0: + version "2.8.3" + resolved "https://npm-registry.prod.contently.systems/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-http@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.0.tgz#22fb33fe9b4056b4eccf58bd8f400c4b993ffe57" + integrity sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^3.0.6" + xtend "^4.0.0" + +stream-iterate@^1.1.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" + integrity sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE= + dependencies: + readable-stream "^2.1.5" + stream-shift "^1.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +stream-splicer@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" + integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + +streamqueue@0.0.6: + version "0.0.6" + resolved "https://npm-registry.prod.contently.systems/streamqueue/-/streamqueue-0.0.6.tgz#66f5f5ec94e9b8af249e4aec2dd1f741bfe94de3" + integrity sha1-ZvX17JTpuK8knkrsLdH3Qb/pTeM= + dependencies: + readable-stream "^1.0.26-2" + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + +string-length@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + integrity sha1-VpcPscOFWOnnC3KL894mmsRa36w= + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://npm-registry.prod.contently.systems/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trim@^1.1.2: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://npm-registry.prod.contently.systems/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.0.0: + version "3.3.0" + resolved "https://npm-registry.prod.contently.systems/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +stringify-package@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" + integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g== + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://npm-registry.prod.contently.systems/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom-string@1.X: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@1.0.x: + version "1.0.4" + resolved "https://npm-registry.prod.contently.systems/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= + +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +subarg@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= + dependencies: + has-flag "^1.0.0" + +supports-color@6.0.0: + version "6.0.0" + resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://npm-registry.prod.contently.systems/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://npm-registry.prod.contently.systems/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://npm-registry.prod.contently.systems/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" + +tar@^2.0.0: + version "2.2.2" + resolved "https://npm-registry.prod.contently.systems/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +tar@^4, tar@^4.4.8: + version "4.4.10" + resolved "https://npm-registry.prod.contently.systems/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://npm-registry.prod.contently.systems/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://npm-registry.prod.contently.systems/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +textextensions@~1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" + integrity sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI= + +through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://npm-registry.prod.contently.systems/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^0.4.1: + version "0.4.2" + resolved "https://npm-registry.prod.contently.systems/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through2@^0.5.0, through2@^0.5.1: + version "0.5.1" + resolved "https://npm-registry.prod.contently.systems/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^0.6.1, through2@^0.6.3: + version "0.6.5" + resolved "https://npm-registry.prod.contently.systems/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through@2, "through@>=2.2.7 <3", through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://npm-registry.prod.contently.systems/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tildify@^1.0.0, tildify@^1.1.2: + version "1.2.0" + resolved "https://npm-registry.prod.contently.systems/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://npm-registry.prod.contently.systems/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= + dependencies: + process "~0.11.0" + +timers-ext@^0.1.5: + version "0.1.7" + resolved "https://npm-registry.prod.contently.systems/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + +tiny-lr@0.1.4: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/tiny-lr/-/tiny-lr-0.1.4.tgz#6e41d7e67dfd0878e5e0b37e37a06d67e309ff4d" + integrity sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00= + dependencies: + body-parser "~1.8.0" + debug "~0.8.1" + faye-websocket "~0.7.2" + parseurl "~1.3.0" + qs "~2.2.3" + +tiny-relative-date@^1.3.0: + version "1.3.0" + resolved "https://npm-registry.prod.contently.systems/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" + integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://npm-registry.prod.contently.systems/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://npm-registry.prod.contently.systems/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://npm-registry.prod.contently.systems/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://npm-registry.prod.contently.systems/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +traverse@~0.6.6: + version "0.6.6" + resolved "https://npm-registry.prod.contently.systems/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + integrity sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics= + +tsml@1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3" + integrity sha1-ifghi52eJX9H1/a1bQHFpNLGj8M= + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://npm-registry.prod.contently.systems/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://npm-registry.prod.contently.systems/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://npm-registry.prod.contently.systems/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.4.1: + version "0.4.1" + resolved "https://npm-registry.prod.contently.systems/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.5.0: + version "0.5.2" + resolved "https://npm-registry.prod.contently.systems/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-is@~1.5.1: + version "1.5.7" + resolved "https://npm-registry.prod.contently.systems/type-is/-/type-is-1.5.7.tgz#b9368a593cc6ef7d0645e78b2f4c64cbecd05e90" + integrity sha1-uTaKWTzG730GReeLL0xky+zQXpA= + dependencies: + media-typer "0.3.0" + mime-types "~2.0.9" + +type@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/type/-/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61" + integrity sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://npm-registry.prod.contently.systems/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +uglify-js@2.6.4: + version "2.6.4" + resolved "https://npm-registry.prod.contently.systems/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" + integrity sha1-ZeovswWck5RpLxX+2HwrNsFrmt8= + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://npm-registry.prod.contently.systems/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.1.4: + version "3.6.0" + resolved "https://npm-registry.prod.contently.systems/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + +uglify-save-license@^0.4.1: + version "0.4.1" + resolved "https://npm-registry.prod.contently.systems/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" + integrity sha1-lXJsF8xv0XHDYX479NjYKqjEzOE= + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +uid-number@0.0.6: + version "0.0.6" + resolved "https://npm-registry.prod.contently.systems/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= + +umask@^1.1.0, umask@~1.1.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + +umd@^3.0.0: + version "3.0.3" + resolved "https://npm-registry.prod.contently.systems/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +undeclared-identifiers@^1.1.2: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" + integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== + dependencies: + acorn-node "^1.3.0" + dash-ast "^1.0.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" + +underscore@^1.9.1: + version "1.9.1" + resolved "https://npm-registry.prod.contently.systems/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://npm-registry.prod.contently.systems/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universal-user-agent@^2.0.0, universal-user-agent@^2.1.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" + integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== + dependencies: + os-name "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://npm-registry.prod.contently.systems/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +upath@^1.1.1: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +update-notifier@^2.3.0, update-notifier@^2.5.0: + version "2.5.0" + resolved "https://npm-registry.prod.contently.systems/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://npm-registry.prod.contently.systems/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-join@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" + integrity sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-template@^2.0.8: + version "2.0.8" + resolved "https://npm-registry.prod.contently.systems/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= + +url-toolkit@^2.1.1, url-toolkit@^2.1.3: + version "2.1.6" + resolved "https://npm-registry.prod.contently.systems/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2" + integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw== + +url@~0.11.0: + version "0.11.0" + resolved "https://npm-registry.prod.contently.systems/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://npm-registry.prod.contently.systems/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +user-home@^1.1.1: + version "1.1.1" + resolved "https://npm-registry.prod.contently.systems/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://npm-registry.prod.contently.systems/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= + +util@0.10.3: + version "0.10.3" + resolved "https://npm-registry.prod.contently.systems/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@~0.10.1: + version "0.10.4" + resolved "https://npm-registry.prod.contently.systems/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.3.2" + resolved "https://npm-registry.prod.contently.systems/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8flags@^2.0.2, v8flags@^2.0.9: + version "2.1.1" + resolved "https://npm-registry.prod.contently.systems/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://npm-registry.prod.contently.systems/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +verror@1.10.0: + version "1.10.0" + resolved "https://npm-registry.prod.contently.systems/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +"video.js@^6.8.0 || ^7.0.0": + version "7.6.0" + resolved "https://npm-registry.prod.contently.systems/video.js/-/video.js-7.6.0.tgz#556c151004e27d340be3a732a14bf7c1aaf7e8b4" + integrity sha512-A0HSKzAmcYkd1xyExqUlM6n8bkghcX54iCvW08bPvvl3UHt8d8zijuylfIWu8vo1Z8fYyk9HPOFs1i3Cldr/cw== + dependencies: + "@babel/runtime" "^7.4.5" + "@videojs/http-streaming" "1.10.3" + global "4.3.2" + keycode "^2.2.0" + safe-json-parse "4.0.0" + tsml "1.0.1" + videojs-font "3.2.0" + videojs-vtt.js "^0.14.1" + xhr "2.4.0" + +video.js@^7.6.5: + version "7.6.5" + resolved "https://npm-registry.prod.contently.systems/video.js/-/video.js-7.6.5.tgz#af66a71bc05fd79c581c1673ac5a78a6b31bc831" + integrity sha512-r0kC9SNJhXz9th/wwbRaLVOIZTvXkF+rhFq9/FWU+e+EJClwClRCgP8STGmfrPHDXrfWiJwH9YY21JZK61vGGQ== + dependencies: + "@babel/runtime" "^7.4.5" + "@videojs/http-streaming" "1.10.6" + global "4.3.2" + keycode "^2.2.0" + safe-json-parse "4.0.0" + videojs-font "3.2.0" + videojs-vtt.js "^0.14.1" + xhr "2.4.0" + +videojs-font@3.2.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/videojs-font/-/videojs-font-3.2.0.tgz#212c9d3f4e4ec3fa7345167d64316add35e92232" + integrity sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA== + +videojs-vtt.js@^0.14.1: + version "0.14.1" + resolved "https://npm-registry.prod.contently.systems/videojs-vtt.js/-/videojs-vtt.js-0.14.1.tgz#da583eb1fc9c81c826a9432b706040e8dea49911" + integrity sha512-YxOiywx6N9t3J5nqsE5WN2Sw4CSqVe3zV+AZm2T4syOc2buNJaD6ZoexSdeszx2sHLU/RRo2r4BJAXFDQ7Qo2Q== + dependencies: + global "^4.3.1" + +vinyl-buffer@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz#96c1a3479b8c5392542c612029013b5b27f88bbf" + integrity sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78= + dependencies: + bl "^1.2.1" + through2 "^2.0.3" + +vinyl-bufferstream@^1.0.1: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz#0537869f580effa4ca45acb47579e4b9fe63081a" + integrity sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo= + dependencies: + bufferstreams "1.0.1" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://npm-registry.prod.contently.systems/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY= + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-map@^1.0.1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/vinyl-map/-/vinyl-map-1.0.2.tgz#a8b296025f973fa7cad62817967a48f1d176bf7c" + integrity sha1-qLKWAl+XP6fK1igXlnpI8dF2v3w= + dependencies: + bl "^1.1.2" + new-from "0.0.3" + through2 "^0.4.1" + +vinyl-source-stream@^1.1.2: + version "1.1.2" + resolved "https://npm-registry.prod.contently.systems/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz#62b53a135610a896e98ca96bee3a87f008a8e780" + integrity sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A= + dependencies: + through2 "^2.0.3" + vinyl "^0.4.3" + +vinyl-sourcemaps-apply@^0.2.0: + version "0.2.1" + resolved "https://npm-registry.prod.contently.systems/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= + dependencies: + source-map "^0.5.1" + +vinyl@^0.2.1: + version "0.2.3" + resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + integrity sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI= + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.0, vinyl@^0.4.3: + version "0.4.6" + resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4= + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.0: + version "2.2.0" + resolved "https://npm-registry.prod.contently.systems/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@^1.0.0: + version "1.1.0" + resolved "https://npm-registry.prod.contently.systems/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +watch@^0.11.0: + version "0.11.0" + resolved "https://npm-registry.prod.contently.systems/watch/-/watch-0.11.0.tgz#e8dba091b7456799a3af57978b986e77e1320406" + integrity sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY= + +watchify@^3.11.0: + version "3.11.1" + resolved "https://npm-registry.prod.contently.systems/watchify/-/watchify-3.11.1.tgz#8e4665871fff1ef64c0430d1a2c9d084d9721881" + integrity sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog== + dependencies: + anymatch "^2.0.0" + browserify "^16.1.0" + chokidar "^2.1.1" + defined "^1.0.0" + outpipe "^1.1.0" + through2 "^2.0.0" + xtend "^4.0.0" + +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://npm-registry.prod.contently.systems/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +websocket-driver@>=0.3.6: + version "0.7.3" + resolved "https://npm-registry.prod.contently.systems/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://npm-registry.prod.contently.systems/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +which-module@^1.0.0: + version "1.0.0" + resolved "https://npm-registry.prod.contently.systems/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://npm-registry.prod.contently.systems/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@1.3.1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://npm-registry.prod.contently.systems/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4" + integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3, wide-align@^1.1.0: + version "1.1.3" + resolved "https://npm-registry.prod.contently.systems/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://npm-registry.prod.contently.systems/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://npm-registry.prod.contently.systems/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +window-size@^0.1.4: + version "0.1.4" + resolved "https://npm-registry.prod.contently.systems/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= + +windows-release@^3.1.0: + version "3.2.0" + resolved "https://npm-registry.prod.contently.systems/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" + integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + dependencies: + execa "^1.0.0" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://npm-registry.prod.contently.systems/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://npm-registry.prod.contently.systems/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +worker-farm@^1.6.0: + version "1.7.0" + resolved "https://npm-registry.prod.contently.systems/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://npm-registry.prod.contently.systems/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://npm-registry.prod.contently.systems/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://npm-registry.prod.contently.systems/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +wreck@^6.3.0: + version "6.3.0" + resolved "https://npm-registry.prod.contently.systems/wreck/-/wreck-6.3.0.tgz#a1369769f07bbb62d6a378336a7871fc773c740b" + integrity sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs= + dependencies: + boom "2.x.x" + hoek "2.x.x" + +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://npm-registry.prod.contently.systems/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xhr@2.4.0: + version "2.4.0" + resolved "https://npm-registry.prod.contently.systems/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993" + integrity sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM= + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.1" + resolved "https://npm-registry.prod.contently.systems/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +xtend@~2.1.1: + version "2.1.2" + resolved "https://npm-registry.prod.contently.systems/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://npm-registry.prod.contently.systems/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= + +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://npm-registry.prod.contently.systems/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://npm-registry.prod.contently.systems/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://npm-registry.prod.contently.systems/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.0.3" + resolved "https://npm-registry.prod.contently.systems/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@13.0.0: + version "13.0.0" + resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" + integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.0.0, yargs-parser@^13.1.0: + version "13.1.1" + resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://npm-registry.prod.contently.systems/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + +yargs-unparser@1.5.0: + version "1.5.0" + resolved "https://npm-registry.prod.contently.systems/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" + integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== + dependencies: + flat "^4.1.0" + lodash "^4.17.11" + yargs "^12.0.5" + +yargs@13.2.2: + version "13.2.2" + resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" + integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== + dependencies: + cliui "^4.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.0.0" + +yargs@^11.0.0: + version "11.1.0" + resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^12.0.5: + version "12.0.5" + resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^13.1.0: + version "13.2.4" + resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@^3.28.0: + version "3.32.0" + resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://npm-registry.prod.contently.systems/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0"