diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f28c44c83..8f21a8d110 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,9 @@ v1.3.8-dev * ons-tabbar: persistent tabs only throw 'init' event once. * core: every child element will be wrapped inside an ons-page. * ons-page: added page lifecycle events API + * ons-fab: Implemented 'fab' component. + * core: Added page attribute expressions. + * ons-carousel: Fixed [#844](https://github.com/OnsenUI/OnsenUI/issues/844). v1.3.7 ---- diff --git a/README.md b/README.md index d84fbe7ff1..8f701ea8ac 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,11 @@ # Onsen UI +[![Join us on Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/OnsenUI/OnsenUI) +[![StackOverflow](http://img.shields.io/badge/stackoverflow-onsen--ui-FF412D.svg )]( http://stackoverflow.com/questions/tagged/onsen-ui) +[![TypeScript definitions on DefinitelyTyped](http://definitelytyped.org/badges/standard-flat.svg)](http://definitelytyped.org) [![Circle CI](https://circleci.com/gh/OnsenUI/OnsenUI.svg?style=svg)](https://circleci.com/gh/OnsenUI/OnsenUI) - [![Coverage Status](https://coveralls.io/repos/OnsenUI/OnsenUI/badge.svg?branch=master&service=github)](https://coveralls.io/github/OnsenUI/OnsenUI?branch=master) -[![TypeScript definitions on DefinitelyTyped](http://definitelytyped.org/badges/standard-flat.svg)](http://definitelytyped.org) - -[![Join us on Gitter](https://img.shields.io/badge/gitter-join%20chat-1dce73.svg)](https://gitter.im/OnsenUI/OnsenUI) - The best place to start with Onsen UI is our [Getting Started](http://onsen.io/guide/getting_started.html) page. ![The Answer to PhoneGap UI Development](https://cloud.githubusercontent.com/assets/9889313/5350569/eec8b870-7efb-11e4-90af-2f4d505e09a8.png) diff --git a/build/js/ons-core.js b/build/js/ons-core.js index 45d776a3da..934b24072c 100644 --- a/build/js/ons-core.js +++ b/build/js/ons-core.js @@ -1,4 +1,4 @@ -/*! ons-core.js for Onsen UI v1.3.5-dev - 2015-07-27 */ +/*! ons-core.js for Onsen UI v1.3.8-dev - 2015-08-06 */ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // JavaScript Dynamic Content shim for Windows Store apps (function () { @@ -3299,14 +3299,14 @@ window.DoorLock = (function () { this._log = options.log || function () {}; } + /** + * Register a lock. + * + * @return {Function} Callback for unlocking. + */ + _createClass(DoorLock, [{ key: 'lock', - - /** - * Register a lock. - * - * @return {Function} Callback for unlocking. - */ value: function lock() { var _this = this; @@ -3339,14 +3339,14 @@ window.DoorLock = (function () { this._waitList.shift()(); } } - }, { - key: 'waitUnlock', /** * Register a callback for waiting unlocked door. * * @params {Function} callback Callback on unlocking the door completely. */ + }, { + key: 'waitUnlock', value: function waitUnlock(callback) { if (!(callback instanceof Function)) { throw new Error('The callback param must be a function.'); @@ -3358,12 +3358,12 @@ window.DoorLock = (function () { callback(); } } - }, { - key: 'isLocked', /** * @return {Boolean} */ + }, { + key: 'isLocked', value: function isLocked() { return this._lockList.length > 0; } @@ -3499,36 +3499,36 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this._boundCallback = this._callback.bind(this); } + /** + * Enable to handle 'backbutton' events. + */ + _createClass(DevicebackButtonDispatcher, [{ key: 'enable', - - /** - * Enable to handle 'backbutton' events. - */ value: function enable() { if (!this._isEnabled) { util.addBackButtonListener(this._boundCallback); this._isEnabled = true; } } - }, { - key: 'disable', /** * Disable to handle 'backbutton' events. */ + }, { + key: 'disable', value: function disable() { if (this._isEnabled) { util.removeBackButtonListener(this._boundCallback); this._isEnabled = false; } } - }, { - key: 'fireDeviceBackButtonEvent', /** * Fire a 'backbutton' event manually. */ + }, { + key: 'fireDeviceBackButtonEvent', value: function fireDeviceBackButtonEvent() { var event = document.createEvent('Event'); event.initEvent('backbutton', true, true); @@ -3539,13 +3539,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons value: function _callback() { this._dispatchDeviceBackButtonEvent(); } - }, { - key: 'createHandler', /** * @param {HTMLElement} element * @param {Function} callback */ + }, { + key: 'createHandler', value: function createHandler(element, callback) { if (!(element instanceof HTMLElement)) { throw new Error('element must be an instance of HTMLElement'); @@ -3622,12 +3622,12 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons element = element.parentNode; } } - }, { - key: '_captureTree', /** * @return {Object} */ + }, { + key: '_captureTree', value: function _captureTree() { return createTree(document.body); @@ -3676,13 +3676,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }); } } - }, { - key: '_findHandlerLeafElement', /** * @param {Object} tree * @return {HTMLElement} */ + }, { + key: '_findHandlerLeafElement', value: function _findHandlerLeafElement(tree) { return find(tree); @@ -4212,23 +4212,23 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this.delay = options.delay !== undefined ? options.delay : this.delay; } + /** + * @param {HTMLElement} modal + * @param {Function} callback + */ + _createClass(ModalAnimator, [{ key: 'show', - - /** - * @param {HTMLElement} modal - * @param {Function} callback - */ value: function show(modal, callback) { callback(); } - }, { - key: 'hide', /** * @param {HTMLElement} modal * @param {Function} callback */ + }, { + key: 'hide', value: function hide(modal, callback) { callback(); } @@ -4397,7 +4397,7 @@ var _get = function get(_x4, _x5, _x6) { var _again = true; _function: while (_a 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 _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) subClass.__proto__ = superClass; } +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; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } @@ -4422,23 +4422,27 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this.duration = duration; } + /** + * Android style animator for alert dialog. + */ + + /** + * @param {HTMLElement} dialog + * @param {Function} done + */ + _createClass(AlertDialogAnimator, [{ key: 'show', - - /** - * @param {HTMLElement} dialog - * @param {Function} done - */ value: function show(dialog, done) { done(); } - }, { - key: 'hide', /** * @param {HTMLElement} dialog * @param {Function} done */ + }, { + key: 'hide', value: function hide(dialog, done) { done(); } @@ -4447,10 +4451,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return AlertDialogAnimator; })(); - /** - * Android style animator for alert dialog. - */ - var AndroidAlertDialogAnimator = (function (_AlertDialogAnimator) { _inherits(AndroidAlertDialogAnimator, _AlertDialogAnimator); @@ -4469,13 +4469,17 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _get(Object.getPrototypeOf(AndroidAlertDialogAnimator.prototype), 'constructor', this).call(this, { duration: duration, timing: timing, delay: delay }); } + /** + * iOS style animator for alert dialog. + */ + + /** + * @param {Object} dialog + * @param {Function} callback + */ + _createClass(AndroidAlertDialogAnimator, [{ key: 'show', - - /** - * @param {Object} dialog - * @param {Function} callback - */ value: function show(dialog, callback) { callback = callback ? callback : function () {}; @@ -4504,13 +4508,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons done(); })); } - }, { - key: 'hide', /** * @param {Object} dialog * @param {Function} callback */ + }, { + key: 'hide', value: function hide(dialog, callback) { callback = callback ? callback : function () {}; @@ -4544,10 +4548,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return AndroidAlertDialogAnimator; })(AlertDialogAnimator); - /** - * iOS style animator for alert dialog. - */ - var IOSAlertDialogAnimator = (function (_AlertDialogAnimator2) { _inherits(IOSAlertDialogAnimator, _AlertDialogAnimator2); @@ -4566,13 +4566,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _get(Object.getPrototypeOf(IOSAlertDialogAnimator.prototype), 'constructor', this).call(this, { duration: duration, timing: timing, delay: delay }); } + /* + * @param {Object} dialog + * @param {Function} callback + */ + _createClass(IOSAlertDialogAnimator, [{ key: 'show', - - /* - * @param {Object} dialog - * @param {Function} callback - */ value: function show(dialog, callback) { callback = callback ? callback : function () {}; @@ -4601,13 +4601,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons done(); })); } - }, { - key: 'hide', /** * @param {Object} dialog * @param {Function} callback */ + }, { + key: 'hide', value: function hide(dialog, callback) { callback = callback ? callback : function () {}; @@ -4695,6 +4695,11 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons } } + /** + * @param {String} jsonString + * @return {Object/null} + */ + _createClass(AnimatorFactory, [{ key: 'setAnimationOptions', @@ -4704,8 +4709,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons value: function setAnimationOptions(options) { this._animationOptions = options; } - }, { - key: 'newAnimator', /** * @param {Object} options @@ -4714,6 +4717,8 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons * @param {Object} defaultAnimator The default animator instance * @return {Object} An animator instance */ + }, { + key: 'newAnimator', value: function newAnimator(options, defaultAnimator) { options = options || {}; @@ -4747,11 +4752,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons } }], [{ key: 'parseJSONSafely', - - /** - * @param {String} jsonString - * @return {Object/null} - */ value: function parseJSONSafely(jsonString) { try { return JSON.parse(jsonString); @@ -4801,16 +4801,16 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this._frozen = false; } + /** + * @param {Function} callback A function receive a function that receive result object and target object optinally + * @return {Function} pass-through callback parameter + * @example + * asyncHook.add((next, target) => next(target + target)); + * asyncHook.run(result => console.log(result), 2); // print 4 + */ + _createClass(AsyncHook, [{ key: 'add', - - /** - * @param {Function} callback A function receive a function that receive result object and target object optinally - * @return {Function} pass-through callback parameter - * @example - * asyncHook.add((next, target) => next(target + target)); - * asyncHook.run(result => console.log(result), 2); // print 4 - */ value: function add(callback) { if (this._frozen) { throw new Error('This hook is frozen.'); @@ -4818,13 +4818,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this._callbacks.push(callback); return callback; } - }, { - key: 'remove', /** * @param {Function} callback A function receive a function that receive result object and target object optinally * @return {Boolean} */ + }, { + key: 'remove', value: function remove(callback) { if (this._frozen) { throw new Error('This hook is frozen.'); @@ -4837,22 +4837,22 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return false; } } - }, { - key: 'freeze', /** * Freeze this hook. AsyncHook deny add() and remove() operation after this method is invoked. */ + }, { + key: 'freeze', value: function freeze() { this._frozen = true; } - }, { - key: 'run', /** * @param {Function} callback A function receive target object optionally. * @param {Object} [target] */ + }, { + key: 'run', value: function run(callback, target) { var _this = this; @@ -4901,7 +4901,7 @@ var _get = function get(_x5, _x6, _x7) { var _again = true; _function: while (_a 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 _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) subClass.__proto__ = superClass; } +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; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } @@ -4926,23 +4926,27 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this.duration = duration; } + /** + * Android style animator for dialog. + */ + + /** + * @param {HTMLElement} dialog + * @param {Function} done + */ + _createClass(DialogAnimator, [{ key: 'show', - - /** - * @param {HTMLElement} dialog - * @param {Function} done - */ value: function show(dialog, done) { done(); } - }, { - key: 'hide', /** * @param {HTMLElement} dialog * @param {Function} done */ + }, { + key: 'hide', value: function hide(dialog, done) { done(); } @@ -4951,10 +4955,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return DialogAnimator; })(); - /** - * Android style animator for dialog. - */ - var AndroidDialogAnimator = (function (_DialogAnimator) { _inherits(AndroidDialogAnimator, _DialogAnimator); @@ -4973,13 +4973,17 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _get(Object.getPrototypeOf(AndroidDialogAnimator.prototype), 'constructor', this).call(this, { timing: timing, delay: delay, duration: duration }); } + /** + * iOS style animator for dialog. + */ + + /** + * @param {Object} dialog + * @param {Function} callback + */ + _createClass(AndroidDialogAnimator, [{ key: 'show', - - /** - * @param {Object} dialog - * @param {Function} callback - */ value: function show(dialog, callback) { callback = callback ? callback : function () {}; @@ -5008,13 +5012,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons done(); })); } - }, { - key: 'hide', /** * @param {Object} dialog * @param {Function} callback */ + }, { + key: 'hide', value: function hide(dialog, callback) { callback = callback ? callback : function () {}; @@ -5048,10 +5052,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return AndroidDialogAnimator; })(DialogAnimator); - /** - * iOS style animator for dialog. - */ - var IOSDialogAnimator = (function (_DialogAnimator2) { _inherits(IOSDialogAnimator, _DialogAnimator2); @@ -5070,13 +5070,17 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _get(Object.getPrototypeOf(IOSDialogAnimator.prototype), 'constructor', this).call(this, { timing: timing, delay: delay, duration: duration }); } + /** + * Slide animator for dialog. + */ + + /** + * @param {Object} dialog + * @param {Function} callback + */ + _createClass(IOSDialogAnimator, [{ key: 'show', - - /** - * @param {Object} dialog - * @param {Function} callback - */ value: function show(dialog, callback) { callback = callback ? callback : function () {}; @@ -5103,13 +5107,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons done(); })); } - }, { - key: 'hide', /** * @param {Object} dialog * @param {Function} callback */ + }, { + key: 'hide', value: function hide(dialog, callback) { callback = callback ? callback : function () {}; @@ -5141,10 +5145,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return IOSDialogAnimator; })(DialogAnimator); - /** - * Slide animator for dialog. - */ - var SlideDialogAnimator = (function (_DialogAnimator3) { _inherits(SlideDialogAnimator, _DialogAnimator3); @@ -5163,13 +5163,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _get(Object.getPrototypeOf(SlideDialogAnimator.prototype), 'constructor', this).call(this, { timing: timing, delay: delay, duration: duration }); } + /** + * @param {Object} dialog + * @param {Function} callback + */ + _createClass(SlideDialogAnimator, [{ key: 'show', - - /** - * @param {Object} dialog - * @param {Function} callback - */ value: function show(dialog, callback) { callback = callback ? callback : function () {}; @@ -5196,13 +5196,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons done(); })); } - }, { - key: 'hide', /** * @param {Object} dialog * @param {Function} callback */ + }, { + key: 'hide', value: function hide(dialog, callback) { callback = callback ? callback : function () {}; @@ -5266,7 +5266,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function (ons) { 'use strict'; @@ -5290,13 +5290,13 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' _get(Object.getPrototypeOf(FadeModalAnimator.prototype), 'constructor', this).call(this, options); } + /** + * @param {HTMLElement} modal + * @param {Function} callback + */ + _createClass(FadeModalAnimator, [{ key: 'show', - - /** - * @param {HTMLElement} modal - * @param {Function} callback - */ value: function show(modal, callback) { callback = callback ? callback : function () {}; @@ -5312,13 +5312,13 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' done(); }).play(); } - }, { - key: 'hide', /** * @param {HTMLElement} modal * @param {Function} callback */ + }, { + key: 'hide', value: function hide(modal, callback) { callback = callback ? callback : function () {}; @@ -5367,7 +5367,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function (ons) { 'use strict'; @@ -5393,14 +5393,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' _get(Object.getPrototypeOf(FadeNavigatorTransitionAnimator.prototype), 'constructor', this).call(this, options); } + /** + * @param {Object} enterPage + * @param {Object} leavePage + * @param {Function} callback + */ + _createClass(FadeNavigatorTransitionAnimator, [{ key: 'push', - - /** - * @param {Object} enterPage - * @param {Object} leavePage - * @param {Function} callback - */ value: function push(enterPage, leavePage, callback) { animit.runAll(animit([enterPage.element._getContentElement(), enterPage.element._getBackgroundElement()]).queue({ @@ -5434,14 +5434,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' timing: this.timing }).resetStyle()); } - }, { - key: 'pop', /** * @param {Object} enterPage * @param {Object} leavePage * @param {Function} done */ + }, { + key: 'pop', value: function pop(enterPage, leavePage, callback) { animit.runAll(animit([leavePage.element._getContentElement(), leavePage.element._getBackgroundElement()]).queue({ css: { @@ -5507,7 +5507,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function (ons) { 'use strict'; @@ -5523,13 +5523,13 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' _get(Object.getPrototypeOf(FadePopoverAnimator.prototype), 'constructor', this).call(this, options); } + /** + * @param {Object} popover + * @param {Function} callback + */ + _createClass(FadePopoverAnimator, [{ key: 'show', - - /** - * @param {Object} popover - * @param {Function} callback - */ value: function show(popover, callback) { var pop = popover.querySelector('.popover'); var mask = popover.querySelector('.popover-mask'); @@ -5555,13 +5555,13 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' done(); })); } - }, { - key: 'hide', /** * @param {Object} popover * @param {Function} callback */ + }, { + key: 'hide', value: function hide(popover, callback) { var pop = popover.querySelector('.popover'); var mask = popover.querySelector('.popover-mask'); @@ -5618,7 +5618,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function (ons) { 'use strict'; @@ -5695,14 +5695,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return bothPageHasToolbar && noAndroidLikeToolbar; } - }, { - key: 'push', /** * @param {Object} enterPage * @param {Object} leavePage * @param {Function} callback */ + }, { + key: 'push', value: function push(enterPage, leavePage, callback) { var _this = this; @@ -5849,14 +5849,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' })); } } - }, { - key: 'pop', /** * @param {Object} enterPage * @param {Object} leavePage * @param {Function} done */ + }, { + key: 'pop', value: function pop(enterPage, leavePage, done) { var _this2 = this; @@ -6060,6 +6060,10 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _classCallCheck(this, LazyRepeatDelegate); } + /** + * This class provide core functions for ons-lazy-repeat. + */ + _createClass(LazyRepeatDelegate, [{ key: 'prepareItem', @@ -6070,51 +6074,51 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons value: function prepareItem(index, done) { throw new Error('This is an abstract method.'); } - }, { - key: 'countItems', /** * @return {Number} */ + }, { + key: 'countItems', value: function countItems() { throw new Error('This is an abstract method.'); } - }, { - key: 'updateItem', /** * @param {Number} index * @param {Object} item * @param {Element} item.element */ + }, { + key: 'updateItem', value: function updateItem(index, item) { throw new Error('This is an abstract method.'); } - }, { - key: 'calculateItemHeight', /** * @return {Number} */ + }, { + key: 'calculateItemHeight', value: function calculateItemHeight(index) { throw new Error('This is an abstract method.'); } - }, { - key: 'destroyItem', /** * @param {Number} index * @param {Object} item */ + }, { + key: 'destroyItem', value: function destroyItem(index, item) { throw new Error('This is an abstract method.'); } - }, { - key: 'destroy', /** * @return {void} */ + }, { + key: 'destroy', value: function destroy() { throw new Error('This is an abstract method.'); } @@ -6123,10 +6127,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return LazyRepeatDelegate; })(); - /** - * This class provide core functions for ons-lazy-repeat. - */ - var LazyRepeatProvider = (function () { /** @@ -6199,8 +6199,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var items = this._getItemsInView(); var keep = {}; - this._wrapperElement.style.height = this._itemHeightSum[this._maxIndex] + 'px'; - for (var i = 0, l = items.length; i < l; i++) { var _item = items[i]; this._renderElement(_item); @@ -6212,25 +6210,35 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this._removeElement(key); } } + + this._wrapperElement.style.height = this._calculateListHeight() + 'px'; } }, { - key: '_isRendered', + key: '_calculateListHeight', + value: function _calculateListHeight() { + var indices = Object.keys(this._renderedItems).map(function (n) { + return parseInt(n); + }); + return this._itemHeightSum[indices.pop()] || 0; + } /** * @param {Number} index * @return {Boolean} */ + }, { + key: '_isRendered', value: function _isRendered(index) { return this._renderedItems.hasOwnProperty(index); } - }, { - key: '_renderElement', /** * @param {Object} item * @param {Number} item.index * @param {Number} item.top */ + }, { + key: '_renderElement', value: function _renderElement(_ref) { var _this = this; @@ -6264,12 +6272,12 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _this._renderedItems[index] = item; }); } - }, { - key: '_removeElement', /** * @param {Number} index */ + }, { + key: '_removeElement', value: function _removeElement(index) { if (!this._isRendered(index)) { return; @@ -6428,7 +6436,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function (ons) { 'use strict'; @@ -6457,14 +6465,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.backgroundMask = ons._util.createElement('\n
\n '); } + /** + * @param {Object} enterPage + * @param {Object} leavePage + * @param {Function} callback + */ + _createClass(LiftNavigatorTransitionAnimator, [{ key: 'push', - - /** - * @param {Object} enterPage - * @param {Object} leavePage - * @param {Function} callback - */ value: function push(enterPage, leavePage, callback) { util.removeElement(this.backgroundMask); leavePage.element.parentNode.insertBefore(this.backgroundMask, leavePage.element); @@ -6503,14 +6511,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' timing: this.timing })); } - }, { - key: 'pop', /** * @param {Object} enterPage * @param {Object} leavePage * @param {Function} callback */ + }, { + key: 'pop', value: function pop(enterPage, leavePage, callback) { util.removeElement(this.backgroundMask); enterPage.element.parentNode.insertBefore(this.backgroundMask, enterPage.element); @@ -6621,14 +6629,14 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return dict; } } - }, { - key: 'applyDiffToClassList', /** * @param {Object} diff * @param {Object} classList * @param {String} template */ + }, { + key: 'applyDiffToClassList', value: function applyDiffToClassList(diff, classList, template) { diff.added.map(function (modifier) { return template.replace(/\*/g, modifier); @@ -6642,14 +6650,14 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return classList.remove(klass); }); } - }, { - key: 'applyDiffToElement', /** * @param {Object} diff * @param {HTMLElement} element * @param {Object} scheme */ + }, { + key: 'applyDiffToElement', value: function applyDiffToElement(diff, element, scheme) { for (var selector in scheme) { if (scheme.hasOwnProperty(selector)) { @@ -6660,8 +6668,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons } } } - }, { - key: 'onModifierChanged', /** * @param {String} last @@ -6669,16 +6675,18 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons * @param {HTMLElement} element * @param {Object} scheme */ + }, { + key: 'onModifierChanged', value: function onModifierChanged(last, current, element, scheme) { return ModifierUtil.applyDiffToElement(ModifierUtil.diff(last, current), element, scheme); } - }, { - key: 'initModifier', /** * @param {HTMLElement} element * @param {Object} scheme */ + }, { + key: 'initModifier', value: function initModifier(element, scheme) { var modifier = element.getAttribute('modifier'); if (typeof modifier !== 'string') { @@ -6776,12 +6784,12 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons value: function getDeviceBackButtonHandler() { return this._deviceBackButtonHandler; } - }, { - key: 'getPageView', /** * @return {PageView} */ + }, { + key: 'getPageView', value: function getPageView() { if (!this._page) { this._page = util.findParent('ons-page'); @@ -6940,7 +6948,7 @@ limitations under the License. /** * @param {String} page - * @return {Promise} + * @return {Promise} */ ons._internal.getTemplateHTMLAsync = function (page) { return new Promise(function (resolve, reject) { @@ -6970,7 +6978,7 @@ limitations under the License. /** * @param {String} page - * @return {Promise} + * @return {Promise} */ ons._internal.getPageHTMLAsync = function (page) { return ons._internal.getTemplateHTMLAsync(page).then(function (html) { @@ -7375,6 +7383,56 @@ limitations under the License. 'use strict'; +(function (ons) { + ons.pageAttributeExpression = { + _variables: {}, + defineVariable: function defineVariable(name, value) { + var overwrite = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; + + if (typeof name !== 'string') { + throw new Error('Variable name must be a string.'); + } else if (typeof value !== 'string' || typeof value !== 'function') { + throw new Error('Variable value must be a string or a function.'); + } else if (this._variables.hasOwnProperty(name) && overwrite) { + throw new Error('"' + name + '" is already defined.'); + } + this._variables[name] = value; + }, + getVariable: function getVariable(name) { + if (!this._variables.hasOwnProperty(name)) { + return null; + } + + return this._variables[name]; + }, + removeVariable: function removeVariable(name) { + delete this._variables[name]; + }, + getAllVariables: function getAllVariables() { + return this._variables; + }, + evaluate: function evaluate(expression) {} + }; +})(window.ons = window.ons || {}); +/* +Copyright 2013-2015 ASIAL CORPORATION + +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. + +*/ + +'use strict'; + (function (ons) { 'use strict'; @@ -7408,7 +7466,8 @@ limitations under the License. if (ons.platform._renderPlatform) { return ons.platform._renderPlatform === 'ios'; } else { - return /iPhone|iPad|iPod/i.test(navigator.userAgent); + return (/iPhone|iPad|iPod/i.test(navigator.userAgent) + ); } }, @@ -7419,7 +7478,8 @@ limitations under the License. if (ons.platform._renderPlatform) { return ons.platform._renderPlatform === 'android'; } else { - return /Android/i.test(navigator.userAgent); + return (/Android/i.test(navigator.userAgent) + ); } }, @@ -7427,14 +7487,16 @@ limitations under the License. * @return {Boolean} */ isAndroidPhone: function isAndroidPhone() { - return /Android/i.test(navigator.userAgent) && /Mobile/i.test(navigator.userAgent); + return (/Android/i.test(navigator.userAgent) && /Mobile/i.test(navigator.userAgent) + ); }, /** * @return {Boolean} */ isAndroidTablet: function isAndroidTablet() { - return /Android/i.test(navigator.userAgent) && !/Mobile/i.test(navigator.userAgent); + return (/Android/i.test(navigator.userAgent) && !/Mobile/i.test(navigator.userAgent) + ); }, /** @@ -7444,7 +7506,8 @@ limitations under the License. if (ons.platform._renderPlatform) { return ons.platform._renderPlatform === 'wp'; } else { - return /Windows Phone|IEMobile|WPDesktop/i.test(navigator.userAgent); + return (/Windows Phone|IEMobile|WPDesktop/i.test(navigator.userAgent) + ); } }, @@ -7452,14 +7515,16 @@ limitations under the License. * @return {Boolean} */ isIPhone: function isIPhone() { - return /iPhone/i.test(navigator.userAgent); + return (/iPhone/i.test(navigator.userAgent) + ); }, /** * @return {Boolean} */ isIPad: function isIPad() { - return /iPad/i.test(navigator.userAgent); + return (/iPad/i.test(navigator.userAgent) + ); }, /** @@ -7469,7 +7534,8 @@ limitations under the License. if (ons.platform._renderPlatform) { return ons.platform._renderPlatform === 'blackberry'; } else { - return /BlackBerry|RIM Tablet OS|BB10/i.test(navigator.userAgent); + return (/BlackBerry|RIM Tablet OS|BB10/i.test(navigator.userAgent) + ); } }, @@ -7634,7 +7700,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function (ons) { 'use strict'; @@ -7664,14 +7730,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.blackMaskOpacity = 0.4; } + /** + * @param {Object} enterPage + * @param {Object} leavePage + * @param {Function} callback + */ + _createClass(SimpleSlideNavigatorTransitionAnimator, [{ key: 'push', - - /** - * @param {Object} enterPage - * @param {Object} leavePage - * @param {Function} callback - */ value: function push(enterPage, leavePage, callback) { util.removeElement(this.backgroundMask); leavePage.element.parentNode.insertBefore(this.backgroundMask, leavePage.element.nextSibling); @@ -7714,14 +7780,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' done(); })); } - }, { - key: 'pop', /** * @param {Object} enterPage * @param {Object} leavePage * @param {Function} done */ + }, { + key: 'pop', value: function pop(enterPage, leavePage, done) { util.removeElement(this.backgroundMask); enterPage.element.parentNode.insertBefore(this.backgroundMask, enterPage.element.nextSibling); @@ -7797,7 +7863,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag 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 _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) subClass.__proto__ = superClass; } +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; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } @@ -7823,16 +7889,16 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this.delay = options.delay !== undefined ? options.delay : '0'; } + /** + * @param {Element} enterPage ons-page element + * @param {Element} leavePage ons-page element + * @param {Number} enterPageIndex + * @param {Number} leavePageIndex + * @param {Function} done + */ + _createClass(TabbarAnimator, [{ key: 'apply', - - /** - * @param {Element} enterPage ons-page element - * @param {Element} leavePage ons-page element - * @param {Number} enterPageIndex - * @param {Number} leavePageIndex - * @param {Function} done - */ value: function apply(enterPage, leavePage, enterPageIndex, leavePageIndex, done) { throw new Error('This method must be implemented.'); } @@ -7917,13 +7983,13 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _get(Object.getPrototypeOf(TabbarSlideAnimator.prototype), 'constructor', this).call(this, options); } + /** + * @param {jqLite} enterPage + * @param {jqLite} leavePage + */ + _createClass(TabbarSlideAnimator, [{ key: 'apply', - - /** - * @param {jqLite} enterPage - * @param {jqLite} leavePage - */ value: function apply(enterPage, leavePage, enterIndex, leaveIndex, done) { var sgn = enterIndex > leaveIndex; @@ -10569,7 +10635,7 @@ var _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_a function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -10628,14 +10694,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.setAttribute('modifier', (modifier + ' android').trim()); } } - }, { - key: 'setDisabled', /** * Disable or enable alert dialog. * * @param {Boolean} */ + }, { + key: 'setDisabled', value: function setDisabled(disabled) { if (typeof disabled !== 'boolean') { throw new Error('Argument must be a boolean.'); @@ -10647,25 +10713,25 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('disabled'); } } - }, { - key: 'isDisabled', /** * True if alert dialog is disabled. * * @return {Boolean} */ + }, { + key: 'isDisabled', value: function isDisabled() { return this.hasAttribute('disabled'); } - }, { - key: 'setCancelable', /** * Make alert dialog cancelable or uncancelable. * * @param {Boolean} */ + }, { + key: 'setCancelable', value: function setCancelable(cancelable) { if (typeof cancelable !== 'boolean') { throw new Error('Argument must be a boolean.'); @@ -10677,8 +10743,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('cancelable'); } } - }, { - key: 'show', /** * Show alert dialog. @@ -10688,6 +10752,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] animation options * @param {Function} [options.callback] callback after dialog is shown */ + }, { + key: 'show', value: function show() { var _this = this; @@ -10727,8 +10793,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } } - }, { - key: 'hide', /** * Hide alert dialog. @@ -10738,6 +10802,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] animation options * @param {Function} [options.callback] callback after dialog is hidden */ + }, { + key: 'hide', value: function hide() { var _this2 = this; @@ -10775,23 +10841,23 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } } - }, { - key: 'isShown', /** * True if alert dialog is visible. * * @return {Boolean} */ + }, { + key: 'isShown', value: function isShown() { return this._visible; } - }, { - key: 'destroy', /** * Destroy alert dialog. */ + }, { + key: 'destroy', value: function destroy() { if (this.parentElement) { this.parentElement.removeChild(this); @@ -10934,7 +11000,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -11036,7 +11102,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -11114,7 +11180,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -11181,7 +11247,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -11247,7 +11313,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -11394,12 +11460,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' width: this._getCarouselItemSize() * this._getCarouselItemCount() }; } - }, { - key: '_getCarouselItemSize', /** * @return {Number} */ + }, { + key: '_getCarouselItemSize', value: function _getCarouselItemSize() { var sizeAttr = this._getCarouselItemSizeAttr(); var sizeInfo = this._decomposeSizeString(sizeAttr); @@ -11413,12 +11479,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' throw new Error('Invalid state'); } } - }, { - key: '_getInitialIndex', /** * @return {Number} */ + }, { + key: '_getInitialIndex', value: function _getInitialIndex() { var index = parseInt(this.getAttribute('initial-index'), 10); @@ -11428,24 +11494,24 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return 0; } } - }, { - key: '_getCarouselItemSizeAttr', /** * @return {String} */ + }, { + key: '_getCarouselItemSizeAttr', value: function _getCarouselItemSizeAttr() { var attrName = 'item-' + (this._isVertical() ? 'height' : 'width'); var itemSizeAttr = ('' + this.getAttribute(attrName)).trim(); return itemSizeAttr.match(/^\d+(px|%)$/) ? itemSizeAttr : '100%'; } - }, { - key: '_decomposeSizeString', /** * @return {Object} */ + }, { + key: '_decomposeSizeString', value: function _decomposeSizeString(size) { var matches = size.match(/^(\d+)(px|%)/); @@ -11461,12 +11527,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._lastActiveIndex = this._getInitialIndex(); this._scrollTo(this._scroll); } - }, { - key: 'setSwipeable', /** * @param {Boolean} swipeable */ + }, { + key: 'setSwipeable', value: function setSwipeable(swipeable) { if (swipeable) { this.setAttribute('swipeable', ''); @@ -11474,21 +11540,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('swipeable'); } } - }, { - key: 'isSwipeable', /** * @return {Boolean} */ + }, { + key: 'isSwipeable', value: function isSwipeable() { return this.hasAttribute('swipeable'); } - }, { - key: 'setAutoScrollRatio', /** * @param {Number} ratio */ + }, { + key: 'setAutoScrollRatio', value: function setAutoScrollRatio(ratio) { if (ratio < 0.0 || ratio > 1.0) { throw new Error('Invalid ratio.'); @@ -11496,12 +11562,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.setAttribute('auto-scroll-ratio', ratio); } - }, { - key: 'getAutoScrollRatio', /** * @return {Number} */ + }, { + key: 'getAutoScrollRatio', value: function getAutoScrollRatio() { var attr = this.getAttribute('auto-scroll-ratio'); @@ -11516,8 +11582,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return isNaN(scrollRatio) ? 0.5 : scrollRatio; } - }, { - key: 'setActiveCarouselItemIndex', /** * @param {Number} index @@ -11525,6 +11589,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Function} [options.callback] * @param {String} [options.animation] */ + }, { + key: 'setActiveCarouselItemIndex', value: function setActiveCarouselItemIndex(index, options) { options = options || {}; @@ -11537,12 +11603,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._tryFirePostChangeEvent(); } - }, { - key: 'getActiveCarouselItemIndex', /** * @return {Number} */ + }, { + key: 'getActiveCarouselItemIndex', value: function getActiveCarouselItemIndex() { var scroll = this._scroll; var count = this._getCarouselItemCount(); @@ -11561,34 +11627,34 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' // max carousel index return i; } - }, { - key: 'next', /** * @param {Object} [options] * @param {Function} [options.callback] * @param {String} [options.animation] */ + }, { + key: 'next', value: function next(options) { return this.setActiveCarouselItemIndex(this.getActiveCarouselItemIndex() + 1, options); } - }, { - key: 'prev', /** * @param {Object} [options] * @param {Function} [options.callback] * @param {String} [options.animation] */ + }, { + key: 'prev', value: function prev(options) { return this.setActiveCarouselItemIndex(this.getActiveCarouselItemIndex() - 1, options); } - }, { - key: 'setAutoScrollEnabled', /** * @param {Boolean} enabled */ + }, { + key: 'setAutoScrollEnabled', value: function setAutoScrollEnabled(enabled) { if (enabled) { this.setAttribute('auto-scroll', ''); @@ -11596,21 +11662,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('auto-scroll'); } } - }, { - key: 'isAutoScrollEnabled', /** * @return {Boolean} */ + }, { + key: 'isAutoScrollEnabled', value: function isAutoScrollEnabled() { return this.hasAttribute('auto-scroll'); } - }, { - key: 'setDisabled', /** * @param {Boolean} disabled */ + }, { + key: 'setDisabled', value: function setDisabled(disabled) { if (disabled) { this.setAttribute('disabled', ''); @@ -11618,21 +11684,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('disabled'); } } - }, { - key: 'isDisabled', /** * @return {Boolean} */ + }, { + key: 'isDisabled', value: function isDisabled() { return this.hasAttribute('disabled'); } - }, { - key: 'setOverscrollable', /** * @param {Boolean} scrollable */ + }, { + key: 'setOverscrollable', value: function setOverscrollable(scrollable) { if (scrollable) { this.setAttribute('overscrollable', ''); @@ -11640,33 +11706,33 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('overscrollable'); } } - }, { - key: 'isOverscrollable', /** * @return {Boolean} */ + }, { + key: 'isOverscrollable', value: function isOverscrollable() { return this.hasAttribute('overscrollable'); } - }, { - key: '_isEnabledChangeEvent', /** * @return {Boolean} */ + }, { + key: '_isEnabledChangeEvent', value: function _isEnabledChangeEvent() { var elementSize = this._getElementSize(); var carouselItemSize = this._getCarouselItemSize(); return this.isAutoScrollEnabled() && elementSize === carouselItemSize; } - }, { - key: '_isVertical', /** * @return {Boolean} */ + }, { + key: '_isVertical', value: function _isVertical() { return this.getAttribute('direction') === 'vertical'; } @@ -11778,12 +11844,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' event.gesture.preventDefault(); } - }, { - key: '_mixin', /** * @param {Object} trait */ + }, { + key: '_mixin', value: function _mixin(trait) { Object.keys(trait).forEach((function (key) { this[key] = trait[key]; @@ -11866,22 +11932,22 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return Math.max(0, Math.min(max, scroll)); } } - }, { - key: '_getCarouselItemElements', /** * @return {Array} */ + }, { + key: '_getCarouselItemElements', value: function _getCarouselItemElements() { return ons._util.arrayFrom(this.querySelectorAll('ons-carousel-item')); } - }, { - key: '_scrollTo', /** * @param {Number} scroll * @param {Object} [options] */ + }, { + key: '_scrollTo', value: function _scrollTo(scroll, options) { var _this3 = this; @@ -11978,21 +12044,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return; } - }, { - key: '_getCarouselItemCount', /** * @return {Number} */ + }, { + key: '_getCarouselItemCount', value: function _getCarouselItemCount() { return this._getCarouselItemElements().length; } - }, { - key: 'refresh', /** * Refresh carousel item layout. */ + }, { + key: 'refresh', value: function refresh() { // Bug fix if (this._getCarouselItemSize() === 0) { @@ -12094,7 +12160,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -12175,7 +12241,7 @@ var _get = function get(_x3, _x4, _x5) { var _again = true; _function: while (_a function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -12246,12 +12312,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.setAttribute('no-status-bar-fill', ''); } - }, { - key: 'getDeviceBackButtonHandler', /** * @return {Object} */ + }, { + key: 'getDeviceBackButtonHandler', value: function getDeviceBackButtonHandler() { return this._deviceBackButtonHandler; } @@ -12277,8 +12343,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } } - }, { - key: 'show', /** * Show dialog. @@ -12288,6 +12352,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] animation options * @param {Function} [options.callback] callback after dialog is shown */ + }, { + key: 'show', value: function show() { var _this2 = this; @@ -12329,8 +12395,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } } - }, { - key: 'hide', /** * Hide dialog. @@ -12340,6 +12404,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] animation options * @param {Function} [options.callback] callback after dialog is hidden */ + }, { + key: 'hide', value: function hide() { var _this3 = this; @@ -12376,47 +12442,47 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } } - }, { - key: 'destroy', /** * Destroy dialog. */ + }, { + key: 'destroy', value: function destroy() { if (this.parentElement) { this.parentElement.removeChild(this); } } - }, { - key: 'isShown', /** * True if dialog is visible. * * @return {Boolean} */ + }, { + key: 'isShown', value: function isShown() { return this._visible; } - }, { - key: 'isCancelable', /** * True if the dialog is cancelable. * * @return {Boolean} */ + }, { + key: 'isCancelable', value: function isCancelable() { return this.hasAttribute('cancelable'); } - }, { - key: 'setDisabled', /** * Disable or enable dialog. * * @param {Boolean} */ + }, { + key: 'setDisabled', value: function setDisabled(disabled) { if (typeof disabled !== 'boolean') { throw new Error('Argument must be a boolean.'); @@ -12428,25 +12494,25 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('disabled'); } } - }, { - key: 'isDisabled', /** * True if dialog is disabled. * * @return {Boolean} */ + }, { + key: 'isDisabled', value: function isDisabled() { return this.hasAttribute('disabled'); } - }, { - key: 'setCancelable', /** * Make dialog cancelable or uncancelable. * * @param {Boolean} */ + }, { + key: 'setCancelable', value: function setCancelable(cancelable) { if (typeof cancelable !== 'boolean') { throw new Error('Argument must be a boolean.'); @@ -12489,12 +12555,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' get: function get() { return util.findChild(this, '.dialog-mask'); } - }, { - key: '_dialog', /** * @return {Element} */ + }, { + key: '_dialog', get: function get() { return util.findChild(this, '.dialog'); } @@ -12552,7 +12618,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -12607,7 +12673,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -12652,12 +12718,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return _this.classList.add(className); }); } - }, { - key: '_cleanClassAttribute', /** * Remove unneeded class value. */ + }, { + key: '_cleanClassAttribute', value: function _cleanClassAttribute() { var classList = this.classList; @@ -12693,10 +12759,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' if (size.match(/^[1-5]x|lg$/)) { classList.push('fa-' + size); this.style.removeProperty('font-size'); - } else if (typeof size === 'string') { - style.fontSize = size; } else { - classList.push('fa-lg'); + style.fontSize = size; } return { @@ -12740,7 +12804,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -12806,7 +12870,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -12899,7 +12963,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -12965,7 +13029,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -13083,8 +13147,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' value: function isShown() { return this.style.display !== 'none'; } - }, { - key: 'show', /** * Show modal view. @@ -13094,6 +13156,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] animation options * @param {Function} [options.callback] callback after modal is shown */ + }, { + key: 'show', value: function show(options) { var _this = this; @@ -13112,8 +13176,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); }); } - }, { - key: 'toggle', /** * Toggle modal view. @@ -13123,6 +13185,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] animation options * @param {Function} [options.callback] callback after modal is toggled */ + }, { + key: 'toggle', value: function toggle() { if (this.isShown()) { return this.hide.apply(this, arguments); @@ -13130,8 +13194,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return this.show.apply(this, arguments); } } - }, { - key: 'hide', /** * Hide modal view. @@ -13141,6 +13203,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] animation options * @param {Function} [options.callback] callback after modal is hidden */ + }, { + key: 'hide', value: function hide(options) { var _this2 = this; @@ -13219,7 +13283,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -13265,17 +13329,15 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' defaultAnimationOptions: AnimatorFactory.parseJSONSafely(this.getAttribute('animation-options')) || {} }); } - }, { - key: 'canPopPage', /** * @return {Boolean} */ + }, { + key: 'canPopPage', value: function canPopPage() { return this._pages.length > 1; } - }, { - key: 'replacePage', /** * Replaces the current page with the specified one. @@ -13283,6 +13345,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {String} page * @param {Object} [options] */ + }, { + key: 'replacePage', value: function replacePage(page, options) { var _this = this; @@ -13299,8 +13363,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return this.pushPage(page, options); } - }, { - key: 'popPage', /** * Pops current page from the page stack. @@ -13312,6 +13374,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Function} [options.onTransitionEnd] * @param {Boolean} [options.cancelIfRunning] */ + }, { + key: 'popPage', value: function popPage(options) { var _this2 = this; @@ -13404,8 +13468,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' var animator = this._animatorFactory.newAnimator(options, leavePage.options.animator); animator.pop(enterPage, leavePage, callback); } - }, { - key: 'insertPage', /** * Insert page object that has the specified pageUrl into the page stack and @@ -13416,6 +13478,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options] * @param {String/NavigatorTransitionAnimator} [options.animation] */ + }, { + key: 'insertPage', value: function insertPage(index, page, options) { var _this4 = this; @@ -13461,8 +13525,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); }); } - }, { - key: 'getCurrentPage', /** * Get current page's navigator item. @@ -13472,6 +13534,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * * @return {Object} */ + }, { + key: 'getCurrentPage', value: function getCurrentPage() { if (this._pages.length <= 0) { throw new Error('Invalid state'); @@ -13494,8 +13558,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' event.callParentHandler(); } } - }, { - key: 'resetToPage', /** * Clears page stack and add the specified pageUrl to the page stack. @@ -13505,6 +13567,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {String} page * @param {Object} [options] */ + }, { + key: 'resetToPage', value: function resetToPage(page, options) { var _this5 = this; @@ -13558,8 +13622,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._deviceBackButtonHandler.destroy(); this._deviceBackButtonHandler = null; } - }, { - key: 'pushPage', /** * Pushes the specified pageUrl into the page stack and @@ -13572,6 +13634,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Function} [options.onTransitionEnd] * @param {Boolean} [options.cancelIfRunning] */ + }, { + key: 'pushPage', value: function pushPage(page, options) { var _this7 = this; @@ -13607,8 +13671,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' _this8._pushPageDOM(page, _this8._createPageElement(templateHTML), options, done); }); } - }, { - key: '_pushPageDOM', /** * @param {String} page Page name. @@ -13616,6 +13678,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} options * @param {Function} [unlock] */ + }, { + key: '_pushPageDOM', value: function _pushPageDOM(page, element, options, unlock) { var _this9 = this; @@ -13672,12 +13736,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }, element); }, element); } - }, { - key: '_emitPrePushEvent', /** * @return {Boolean} Whether if event is canceled. */ + }, { + key: '_emitPrePushEvent', value: function _emitPrePushEvent() { var isCanceled = false; var event = new CustomEvent('prepush', { @@ -13695,12 +13759,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return isCanceled; } - }, { - key: '_emitPrePopEvent', /** * @return {Boolean} Whether if event is canceled. */ + }, { + key: '_emitPrePopEvent', value: function _emitPrePopEvent() { var isCanceled = false; @@ -13722,14 +13786,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return isCanceled; } - }, { - key: '_createPageObject', /** * @param {String} page * @param {Element} element * @param {Object} options */ + }, { + key: '_createPageObject', value: function _createPageObject(page, element, options) { options.animator = this._animatorFactory.newAnimator(options); @@ -13817,7 +13881,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -13854,21 +13918,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); this.dispatchEvent(event); } - }, { - key: 'getDeviceBackButtonHandler', /** * @return {Object/null} */ + }, { + key: 'getDeviceBackButtonHandler', value: function getDeviceBackButtonHandler() { return this._deviceBackButtonHandler || null; } - }, { - key: 'setDeviceBackButtonHandler', /** * @param {Function} callback */ + }, { + key: 'setDeviceBackButtonHandler', value: function setDeviceBackButtonHandler(callback) { if (this._deviceBackButtonHandler) { this._deviceBackButtonHandler.destroy(); @@ -13876,12 +13940,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._deviceBackButtonHandler = ons._deviceBackButtonDispatcher.createHandler(this, callback); } - }, { - key: '_getContentElement', /** * @return {HTMLElement} */ + }, { + key: '_getContentElement', value: function _getContentElement() { var result = ons._util.findChild(this, '.page__content'); if (result) { @@ -13889,21 +13953,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' } throw Error('fail to get ".page__content" element.'); } - }, { - key: '_hasToolbarElement', /** * @return {Boolean} */ + }, { + key: '_hasToolbarElement', value: function _hasToolbarElement() { return !!ons._util.findChild(this, 'ons-toolbar'); } - }, { - key: '_canAnimateToolbar', /** * @return {Boolean} */ + }, { + key: '_canAnimateToolbar', value: function _canAnimateToolbar() { var toolbar = ons._util.findChild(this, 'ons-toolbar'); if (toolbar) { @@ -13919,12 +13983,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return false; } - }, { - key: '_getBackgroundElement', /** * @return {HTMLElement} */ + }, { + key: '_getBackgroundElement', value: function _getBackgroundElement() { var result = ons._util.findChild(this, '.page__background'); if (result) { @@ -13932,32 +13996,32 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' } throw Error('fail to get ".page__background" element.'); } - }, { - key: '_getBottomToolbarElement', /** * @return {HTMLElement} */ + }, { + key: '_getBottomToolbarElement', value: function _getBottomToolbarElement() { return ons._util.findChild(this, 'ons-bottom-toolbar') || ons._internal.nullElement; } - }, { - key: '_getToolbarElement', /** * @return {HTMLElement} */ + }, { + key: '_getToolbarElement', value: function _getToolbarElement() { return ons._util.findChild(this, 'ons-toolbar') || nullToolbarElement; } - }, { - key: '_registerToolbar', /** * Register toolbar element to this page. * * @param {HTMLElement} element */ + }, { + key: '_registerToolbar', value: function _registerToolbar(element) { this._getContentElement().setAttribute('no-status-bar-fill', ''); @@ -13967,14 +14031,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.insertBefore(element, this.children[0]); } } - }, { - key: '_registerBottomToolbar', /** * Register toolbar element to this page. * * @param {HTMLElement} element */ + }, { + key: '_registerBottomToolbar', value: function _registerBottomToolbar(element) { if (!ons._util.findChild(this, '.page__status-bar-fill')) { var fill = document.createElement('div'); @@ -14097,7 +14161,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -14326,8 +14390,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._popover.setAttribute('style', style); } } - }, { - key: 'show', /** * Show popover. @@ -14339,6 +14401,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {String} [options.animation] animation type * @param {Object} [options.animationOptions] animation options */ + }, { + key: 'show', value: function show(target, options) { var _this3 = this; @@ -14393,8 +14457,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } } - }, { - key: 'hide', /** * Hide popover. @@ -14403,6 +14465,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {String} [options.animation] animation type * @param {Object} [options.animationOptions] animation options */ + }, { + key: 'hide', value: function hide(options) { var _this4 = this; @@ -14438,14 +14502,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } } - }, { - key: 'isShown', /** * Returns whether the popover is visible or not. * * @return {Boolean} */ + }, { + key: 'isShown', value: function isShown() { return this._visible; } @@ -14485,14 +14549,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._animatorFactory = this._createAnimatorFactory(); } } - }, { - key: 'setCancelable', /** * Set whether the popover should be cancelable or not. * * @param {Boolean} */ + }, { + key: 'setCancelable', value: function setCancelable(cancelable) { if (typeof cancelable !== 'boolean') { throw new Error('Argument must be a boolean.'); @@ -14504,23 +14568,23 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.removeAttribute('cancelable'); } } - }, { - key: 'isCancelable', /** * Return whether the popover is cancelable or not. * * @return {Boolean} */ + }, { + key: 'isCancelable', value: function isCancelable() { return this.hasAttribute('cancelable'); } - }, { - key: 'destroy', /** * Destroy the popover and remove it from the DOM tree. */ + }, { + key: 'destroy', value: function destroy() { if (this.parentElement) { this.parentElement.removeChild(this); @@ -14605,7 +14669,7 @@ var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_a function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -14766,12 +14830,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' } } } - }, { - key: 'setActionCallback', /** * @param {Function} callback */ + }, { + key: 'setActionCallback', value: function setActionCallback(callback) { this._callback = callback; } @@ -14791,41 +14855,41 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._translateTo(0, { animate: true }); this._setState(STATE_INITIAL); } - }, { - key: 'getHeight', /** * @return {Number} */ + }, { + key: 'getHeight', value: function getHeight() { return parseInt(this.getAttribute('height') || '64', 10); } - }, { - key: 'setHeight', /** * @param {Number} height */ + }, { + key: 'setHeight', value: function setHeight(height) { this.setAttribute('height', height + 'px'); this._setStyle(); } - }, { - key: 'setThresholdHeight', /** * @param {Number} thresholdHeight */ + }, { + key: 'setThresholdHeight', value: function setThresholdHeight(thresholdHeight) { this.setAttribute('threshold-height', thresholdHeight + 'px'); } - }, { - key: 'getThresholdHeight', /** * @return {Number} */ + }, { + key: 'getThresholdHeight', value: function getThresholdHeight() { return parseInt(this.getAttribute('threshold-height') || '96', 10); } @@ -14901,14 +14965,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return this._scrollElement; } } - }, { - key: '_translateTo', /** * @param {Number} scroll * @param {Object} options * @param {Function} [options.callback] */ + }, { + key: '_translateTo', value: function _translateTo(scroll) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; @@ -15057,7 +15121,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -15151,21 +15215,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this.setAttribute('checked', ''); } } - }, { - key: '_isChecked', /** * @return {Boolean} */ + }, { + key: '_isChecked', value: function _isChecked() { return this._getCheckbox().checked; } - }, { - key: '_setChecked', /** * @param {Boolean} */ + }, { + key: '_setChecked', value: function _setChecked(isChecked) { isChecked = !!isChecked; @@ -15254,7 +15318,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -15369,11 +15433,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' value: function isPersistent() { return this.hasAttribute('persistent'); } - }, { - key: '_hasDefaultTemplate', - value: function _hasDefaultTemplate() { - return this.classList.contains('tab-bar__item--default'); - } }, { key: 'setActive', value: function setActive() { @@ -15402,17 +15461,15 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return element.style.display = 'none'; }); } - }, { - key: 'isLoaded', /** * @return {Boolean} */ + }, { + key: 'isLoaded', value: function isLoaded() { return false; } - }, { - key: '_loadPageElement', /** * @param {Function} callback @@ -15420,6 +15477,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} hooks.compile * @param {Object} hooks.link */ + }, { + key: '_loadPageElement', value: function _loadPageElement(callback, hooks) { var _this = this; @@ -15441,33 +15500,33 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._createPageElement(this.getAttribute('page'), callback); } } - }, { - key: '_createPageElement', /** * @param {String} page * @param {Function} callback */ + }, { + key: '_createPageElement', value: function _createPageElement(page, callback) { ons._internal.getPageHTMLAsync(page).then(function (html) { callback(util.createElement(html.trim())); }); } - }, { - key: 'isActive', /** * @return {Boolean} */ + }, { + key: 'isActive', value: function isActive() { return this.classList.contains('active'); } - }, { - key: 'canReload', /** * @return {Boolean} */ + }, { + key: 'canReload', value: function canReload() { return !this.hasAttribute('no-reload'); } @@ -15518,8 +15577,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return i; } } - - throw new Error('Invalid state: tab index is not found.'); } }, { key: '_ensureElementPosition', @@ -15580,7 +15637,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -15623,7 +15680,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._tabbarId = generateId(); this._animatorFactory = new AnimatorFactory({ - animators: TabbarElement._animatorDict, + animators: OnsTabbarElement._animatorDict, baseClass: TabbarAnimator, baseClassName: 'TabbarAnimator', defaultAnimation: this.getAttribute('animation'), @@ -15704,8 +15761,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' value: function _getTabbarElement() { return util.findChild(this, '.tab-bar'); } - }, { - key: 'loadPage', /** * @param {String} page @@ -15713,13 +15768,13 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animation] * @param {Object} [options.callback] */ + }, { + key: 'loadPage', value: function loadPage(page, options) { options = options || {}; options._removeElement = true; return this._loadPage(page, options); } - }, { - key: '_loadPage', /** * @param {String} page @@ -15727,6 +15782,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animation] * @param {Object} [options.callback] */ + }, { + key: '_loadPage', value: function _loadPage(page, options) { var _this2 = this; @@ -15734,8 +15791,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' _this2._loadPageDOMAsync(pageElement, options); }); } - }, { - key: '_loadPageDOMAsync', /** * @param {Element} pageElement @@ -15743,6 +15798,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animation] * @param {Object} [options.callback] */ + }, { + key: '_loadPageDOMAsync', value: function _loadPageDOMAsync(pageElement, options) { var _this3 = this; @@ -15755,21 +15812,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }, pageElement); }, pageElement); } - }, { - key: 'getTabbarId', /** * @return {String} */ + }, { + key: 'getTabbarId', value: function getTabbarId() { return this._tabbarId; } - }, { - key: '_getCurrentPageElement', /** * @return {Element/null} */ + }, { + key: '_getCurrentPageElement', value: function _getCurrentPageElement() { var pages = this._getContentElement().children; var page = null; @@ -15786,8 +15843,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return page; } - }, { - key: '_switchPage', /** * @param {Element} element @@ -15799,6 +15854,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Number} options.selectedTabIndex * @param {Number} options.previousTabIndex */ + }, { + key: '_switchPage', value: function _switchPage(element, options) { if (this.getActiveTabIndex() !== -1) { var oldPageElement = this._getContentElement().children.length > 1 ? this._getCurrentPageElement() : ons._internal.nullElement; @@ -15823,8 +15880,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' } } } - }, { - key: 'setActiveTab', /** * @param {Number} index @@ -15834,12 +15889,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' * @param {Object} [options.animationOptions] * @return {Boolean} success or not */ + }, { + key: 'setActiveTab', value: function setActiveTab(index, options) { var _this4 = this; options = options || {}; - var previousTab = this._getTabElement(this.getActiveTabIndex()), + var previousTab = this._getActiveTabElement(), selectedTab = this._getTabElement(index), previousTabIndex = this.getActiveTabIndex(), selectedTabIndex = index; @@ -15894,17 +15951,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' } var params = { - callback: (function (_callback) { - function callback() { - return _callback.apply(this, arguments); - } - - callback.toString = function () { - return _callback.toString(); - }; - - return callback; - })(function () { + callback: function callback() { _this4.dispatchEvent(new CustomEvent('postchange', { bubbles: true, detail: { @@ -15914,9 +15961,9 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' })); if (options.callback instanceof Function) { - callback(); + options.callback(); } - }), + }, previousTabIndex: previousTabIndex, selectedTabIndex: selectedTabIndex, _removeElement: removeElement @@ -15953,14 +16000,14 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return true; } - }, { - key: '_loadPersistentPageDOM', /** * @param {Element} element * @param {Object} options * @param {Object} options.animation */ + }, { + key: '_loadPersistentPageDOM', value: function _loadPersistentPageDOM(element, options) { options = options || {}; @@ -15968,12 +16015,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' this._getContentElement().appendChild(element); this._switchPage(element, options); } - }, { - key: 'setTabbarVisibility', /** * @param {Boolean} visible */ + }, { + key: 'setTabbarVisibility', value: function setTabbarVisibility(visible) { this._getContentElement().style[this._hasTopTabbar() ? 'top' : 'bottom'] = visible ? '' : '0px'; this._getTabbarElement().style.display = visible ? '' : 'none'; @@ -15983,12 +16030,12 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' value: function _getContentElement() { return ons._util.findChild(this, '.tab-bar__content'); } - }, { - key: 'getActiveTabIndex', /** * @return {Number} When active tab is not found, returns -1. */ + }, { + key: 'getActiveTabIndex', value: function getActiveTabIndex() { var tabs = this._getTabbarElement().children; @@ -16000,21 +16047,21 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return -1; } - }, { - key: '_getActiveTabElement', /** * @return {Number} When active tab is not found, returns -1. */ + }, { + key: '_getActiveTabElement', value: function _getActiveTabElement() { return this._getTabElement(this.getActiveTabIndex()); } - }, { - key: '_getTabElement', /** * @return {Element} */ + }, { + key: '_getTabElement', value: function _getTabElement(index) { return this._getTabbarElement().children[index]; } @@ -16024,17 +16071,6 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }, { key: 'attachedCallback', value: function attachedCallback() {} - }, { - key: '_ensureTabElements', - value: function _ensureTabElements(wrapper) { - // ensure that all children are "ons-tab" element after compile. - - for (var i = 0; i < wrapper.children.length; i++) { - if (wrapper.children[i].nodeName.toLowerCase() !== 'ons-tab') { - throw new Error('children must be an element of "ons-tab" elements'); - } - } - } }, { key: 'attributeChangedCallback', value: function attributeChangedCallback(name, last, current) { @@ -16047,29 +16083,29 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' return TabbarElement; })(ons._BaseElement); - TabbarElement._animatorDict = { - 'default': TabbarNoneAnimator, - 'fade': TabbarFadeAnimator, - 'slide': TabbarSlideAnimator, - 'none': TabbarNoneAnimator - }; - - /** - * @param {String} name - * @param {Function} Animator - */ - TabbarElement.registerAnimator = function (name, Animator) { - if (!(Animator.prototype instanceof TabbarAnimator)) { - throw new Error('"Animator" param must inherit TabbarAnimator'); - } - TabbarElement._animatorDict[name] = Animator; - }; - if (!window.OnsTabbarElement) { window.OnsTabbarElement = document.registerElement('ons-tabbar', { prototype: TabbarElement.prototype }); + window.OnsTabbarElement._animatorDict = { + 'default': TabbarNoneAnimator, + 'fade': TabbarFadeAnimator, + 'slide': TabbarSlideAnimator, + 'none': TabbarNoneAnimator + }; + + /** + * @param {String} name + * @param {Function} Animator + */ + window.OnsTabbarElement.registerAnimator = function (name, Animator) { + if (!(Animator.prototype instanceof TabbarAnimator)) { + throw new Error('"Animator" param must inherit TabbarAnimator'); + } + this._animatorDict[name] = Animator; + }; + window.OnsTabbarElement.ready = function (element, callback) { setImmediate(callback); }; @@ -16100,7 +16136,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -16168,7 +16204,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -16236,7 +16272,7 @@ var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_ag function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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) subClass.__proto__ = superClass; } +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; } (function () { 'use strict'; @@ -16311,39 +16347,39 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' page._registerToolbar(this); } } - }, { - key: '_getToolbarLeftItemsElement', /** * @return {HTMLElement} */ + }, { + key: '_getToolbarLeftItemsElement', value: function _getToolbarLeftItemsElement() { return this.querySelector('.left') || ons._internal.nullElement; } - }, { - key: '_getToolbarCenterItemsElement', /** * @return {HTMLElement} */ + }, { + key: '_getToolbarCenterItemsElement', value: function _getToolbarCenterItemsElement() { return this.querySelector('.center') || ons._internal.nullElement; } - }, { - key: '_getToolbarRightItemsElement', /** * @return {HTMLElement} */ + }, { + key: '_getToolbarRightItemsElement', value: function _getToolbarRightItemsElement() { return this.querySelector('.right') || ons._internal.nullElement; } - }, { - key: '_getToolbarBackButtonLabelElement', /** * @return {HTMLElement} */ + }, { + key: '_getToolbarBackButtonLabelElement', value: function _getToolbarBackButtonLabelElement() { return this.querySelector('ons-back-button .back-button__label') || ons._internal.nullElement; } @@ -16439,4 +16475,4 @@ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' }); } })(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpbnN0b3JlLWpzY29tcGF0LmpzIiwiQ3VzdG9tRWxlbWVudHMuanMiLCJDdXN0b21FdmVudC5qcyIsImNsYXNzLmpzIiwiZmFzdGNsaWNrLmpzIiwibWljcm9ldmVudC5qcyIsIm1vZGVybml6ci5jdXN0b20uanMiLCJwcm9taXNlLTYuMS4wLmpzIiwic2V0SW1tZWRpYXRlLmpzIiwidmlld3BvcnQuanMiLCJkb29ybG9jay5lczYiLCJkZXZpY2UtYmFjay1idXR0b24tZGlzcGF0Y2hlci5lczYiLCJvbnMuZXM2Iiwib25zLXV0aWwuZXM2IiwibW9kYWwtYW5pbWF0b3IuZXM2IiwibmF2aWdhdG9yLXRyYW5zaXRpb24tYW5pbWF0b3IuZXM2IiwicG9wb3Zlci1hbmltYXRvci5lczYiLCJhbGVydC1kaWFsb2ctYW5pbWF0b3IuZXM2IiwiYW5pbWF0b3ItZmFjdG9yeS5lczYiLCJhc3luYy1ob29rLmVzNiIsImRpYWxvZy1hbmltYXRvci5lczYiLCJmYWRlLW1vZGFsLWFuaW1hdG9yLmVzNiIsImZhZGUtbmF2aWdhdG9yLXRyYW5zaXRpb24tYW5pbWF0b3IuZXM2IiwiZmFkZS1wb3BvdmVyLWFuaW1hdG9yLmVzNiIsImlvcy1zbGlkZS1uYXZpZ2F0b3ItdHJhbnNpdGlvbi1hbmltYXRvci5lczYiLCJsYXp5LXJlcGVhdC1wcm92aWRlci5lczYiLCJsaWZ0LW5hdmlnYXRvci10cmFuc2l0aW9uLWFuaW1hdG9yLmVzNiIsIm1vZGlmaWVyLXV0aWwuZXM2IiwibmF2aWdhdG9yLXBhZ2UuZXM2Iiwib25zLWludGVybmFsLmVzNiIsIm9ucy1ub3RpZmljYXRpb24uZXM2Iiwib25zLW9yaWVudGF0aW9uLmVzNiIsIm9ucy1wbGF0Zm9ybS5lczYiLCJvbnMtc29mdHdhcmUta2V5Ym9hcmQuZXM2Iiwic2ltcGxlLXNsaWRlLW5hdmlnYXRvci10cmFuc2l0aW9uLWFuaW1hdG9yLmVzNiIsInRhYmJhci1hbmltYXRvci5lczYiLCJhbmltaXQuanMiLCJvbnMtZ2VzdHVyZS1kZXRlY3Rvci5qcyIsInNldHVwLmVzNiIsIm9ucy1hbGVydC1kaWFsb2cuZXM2Iiwib25zLWJhY2stYnV0dG9uLmVzNiIsIm9ucy1ib3R0b20tdG9vbGJhci5lczYiLCJvbnMtYnV0dG9uLmVzNiIsIm9ucy1jYXJvdXNlbC1pdGVtLmVzNiIsIm9ucy1jYXJvdXNlbC5lczYiLCJvbnMtY29sLmVzNiIsIm9ucy1kaWFsb2cuZXM2Iiwib25zLWdlc3R1cmUtZGV0ZWN0b3IuZXM2Iiwib25zLWljb24uZXM2Iiwib25zLWxpc3QtaGVhZGVyLmVzNiIsIm9ucy1saXN0LWl0ZW0uZXM2Iiwib25zLWxpc3QuZXM2Iiwib25zLW1vZGFsLmVzNiIsIm9ucy1uYXZpZ2F0b3IuZXM2Iiwib25zLXBhZ2UuZXM2Iiwib25zLXBvcG92ZXIuZXM2Iiwib25zLXB1bGwtaG9vay5lczYiLCJvbnMtcm93LmVzNiIsIm9ucy1zY3JvbGxlci5lczYiLCJvbnMtc3dpdGNoLmVzNiIsIm9ucy10YWIuZXM2Iiwib25zLXRhYmJhci5lczYiLCJvbnMtdGVtcGxhdGUuZXM2Iiwib25zLXRvb2xiYXItYnV0dG9uLmVzNiIsIm9ucy10b29sYmFyLmVzNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNTdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDejBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN2WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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RUFBRTtBQUNoQyxZQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDOztBQUV0RCxZQUFJLENBQUMsU0FBUyxFQUFFO0FBQ2QsbUJBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFDLG1CQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQjs7QUFFRCxZQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO0FBQ3JDLG1CQUFTLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztTQUNoQzs7QUFFRCxpQkFBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDbkQsZUFBTyxTQUFTLENBQUM7T0FDbEI7OztXQW5KRyxjQUFjO0tBQVMsR0FBRyxDQUFDLFlBQVk7O0FBdUo3QyxNQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFO0FBQzdCLFVBQU0sQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRTtBQUNqRSxlQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVM7S0FDcEMsQ0FBQyxDQUFDO0dBQ0o7Q0FDRixDQUFBLEVBQUcsQ0FBQyIsImZpbGUiOiJvbnMtY29yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IE9wZW4gVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuLy8gSmF2YVNjcmlwdCBEeW5hbWljIENvbnRlbnQgc2hpbSBmb3IgV2luZG93cyBTdG9yZSBhcHBzXG4oZnVuY3Rpb24gKCkge1xuXG4gICAgaWYgKHdpbmRvdy5NU0FwcCAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuXG4gICAgICAgIC8vIFNvbWUgbm9kZXMgd2lsbCBoYXZlIGFuIFwiYXR0cmlidXRlc1wiIHByb3BlcnR5IHdoaWNoIHNoYWRvd3MgdGhlIE5vZGUucHJvdG90eXBlLmF0dHJpYnV0ZXMgcHJvcGVydHlcbiAgICAgICAgLy8gIGFuZCBtZWFucyB3ZSBkb24ndCBhY3R1YWxseSBzZWUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE5vZGUgKGludGVyZXN0aW5nbHkgdGhlIFZTIGRlYnVnIGNvbnNvbGVcbiAgICAgICAgLy8gIGFwcGVhcnMgdG8gc3VmZmVyIGZyb20gdGhlIHNhbWUgaXNzdWUpLlxuICAgICAgICAvL1xuICAgICAgICB2YXIgRWxlbWVudF9zZXRBdHRyaWJ1dGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90eXBlLCBcInNldEF0dHJpYnV0ZVwiKS52YWx1ZTtcbiAgICAgICAgdmFyIEVsZW1lbnRfcmVtb3ZlQXR0cmlidXRlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgXCJyZW1vdmVBdHRyaWJ1dGVcIikudmFsdWU7XG4gICAgICAgIHZhciBIVE1MRWxlbWVudF9pbnNlcnRBZGphY2VudEhUTUxQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwgXCJpbnNlcnRBZGphY2VudEhUTUxcIik7XG4gICAgICAgIHZhciBOb2RlX2dldF9hdHRyaWJ1dGVzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwgXCJhdHRyaWJ1dGVzXCIpLmdldDtcbiAgICAgICAgdmFyIE5vZGVfZ2V0X2NoaWxkTm9kZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCBcImNoaWxkTm9kZXNcIikuZ2V0O1xuICAgICAgICB2YXIgZGV0ZWN0aW9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBOb2RlX2dldF9hdHRyaWJ1dGVzLmNhbGwoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBFbGVtZW50X3NldEF0dHJpYnV0ZS5jYWxsKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgRWxlbWVudF9yZW1vdmVBdHRyaWJ1dGUuY2FsbChlbGVtZW50LCBhdHRyaWJ1dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hpbGROb2RlcyhlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gTm9kZV9nZXRfY2hpbGROb2Rlcy5jYWxsKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZW1wdHkoZWxlbWVudCkge1xuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQubGFzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluc2VydEFkamFjZW50SFRNTChlbGVtZW50LCBwb3NpdGlvbiwgaHRtbCkge1xuICAgICAgICAgICAgSFRNTEVsZW1lbnRfaW5zZXJ0QWRqYWNlbnRIVE1MUHJvcGVydHlEZXNjcmlwdG9yLnZhbHVlLmNhbGwoZWxlbWVudCwgcG9zaXRpb24sIGh0bWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5VbnNhZmVNb2RlKCkge1xuICAgICAgICAgICAgdmFyIGlzVW5zYWZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGV0ZWN0aW9uRGl2LmlubmVySFRNTCA9IFwiPHRlc3QvPlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgaXNVbnNhZmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGlzVW5zYWZlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2xlYW5zZShodG1sLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgICAgICB2YXIgY2xlYW5lciA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcImNsZWFuZXJcIik7XG4gICAgICAgICAgICBlbXB0eShjbGVhbmVyLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0QWRqYWNlbnRIVE1MKGNsZWFuZXIuZG9jdW1lbnRFbGVtZW50LCBcImFmdGVyYmVnaW5cIiwgaHRtbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHNjcmlwdHMgPSBjbGVhbmVyLmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzY3JpcHRzLCBmdW5jdGlvbiAoc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChzY3JpcHQudHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gXCJ0ZXh0L2luZXJ0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHQvamF2YXNjcmlwdFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dC9lY21hc2NyaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0L3gtamF2YXNjcmlwdFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dC9qc2NyaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0L2xpdmVzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHQvamF2YXNjcmlwdDEuMVwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0MS4yXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0L2phdmFzY3JpcHQxLjNcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gXCJ0ZXh0L2luZXJ0LVwiICsgc2NyaXB0LnR5cGUuc2xpY2UoXCJ0ZXh0L1wiLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSBcImFwcGxpY2F0aW9uL2luZXJ0LVwiICsgc2NyaXB0LnR5cGUuc2xpY2UoXCJhcHBsaWNhdGlvbi9cIi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBjbGVhbnNlQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGF0dHJpYnV0ZXMgY29sbGVjdGlvbiBpcyBsaXZlIGl0IGlzIHNpbXBsZXIgdG8gcXVldWUgdXAgdGhlIHJlbmFtZXNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmFtZVswXSA9PT0gXCJvXCIgfHwgbmFtZVswXSA9PT0gXCJPXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVbMV0gPT09IFwiblwiIHx8IG5hbWVbMV0gPT09IFwiTlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGV2ZW50cyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaCh7IG5hbWU6IGF0dHJpYnV0ZS5uYW1lLCB2YWx1ZTogYXR0cmlidXRlLnZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBldmVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gZXZlbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKGVsZW1lbnQsIFwieC1cIiArIGF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGNoaWxkTm9kZXMoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFuc2VBdHRyaWJ1dGVzKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhbnNlQXR0cmlidXRlcyhjbGVhbmVyLmRvY3VtZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIHZhciBjbGVhbmVkTm9kZXMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQudGFnTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICAgICAgICAgICAgY2xlYW5lZE5vZGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuYWRvcHROb2RlKGNsZWFuZXIuZG9jdW1lbnRFbGVtZW50KS5jaGlsZE5vZGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsZWFuZXIuaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbmVkTm9kZXMgPSBjbGVhbmVkTm9kZXMuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LmFkb3B0Tm9kZShjbGVhbmVyLmhlYWQpLmNoaWxkTm9kZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNsZWFuZXIuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhbmVkTm9kZXMgPSBjbGVhbmVkTm9kZXMuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LmFkb3B0Tm9kZShjbGVhbmVyLmJvZHkpLmNoaWxkTm9kZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjbGVhbmVkTm9kZXM7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjbGVhbnNlUHJvcGVydHlTZXR0ZXIocHJvcGVydHksIHNldHRlcikge1xuICAgICAgICAgICAgdmFyIHByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxTZXR0ZXIgPSBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxFbGVtZW50LnByb3RvdHlwZSwgcHJvcGVydHksIHtcbiAgICAgICAgICAgICAgICBnZXQ6IHByb3BlcnR5RGVzY3JpcHRvci5nZXQsXG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LldpbkpTICYmIHdpbmRvdy5XaW5KUy5fZXhlY1Vuc2FmZSAmJiBpblVuc2FmZU1vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTZXR0ZXIuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBjbGVhbnNlKHZhbHVlLCB0aGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXIocHJvcGVydHlEZXNjcmlwdG9yLCB0aGF0LCBub2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogcHJvcGVydHlEZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYW5zZVByb3BlcnR5U2V0dGVyKFwiaW5uZXJIVE1MXCIsIGZ1bmN0aW9uIChwcm9wZXJ0eURlc2NyaXB0b3IsIHRhcmdldCwgZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGVtcHR5KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoZWxlbWVudHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY2xlYW5zZVByb3BlcnR5U2V0dGVyKFwib3V0ZXJIVE1MXCIsIGZ1bmN0aW9uIChwcm9wZXJ0eURlc2NyaXB0b3IsIHRhcmdldCwgZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmVuZFwiLCBlbGVtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxufSgpKTsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbi8vIEB2ZXJzaW9uIDAuNy4zXG5pZiAodHlwZW9mIFdlYWtNYXAgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbiAgICB2YXIgY291bnRlciA9IERhdGUubm93KCkgJSAxZTk7XG4gICAgdmFyIFdlYWtNYXAgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMubmFtZSA9IFwiX19zdFwiICsgKE1hdGgucmFuZG9tKCkgKiAxZTkgPj4+IDApICsgKGNvdW50ZXIrKyArIFwiX19cIik7XG4gICAgfTtcbiAgICBXZWFrTWFwLnByb3RvdHlwZSA9IHtcbiAgICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTtcbiAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5WzBdID09PSBrZXkpIGVudHJ5WzFdID0gdmFsdWU7IGVsc2UgZGVmaW5lUHJvcGVydHkoa2V5LCB0aGlzLm5hbWUsIHtcbiAgICAgICAgICB2YWx1ZTogWyBrZXksIHZhbHVlIF0sXG4gICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgcmV0dXJuIChlbnRyeSA9IGtleVt0aGlzLm5hbWVdKSAmJiBlbnRyeVswXSA9PT0ga2V5ID8gZW50cnlbMV0gOiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgXCJkZWxldGVcIjogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5WzBdICE9PSBrZXkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZW50cnlbMF0gPSBlbnRyeVsxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgaGFzOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0ga2V5W3RoaXMubmFtZV07XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGVudHJ5WzBdID09PSBrZXk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuV2Vha01hcCA9IFdlYWtNYXA7XG4gIH0pKCk7XG59XG5cbihmdW5jdGlvbihnbG9iYWwpIHtcbiAgdmFyIHJlZ2lzdHJhdGlvbnNUYWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBzZXRJbW1lZGlhdGU7XG4gIGlmICgvVHJpZGVudHxFZGdlLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgc2V0SW1tZWRpYXRlID0gc2V0VGltZW91dDtcbiAgfSBlbHNlIGlmICh3aW5kb3cuc2V0SW1tZWRpYXRlKSB7XG4gICAgc2V0SW1tZWRpYXRlID0gd2luZG93LnNldEltbWVkaWF0ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2V0SW1tZWRpYXRlUXVldWUgPSBbXTtcbiAgICB2YXIgc2VudGluZWwgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChlLmRhdGEgPT09IHNlbnRpbmVsKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IHNldEltbWVkaWF0ZVF1ZXVlO1xuICAgICAgICBzZXRJbW1lZGlhdGVRdWV1ZSA9IFtdO1xuICAgICAgICBxdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgICAgICBmdW5jKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgIHNldEltbWVkaWF0ZVF1ZXVlLnB1c2goZnVuYyk7XG4gICAgICB3aW5kb3cucG9zdE1lc3NhZ2Uoc2VudGluZWwsIFwiKlwiKTtcbiAgICB9O1xuICB9XG4gIHZhciBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICB2YXIgc2NoZWR1bGVkT2JzZXJ2ZXJzID0gW107XG4gIGZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2sob2JzZXJ2ZXIpIHtcbiAgICBzY2hlZHVsZWRPYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgc2V0SW1tZWRpYXRlKGRpc3BhdGNoQ2FsbGJhY2tzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd3JhcElmTmVlZGVkKG5vZGUpIHtcbiAgICByZXR1cm4gd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsICYmIHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbC53cmFwSWZOZWVkZWQobm9kZSkgfHwgbm9kZTtcbiAgfVxuICBmdW5jdGlvbiBkaXNwYXRjaENhbGxiYWNrcygpIHtcbiAgICBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIHZhciBvYnNlcnZlcnMgPSBzY2hlZHVsZWRPYnNlcnZlcnM7XG4gICAgc2NoZWR1bGVkT2JzZXJ2ZXJzID0gW107XG4gICAgb2JzZXJ2ZXJzLnNvcnQoZnVuY3Rpb24obzEsIG8yKSB7XG4gICAgICByZXR1cm4gbzEudWlkXyAtIG8yLnVpZF87XG4gICAgfSk7XG4gICAgdmFyIGFueU5vbkVtcHR5ID0gZmFsc2U7XG4gICAgb2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBxdWV1ZSA9IG9ic2VydmVyLnRha2VSZWNvcmRzKCk7XG4gICAgICByZW1vdmVUcmFuc2llbnRPYnNlcnZlcnNGb3Iob2JzZXJ2ZXIpO1xuICAgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBvYnNlcnZlci5jYWxsYmFja18ocXVldWUsIG9ic2VydmVyKTtcbiAgICAgICAgYW55Tm9uRW1wdHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChhbnlOb25FbXB0eSkgZGlzcGF0Y2hDYWxsYmFja3MoKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVUcmFuc2llbnRPYnNlcnZlcnNGb3Iob2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci5ub2Rlc18uZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQobm9kZSk7XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbnMpIHJldHVybjtcbiAgICAgIHJlZ2lzdHJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihyZWdpc3RyYXRpb24pIHtcbiAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbi5vYnNlcnZlciA9PT0gb2JzZXJ2ZXIpIHJlZ2lzdHJhdGlvbi5yZW1vdmVUcmFuc2llbnRPYnNlcnZlcnMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCh0YXJnZXQsIGNhbGxiYWNrKSB7XG4gICAgZm9yICh2YXIgbm9kZSA9IHRhcmdldDsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbnMgPSByZWdpc3RyYXRpb25zVGFibGUuZ2V0KG5vZGUpO1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbnMpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJhdGlvbnNbal07XG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSByZWdpc3RyYXRpb24ub3B0aW9ucztcbiAgICAgICAgICBpZiAobm9kZSAhPT0gdGFyZ2V0ICYmICFvcHRpb25zLnN1YnRyZWUpIGNvbnRpbnVlO1xuICAgICAgICAgIHZhciByZWNvcmQgPSBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgICBpZiAocmVjb3JkKSByZWdpc3RyYXRpb24uZW5xdWV1ZShyZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciB1aWRDb3VudGVyID0gMDtcbiAgZnVuY3Rpb24gSnNNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja18gPSBjYWxsYmFjaztcbiAgICB0aGlzLm5vZGVzXyA9IFtdO1xuICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICB0aGlzLnVpZF8gPSArK3VpZENvdW50ZXI7XG4gIH1cbiAgSnNNdXRhdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHtcbiAgICBvYnNlcnZlOiBmdW5jdGlvbih0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIHRhcmdldCA9IHdyYXBJZk5lZWRlZCh0YXJnZXQpO1xuICAgICAgaWYgKCFvcHRpb25zLmNoaWxkTGlzdCAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzICYmICFvcHRpb25zLmNoYXJhY3RlckRhdGEgfHwgb3B0aW9ucy5hdHRyaWJ1dGVPbGRWYWx1ZSAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmxlbmd0aCAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IG9wdGlvbnMuY2hhcmFjdGVyRGF0YU9sZFZhbHVlICYmICFvcHRpb25zLmNoYXJhY3RlckRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQodGFyZ2V0KTtcbiAgICAgIGlmICghcmVnaXN0cmF0aW9ucykgcmVnaXN0cmF0aW9uc1RhYmxlLnNldCh0YXJnZXQsIHJlZ2lzdHJhdGlvbnMgPSBbXSk7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9uO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWdpc3RyYXRpb25zW2ldLm9ic2VydmVyID09PSB0aGlzKSB7XG4gICAgICAgICAgcmVnaXN0cmF0aW9uID0gcmVnaXN0cmF0aW9uc1tpXTtcbiAgICAgICAgICByZWdpc3RyYXRpb24ucmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgcmVnaXN0cmF0aW9uLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbikge1xuICAgICAgICByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKHRoaXMsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgIHJlZ2lzdHJhdGlvbnMucHVzaChyZWdpc3RyYXRpb24pO1xuICAgICAgICB0aGlzLm5vZGVzXy5wdXNoKHRhcmdldCk7XG4gICAgICB9XG4gICAgICByZWdpc3RyYXRpb24uYWRkTGlzdGVuZXJzKCk7XG4gICAgfSxcbiAgICBkaXNjb25uZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQobm9kZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVnaXN0cmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciByZWdpc3RyYXRpb24gPSByZWdpc3RyYXRpb25zW2ldO1xuICAgICAgICAgIGlmIChyZWdpc3RyYXRpb24ub2JzZXJ2ZXIgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICB9LFxuICAgIHRha2VSZWNvcmRzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjb3B5T2ZSZWNvcmRzID0gdGhpcy5yZWNvcmRzXztcbiAgICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICAgIHJldHVybiBjb3B5T2ZSZWNvcmRzO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gTXV0YXRpb25SZWNvcmQodHlwZSwgdGFyZ2V0KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmFkZGVkTm9kZXMgPSBbXTtcbiAgICB0aGlzLnJlbW92ZWROb2RlcyA9IFtdO1xuICAgIHRoaXMucHJldmlvdXNTaWJsaW5nID0gbnVsbDtcbiAgICB0aGlzLm5leHRTaWJsaW5nID0gbnVsbDtcbiAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gbnVsbDtcbiAgICB0aGlzLm9sZFZhbHVlID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBjb3B5TXV0YXRpb25SZWNvcmQob3JpZ2luYWwpIHtcbiAgICB2YXIgcmVjb3JkID0gbmV3IE11dGF0aW9uUmVjb3JkKG9yaWdpbmFsLnR5cGUsIG9yaWdpbmFsLnRhcmdldCk7XG4gICAgcmVjb3JkLmFkZGVkTm9kZXMgPSBvcmlnaW5hbC5hZGRlZE5vZGVzLnNsaWNlKCk7XG4gICAgcmVjb3JkLnJlbW92ZWROb2RlcyA9IG9yaWdpbmFsLnJlbW92ZWROb2Rlcy5zbGljZSgpO1xuICAgIHJlY29yZC5wcmV2aW91c1NpYmxpbmcgPSBvcmlnaW5hbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgcmVjb3JkLm5leHRTaWJsaW5nID0gb3JpZ2luYWwubmV4dFNpYmxpbmc7XG4gICAgcmVjb3JkLmF0dHJpYnV0ZU5hbWUgPSBvcmlnaW5hbC5hdHRyaWJ1dGVOYW1lO1xuICAgIHJlY29yZC5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBvcmlnaW5hbC5hdHRyaWJ1dGVOYW1lc3BhY2U7XG4gICAgcmVjb3JkLm9sZFZhbHVlID0gb3JpZ2luYWwub2xkVmFsdWU7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuICB2YXIgY3VycmVudFJlY29yZCwgcmVjb3JkV2l0aE9sZFZhbHVlO1xuICBmdW5jdGlvbiBnZXRSZWNvcmQodHlwZSwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGN1cnJlbnRSZWNvcmQgPSBuZXcgTXV0YXRpb25SZWNvcmQodHlwZSwgdGFyZ2V0KTtcbiAgfVxuICBmdW5jdGlvbiBnZXRSZWNvcmRXaXRoT2xkVmFsdWUob2xkVmFsdWUpIHtcbiAgICBpZiAocmVjb3JkV2l0aE9sZFZhbHVlKSByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICAgIHJlY29yZFdpdGhPbGRWYWx1ZSA9IGNvcHlNdXRhdGlvblJlY29yZChjdXJyZW50UmVjb3JkKTtcbiAgICByZWNvcmRXaXRoT2xkVmFsdWUub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgICByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFyUmVjb3JkcygpIHtcbiAgICBjdXJyZW50UmVjb3JkID0gcmVjb3JkV2l0aE9sZFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIGZ1bmN0aW9uIHJlY29yZFJlcHJlc2VudHNDdXJyZW50TXV0YXRpb24ocmVjb3JkKSB7XG4gICAgcmV0dXJuIHJlY29yZCA9PT0gcmVjb3JkV2l0aE9sZFZhbHVlIHx8IHJlY29yZCA9PT0gY3VycmVudFJlY29yZDtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RSZWNvcmQobGFzdFJlY29yZCwgbmV3UmVjb3JkKSB7XG4gICAgaWYgKGxhc3RSZWNvcmQgPT09IG5ld1JlY29yZCkgcmV0dXJuIGxhc3RSZWNvcmQ7XG4gICAgaWYgKHJlY29yZFdpdGhPbGRWYWx1ZSAmJiByZWNvcmRSZXByZXNlbnRzQ3VycmVudE11dGF0aW9uKGxhc3RSZWNvcmQpKSByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIFJlZ2lzdHJhdGlvbihvYnNlcnZlciwgdGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gW107XG4gIH1cbiAgUmVnaXN0cmF0aW9uLnByb3RvdHlwZSA9IHtcbiAgICBlbnF1ZXVlOiBmdW5jdGlvbihyZWNvcmQpIHtcbiAgICAgIHZhciByZWNvcmRzID0gdGhpcy5vYnNlcnZlci5yZWNvcmRzXztcbiAgICAgIHZhciBsZW5ndGggPSByZWNvcmRzLmxlbmd0aDtcbiAgICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGxhc3RSZWNvcmQgPSByZWNvcmRzW2xlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgcmVjb3JkVG9SZXBsYWNlTGFzdCA9IHNlbGVjdFJlY29yZChsYXN0UmVjb3JkLCByZWNvcmQpO1xuICAgICAgICBpZiAocmVjb3JkVG9SZXBsYWNlTGFzdCkge1xuICAgICAgICAgIHJlY29yZHNbbGVuZ3RoIC0gMV0gPSByZWNvcmRUb1JlcGxhY2VMYXN0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVDYWxsYmFjayh0aGlzLm9ic2VydmVyKTtcbiAgICAgIH1cbiAgICAgIHJlY29yZHNbbGVuZ3RoXSA9IHJlY29yZDtcbiAgICB9LFxuICAgIGFkZExpc3RlbmVyczogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmFkZExpc3RlbmVyc18odGhpcy50YXJnZXQpO1xuICAgIH0sXG4gICAgYWRkTGlzdGVuZXJzXzogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGVzKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01BdHRyTW9kaWZpZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICBpZiAob3B0aW9ucy5jaGFyYWN0ZXJEYXRhKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICBpZiAob3B0aW9ucy5jaGlsZExpc3QpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVJbnNlcnRlZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoaWxkTGlzdCB8fCBvcHRpb25zLnN1YnRyZWUpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVSZW1vdmVkXCIsIHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgcmVtb3ZlTGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzXyh0aGlzLnRhcmdldCk7XG4gICAgfSxcbiAgICByZW1vdmVMaXN0ZW5lcnNfOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZXMpIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUF0dHJNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoYXJhY3RlckRhdGEpIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoaWxkTGlzdCkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZUluc2VydGVkXCIsIHRoaXMsIHRydWUpO1xuICAgICAgaWYgKG9wdGlvbnMuY2hpbGRMaXN0IHx8IG9wdGlvbnMuc3VidHJlZSkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZVJlbW92ZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGRUcmFuc2llbnRPYnNlcnZlcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKG5vZGUgPT09IHRoaXMudGFyZ2V0KSByZXR1cm47XG4gICAgICB0aGlzLmFkZExpc3RlbmVyc18obm9kZSk7XG4gICAgICB0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXMucHVzaChub2RlKTtcbiAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgIGlmICghcmVnaXN0cmF0aW9ucykgcmVnaXN0cmF0aW9uc1RhYmxlLnNldChub2RlLCByZWdpc3RyYXRpb25zID0gW10pO1xuICAgICAgcmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMpO1xuICAgIH0sXG4gICAgcmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzO1xuICAgICAgdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gW107XG4gICAgICB0cmFuc2llbnRPYnNlcnZlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyc18obm9kZSk7XG4gICAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbnNbaV0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICB9LFxuICAgIGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgICBjYXNlIFwiRE9NQXR0ck1vZGlmaWVkXCI6XG4gICAgICAgIHZhciBuYW1lID0gZS5hdHRyTmFtZTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGUucmVsYXRlZE5vZGUubmFtZXNwYWNlVVJJO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIHZhciByZWNvcmQgPSBuZXcgZ2V0UmVjb3JkKFwiYXR0cmlidXRlc1wiLCB0YXJnZXQpO1xuICAgICAgICByZWNvcmQuYXR0cmlidXRlTmFtZSA9IG5hbWU7XG4gICAgICAgIHJlY29yZC5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGUuYXR0ckNoYW5nZSA9PT0gTXV0YXRpb25FdmVudC5BRERJVElPTiA/IG51bGwgOiBlLnByZXZWYWx1ZTtcbiAgICAgICAgZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKHRhcmdldCwgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5hdHRyaWJ1dGVzKSByZXR1cm47XG4gICAgICAgICAgaWYgKG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmxlbmd0aCAmJiBvcHRpb25zLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG5hbWUpID09PSAtMSAmJiBvcHRpb25zLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG5hbWVzcGFjZSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZU9sZFZhbHVlKSByZXR1cm4gZ2V0UmVjb3JkV2l0aE9sZFZhbHVlKG9sZFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgICBjYXNlIFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCI6XG4gICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIHJlY29yZCA9IGdldFJlY29yZChcImNoYXJhY3RlckRhdGFcIiwgdGFyZ2V0KTtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gZS5wcmV2VmFsdWU7XG4gICAgICAgIGZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCh0YXJnZXQsIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuY2hhcmFjdGVyRGF0YSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChvcHRpb25zLmNoYXJhY3RlckRhdGFPbGRWYWx1ZSkgcmV0dXJuIGdldFJlY29yZFdpdGhPbGRWYWx1ZShvbGRWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAgY2FzZSBcIkRPTU5vZGVSZW1vdmVkXCI6XG4gICAgICAgIHRoaXMuYWRkVHJhbnNpZW50T2JzZXJ2ZXIoZS50YXJnZXQpO1xuXG4gICAgICAgY2FzZSBcIkRPTU5vZGVJbnNlcnRlZFwiOlxuICAgICAgICB2YXIgY2hhbmdlZE5vZGUgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIGFkZGVkTm9kZXMsIHJlbW92ZWROb2RlcztcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gXCJET01Ob2RlSW5zZXJ0ZWRcIikge1xuICAgICAgICAgIGFkZGVkTm9kZXMgPSBbIGNoYW5nZWROb2RlIF07XG4gICAgICAgICAgcmVtb3ZlZE5vZGVzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZWROb2RlcyA9IFtdO1xuICAgICAgICAgIHJlbW92ZWROb2RlcyA9IFsgY2hhbmdlZE5vZGUgXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gY2hhbmdlZE5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSBjaGFuZ2VkTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgdmFyIHJlY29yZCA9IGdldFJlY29yZChcImNoaWxkTGlzdFwiLCBlLnRhcmdldC5wYXJlbnROb2RlKTtcbiAgICAgICAgcmVjb3JkLmFkZGVkTm9kZXMgPSBhZGRlZE5vZGVzO1xuICAgICAgICByZWNvcmQucmVtb3ZlZE5vZGVzID0gcmVtb3ZlZE5vZGVzO1xuICAgICAgICByZWNvcmQucHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nO1xuICAgICAgICByZWNvcmQubmV4dFNpYmxpbmcgPSBuZXh0U2libGluZztcbiAgICAgICAgZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKGUucmVsYXRlZE5vZGUsIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuY2hpbGRMaXN0KSByZXR1cm47XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjbGVhclJlY29yZHMoKTtcbiAgICB9XG4gIH07XG4gIGdsb2JhbC5Kc011dGF0aW9uT2JzZXJ2ZXIgPSBKc011dGF0aW9uT2JzZXJ2ZXI7XG4gIGlmICghZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIpIGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyID0gSnNNdXRhdGlvbk9ic2VydmVyO1xufSkodGhpcyk7XG5cbndpbmRvdy5DdXN0b21FbGVtZW50cyA9IHdpbmRvdy5DdXN0b21FbGVtZW50cyB8fCB7XG4gIGZsYWdzOiB7fVxufTtcblxuKGZ1bmN0aW9uKHNjb3BlKSB7XG4gIHZhciBmbGFncyA9IHNjb3BlLmZsYWdzO1xuICB2YXIgbW9kdWxlcyA9IFtdO1xuICB2YXIgYWRkTW9kdWxlID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gICAgbW9kdWxlcy5wdXNoKG1vZHVsZSk7XG4gIH07XG4gIHZhciBpbml0aWFsaXplTW9kdWxlcyA9IGZ1bmN0aW9uKCkge1xuICAgIG1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbihtb2R1bGUpIHtcbiAgICAgIG1vZHVsZShzY29wZSk7XG4gICAgfSk7XG4gIH07XG4gIHNjb3BlLmFkZE1vZHVsZSA9IGFkZE1vZHVsZTtcbiAgc2NvcGUuaW5pdGlhbGl6ZU1vZHVsZXMgPSBpbml0aWFsaXplTW9kdWxlcztcbiAgc2NvcGUuaGFzTmF0aXZlID0gQm9vbGVhbihkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQpO1xuICBzY29wZS51c2VOYXRpdmUgPSAhZmxhZ3MucmVnaXN0ZXIgJiYgc2NvcGUuaGFzTmF0aXZlICYmICF3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwgJiYgKCF3aW5kb3cuSFRNTEltcG9ydHMgfHwgSFRNTEltcG9ydHMudXNlTmF0aXZlKTtcbn0pKHdpbmRvdy5DdXN0b21FbGVtZW50cyk7XG5cbndpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oc2NvcGUpIHtcbiAgdmFyIElNUE9SVF9MSU5LX1RZUEUgPSB3aW5kb3cuSFRNTEltcG9ydHMgPyBIVE1MSW1wb3J0cy5JTVBPUlRfTElOS19UWVBFIDogXCJub25lXCI7XG4gIGZ1bmN0aW9uIGZvclN1YnRyZWUobm9kZSwgY2IpIHtcbiAgICBmaW5kQWxsRWxlbWVudHMobm9kZSwgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKGNiKGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yUm9vdHMoZSwgY2IpO1xuICAgIH0pO1xuICAgIGZvclJvb3RzKG5vZGUsIGNiKTtcbiAgfVxuICBmdW5jdGlvbiBmaW5kQWxsRWxlbWVudHMobm9kZSwgZmluZCwgZGF0YSkge1xuICAgIHZhciBlID0gbm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICBpZiAoIWUpIHtcbiAgICAgIGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICB3aGlsZSAoZSAmJiBlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICBlID0gZS5uZXh0U2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKGUpIHtcbiAgICAgIGlmIChmaW5kKGUsIGRhdGEpICE9PSB0cnVlKSB7XG4gICAgICAgIGZpbmRBbGxFbGVtZW50cyhlLCBmaW5kLCBkYXRhKTtcbiAgICAgIH1cbiAgICAgIGUgPSBlLm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gZm9yUm9vdHMobm9kZSwgY2IpIHtcbiAgICB2YXIgcm9vdCA9IG5vZGUuc2hhZG93Um9vdDtcbiAgICB3aGlsZSAocm9vdCkge1xuICAgICAgZm9yU3VidHJlZShyb290LCBjYik7XG4gICAgICByb290ID0gcm9vdC5vbGRlclNoYWRvd1Jvb3Q7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGZvckRvY3VtZW50VHJlZShkb2MsIGNiKSB7XG4gICAgX2ZvckRvY3VtZW50VHJlZShkb2MsIGNiLCBbXSk7XG4gIH1cbiAgZnVuY3Rpb24gX2ZvckRvY3VtZW50VHJlZShkb2MsIGNiLCBwcm9jZXNzaW5nRG9jdW1lbnRzKSB7XG4gICAgZG9jID0gd3JhcChkb2MpO1xuICAgIGlmIChwcm9jZXNzaW5nRG9jdW1lbnRzLmluZGV4T2YoZG9jKSA+PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3NpbmdEb2N1bWVudHMucHVzaChkb2MpO1xuICAgIHZhciBpbXBvcnRzID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaW5rW3JlbD1cIiArIElNUE9SVF9MSU5LX1RZUEUgKyBcIl1cIik7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBpbXBvcnRzLmxlbmd0aCwgbjsgaSA8IGwgJiYgKG4gPSBpbXBvcnRzW2ldKTsgaSsrKSB7XG4gICAgICBpZiAobi5pbXBvcnQpIHtcbiAgICAgICAgX2ZvckRvY3VtZW50VHJlZShuLmltcG9ydCwgY2IsIHByb2Nlc3NpbmdEb2N1bWVudHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYihkb2MpO1xuICB9XG4gIHNjb3BlLmZvckRvY3VtZW50VHJlZSA9IGZvckRvY3VtZW50VHJlZTtcbiAgc2NvcGUuZm9yU3VidHJlZSA9IGZvclN1YnRyZWU7XG59KTtcblxud2luZG93LkN1c3RvbUVsZW1lbnRzLmFkZE1vZHVsZShmdW5jdGlvbihzY29wZSkge1xuICB2YXIgZmxhZ3MgPSBzY29wZS5mbGFncztcbiAgdmFyIGZvclN1YnRyZWUgPSBzY29wZS5mb3JTdWJ0cmVlO1xuICB2YXIgZm9yRG9jdW1lbnRUcmVlID0gc2NvcGUuZm9yRG9jdW1lbnRUcmVlO1xuICBmdW5jdGlvbiBhZGRlZE5vZGUobm9kZSkge1xuICAgIHJldHVybiBhZGRlZChub2RlKSB8fCBhZGRlZFN1YnRyZWUobm9kZSk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkZWQobm9kZSkge1xuICAgIGlmIChzY29wZS51cGdyYWRlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXR0YWNoZWQobm9kZSk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkZWRTdWJ0cmVlKG5vZGUpIHtcbiAgICBmb3JTdWJ0cmVlKG5vZGUsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChhZGRlZChlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBhdHRhY2hlZE5vZGUobm9kZSkge1xuICAgIGF0dGFjaGVkKG5vZGUpO1xuICAgIGlmIChpbkRvY3VtZW50KG5vZGUpKSB7XG4gICAgICBmb3JTdWJ0cmVlKG5vZGUsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgYXR0YWNoZWQoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgdmFyIGhhc1BvbHlmaWxsTXV0YXRpb25zID0gIXdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyID09PSB3aW5kb3cuSnNNdXRhdGlvbk9ic2VydmVyO1xuICBzY29wZS5oYXNQb2x5ZmlsbE11dGF0aW9ucyA9IGhhc1BvbHlmaWxsTXV0YXRpb25zO1xuICB2YXIgaXNQZW5kaW5nTXV0YXRpb25zID0gZmFsc2U7XG4gIHZhciBwZW5kaW5nTXV0YXRpb25zID0gW107XG4gIGZ1bmN0aW9uIGRlZmVyTXV0YXRpb24oZm4pIHtcbiAgICBwZW5kaW5nTXV0YXRpb25zLnB1c2goZm4pO1xuICAgIGlmICghaXNQZW5kaW5nTXV0YXRpb25zKSB7XG4gICAgICBpc1BlbmRpbmdNdXRhdGlvbnMgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCh0YWtlTXV0YXRpb25zKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdGFrZU11dGF0aW9ucygpIHtcbiAgICBpc1BlbmRpbmdNdXRhdGlvbnMgPSBmYWxzZTtcbiAgICB2YXIgJHAgPSBwZW5kaW5nTXV0YXRpb25zO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gJHAubGVuZ3RoLCBwOyBpIDwgbCAmJiAocCA9ICRwW2ldKTsgaSsrKSB7XG4gICAgICBwKCk7XG4gICAgfVxuICAgIHBlbmRpbmdNdXRhdGlvbnMgPSBbXTtcbiAgfVxuICBmdW5jdGlvbiBhdHRhY2hlZChlbGVtZW50KSB7XG4gICAgaWYgKGhhc1BvbHlmaWxsTXV0YXRpb25zKSB7XG4gICAgICBkZWZlck11dGF0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICBfYXR0YWNoZWQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2F0dGFjaGVkKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBfYXR0YWNoZWQoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50Ll9fdXBncmFkZWRfXyAmJiAoZWxlbWVudC5hdHRhY2hlZENhbGxiYWNrIHx8IGVsZW1lbnQuZGV0YWNoZWRDYWxsYmFjaykpIHtcbiAgICAgIGlmICghZWxlbWVudC5fX2F0dGFjaGVkICYmIGluRG9jdW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudC5fX2F0dGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuYXR0YWNoZWRDYWxsYmFjaykge1xuICAgICAgICAgIGVsZW1lbnQuYXR0YWNoZWRDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGRldGFjaGVkTm9kZShub2RlKSB7XG4gICAgZGV0YWNoZWQobm9kZSk7XG4gICAgZm9yU3VidHJlZShub2RlLCBmdW5jdGlvbihlKSB7XG4gICAgICBkZXRhY2hlZChlKTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBkZXRhY2hlZChlbGVtZW50KSB7XG4gICAgaWYgKGhhc1BvbHlmaWxsTXV0YXRpb25zKSB7XG4gICAgICBkZWZlck11dGF0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICBfZGV0YWNoZWQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2RldGFjaGVkKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBfZGV0YWNoZWQoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50Ll9fdXBncmFkZWRfXyAmJiAoZWxlbWVudC5hdHRhY2hlZENhbGxiYWNrIHx8IGVsZW1lbnQuZGV0YWNoZWRDYWxsYmFjaykpIHtcbiAgICAgIGlmIChlbGVtZW50Ll9fYXR0YWNoZWQgJiYgIWluRG9jdW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudC5fX2F0dGFjaGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50LmRldGFjaGVkQ2FsbGJhY2spIHtcbiAgICAgICAgICBlbGVtZW50LmRldGFjaGVkQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpbkRvY3VtZW50KGVsZW1lbnQpIHtcbiAgICB2YXIgcCA9IGVsZW1lbnQ7XG4gICAgdmFyIGRvYyA9IHdyYXAoZG9jdW1lbnQpO1xuICAgIHdoaWxlIChwKSB7XG4gICAgICBpZiAocCA9PSBkb2MpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBwID0gcC5wYXJlbnROb2RlIHx8IHAubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAmJiBwLmhvc3Q7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHdhdGNoU2hhZG93KG5vZGUpIHtcbiAgICBpZiAobm9kZS5zaGFkb3dSb290ICYmICFub2RlLnNoYWRvd1Jvb3QuX193YXRjaGVkKSB7XG4gICAgICBmbGFncy5kb20gJiYgY29uc29sZS5sb2coXCJ3YXRjaGluZyBzaGFkb3ctcm9vdCBmb3I6IFwiLCBub2RlLmxvY2FsTmFtZSk7XG4gICAgICB2YXIgcm9vdCA9IG5vZGUuc2hhZG93Um9vdDtcbiAgICAgIHdoaWxlIChyb290KSB7XG4gICAgICAgIG9ic2VydmUocm9vdCk7XG4gICAgICAgIHJvb3QgPSByb290Lm9sZGVyU2hhZG93Um9vdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlcihtdXRhdGlvbnMpIHtcbiAgICBpZiAoZmxhZ3MuZG9tKSB7XG4gICAgICB2YXIgbXggPSBtdXRhdGlvbnNbMF07XG4gICAgICBpZiAobXggJiYgbXgudHlwZSA9PT0gXCJjaGlsZExpc3RcIiAmJiBteC5hZGRlZE5vZGVzKSB7XG4gICAgICAgIGlmIChteC5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgdmFyIGQgPSBteC5hZGRlZE5vZGVzWzBdO1xuICAgICAgICAgIHdoaWxlIChkICYmIGQgIT09IGRvY3VtZW50ICYmICFkLmhvc3QpIHtcbiAgICAgICAgICAgIGQgPSBkLnBhcmVudE5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB1ID0gZCAmJiAoZC5VUkwgfHwgZC5fVVJMIHx8IGQuaG9zdCAmJiBkLmhvc3QubG9jYWxOYW1lKSB8fCBcIlwiO1xuICAgICAgICAgIHUgPSB1LnNwbGl0KFwiLz9cIikuc2hpZnQoKS5zcGxpdChcIi9cIikucG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZ3JvdXAoXCJtdXRhdGlvbnMgKCVkKSBbJXNdXCIsIG11dGF0aW9ucy5sZW5ndGgsIHUgfHwgXCJcIik7XG4gICAgfVxuICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG14KSB7XG4gICAgICBpZiAobXgudHlwZSA9PT0gXCJjaGlsZExpc3RcIikge1xuICAgICAgICBmb3JFYWNoKG14LmFkZGVkTm9kZXMsIGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgICBpZiAoIW4ubG9jYWxOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFkZGVkTm9kZShuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvckVhY2gobXgucmVtb3ZlZE5vZGVzLCBmdW5jdGlvbihuKSB7XG4gICAgICAgICAgaWYgKCFuLmxvY2FsTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXRhY2hlZE5vZGUobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZsYWdzLmRvbSAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gIH1cbiAgZnVuY3Rpb24gdGFrZVJlY29yZHMobm9kZSkge1xuICAgIG5vZGUgPSB3cmFwKG5vZGUpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgbm9kZSA9IHdyYXAoZG9jdW1lbnQpO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICB2YXIgb2JzZXJ2ZXIgPSBub2RlLl9fb2JzZXJ2ZXI7XG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBoYW5kbGVyKG9ic2VydmVyLnRha2VSZWNvcmRzKCkpO1xuICAgICAgdGFrZU11dGF0aW9ucygpO1xuICAgIH1cbiAgfVxuICB2YXIgZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG4gIGZ1bmN0aW9uIG9ic2VydmUoaW5Sb290KSB7XG4gICAgaWYgKGluUm9vdC5fX29ic2VydmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGhhbmRsZXIpO1xuICAgIG9ic2VydmVyLm9ic2VydmUoaW5Sb290LCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgfSk7XG4gICAgaW5Sb290Ll9fb2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuICBmdW5jdGlvbiB1cGdyYWRlRG9jdW1lbnQoZG9jKSB7XG4gICAgZG9jID0gd3JhcChkb2MpO1xuICAgIGZsYWdzLmRvbSAmJiBjb25zb2xlLmdyb3VwKFwidXBncmFkZURvY3VtZW50OiBcIiwgZG9jLmJhc2VVUkkuc3BsaXQoXCIvXCIpLnBvcCgpKTtcbiAgICBhZGRlZE5vZGUoZG9jKTtcbiAgICBvYnNlcnZlKGRvYyk7XG4gICAgZmxhZ3MuZG9tICYmIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgfVxuICBmdW5jdGlvbiB1cGdyYWRlRG9jdW1lbnRUcmVlKGRvYykge1xuICAgIGZvckRvY3VtZW50VHJlZShkb2MsIHVwZ3JhZGVEb2N1bWVudCk7XG4gIH1cbiAgdmFyIG9yaWdpbmFsQ3JlYXRlU2hhZG93Um9vdCA9IEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNoYWRvd1Jvb3Q7XG4gIGlmIChvcmlnaW5hbENyZWF0ZVNoYWRvd1Jvb3QpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTaGFkb3dSb290ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcm9vdCA9IG9yaWdpbmFsQ3JlYXRlU2hhZG93Um9vdC5jYWxsKHRoaXMpO1xuICAgICAgQ3VzdG9tRWxlbWVudHMud2F0Y2hTaGFkb3codGhpcyk7XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9O1xuICB9XG4gIHNjb3BlLndhdGNoU2hhZG93ID0gd2F0Y2hTaGFkb3c7XG4gIHNjb3BlLnVwZ3JhZGVEb2N1bWVudFRyZWUgPSB1cGdyYWRlRG9jdW1lbnRUcmVlO1xuICBzY29wZS51cGdyYWRlU3VidHJlZSA9IGFkZGVkU3VidHJlZTtcbiAgc2NvcGUudXBncmFkZUFsbCA9IGFkZGVkTm9kZTtcbiAgc2NvcGUuYXR0YWNoZWROb2RlID0gYXR0YWNoZWROb2RlO1xuICBzY29wZS50YWtlUmVjb3JkcyA9IHRha2VSZWNvcmRzO1xufSk7XG5cbndpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oc2NvcGUpIHtcbiAgdmFyIGZsYWdzID0gc2NvcGUuZmxhZ3M7XG4gIGZ1bmN0aW9uIHVwZ3JhZGUobm9kZSkge1xuICAgIGlmICghbm9kZS5fX3VwZ3JhZGVkX18gJiYgbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgIHZhciBpcyA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiaXNcIik7XG4gICAgICB2YXIgZGVmaW5pdGlvbiA9IHNjb3BlLmdldFJlZ2lzdGVyZWREZWZpbml0aW9uKGlzIHx8IG5vZGUubG9jYWxOYW1lKTtcbiAgICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGlmIChpcyAmJiBkZWZpbml0aW9uLnRhZyA9PSBub2RlLmxvY2FsTmFtZSkge1xuICAgICAgICAgIHJldHVybiB1cGdyYWRlV2l0aERlZmluaXRpb24obm9kZSwgZGVmaW5pdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzICYmICFkZWZpbml0aW9uLmV4dGVuZHMpIHtcbiAgICAgICAgICByZXR1cm4gdXBncmFkZVdpdGhEZWZpbml0aW9uKG5vZGUsIGRlZmluaXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwZ3JhZGVXaXRoRGVmaW5pdGlvbihlbGVtZW50LCBkZWZpbml0aW9uKSB7XG4gICAgZmxhZ3MudXBncmFkZSAmJiBjb25zb2xlLmdyb3VwKFwidXBncmFkZTpcIiwgZWxlbWVudC5sb2NhbE5hbWUpO1xuICAgIGlmIChkZWZpbml0aW9uLmlzKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImlzXCIsIGRlZmluaXRpb24uaXMpO1xuICAgIH1cbiAgICBpbXBsZW1lbnRQcm90b3R5cGUoZWxlbWVudCwgZGVmaW5pdGlvbik7XG4gICAgZWxlbWVudC5fX3VwZ3JhZGVkX18gPSB0cnVlO1xuICAgIGNyZWF0ZWQoZWxlbWVudCk7XG4gICAgc2NvcGUuYXR0YWNoZWROb2RlKGVsZW1lbnQpO1xuICAgIHNjb3BlLnVwZ3JhZGVTdWJ0cmVlKGVsZW1lbnQpO1xuICAgIGZsYWdzLnVwZ3JhZGUgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIGZ1bmN0aW9uIGltcGxlbWVudFByb3RvdHlwZShlbGVtZW50LCBkZWZpbml0aW9uKSB7XG4gICAgaWYgKE9iamVjdC5fX3Byb3RvX18pIHtcbiAgICAgIGVsZW1lbnQuX19wcm90b19fID0gZGVmaW5pdGlvbi5wcm90b3R5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1c3RvbU1peGluKGVsZW1lbnQsIGRlZmluaXRpb24ucHJvdG90eXBlLCBkZWZpbml0aW9uLm5hdGl2ZSk7XG4gICAgICBlbGVtZW50Ll9fcHJvdG9fXyA9IGRlZmluaXRpb24ucHJvdG90eXBlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjdXN0b21NaXhpbihpblRhcmdldCwgaW5TcmMsIGluTmF0aXZlKSB7XG4gICAgdmFyIHVzZWQgPSB7fTtcbiAgICB2YXIgcCA9IGluU3JjO1xuICAgIHdoaWxlIChwICE9PSBpbk5hdGl2ZSAmJiBwICE9PSBIVE1MRWxlbWVudC5wcm90b3R5cGUpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgazsgayA9IGtleXNbaV07IGkrKykge1xuICAgICAgICBpZiAoIXVzZWRba10pIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5UYXJnZXQsIGssIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocCwgaykpO1xuICAgICAgICAgIHVzZWRba10gPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHApO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVkKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudC5jcmVhdGVkQ2FsbGJhY2spIHtcbiAgICAgIGVsZW1lbnQuY3JlYXRlZENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG4gIHNjb3BlLnVwZ3JhZGUgPSB1cGdyYWRlO1xuICBzY29wZS51cGdyYWRlV2l0aERlZmluaXRpb24gPSB1cGdyYWRlV2l0aERlZmluaXRpb247XG4gIHNjb3BlLmltcGxlbWVudFByb3RvdHlwZSA9IGltcGxlbWVudFByb3RvdHlwZTtcbn0pO1xuXG53aW5kb3cuQ3VzdG9tRWxlbWVudHMuYWRkTW9kdWxlKGZ1bmN0aW9uKHNjb3BlKSB7XG4gIHZhciBpc0lFMTFPck9sZGVyID0gc2NvcGUuaXNJRTExT3JPbGRlcjtcbiAgdmFyIHVwZ3JhZGVEb2N1bWVudFRyZWUgPSBzY29wZS51cGdyYWRlRG9jdW1lbnRUcmVlO1xuICB2YXIgdXBncmFkZUFsbCA9IHNjb3BlLnVwZ3JhZGVBbGw7XG4gIHZhciB1cGdyYWRlV2l0aERlZmluaXRpb24gPSBzY29wZS51cGdyYWRlV2l0aERlZmluaXRpb247XG4gIHZhciBpbXBsZW1lbnRQcm90b3R5cGUgPSBzY29wZS5pbXBsZW1lbnRQcm90b3R5cGU7XG4gIHZhciB1c2VOYXRpdmUgPSBzY29wZS51c2VOYXRpdmU7XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyKG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGVmaW5pdGlvbiA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQ6IGZpcnN0IGFyZ3VtZW50IGBuYW1lYCBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICB9XG4gICAgaWYgKG5hbWUuaW5kZXhPZihcIi1cIikgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQ6IGZpcnN0IGFyZ3VtZW50ICgnbmFtZScpIG11c3QgY29udGFpbiBhIGRhc2ggKCctJykuIEFyZ3VtZW50IHByb3ZpZGVkIHdhcyAnXCIgKyBTdHJpbmcobmFtZSkgKyBcIicuXCIpO1xuICAgIH1cbiAgICBpZiAoaXNSZXNlcnZlZFRhZyhuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ3JlZ2lzdGVyRWxlbWVudCcgb24gJ0RvY3VtZW50JzogUmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgdHlwZSAnXCIgKyBTdHJpbmcobmFtZSkgKyBcIicuIFRoZSB0eXBlIG5hbWUgaXMgaW52YWxpZC5cIik7XG4gICAgfVxuICAgIGlmIChnZXRSZWdpc3RlcmVkRGVmaW5pdGlvbihuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlRGVmaW5pdGlvbkVycm9yOiBhIHR5cGUgd2l0aCBuYW1lICdcIiArIFN0cmluZyhuYW1lKSArIFwiJyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgfVxuICAgIGlmICghZGVmaW5pdGlvbi5wcm90b3R5cGUpIHtcbiAgICAgIGRlZmluaXRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MRWxlbWVudC5wcm90b3R5cGUpO1xuICAgIH1cbiAgICBkZWZpbml0aW9uLl9fbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBkZWZpbml0aW9uLmxpZmVjeWNsZSA9IGRlZmluaXRpb24ubGlmZWN5Y2xlIHx8IHt9O1xuICAgIGRlZmluaXRpb24uYW5jZXN0cnkgPSBhbmNlc3RyeShkZWZpbml0aW9uLmV4dGVuZHMpO1xuICAgIHJlc29sdmVUYWdOYW1lKGRlZmluaXRpb24pO1xuICAgIHJlc29sdmVQcm90b3R5cGVDaGFpbihkZWZpbml0aW9uKTtcbiAgICBvdmVycmlkZUF0dHJpYnV0ZUFwaShkZWZpbml0aW9uLnByb3RvdHlwZSk7XG4gICAgcmVnaXN0ZXJEZWZpbml0aW9uKGRlZmluaXRpb24uX19uYW1lLCBkZWZpbml0aW9uKTtcbiAgICBkZWZpbml0aW9uLmN0b3IgPSBnZW5lcmF0ZUNvbnN0cnVjdG9yKGRlZmluaXRpb24pO1xuICAgIGRlZmluaXRpb24uY3Rvci5wcm90b3R5cGUgPSBkZWZpbml0aW9uLnByb3RvdHlwZTtcbiAgICBkZWZpbml0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGRlZmluaXRpb24uY3RvcjtcbiAgICBpZiAoc2NvcGUucmVhZHkpIHtcbiAgICAgIHVwZ3JhZGVEb2N1bWVudFRyZWUoZG9jdW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5pdGlvbi5jdG9yO1xuICB9XG4gIGZ1bmN0aW9uIG92ZXJyaWRlQXR0cmlidXRlQXBpKHByb3RvdHlwZSkge1xuICAgIGlmIChwcm90b3R5cGUuc2V0QXR0cmlidXRlLl9wb2x5ZmlsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzZXRBdHRyaWJ1dGUgPSBwcm90b3R5cGUuc2V0QXR0cmlidXRlO1xuICAgIHByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgY2hhbmdlQXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgdmFsdWUsIHNldEF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgICB2YXIgcmVtb3ZlQXR0cmlidXRlID0gcHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZTtcbiAgICBwcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgY2hhbmdlQXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgbnVsbCwgcmVtb3ZlQXR0cmlidXRlKTtcbiAgICB9O1xuICAgIHByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuX3BvbHlmaWxsZWQgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIGNoYW5nZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgb3BlcmF0aW9uKSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBvcGVyYXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sgJiYgbmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc1Jlc2VydmVkVGFnKG5hbWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc2VydmVkVGFnTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IHJlc2VydmVkVGFnTGlzdFtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIHJlc2VydmVkVGFnTGlzdCA9IFsgXCJhbm5vdGF0aW9uLXhtbFwiLCBcImNvbG9yLXByb2ZpbGVcIiwgXCJmb250LWZhY2VcIiwgXCJmb250LWZhY2Utc3JjXCIsIFwiZm9udC1mYWNlLXVyaVwiLCBcImZvbnQtZmFjZS1mb3JtYXRcIiwgXCJmb250LWZhY2UtbmFtZVwiLCBcIm1pc3NpbmctZ2x5cGhcIiBdO1xuICBmdW5jdGlvbiBhbmNlc3RyeShleHRuZHMpIHtcbiAgICB2YXIgZXh0ZW5kZWUgPSBnZXRSZWdpc3RlcmVkRGVmaW5pdGlvbihleHRuZHMpO1xuICAgIGlmIChleHRlbmRlZSkge1xuICAgICAgcmV0dXJuIGFuY2VzdHJ5KGV4dGVuZGVlLmV4dGVuZHMpLmNvbmNhdChbIGV4dGVuZGVlIF0pO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhZ05hbWUoZGVmaW5pdGlvbikge1xuICAgIHZhciBiYXNlVGFnID0gZGVmaW5pdGlvbi5leHRlbmRzO1xuICAgIGZvciAodmFyIGkgPSAwLCBhOyBhID0gZGVmaW5pdGlvbi5hbmNlc3RyeVtpXTsgaSsrKSB7XG4gICAgICBiYXNlVGFnID0gYS5pcyAmJiBhLnRhZztcbiAgICB9XG4gICAgZGVmaW5pdGlvbi50YWcgPSBiYXNlVGFnIHx8IGRlZmluaXRpb24uX19uYW1lO1xuICAgIGlmIChiYXNlVGFnKSB7XG4gICAgICBkZWZpbml0aW9uLmlzID0gZGVmaW5pdGlvbi5fX25hbWU7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlc29sdmVQcm90b3R5cGVDaGFpbihkZWZpbml0aW9uKSB7XG4gICAgaWYgKCFPYmplY3QuX19wcm90b19fKSB7XG4gICAgICB2YXIgbmF0aXZlUHJvdG90eXBlID0gSFRNTEVsZW1lbnQucHJvdG90eXBlO1xuICAgICAgaWYgKGRlZmluaXRpb24uaXMpIHtcbiAgICAgICAgdmFyIGluc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRlZmluaXRpb24udGFnKTtcbiAgICAgICAgdmFyIGV4cGVjdGVkUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3QpO1xuICAgICAgICBpZiAoZXhwZWN0ZWRQcm90b3R5cGUgPT09IGRlZmluaXRpb24ucHJvdG90eXBlKSB7XG4gICAgICAgICAgbmF0aXZlUHJvdG90eXBlID0gZXhwZWN0ZWRQcm90b3R5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBwcm90byA9IGRlZmluaXRpb24ucHJvdG90eXBlLCBhbmNlc3RvcjtcbiAgICAgIHdoaWxlIChwcm90byAmJiBwcm90byAhPT0gbmF0aXZlUHJvdG90eXBlKSB7XG4gICAgICAgIGFuY2VzdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgcHJvdG8uX19wcm90b19fID0gYW5jZXN0b3I7XG4gICAgICAgIHByb3RvID0gYW5jZXN0b3I7XG4gICAgICB9XG4gICAgICBkZWZpbml0aW9uLm5hdGl2ZSA9IG5hdGl2ZVByb3RvdHlwZTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaW5zdGFudGlhdGUoZGVmaW5pdGlvbikge1xuICAgIHJldHVybiB1cGdyYWRlV2l0aERlZmluaXRpb24oZG9tQ3JlYXRlRWxlbWVudChkZWZpbml0aW9uLnRhZyksIGRlZmluaXRpb24pO1xuICB9XG4gIHZhciByZWdpc3RyeSA9IHt9O1xuICBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkRGVmaW5pdGlvbihuYW1lKSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeVtuYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24obmFtZSwgZGVmaW5pdGlvbikge1xuICAgIHJlZ2lzdHJ5W25hbWVdID0gZGVmaW5pdGlvbjtcbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZUNvbnN0cnVjdG9yKGRlZmluaXRpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaW5zdGFudGlhdGUoZGVmaW5pdGlvbik7XG4gICAgfTtcbiAgfVxuICB2YXIgSFRNTF9OQU1FU1BBQ0UgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgdGFnLCB0eXBlRXh0ZW5zaW9uKSB7XG4gICAgaWYgKG5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KHRhZywgdHlwZUV4dGVuc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkb21DcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCB0YWcpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZywgdHlwZUV4dGVuc2lvbikge1xuICAgIGlmICh0YWcpIHtcbiAgICAgIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZUV4dGVuc2lvbikge1xuICAgICAgdHlwZUV4dGVuc2lvbiA9IHR5cGVFeHRlbnNpb24udG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgdmFyIGRlZmluaXRpb24gPSBnZXRSZWdpc3RlcmVkRGVmaW5pdGlvbih0eXBlRXh0ZW5zaW9uIHx8IHRhZyk7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgIGlmICh0YWcgPT0gZGVmaW5pdGlvbi50YWcgJiYgdHlwZUV4dGVuc2lvbiA9PSBkZWZpbml0aW9uLmlzKSB7XG4gICAgICAgIHJldHVybiBuZXcgZGVmaW5pdGlvbi5jdG9yKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXR5cGVFeHRlbnNpb24gJiYgIWRlZmluaXRpb24uaXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkZWZpbml0aW9uLmN0b3IoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGVsZW1lbnQ7XG4gICAgaWYgKHR5cGVFeHRlbnNpb24pIHtcbiAgICAgIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImlzXCIsIHR5cGVFeHRlbnNpb24pO1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICAgIGVsZW1lbnQgPSBkb21DcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgaWYgKHRhZy5pbmRleE9mKFwiLVwiKSA+PSAwKSB7XG4gICAgICBpbXBsZW1lbnRQcm90b3R5cGUoZWxlbWVudCwgSFRNTEVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuICB2YXIgZG9tQ3JlYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChkb2N1bWVudCk7XG4gIHZhciBkb21DcmVhdGVFbGVtZW50TlMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMuYmluZChkb2N1bWVudCk7XG4gIHZhciBpc0luc3RhbmNlO1xuICBpZiAoIU9iamVjdC5fX3Byb3RvX18gJiYgIXVzZU5hdGl2ZSkge1xuICAgIGlzSW5zdGFuY2UgPSBmdW5jdGlvbihvYmosIGN0b3IpIHtcbiAgICAgIHZhciBwID0gb2JqO1xuICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgaWYgKHAgPT09IGN0b3IucHJvdG90eXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAuX19wcm90b19fO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaXNJbnN0YW5jZSA9IGZ1bmN0aW9uKG9iaiwgYmFzZSkge1xuICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIGJhc2U7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB3cmFwRG9tTWV0aG9kVG9Gb3JjZVVwZ3JhZGUob2JqLCBtZXRob2ROYW1lKSB7XG4gICAgdmFyIG9yaWcgPSBvYmpbbWV0aG9kTmFtZV07XG4gICAgb2JqW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbiA9IG9yaWcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHVwZ3JhZGVBbGwobik7XG4gICAgICByZXR1cm4gbjtcbiAgICB9O1xuICB9XG4gIHdyYXBEb21NZXRob2RUb0ZvcmNlVXBncmFkZShOb2RlLnByb3RvdHlwZSwgXCJjbG9uZU5vZGVcIik7XG4gIHdyYXBEb21NZXRob2RUb0ZvcmNlVXBncmFkZShkb2N1bWVudCwgXCJpbXBvcnROb2RlXCIpO1xuICBpZiAoaXNJRTExT3JPbGRlcikge1xuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpbXBvcnROb2RlID0gZG9jdW1lbnQuaW1wb3J0Tm9kZTtcbiAgICAgIGRvY3VtZW50LmltcG9ydE5vZGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG4gPSBpbXBvcnROb2RlLmFwcGx5KGRvY3VtZW50LCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAobi5ub2RlVHlwZSA9PSBuLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcbiAgICAgICAgICB2YXIgZiA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgICBmLmFwcGVuZENoaWxkKG4pO1xuICAgICAgICAgIHJldHVybiBmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKCk7XG4gIH1cbiAgZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50ID0gcmVnaXN0ZXI7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50O1xuICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgPSBjcmVhdGVFbGVtZW50TlM7XG4gIHNjb3BlLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gIHNjb3BlLmluc3RhbmNlb2YgPSBpc0luc3RhbmNlO1xuICBzY29wZS5yZXNlcnZlZFRhZ0xpc3QgPSByZXNlcnZlZFRhZ0xpc3Q7XG4gIHNjb3BlLmdldFJlZ2lzdGVyZWREZWZpbml0aW9uID0gZ2V0UmVnaXN0ZXJlZERlZmluaXRpb247XG4gIGRvY3VtZW50LnJlZ2lzdGVyID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50O1xufSk7XG5cbihmdW5jdGlvbihzY29wZSkge1xuICB2YXIgdXNlTmF0aXZlID0gc2NvcGUudXNlTmF0aXZlO1xuICB2YXIgaW5pdGlhbGl6ZU1vZHVsZXMgPSBzY29wZS5pbml0aWFsaXplTW9kdWxlcztcbiAgdmFyIGlzSUUxMU9yT2xkZXIgPSAvVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgaWYgKHVzZU5hdGl2ZSkge1xuICAgIHZhciBub3AgPSBmdW5jdGlvbigpIHt9O1xuICAgIHNjb3BlLndhdGNoU2hhZG93ID0gbm9wO1xuICAgIHNjb3BlLnVwZ3JhZGUgPSBub3A7XG4gICAgc2NvcGUudXBncmFkZUFsbCA9IG5vcDtcbiAgICBzY29wZS51cGdyYWRlRG9jdW1lbnRUcmVlID0gbm9wO1xuICAgIHNjb3BlLnVwZ3JhZGVTdWJ0cmVlID0gbm9wO1xuICAgIHNjb3BlLnRha2VSZWNvcmRzID0gbm9wO1xuICAgIHNjb3BlLmluc3RhbmNlb2YgPSBmdW5jdGlvbihvYmosIGJhc2UpIHtcbiAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBiYXNlO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbGl6ZU1vZHVsZXMoKTtcbiAgfVxuICB2YXIgdXBncmFkZURvY3VtZW50VHJlZSA9IHNjb3BlLnVwZ3JhZGVEb2N1bWVudFRyZWU7XG4gIGlmICghd2luZG93LndyYXApIHtcbiAgICBpZiAod2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSB7XG4gICAgICB3aW5kb3cud3JhcCA9IFNoYWRvd0RPTVBvbHlmaWxsLndyYXBJZk5lZWRlZDtcbiAgICAgIHdpbmRvdy51bndyYXAgPSBTaGFkb3dET01Qb2x5ZmlsbC51bndyYXBJZk5lZWRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LndyYXAgPSB3aW5kb3cudW53cmFwID0gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAgICB1cGdyYWRlRG9jdW1lbnRUcmVlKHdyYXAoZG9jdW1lbnQpKTtcbiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7XG4gICAgICBIVE1MSW1wb3J0cy5fX2ltcG9ydHNQYXJzaW5nSG9vayA9IGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICB1cGdyYWRlRG9jdW1lbnRUcmVlKHdyYXAoZWx0LmltcG9ydCkpO1xuICAgICAgfTtcbiAgICB9XG4gICAgQ3VzdG9tRWxlbWVudHMucmVhZHkgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBDdXN0b21FbGVtZW50cy5yZWFkeVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHdpbmRvdy5IVE1MSW1wb3J0cykge1xuICAgICAgICBDdXN0b21FbGVtZW50cy5lbGFwc2VkID0gQ3VzdG9tRWxlbWVudHMucmVhZHlUaW1lIC0gSFRNTEltcG9ydHMucmVhZHlUaW1lO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJXZWJDb21wb25lbnRzUmVhZHlcIiwge1xuICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzSUUxMU9yT2xkZXIgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgd2luZG93LkN1c3RvbUV2ZW50ID0gZnVuY3Rpb24oaW5UeXBlLCBwYXJhbXMpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgIGUuaW5pdEN1c3RvbUV2ZW50KGluVHlwZSwgQm9vbGVhbihwYXJhbXMuYnViYmxlcyksIEJvb2xlYW4ocGFyYW1zLmNhbmNlbGFibGUpLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBlO1xuICAgIH07XG4gICAgd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fCBzY29wZS5mbGFncy5lYWdlcikge1xuICAgIGJvb3RzdHJhcCgpO1xuICB9IGVsc2UgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiaW50ZXJhY3RpdmVcIiAmJiAhd2luZG93LmF0dGFjaEV2ZW50ICYmICghd2luZG93LkhUTUxJbXBvcnRzIHx8IHdpbmRvdy5IVE1MSW1wb3J0cy5yZWFkeSkpIHtcbiAgICBib290c3RyYXAoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbG9hZEV2ZW50ID0gd2luZG93LkhUTUxJbXBvcnRzICYmICFIVE1MSW1wb3J0cy5yZWFkeSA/IFwiSFRNTEltcG9ydHNMb2FkZWRcIiA6IFwiRE9NQ29udGVudExvYWRlZFwiO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGxvYWRFdmVudCwgYm9vdHN0cmFwKTtcbiAgfVxuICBzY29wZS5pc0lFMTFPck9sZGVyID0gaXNJRTExT3JPbGRlcjtcbn0pKHdpbmRvdy5DdXN0b21FbGVtZW50cyk7XG4iLCJpZiAoIXdpbmRvdy5DdXN0b21FdmVudCkge1xuICAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIEN1c3RvbUV2ZW50O1xuXG4gICAgQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbihldmVudCwgcGFyYW1zKSB7XG4gICAgICB2YXIgZXZ0O1xuICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHtcbiAgICAgICAgYnViYmxlczogZmFsc2UsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBkZXRhaWw6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50LCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9O1xuXG4gICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcblxuICAgIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xuICB9KSgpO1xufVxuIiwiLyogU2ltcGxlIEphdmFTY3JpcHQgSW5oZXJpdGFuY2VcbiAqIEJ5IEpvaG4gUmVzaWcgaHR0cDovL2Vqb2huLm9yZy9cbiAqIE1JVCBMaWNlbnNlZC5cbiAqL1xuLy8gSW5zcGlyZWQgYnkgYmFzZTIgYW5kIFByb3RvdHlwZVxuKGZ1bmN0aW9uKCl7XG4gIHZhciBpbml0aWFsaXppbmcgPSBmYWxzZSwgZm5UZXN0ID0gL3h5ei8udGVzdChmdW5jdGlvbigpe3h5ejt9KSA/IC9cXGJfc3VwZXJcXGIvIDogLy4qLztcbiBcbiAgLy8gVGhlIGJhc2UgQ2xhc3MgaW1wbGVtZW50YXRpb24gKGRvZXMgbm90aGluZylcbiAgdGhpcy5DbGFzcyA9IGZ1bmN0aW9uKCl7fTtcbiBcbiAgLy8gQ3JlYXRlIGEgbmV3IENsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSB0aGlzIGNsYXNzXG4gIENsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uKHByb3ApIHtcbiAgICB2YXIgX3N1cGVyID0gdGhpcy5wcm90b3R5cGU7XG4gICBcbiAgICAvLyBJbnN0YW50aWF0ZSBhIGJhc2UgY2xhc3MgKGJ1dCBvbmx5IGNyZWF0ZSB0aGUgaW5zdGFuY2UsXG4gICAgLy8gZG9uJ3QgcnVuIHRoZSBpbml0IGNvbnN0cnVjdG9yKVxuICAgIGluaXRpYWxpemluZyA9IHRydWU7XG4gICAgdmFyIHByb3RvdHlwZSA9IG5ldyB0aGlzKCk7XG4gICAgaW5pdGlhbGl6aW5nID0gZmFsc2U7XG4gICBcbiAgICAvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG92ZXIgb250byB0aGUgbmV3IHByb3RvdHlwZVxuICAgIGZvciAodmFyIG5hbWUgaW4gcHJvcCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZnVuY3Rpb25cbiAgICAgIHByb3RvdHlwZVtuYW1lXSA9IHR5cGVvZiBwcm9wW25hbWVdID09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICB0eXBlb2YgX3N1cGVyW25hbWVdID09IFwiZnVuY3Rpb25cIiAmJiBmblRlc3QudGVzdChwcm9wW25hbWVdKSA/XG4gICAgICAgIChmdW5jdGlvbihuYW1lLCBmbil7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRtcCA9IHRoaXMuX3N1cGVyO1xuICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEFkZCBhIG5ldyAuX3N1cGVyKCkgbWV0aG9kIHRoYXQgaXMgdGhlIHNhbWUgbWV0aG9kXG4gICAgICAgICAgICAvLyBidXQgb24gdGhlIHN1cGVyLWNsYXNzXG4gICAgICAgICAgICB0aGlzLl9zdXBlciA9IF9zdXBlcltuYW1lXTtcbiAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBUaGUgbWV0aG9kIG9ubHkgbmVlZCB0byBiZSBib3VuZCB0ZW1wb3JhcmlseSwgc28gd2VcbiAgICAgICAgICAgIC8vIHJlbW92ZSBpdCB3aGVuIHdlJ3JlIGRvbmUgZXhlY3V0aW5nXG4gICAgICAgICAgICB2YXIgcmV0ID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5fc3VwZXIgPSB0bXA7XG4gICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICB9O1xuICAgICAgICB9KShuYW1lLCBwcm9wW25hbWVdKSA6XG4gICAgICAgIHByb3BbbmFtZV07XG4gICAgfVxuICAgXG4gICAgLy8gVGhlIGR1bW15IGNsYXNzIGNvbnN0cnVjdG9yXG4gICAgZnVuY3Rpb24gQ2xhc3MoKSB7XG4gICAgICAvLyBBbGwgY29uc3RydWN0aW9uIGlzIGFjdHVhbGx5IGRvbmUgaW4gdGhlIGluaXQgbWV0aG9kXG4gICAgICBpZiAoICFpbml0aWFsaXppbmcgJiYgdGhpcy5pbml0IClcbiAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgXG4gICAgLy8gUG9wdWxhdGUgb3VyIGNvbnN0cnVjdGVkIHByb3RvdHlwZSBvYmplY3RcbiAgICBDbGFzcy5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICBcbiAgICAvLyBFbmZvcmNlIHRoZSBjb25zdHJ1Y3RvciB0byBiZSB3aGF0IHdlIGV4cGVjdFxuICAgIENsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENsYXNzO1xuIFxuICAgIC8vIEFuZCBtYWtlIHRoaXMgY2xhc3MgZXh0ZW5kYWJsZVxuICAgIENsYXNzLmV4dGVuZCA9IGFyZ3VtZW50cy5jYWxsZWU7XG4gICBcbiAgICByZXR1cm4gQ2xhc3M7XG4gIH07XG59KSgpOyIsIjsoZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0LyoqXG5cdCAqIEBwcmVzZXJ2ZSBGYXN0Q2xpY2s6IHBvbHlmaWxsIHRvIHJlbW92ZSBjbGljayBkZWxheXMgb24gYnJvd3NlcnMgd2l0aCB0b3VjaCBVSXMuXG5cdCAqXG5cdCAqIEBjb2RpbmdzdGFuZGFyZCBmdGxhYnMtanN2MlxuXHQgKiBAY29weXJpZ2h0IFRoZSBGaW5hbmNpYWwgVGltZXMgTGltaXRlZCBbQWxsIFJpZ2h0cyBSZXNlcnZlZF1cblx0ICogQGxpY2Vuc2UgTUlUIExpY2Vuc2UgKHNlZSBMSUNFTlNFLnR4dClcblx0ICovXG5cblx0Lypqc2xpbnQgYnJvd3Nlcjp0cnVlLCBub2RlOnRydWUqL1xuXHQvKmdsb2JhbCBkZWZpbmUsIEV2ZW50LCBOb2RlKi9cblxuXG5cdC8qKlxuXHQgKiBJbnN0YW50aWF0ZSBmYXN0LWNsaWNraW5nIGxpc3RlbmVycyBvbiB0aGUgc3BlY2lmaWVkIGxheWVyLlxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtFbGVtZW50fSBsYXllciBUaGUgbGF5ZXIgdG8gbGlzdGVuIG9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzXG5cdCAqL1xuXHRmdW5jdGlvbiBGYXN0Q2xpY2sobGF5ZXIsIG9wdGlvbnMpIHtcblx0XHR2YXIgb2xkT25DbGljaztcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogV2hldGhlciBhIGNsaWNrIGlzIGN1cnJlbnRseSBiZWluZyB0cmFja2VkLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgYm9vbGVhblxuXHRcdCAqL1xuXHRcdHRoaXMudHJhY2tpbmdDbGljayA9IGZhbHNlO1xuXG5cblx0XHQvKipcblx0XHQgKiBUaW1lc3RhbXAgZm9yIHdoZW4gY2xpY2sgdHJhY2tpbmcgc3RhcnRlZC5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMudHJhY2tpbmdDbGlja1N0YXJ0ID0gMDtcblxuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGVsZW1lbnQgYmVpbmcgdHJhY2tlZCBmb3IgYSBjbGljay5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIEV2ZW50VGFyZ2V0XG5cdFx0ICovXG5cdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gbnVsbDtcblxuXG5cdFx0LyoqXG5cdFx0ICogWC1jb29yZGluYXRlIG9mIHRvdWNoIHN0YXJ0IGV2ZW50LlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgbnVtYmVyXG5cdFx0ICovXG5cdFx0dGhpcy50b3VjaFN0YXJ0WCA9IDA7XG5cblxuXHRcdC8qKlxuXHRcdCAqIFktY29vcmRpbmF0ZSBvZiB0b3VjaCBzdGFydCBldmVudC5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMudG91Y2hTdGFydFkgPSAwO1xuXG5cblx0XHQvKipcblx0XHQgKiBJRCBvZiB0aGUgbGFzdCB0b3VjaCwgcmV0cmlldmVkIGZyb20gVG91Y2guaWRlbnRpZmllci5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMubGFzdFRvdWNoSWRlbnRpZmllciA9IDA7XG5cblxuXHRcdC8qKlxuXHRcdCAqIFRvdWNobW92ZSBib3VuZGFyeSwgYmV5b25kIHdoaWNoIGEgY2xpY2sgd2lsbCBiZSBjYW5jZWxsZWQuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBudW1iZXJcblx0XHQgKi9cblx0XHR0aGlzLnRvdWNoQm91bmRhcnkgPSBvcHRpb25zLnRvdWNoQm91bmRhcnkgfHwgMTA7XG5cblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBGYXN0Q2xpY2sgbGF5ZXIuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBFbGVtZW50XG5cdFx0ICovXG5cdFx0dGhpcy5sYXllciA9IGxheWVyO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIG1pbmltdW0gdGltZSBiZXR3ZWVuIHRhcCh0b3VjaHN0YXJ0IGFuZCB0b3VjaGVuZCkgZXZlbnRzXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBudW1iZXJcblx0XHQgKi9cblx0XHR0aGlzLnRhcERlbGF5ID0gb3B0aW9ucy50YXBEZWxheSB8fCAyMDA7XG5cblx0XHQvKipcblx0XHQgKiBUaGUgbWF4aW11bSB0aW1lIGZvciBhIHRhcFxuXHRcdCAqXG5cdFx0ICogQHR5cGUgbnVtYmVyXG5cdFx0ICovXG5cdFx0dGhpcy50YXBUaW1lb3V0ID0gb3B0aW9ucy50YXBUaW1lb3V0IHx8IDcwMDtcblxuXHRcdGlmIChGYXN0Q2xpY2subm90TmVlZGVkKGxheWVyKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFNvbWUgb2xkIHZlcnNpb25zIG9mIEFuZHJvaWQgZG9uJ3QgaGF2ZSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuXHRcdGZ1bmN0aW9uIGJpbmQobWV0aG9kLCBjb250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBtZXRob2QuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTsgfTtcblx0XHR9XG5cblxuXHRcdHZhciBtZXRob2RzID0gWydvbk1vdXNlJywgJ29uQ2xpY2snLCAnb25Ub3VjaFN0YXJ0JywgJ29uVG91Y2hNb3ZlJywgJ29uVG91Y2hFbmQnLCAnb25Ub3VjaENhbmNlbCddO1xuXHRcdHZhciBjb250ZXh0ID0gdGhpcztcblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRjb250ZXh0W21ldGhvZHNbaV1dID0gYmluZChjb250ZXh0W21ldGhvZHNbaV1dLCBjb250ZXh0KTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdXAgZXZlbnQgaGFuZGxlcnMgYXMgcmVxdWlyZWRcblx0XHRpZiAoZGV2aWNlSXNBbmRyb2lkKSB7XG5cdFx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm9uTW91c2UsIHRydWUpO1xuXHRcdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlLCB0cnVlKTtcblx0XHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2UsIHRydWUpO1xuXHRcdH1cblxuXHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrLCB0cnVlKTtcblx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoU3RhcnQsIGZhbHNlKTtcblx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uVG91Y2hNb3ZlLCBmYWxzZSk7XG5cdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmQsIGZhbHNlKTtcblx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMub25Ub3VjaENhbmNlbCwgZmFsc2UpO1xuXG5cdFx0Ly8gSGFjayBpcyByZXF1aXJlZCBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IEV2ZW50I3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAoZS5nLiBBbmRyb2lkIDIpXG5cdFx0Ly8gd2hpY2ggaXMgaG93IEZhc3RDbGljayBub3JtYWxseSBzdG9wcyBjbGljayBldmVudHMgYnViYmxpbmcgdG8gY2FsbGJhY2tzIHJlZ2lzdGVyZWQgb24gdGhlIEZhc3RDbGlja1xuXHRcdC8vIGxheWVyIHdoZW4gdGhleSBhcmUgY2FuY2VsbGVkLlxuXHRcdGlmICghRXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikge1xuXHRcdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrLCBjYXB0dXJlKSB7XG5cdFx0XHRcdHZhciBybXYgPSBOb2RlLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyO1xuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuXHRcdFx0XHRcdHJtdi5jYWxsKGxheWVyLCB0eXBlLCBjYWxsYmFjay5oaWphY2tlZCB8fCBjYWxsYmFjaywgY2FwdHVyZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cm12LmNhbGwobGF5ZXIsIHR5cGUsIGNhbGxiYWNrLCBjYXB0dXJlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGNhbGxiYWNrLCBjYXB0dXJlKSB7XG5cdFx0XHRcdHZhciBhZHYgPSBOb2RlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyO1xuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuXHRcdFx0XHRcdGFkdi5jYWxsKGxheWVyLCB0eXBlLCBjYWxsYmFjay5oaWphY2tlZCB8fCAoY2FsbGJhY2suaGlqYWNrZWQgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdFx0XHRcdFx0aWYgKCFldmVudC5wcm9wYWdhdGlvblN0b3BwZWQpIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2soZXZlbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLCBjYXB0dXJlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhZHYuY2FsbChsYXllciwgdHlwZSwgY2FsbGJhY2ssIGNhcHR1cmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIElmIGEgaGFuZGxlciBpcyBhbHJlYWR5IGRlY2xhcmVkIGluIHRoZSBlbGVtZW50J3Mgb25jbGljayBhdHRyaWJ1dGUsIGl0IHdpbGwgYmUgZmlyZWQgYmVmb3JlXG5cdFx0Ly8gRmFzdENsaWNrJ3Mgb25DbGljayBoYW5kbGVyLiBGaXggdGhpcyBieSBwdWxsaW5nIG91dCB0aGUgdXNlci1kZWZpbmVkIGhhbmRsZXIgZnVuY3Rpb24gYW5kXG5cdFx0Ly8gYWRkaW5nIGl0IGFzIGxpc3RlbmVyLlxuXHRcdGlmICh0eXBlb2YgbGF5ZXIub25jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuXG5cdFx0XHQvLyBBbmRyb2lkIGJyb3dzZXIgb24gYXQgbGVhc3QgMy4yIHJlcXVpcmVzIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gaW4gbGF5ZXIub25jbGlja1xuXHRcdFx0Ly8gLSB0aGUgb2xkIG9uZSB3b24ndCB3b3JrIGlmIHBhc3NlZCB0byBhZGRFdmVudExpc3RlbmVyIGRpcmVjdGx5LlxuXHRcdFx0b2xkT25DbGljayA9IGxheWVyLm9uY2xpY2s7XG5cdFx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRcdG9sZE9uQ2xpY2soZXZlbnQpO1xuXHRcdFx0fSwgZmFsc2UpO1xuXHRcdFx0bGF5ZXIub25jbGljayA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogV2luZG93cyBQaG9uZSA4LjEgZmFrZXMgdXNlciBhZ2VudCBzdHJpbmcgdG8gbG9vayBsaWtlIEFuZHJvaWQgYW5kIGlQaG9uZS5cblx0KlxuXHQqIEB0eXBlIGJvb2xlYW5cblx0Ki9cblx0dmFyIGRldmljZUlzV2luZG93c1Bob25lID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiV2luZG93cyBQaG9uZVwiKSA+PSAwO1xuXG5cdC8qKlxuXHQgKiBBbmRyb2lkIHJlcXVpcmVzIGV4Y2VwdGlvbnMuXG5cdCAqXG5cdCAqIEB0eXBlIGJvb2xlYW5cblx0ICovXG5cdHZhciBkZXZpY2VJc0FuZHJvaWQgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FuZHJvaWQnKSA+IDAgJiYgIWRldmljZUlzV2luZG93c1Bob25lO1xuXG5cblx0LyoqXG5cdCAqIGlPUyByZXF1aXJlcyBleGNlcHRpb25zLlxuXHQgKlxuXHQgKiBAdHlwZSBib29sZWFuXG5cdCAqL1xuXHR2YXIgZGV2aWNlSXNJT1MgPSAvaVAoYWR8aG9uZXxvZCkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIWRldmljZUlzV2luZG93c1Bob25lO1xuXG5cblx0LyoqXG5cdCAqIGlPUyA0IHJlcXVpcmVzIGFuIGV4Y2VwdGlvbiBmb3Igc2VsZWN0IGVsZW1lbnRzLlxuXHQgKlxuXHQgKiBAdHlwZSBib29sZWFuXG5cdCAqL1xuXHR2YXIgZGV2aWNlSXNJT1M0ID0gZGV2aWNlSXNJT1MgJiYgKC9PUyA0X1xcZChfXFxkKT8vKS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG5cblx0LyoqXG5cdCAqIGlPUyA2LjAtNy4qIHJlcXVpcmVzIHRoZSB0YXJnZXQgZWxlbWVudCB0byBiZSBtYW51YWxseSBkZXJpdmVkXG5cdCAqXG5cdCAqIEB0eXBlIGJvb2xlYW5cblx0ICovXG5cdHZhciBkZXZpY2VJc0lPU1dpdGhCYWRUYXJnZXQgPSBkZXZpY2VJc0lPUyAmJiAoL09TIFs2LTddX1xcZC8pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cblx0LyoqXG5cdCAqIEJsYWNrQmVycnkgcmVxdWlyZXMgZXhjZXB0aW9ucy5cblx0ICpcblx0ICogQHR5cGUgYm9vbGVhblxuXHQgKi9cblx0dmFyIGRldmljZUlzQmxhY2tCZXJyeTEwID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdCQjEwJykgPiAwO1xuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIGVsZW1lbnQgcmVxdWlyZXMgYSBuYXRpdmUgY2xpY2suXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RWxlbWVudH0gdGFyZ2V0IFRhcmdldCBET00gZWxlbWVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IG5lZWRzIGEgbmF0aXZlIGNsaWNrXG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm5lZWRzQ2xpY2sgPSBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHRzd2l0Y2ggKHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG5cblx0XHQvLyBEb24ndCBzZW5kIGEgc3ludGhldGljIGNsaWNrIHRvIGRpc2FibGVkIGlucHV0cyAoaXNzdWUgIzYyKVxuXHRcdGNhc2UgJ2J1dHRvbic6XG5cdFx0Y2FzZSAnc2VsZWN0Jzpcblx0XHRjYXNlICd0ZXh0YXJlYSc6XG5cdFx0XHRpZiAodGFyZ2V0LmRpc2FibGVkKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdpbnB1dCc6XG5cblx0XHRcdC8vIEZpbGUgaW5wdXRzIG5lZWQgcmVhbCBjbGlja3Mgb24gaU9TIDYgZHVlIHRvIGEgYnJvd3NlciBidWcgKGlzc3VlICM2OClcblx0XHRcdGlmICgoZGV2aWNlSXNJT1MgJiYgdGFyZ2V0LnR5cGUgPT09ICdmaWxlJykgfHwgdGFyZ2V0LmRpc2FibGVkKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdsYWJlbCc6XG5cdFx0Y2FzZSAnaWZyYW1lJzogLy8gaU9TOCBob21lc2NyZWVuIGFwcHMgY2FuIHByZXZlbnQgZXZlbnRzIGJ1YmJsaW5nIGludG8gZnJhbWVzXG5cdFx0Y2FzZSAndmlkZW8nOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICgvXFxibmVlZHNjbGlja1xcYi8pLnRlc3QodGFyZ2V0LmNsYXNzTmFtZSk7XG5cdH07XG5cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBlbGVtZW50IHJlcXVpcmVzIGEgY2FsbCB0byBmb2N1cyB0byBzaW11bGF0ZSBjbGljayBpbnRvIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RWxlbWVudH0gdGFyZ2V0IFRhcmdldCBET00gZWxlbWVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIGEgY2FsbCB0byBmb2N1cyB0byBzaW11bGF0ZSBuYXRpdmUgY2xpY2suXG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm5lZWRzRm9jdXMgPSBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHRzd2l0Y2ggKHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0Y2FzZSAndGV4dGFyZWEnOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2FzZSAnc2VsZWN0Jzpcblx0XHRcdHJldHVybiAhZGV2aWNlSXNBbmRyb2lkO1xuXHRcdGNhc2UgJ2lucHV0Jzpcblx0XHRcdHN3aXRjaCAodGFyZ2V0LnR5cGUpIHtcblx0XHRcdGNhc2UgJ2J1dHRvbic6XG5cdFx0XHRjYXNlICdjaGVja2JveCc6XG5cdFx0XHRjYXNlICdmaWxlJzpcblx0XHRcdGNhc2UgJ2ltYWdlJzpcblx0XHRcdGNhc2UgJ3JhZGlvJzpcblx0XHRcdGNhc2UgJ3N1Ym1pdCc6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTm8gcG9pbnQgaW4gYXR0ZW1wdGluZyB0byBmb2N1cyBkaXNhYmxlZCBpbnB1dHNcblx0XHRcdHJldHVybiAhdGFyZ2V0LmRpc2FibGVkICYmICF0YXJnZXQucmVhZE9ubHk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiAoL1xcYm5lZWRzZm9jdXNcXGIvKS50ZXN0KHRhcmdldC5jbGFzc05hbWUpO1xuXHRcdH1cblx0fTtcblxuXG5cdC8qKlxuXHQgKiBTZW5kIGEgY2xpY2sgZXZlbnQgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEVsZW1lbnR9IHRhcmdldEVsZW1lbnRcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUuc2VuZENsaWNrID0gZnVuY3Rpb24odGFyZ2V0RWxlbWVudCwgZXZlbnQpIHtcblx0XHR2YXIgY2xpY2tFdmVudCwgdG91Y2g7XG5cblx0XHQvLyBPbiBzb21lIEFuZHJvaWQgZGV2aWNlcyBhY3RpdmVFbGVtZW50IG5lZWRzIHRvIGJlIGJsdXJyZWQgb3RoZXJ3aXNlIHRoZSBzeW50aGV0aWMgY2xpY2sgd2lsbCBoYXZlIG5vIGVmZmVjdCAoIzI0KVxuXHRcdGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRhcmdldEVsZW1lbnQpIHtcblx0XHRcdGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuXHRcdH1cblxuXHRcdHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG5cblx0XHQvLyBTeW50aGVzaXplIGEgY2xpY2sgZXZlbnQsIHdpdGggYW4gZXh0cmEgYXR0cmlidXRlIHNvIGl0IGNhbiBiZSB0cmFja2VkXG5cdFx0Y2xpY2tFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xuXHRcdGNsaWNrRXZlbnQuaW5pdE1vdXNlRXZlbnQodGhpcy5kZXRlcm1pbmVFdmVudFR5cGUodGFyZ2V0RWxlbWVudCksIHRydWUsIHRydWUsIHdpbmRvdywgMSwgdG91Y2guc2NyZWVuWCwgdG91Y2guc2NyZWVuWSwgdG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuXHRcdGNsaWNrRXZlbnQuZm9yd2FyZGVkVG91Y2hFdmVudCA9IHRydWU7XG5cdFx0dGFyZ2V0RWxlbWVudC5kaXNwYXRjaEV2ZW50KGNsaWNrRXZlbnQpO1xuXHR9O1xuXG5cdEZhc3RDbGljay5wcm90b3R5cGUuZGV0ZXJtaW5lRXZlbnRUeXBlID0gZnVuY3Rpb24odGFyZ2V0RWxlbWVudCkge1xuXG5cdFx0Ly9Jc3N1ZSAjMTU5OiBBbmRyb2lkIENocm9tZSBTZWxlY3QgQm94IGRvZXMgbm90IG9wZW4gd2l0aCBhIHN5bnRoZXRpYyBjbGljayBldmVudFxuXHRcdGlmIChkZXZpY2VJc0FuZHJvaWQgJiYgdGFyZ2V0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzZWxlY3QnKSB7XG5cdFx0XHRyZXR1cm4gJ21vdXNlZG93bic7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICdjbGljayc7XG5cdH07XG5cblxuXHQvKipcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldHxFbGVtZW50fSB0YXJnZXRFbGVtZW50XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24odGFyZ2V0RWxlbWVudCkge1xuXHRcdHZhciBsZW5ndGg7XG5cblx0XHQvLyBJc3N1ZSAjMTYwOiBvbiBpT1MgNywgc29tZSBpbnB1dCBlbGVtZW50cyAoZS5nLiBkYXRlIGRhdGV0aW1lIG1vbnRoKSB0aHJvdyBhIHZhZ3VlIFR5cGVFcnJvciBvbiBzZXRTZWxlY3Rpb25SYW5nZS4gVGhlc2UgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhbiBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgc2VsZWN0aW9uU3RhcnQgYW5kIHNlbGVjdGlvbkVuZCBwcm9wZXJ0aWVzLCBidXQgdW5mb3J0dW5hdGVseSB0aGF0IGNhbid0IGJlIHVzZWQgZm9yIGRldGVjdGlvbiBiZWNhdXNlIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBhbHNvIHRocm93cyBhIFR5cGVFcnJvci4gSnVzdCBjaGVjayB0aGUgdHlwZSBpbnN0ZWFkLiBGaWxlZCBhcyBBcHBsZSBidWcgIzE1MTIyNzI0LlxuXHRcdGlmIChkZXZpY2VJc0lPUyAmJiB0YXJnZXRFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlICYmIHRhcmdldEVsZW1lbnQudHlwZS5pbmRleE9mKCdkYXRlJykgIT09IDAgJiYgdGFyZ2V0RWxlbWVudC50eXBlICE9PSAndGltZScgJiYgdGFyZ2V0RWxlbWVudC50eXBlICE9PSAnbW9udGgnKSB7XG5cdFx0XHRsZW5ndGggPSB0YXJnZXRFbGVtZW50LnZhbHVlLmxlbmd0aDtcblx0XHRcdHRhcmdldEVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UobGVuZ3RoLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXRFbGVtZW50LmZvY3VzKCk7XG5cdFx0fVxuXHR9O1xuXG5cblx0LyoqXG5cdCAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHRhcmdldCBlbGVtZW50IGlzIGEgY2hpbGQgb2YgYSBzY3JvbGxhYmxlIGxheWVyIGFuZCBpZiBzbywgc2V0IGEgZmxhZyBvbiBpdC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldHxFbGVtZW50fSB0YXJnZXRFbGVtZW50XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLnVwZGF0ZVNjcm9sbFBhcmVudCA9IGZ1bmN0aW9uKHRhcmdldEVsZW1lbnQpIHtcblx0XHR2YXIgc2Nyb2xsUGFyZW50LCBwYXJlbnRFbGVtZW50O1xuXG5cdFx0c2Nyb2xsUGFyZW50ID0gdGFyZ2V0RWxlbWVudC5mYXN0Q2xpY2tTY3JvbGxQYXJlbnQ7XG5cblx0XHQvLyBBdHRlbXB0IHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIHRhcmdldCBlbGVtZW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBzY3JvbGxhYmxlIGxheWVyLiBSZS1jaGVjayBpZiB0aGVcblx0XHQvLyB0YXJnZXQgZWxlbWVudCB3YXMgbW92ZWQgdG8gYW5vdGhlciBwYXJlbnQuXG5cdFx0aWYgKCFzY3JvbGxQYXJlbnQgfHwgIXNjcm9sbFBhcmVudC5jb250YWlucyh0YXJnZXRFbGVtZW50KSkge1xuXHRcdFx0cGFyZW50RWxlbWVudCA9IHRhcmdldEVsZW1lbnQ7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdGlmIChwYXJlbnRFbGVtZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XG5cdFx0XHRcdFx0c2Nyb2xsUGFyZW50ID0gcGFyZW50RWxlbWVudDtcblx0XHRcdFx0XHR0YXJnZXRFbGVtZW50LmZhc3RDbGlja1Njcm9sbFBhcmVudCA9IHBhcmVudEVsZW1lbnQ7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXHRcdFx0fSB3aGlsZSAocGFyZW50RWxlbWVudCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWx3YXlzIHVwZGF0ZSB0aGUgc2Nyb2xsIHRvcCB0cmFja2VyIGlmIHBvc3NpYmxlLlxuXHRcdGlmIChzY3JvbGxQYXJlbnQpIHtcblx0XHRcdHNjcm9sbFBhcmVudC5mYXN0Q2xpY2tMYXN0U2Nyb2xsVG9wID0gc2Nyb2xsUGFyZW50LnNjcm9sbFRvcDtcblx0XHR9XG5cdH07XG5cblxuXHQvKipcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0RWxlbWVudFxuXHQgKiBAcmV0dXJucyB7RWxlbWVudHxFdmVudFRhcmdldH1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUuZ2V0VGFyZ2V0RWxlbWVudEZyb21FdmVudFRhcmdldCA9IGZ1bmN0aW9uKGV2ZW50VGFyZ2V0KSB7XG5cblx0XHQvLyBPbiBzb21lIG9sZGVyIGJyb3dzZXJzIChub3RhYmx5IFNhZmFyaSBvbiBpT1MgNC4xIC0gc2VlIGlzc3VlICM1NikgdGhlIGV2ZW50IHRhcmdldCBtYXkgYmUgYSB0ZXh0IG5vZGUuXG5cdFx0aWYgKGV2ZW50VGFyZ2V0Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuXHRcdFx0cmV0dXJuIGV2ZW50VGFyZ2V0LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50VGFyZ2V0O1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIE9uIHRvdWNoIHN0YXJ0LCByZWNvcmQgdGhlIHBvc2l0aW9uIGFuZCBzY3JvbGwgb2Zmc2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgdGFyZ2V0RWxlbWVudCwgdG91Y2gsIHNlbGVjdGlvbjtcblxuXHRcdC8vIElnbm9yZSBtdWx0aXBsZSB0b3VjaGVzLCBvdGhlcndpc2UgcGluY2gtdG8tem9vbSBpcyBwcmV2ZW50ZWQgaWYgYm90aCBmaW5nZXJzIGFyZSBvbiB0aGUgRmFzdENsaWNrIGVsZW1lbnQgKGlzc3VlICMxMTEpLlxuXHRcdGlmIChldmVudC50YXJnZXRUb3VjaGVzLmxlbmd0aCA+IDEpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHRhcmdldEVsZW1lbnQgPSB0aGlzLmdldFRhcmdldEVsZW1lbnRGcm9tRXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KTtcblx0XHR0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07XG5cblx0XHRpZiAoZGV2aWNlSXNJT1MpIHtcblxuXHRcdFx0Ly8gT25seSB0cnVzdGVkIGV2ZW50cyB3aWxsIGRlc2VsZWN0IHRleHQgb24gaU9TIChpc3N1ZSAjNDkpXG5cdFx0XHRzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgJiYgIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFkZXZpY2VJc0lPUzQpIHtcblxuXHRcdFx0XHQvLyBXZWlyZCB0aGluZ3MgaGFwcGVuIG9uIGlPUyB3aGVuIGFuIGFsZXJ0IG9yIGNvbmZpcm0gZGlhbG9nIGlzIG9wZW5lZCBmcm9tIGEgY2xpY2sgZXZlbnQgY2FsbGJhY2sgKGlzc3VlICMyMyk6XG5cdFx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgbmV4dCB0YXBzIGFueXdoZXJlIGVsc2Ugb24gdGhlIHBhZ2UsIG5ldyB0b3VjaHN0YXJ0IGFuZCB0b3VjaGVuZCBldmVudHMgYXJlIGRpc3BhdGNoZWRcblx0XHRcdFx0Ly8gd2l0aCB0aGUgc2FtZSBpZGVudGlmaWVyIGFzIHRoZSB0b3VjaCBldmVudCB0aGF0IHByZXZpb3VzbHkgdHJpZ2dlcmVkIHRoZSBjbGljayB0aGF0IHRyaWdnZXJlZCB0aGUgYWxlcnQuXG5cdFx0XHRcdC8vIFNhZGx5LCB0aGVyZSBpcyBhbiBpc3N1ZSBvbiBpT1MgNCB0aGF0IGNhdXNlcyBzb21lIG5vcm1hbCB0b3VjaCBldmVudHMgdG8gaGF2ZSB0aGUgc2FtZSBpZGVudGlmaWVyIGFzIGFuXG5cdFx0XHRcdC8vIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0b3VjaCBldmVudCAoaXNzdWUgIzUyKSwgc28gdGhpcyBmaXggaXMgdW5hdmFpbGFibGUgb24gdGhhdCBwbGF0Zm9ybS5cblx0XHRcdFx0Ly8gSXNzdWUgMTIwOiB0b3VjaC5pZGVudGlmaWVyIGlzIDAgd2hlbiBDaHJvbWUgZGV2IHRvb2xzICdFbXVsYXRlIHRvdWNoIGV2ZW50cycgaXMgc2V0IHdpdGggYW4gaU9TIGRldmljZSBVQSBzdHJpbmcsXG5cdFx0XHRcdC8vIHdoaWNoIGNhdXNlcyBhbGwgdG91Y2ggZXZlbnRzIHRvIGJlIGlnbm9yZWQuIEFzIHRoaXMgYmxvY2sgb25seSBhcHBsaWVzIHRvIGlPUywgYW5kIGlPUyBpZGVudGlmaWVycyBhcmUgYWx3YXlzIGxvbmcsXG5cdFx0XHRcdC8vIHJhbmRvbSBpbnRlZ2VycywgaXQncyBzYWZlIHRvIHRvIGNvbnRpbnVlIGlmIHRoZSBpZGVudGlmaWVyIGlzIDAgaGVyZS5cblx0XHRcdFx0aWYgKHRvdWNoLmlkZW50aWZpZXIgJiYgdG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5sYXN0VG91Y2hJZGVudGlmaWVyKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmxhc3RUb3VjaElkZW50aWZpZXIgPSB0b3VjaC5pZGVudGlmaWVyO1xuXG5cdFx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIGNoaWxkIG9mIGEgc2Nyb2xsYWJsZSBsYXllciAodXNpbmcgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoKSBhbmQ6XG5cdFx0XHRcdC8vIDEpIHRoZSB1c2VyIGRvZXMgYSBmbGluZyBzY3JvbGwgb24gdGhlIHNjcm9sbGFibGUgbGF5ZXJcblx0XHRcdFx0Ly8gMikgdGhlIHVzZXIgc3RvcHMgdGhlIGZsaW5nIHNjcm9sbCB3aXRoIGFub3RoZXIgdGFwXG5cdFx0XHRcdC8vIHRoZW4gdGhlIGV2ZW50LnRhcmdldCBvZiB0aGUgbGFzdCAndG91Y2hlbmQnIGV2ZW50IHdpbGwgYmUgdGhlIGVsZW1lbnQgdGhhdCB3YXMgdW5kZXIgdGhlIHVzZXIncyBmaW5nZXJcblx0XHRcdFx0Ly8gd2hlbiB0aGUgZmxpbmcgc2Nyb2xsIHdhcyBzdGFydGVkLCBjYXVzaW5nIEZhc3RDbGljayB0byBzZW5kIGEgY2xpY2sgZXZlbnQgdG8gdGhhdCBsYXllciAtIHVubGVzcyBhIGNoZWNrXG5cdFx0XHRcdC8vIGlzIG1hZGUgdG8gZW5zdXJlIHRoYXQgYSBwYXJlbnQgbGF5ZXIgd2FzIG5vdCBzY3JvbGxlZCBiZWZvcmUgc2VuZGluZyBhIHN5bnRoZXRpYyBjbGljayAoaXNzdWUgIzQyKS5cblx0XHRcdFx0dGhpcy51cGRhdGVTY3JvbGxQYXJlbnQodGFyZ2V0RWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFja2luZ0NsaWNrID0gdHJ1ZTtcblx0XHR0aGlzLnRyYWNraW5nQ2xpY2tTdGFydCA9IGV2ZW50LnRpbWVTdGFtcDtcblx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSB0YXJnZXRFbGVtZW50O1xuXG5cdFx0dGhpcy50b3VjaFN0YXJ0WCA9IHRvdWNoLnBhZ2VYO1xuXHRcdHRoaXMudG91Y2hTdGFydFkgPSB0b3VjaC5wYWdlWTtcblxuXHRcdC8vIFByZXZlbnQgcGhhbnRvbSBjbGlja3Mgb24gZmFzdCBkb3VibGUtdGFwIChpc3N1ZSAjMzYpXG5cdFx0aWYgKChldmVudC50aW1lU3RhbXAgLSB0aGlzLmxhc3RDbGlja1RpbWUpIDwgdGhpcy50YXBEZWxheSkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBCYXNlZCBvbiBhIHRvdWNobW92ZSBldmVudCBvYmplY3QsIGNoZWNrIHdoZXRoZXIgdGhlIHRvdWNoIGhhcyBtb3ZlZCBwYXN0IGEgYm91bmRhcnkgc2luY2UgaXQgc3RhcnRlZC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLnRvdWNoSGFzTW92ZWQgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLCBib3VuZGFyeSA9IHRoaXMudG91Y2hCb3VuZGFyeTtcblxuXHRcdGlmIChNYXRoLmFicyh0b3VjaC5wYWdlWCAtIHRoaXMudG91Y2hTdGFydFgpID4gYm91bmRhcnkgfHwgTWF0aC5hYnModG91Y2gucGFnZVkgLSB0aGlzLnRvdWNoU3RhcnRZKSA+IGJvdW5kYXJ5KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblxuXHQvKipcblx0ICogVXBkYXRlIHRoZSBsYXN0IHBvc2l0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaE1vdmUgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdGlmICghdGhpcy50cmFja2luZ0NsaWNrKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgdG91Y2ggaGFzIG1vdmVkLCBjYW5jZWwgdGhlIGNsaWNrIHRyYWNraW5nXG5cdFx0aWYgKHRoaXMudGFyZ2V0RWxlbWVudCAhPT0gdGhpcy5nZXRUYXJnZXRFbGVtZW50RnJvbUV2ZW50VGFyZ2V0KGV2ZW50LnRhcmdldCkgfHwgdGhpcy50b3VjaEhhc01vdmVkKGV2ZW50KSkge1xuXHRcdFx0dGhpcy50cmFja2luZ0NsaWNrID0gZmFsc2U7XG5cdFx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEF0dGVtcHQgdG8gZmluZCB0aGUgbGFiZWxsZWQgY29udHJvbCBmb3IgdGhlIGdpdmVuIGxhYmVsIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8SFRNTExhYmVsRWxlbWVudH0gbGFiZWxFbGVtZW50XG5cdCAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLmZpbmRDb250cm9sID0gZnVuY3Rpb24obGFiZWxFbGVtZW50KSB7XG5cblx0XHQvLyBGYXN0IHBhdGggZm9yIG5ld2VyIGJyb3dzZXJzIHN1cHBvcnRpbmcgdGhlIEhUTUw1IGNvbnRyb2wgYXR0cmlidXRlXG5cdFx0aWYgKGxhYmVsRWxlbWVudC5jb250cm9sICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBsYWJlbEVsZW1lbnQuY29udHJvbDtcblx0XHR9XG5cblx0XHQvLyBBbGwgYnJvd3NlcnMgdW5kZXIgdGVzdCB0aGF0IHN1cHBvcnQgdG91Y2ggZXZlbnRzIGFsc28gc3VwcG9ydCB0aGUgSFRNTDUgaHRtbEZvciBhdHRyaWJ1dGVcblx0XHRpZiAobGFiZWxFbGVtZW50Lmh0bWxGb3IpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbEVsZW1lbnQuaHRtbEZvcik7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgbm8gZm9yIGF0dHJpYnV0ZSBleGlzdHMsIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGZpcnN0IGxhYmVsbGFibGUgZGVzY2VuZGFudCBlbGVtZW50XG5cdFx0Ly8gdGhlIGxpc3Qgb2Ygd2hpY2ggaXMgZGVmaW5lZCBoZXJlOiBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9mb3Jtcy5odG1sI2NhdGVnb3J5LWxhYmVsXG5cdFx0cmV0dXJuIGxhYmVsRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdidXR0b24sIGlucHV0Om5vdChbdHlwZT1oaWRkZW5dKSwga2V5Z2VuLCBtZXRlciwgb3V0cHV0LCBwcm9ncmVzcywgc2VsZWN0LCB0ZXh0YXJlYScpO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIE9uIHRvdWNoIGVuZCwgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gc2VuZCBhIGNsaWNrIGV2ZW50IGF0IG9uY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5vblRvdWNoRW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgZm9yRWxlbWVudCwgdHJhY2tpbmdDbGlja1N0YXJ0LCB0YXJnZXRUYWdOYW1lLCBzY3JvbGxQYXJlbnQsIHRvdWNoLCB0YXJnZXRFbGVtZW50ID0gdGhpcy50YXJnZXRFbGVtZW50O1xuXG5cdFx0aWYgKCF0aGlzLnRyYWNraW5nQ2xpY2spIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIFByZXZlbnQgcGhhbnRvbSBjbGlja3Mgb24gZmFzdCBkb3VibGUtdGFwIChpc3N1ZSAjMzYpXG5cdFx0aWYgKChldmVudC50aW1lU3RhbXAgLSB0aGlzLmxhc3RDbGlja1RpbWUpIDwgdGhpcy50YXBEZWxheSkge1xuXHRcdFx0dGhpcy5jYW5jZWxOZXh0Q2xpY2sgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKChldmVudC50aW1lU3RhbXAgLSB0aGlzLnRyYWNraW5nQ2xpY2tTdGFydCkgPiB0aGlzLnRhcFRpbWVvdXQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIFJlc2V0IHRvIHByZXZlbnQgd3JvbmcgY2xpY2sgY2FuY2VsIG9uIGlucHV0IChpc3N1ZSAjMTU2KS5cblx0XHR0aGlzLmNhbmNlbE5leHRDbGljayA9IGZhbHNlO1xuXG5cdFx0dGhpcy5sYXN0Q2xpY2tUaW1lID0gZXZlbnQudGltZVN0YW1wO1xuXG5cdFx0dHJhY2tpbmdDbGlja1N0YXJ0ID0gdGhpcy50cmFja2luZ0NsaWNrU3RhcnQ7XG5cdFx0dGhpcy50cmFja2luZ0NsaWNrID0gZmFsc2U7XG5cdFx0dGhpcy50cmFja2luZ0NsaWNrU3RhcnQgPSAwO1xuXG5cdFx0Ly8gT24gc29tZSBpT1MgZGV2aWNlcywgdGhlIHRhcmdldEVsZW1lbnQgc3VwcGxpZWQgd2l0aCB0aGUgZXZlbnQgaXMgaW52YWxpZCBpZiB0aGUgbGF5ZXJcblx0XHQvLyBpcyBwZXJmb3JtaW5nIGEgdHJhbnNpdGlvbiBvciBzY3JvbGwsIGFuZCBoYXMgdG8gYmUgcmUtZGV0ZWN0ZWQgbWFudWFsbHkuIE5vdGUgdGhhdFxuXHRcdC8vIGZvciB0aGlzIHRvIGZ1bmN0aW9uIGNvcnJlY3RseSwgaXQgbXVzdCBiZSBjYWxsZWQgKmFmdGVyKiB0aGUgZXZlbnQgdGFyZ2V0IGlzIGNoZWNrZWQhXG5cdFx0Ly8gU2VlIGlzc3VlICM1NzsgYWxzbyBmaWxlZCBhcyByZGFyOi8vMTMwNDg1ODkgLlxuXHRcdGlmIChkZXZpY2VJc0lPU1dpdGhCYWRUYXJnZXQpIHtcblx0XHRcdHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG5cblx0XHRcdC8vIEluIGNlcnRhaW4gY2FzZXMgYXJndW1lbnRzIG9mIGVsZW1lbnRGcm9tUG9pbnQgY2FuIGJlIG5lZ2F0aXZlLCBzbyBwcmV2ZW50IHNldHRpbmcgdGFyZ2V0RWxlbWVudCB0byBudWxsXG5cdFx0XHR0YXJnZXRFbGVtZW50ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaC5wYWdlWCAtIHdpbmRvdy5wYWdlWE9mZnNldCwgdG91Y2gucGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpIHx8IHRhcmdldEVsZW1lbnQ7XG5cdFx0XHR0YXJnZXRFbGVtZW50LmZhc3RDbGlja1Njcm9sbFBhcmVudCA9IHRoaXMudGFyZ2V0RWxlbWVudC5mYXN0Q2xpY2tTY3JvbGxQYXJlbnQ7XG5cdFx0fVxuXG5cdFx0dGFyZ2V0VGFnTmFtZSA9IHRhcmdldEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdGlmICh0YXJnZXRUYWdOYW1lID09PSAnbGFiZWwnKSB7XG5cdFx0XHRmb3JFbGVtZW50ID0gdGhpcy5maW5kQ29udHJvbCh0YXJnZXRFbGVtZW50KTtcblx0XHRcdGlmIChmb3JFbGVtZW50KSB7XG5cdFx0XHRcdHRoaXMuZm9jdXModGFyZ2V0RWxlbWVudCk7XG5cdFx0XHRcdGlmIChkZXZpY2VJc0FuZHJvaWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0YXJnZXRFbGVtZW50ID0gZm9yRWxlbWVudDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRoaXMubmVlZHNGb2N1cyh0YXJnZXRFbGVtZW50KSkge1xuXG5cdFx0XHQvLyBDYXNlIDE6IElmIHRoZSB0b3VjaCBzdGFydGVkIGEgd2hpbGUgYWdvIChiZXN0IGd1ZXNzIGlzIDEwMG1zIGJhc2VkIG9uIHRlc3RzIGZvciBpc3N1ZSAjMzYpIHRoZW4gZm9jdXMgd2lsbCBiZSB0cmlnZ2VyZWQgYW55d2F5LiBSZXR1cm4gZWFybHkgYW5kIHVuc2V0IHRoZSB0YXJnZXQgZWxlbWVudCByZWZlcmVuY2Ugc28gdGhhdCB0aGUgc3Vic2VxdWVudCBjbGljayB3aWxsIGJlIGFsbG93ZWQgdGhyb3VnaC5cblx0XHRcdC8vIENhc2UgMjogV2l0aG91dCB0aGlzIGV4Y2VwdGlvbiBmb3IgaW5wdXQgZWxlbWVudHMgdGFwcGVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIGNvbnRhaW5lZCBpbiBhbiBpZnJhbWUsIHRoZW4gYW55IGlucHV0dGVkIHRleHQgd29uJ3QgYmUgdmlzaWJsZSBldmVuIHRob3VnaCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHVwZGF0ZWQgYXMgdGhlIHVzZXIgdHlwZXMgKGlzc3VlICMzNykuXG5cdFx0XHRpZiAoKGV2ZW50LnRpbWVTdGFtcCAtIHRyYWNraW5nQ2xpY2tTdGFydCkgPiAxMDAgfHwgKGRldmljZUlzSU9TICYmIHdpbmRvdy50b3AgIT09IHdpbmRvdyAmJiB0YXJnZXRUYWdOYW1lID09PSAnaW5wdXQnKSkge1xuXHRcdFx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZm9jdXModGFyZ2V0RWxlbWVudCk7XG5cdFx0XHR0aGlzLnNlbmRDbGljayh0YXJnZXRFbGVtZW50LCBldmVudCk7XG5cblx0XHRcdC8vIFNlbGVjdCBlbGVtZW50cyBuZWVkIHRoZSBldmVudCB0byBnbyB0aHJvdWdoIG9uIGlPUyA0LCBvdGhlcndpc2UgdGhlIHNlbGVjdG9yIG1lbnUgd29uJ3Qgb3Blbi5cblx0XHRcdC8vIEFsc28gdGhpcyBicmVha3Mgb3BlbmluZyBzZWxlY3RzIHdoZW4gVm9pY2VPdmVyIGlzIGFjdGl2ZSBvbiBpT1M2LCBpT1M3IChhbmQgcG9zc2libHkgb3RoZXJzKVxuXHRcdFx0aWYgKCFkZXZpY2VJc0lPUyB8fCB0YXJnZXRUYWdOYW1lICE9PSAnc2VsZWN0Jykge1xuXHRcdFx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGRldmljZUlzSU9TICYmICFkZXZpY2VJc0lPUzQpIHtcblxuXHRcdFx0Ly8gRG9uJ3Qgc2VuZCBhIHN5bnRoZXRpYyBjbGljayBldmVudCBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgY29udGFpbmVkIHdpdGhpbiBhIHBhcmVudCBsYXllciB0aGF0IHdhcyBzY3JvbGxlZFxuXHRcdFx0Ly8gYW5kIHRoaXMgdGFwIGlzIGJlaW5nIHVzZWQgdG8gc3RvcCB0aGUgc2Nyb2xsaW5nICh1c3VhbGx5IGluaXRpYXRlZCBieSBhIGZsaW5nIC0gaXNzdWUgIzQyKS5cblx0XHRcdHNjcm9sbFBhcmVudCA9IHRhcmdldEVsZW1lbnQuZmFzdENsaWNrU2Nyb2xsUGFyZW50O1xuXHRcdFx0aWYgKHNjcm9sbFBhcmVudCAmJiBzY3JvbGxQYXJlbnQuZmFzdENsaWNrTGFzdFNjcm9sbFRvcCAhPT0gc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmV2ZW50IHRoZSBhY3R1YWwgY2xpY2sgZnJvbSBnb2luZyB0aG91Z2ggLSB1bmxlc3MgdGhlIHRhcmdldCBub2RlIGlzIG1hcmtlZCBhcyByZXF1aXJpbmdcblx0XHQvLyByZWFsIGNsaWNrcyBvciBpZiBpdCBpcyBpbiB0aGUgd2hpdGVsaXN0IGluIHdoaWNoIGNhc2Ugb25seSBub24tcHJvZ3JhbW1hdGljIGNsaWNrcyBhcmUgcGVybWl0dGVkLlxuXHRcdGlmICghdGhpcy5uZWVkc0NsaWNrKHRhcmdldEVsZW1lbnQpKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0dGhpcy5zZW5kQ2xpY2sodGFyZ2V0RWxlbWVudCwgZXZlbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBPbiB0b3VjaCBjYW5jZWwsIHN0b3AgdHJhY2tpbmcgdGhlIGNsaWNrLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7dm9pZH1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaENhbmNlbCA9IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJhY2tpbmdDbGljayA9IGZhbHNlO1xuXHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IG51bGw7XG5cdH07XG5cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lIG1vdXNlIGV2ZW50cyB3aGljaCBzaG91bGQgYmUgcGVybWl0dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUub25Nb3VzZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cblx0XHQvLyBJZiBhIHRhcmdldCBlbGVtZW50IHdhcyBuZXZlciBzZXQgKGJlY2F1c2UgYSB0b3VjaCBldmVudCB3YXMgbmV2ZXIgZmlyZWQpIGFsbG93IHRoZSBldmVudFxuXHRcdGlmICghdGhpcy50YXJnZXRFbGVtZW50KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnQuZm9yd2FyZGVkVG91Y2hFdmVudCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gUHJvZ3JhbW1hdGljYWxseSBnZW5lcmF0ZWQgZXZlbnRzIHRhcmdldGluZyBhIHNwZWNpZmljIGVsZW1lbnQgc2hvdWxkIGJlIHBlcm1pdHRlZFxuXHRcdGlmICghZXZlbnQuY2FuY2VsYWJsZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gRGVyaXZlIGFuZCBjaGVjayB0aGUgdGFyZ2V0IGVsZW1lbnQgdG8gc2VlIHdoZXRoZXIgdGhlIG1vdXNlIGV2ZW50IG5lZWRzIHRvIGJlIHBlcm1pdHRlZDtcblx0XHQvLyB1bmxlc3MgZXhwbGljaXRseSBlbmFibGVkLCBwcmV2ZW50IG5vbi10b3VjaCBjbGljayBldmVudHMgZnJvbSB0cmlnZ2VyaW5nIGFjdGlvbnMsXG5cdFx0Ly8gdG8gcHJldmVudCBnaG9zdC9kb3VibGVjbGlja3MuXG5cdFx0aWYgKCF0aGlzLm5lZWRzQ2xpY2sodGhpcy50YXJnZXRFbGVtZW50KSB8fCB0aGlzLmNhbmNlbE5leHRDbGljaykge1xuXG5cdFx0XHQvLyBQcmV2ZW50IGFueSB1c2VyLWFkZGVkIGxpc3RlbmVycyBkZWNsYXJlZCBvbiBGYXN0Q2xpY2sgZWxlbWVudCBmcm9tIGJlaW5nIGZpcmVkLlxuXHRcdFx0aWYgKGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikge1xuXHRcdFx0XHRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUGFydCBvZiB0aGUgaGFjayBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IEV2ZW50I3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAoZS5nLiBBbmRyb2lkIDIpXG5cdFx0XHRcdGV2ZW50LnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbmNlbCB0aGUgZXZlbnRcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBtb3VzZSBldmVudCBpcyBwZXJtaXR0ZWQsIHJldHVybiB0cnVlIGZvciB0aGUgYWN0aW9uIHRvIGdvIHRocm91Z2guXG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cblxuXHQvKipcblx0ICogT24gYWN0dWFsIGNsaWNrcywgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHRvdWNoLWdlbmVyYXRlZCBjbGljaywgYSBjbGljayBhY3Rpb24gb2NjdXJyaW5nXG5cdCAqIG5hdHVyYWxseSBhZnRlciBhIGRlbGF5IGFmdGVyIGEgdG91Y2ggKHdoaWNoIG5lZWRzIHRvIGJlIGNhbmNlbGxlZCB0byBhdm9pZCBkdXBsaWNhdGlvbiksIG9yXG5cdCAqIGFuIGFjdHVhbCBjbGljayB3aGljaCBzaG91bGQgYmUgcGVybWl0dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIHBlcm1pdHRlZDtcblxuXHRcdC8vIEl0J3MgcG9zc2libGUgZm9yIGFub3RoZXIgRmFzdENsaWNrLWxpa2UgbGlicmFyeSBkZWxpdmVyZWQgd2l0aCB0aGlyZC1wYXJ0eSBjb2RlIHRvIGZpcmUgYSBjbGljayBldmVudCBiZWZvcmUgRmFzdENsaWNrIGRvZXMgKGlzc3VlICM0NCkuIEluIHRoYXQgY2FzZSwgc2V0IHRoZSBjbGljay10cmFja2luZyBmbGFnIGJhY2sgdG8gZmFsc2UgYW5kIHJldHVybiBlYXJseS4gVGhpcyB3aWxsIGNhdXNlIG9uVG91Y2hFbmQgdG8gcmV0dXJuIGVhcmx5LlxuXHRcdGlmICh0aGlzLnRyYWNraW5nQ2xpY2spIHtcblx0XHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IG51bGw7XG5cdFx0XHR0aGlzLnRyYWNraW5nQ2xpY2sgPSBmYWxzZTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIFZlcnkgb2RkIGJlaGF2aW9yIG9uIGlPUyAoaXNzdWUgIzE4KTogaWYgYSBzdWJtaXQgZWxlbWVudCBpcyBwcmVzZW50IGluc2lkZSBhIGZvcm0gYW5kIHRoZSB1c2VyIGhpdHMgZW50ZXIgaW4gdGhlIGlPUyBzaW11bGF0b3Igb3IgY2xpY2tzIHRoZSBHbyBidXR0b24gb24gdGhlIHBvcC11cCBPUyBrZXlib2FyZCB0aGUgYSBraW5kIG9mICdmYWtlJyBjbGljayBldmVudCB3aWxsIGJlIHRyaWdnZXJlZCB3aXRoIHRoZSBzdWJtaXQtdHlwZSBpbnB1dCBlbGVtZW50IGFzIHRoZSB0YXJnZXQuXG5cdFx0aWYgKGV2ZW50LnRhcmdldC50eXBlID09PSAnc3VibWl0JyAmJiBldmVudC5kZXRhaWwgPT09IDApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHBlcm1pdHRlZCA9IHRoaXMub25Nb3VzZShldmVudCk7XG5cblx0XHQvLyBPbmx5IHVuc2V0IHRhcmdldEVsZW1lbnQgaWYgdGhlIGNsaWNrIGlzIG5vdCBwZXJtaXR0ZWQuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgY2hlY2sgZm9yICF0YXJnZXRFbGVtZW50IGluIG9uTW91c2UgZmFpbHMgYW5kIHRoZSBicm93c2VyJ3MgY2xpY2sgZG9lc24ndCBnbyB0aHJvdWdoLlxuXHRcdGlmICghcGVybWl0dGVkKSB7XG5cdFx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdC8vIElmIGNsaWNrcyBhcmUgcGVybWl0dGVkLCByZXR1cm4gdHJ1ZSBmb3IgdGhlIGFjdGlvbiB0byBnbyB0aHJvdWdoLlxuXHRcdHJldHVybiBwZXJtaXR0ZWQ7XG5cdH07XG5cblxuXHQvKipcblx0ICogUmVtb3ZlIGFsbCBGYXN0Q2xpY2sncyBldmVudCBsaXN0ZW5lcnMuXG5cdCAqXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGxheWVyID0gdGhpcy5sYXllcjtcblxuXHRcdGlmIChkZXZpY2VJc0FuZHJvaWQpIHtcblx0XHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMub25Nb3VzZSwgdHJ1ZSk7XG5cdFx0XHRsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2UsIHRydWUpO1xuXHRcdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2ssIHRydWUpO1xuXHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uVG91Y2hTdGFydCwgZmFsc2UpO1xuXHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmUsIGZhbHNlKTtcblx0XHRsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZCwgZmFsc2UpO1xuXHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5vblRvdWNoQ2FuY2VsLCBmYWxzZSk7XG5cdH07XG5cblxuXHQvKipcblx0ICogQ2hlY2sgd2hldGhlciBGYXN0Q2xpY2sgaXMgbmVlZGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IGxheWVyIFRoZSBsYXllciB0byBsaXN0ZW4gb25cblx0ICovXG5cdEZhc3RDbGljay5ub3ROZWVkZWQgPSBmdW5jdGlvbihsYXllcikge1xuXHRcdHZhciBtZXRhVmlld3BvcnQ7XG5cdFx0dmFyIGNocm9tZVZlcnNpb247XG5cdFx0dmFyIGJsYWNrYmVycnlWZXJzaW9uO1xuXHRcdHZhciBmaXJlZm94VmVyc2lvbjtcblxuXHRcdC8vIERldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IHRvdWNoIGRvbid0IG5lZWQgRmFzdENsaWNrXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cub250b3VjaHN0YXJ0ID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hyb21lIHZlcnNpb24gLSB6ZXJvIGZvciBvdGhlciBicm93c2Vyc1xuXHRcdGNocm9tZVZlcnNpb24gPSArKC9DaHJvbWVcXC8oWzAtOV0rKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBbLDBdKVsxXTtcblxuXHRcdGlmIChjaHJvbWVWZXJzaW9uKSB7XG5cblx0XHRcdGlmIChkZXZpY2VJc0FuZHJvaWQpIHtcblx0XHRcdFx0bWV0YVZpZXdwb3J0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPXZpZXdwb3J0XScpO1xuXG5cdFx0XHRcdGlmIChtZXRhVmlld3BvcnQpIHtcblx0XHRcdFx0XHQvLyBDaHJvbWUgb24gQW5kcm9pZCB3aXRoIHVzZXItc2NhbGFibGU9XCJub1wiIGRvZXNuJ3QgbmVlZCBGYXN0Q2xpY2sgKGlzc3VlICM4OSlcblx0XHRcdFx0XHRpZiAobWV0YVZpZXdwb3J0LmNvbnRlbnQuaW5kZXhPZigndXNlci1zY2FsYWJsZT1ubycpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIENocm9tZSAzMiBhbmQgYWJvdmUgd2l0aCB3aWR0aD1kZXZpY2Utd2lkdGggb3IgbGVzcyBkb24ndCBuZWVkIEZhc3RDbGlja1xuXHRcdFx0XHRcdGlmIChjaHJvbWVWZXJzaW9uID4gMzEgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoIDw9IHdpbmRvdy5vdXRlcldpZHRoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hyb21lIGRlc2t0b3AgZG9lc24ndCBuZWVkIEZhc3RDbGljayAoaXNzdWUgIzE1KVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGRldmljZUlzQmxhY2tCZXJyeTEwKSB7XG5cdFx0XHRibGFja2JlcnJ5VmVyc2lvbiA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cXC8oWzAtOV0qKVxcLihbMC05XSopLyk7XG5cblx0XHRcdC8vIEJsYWNrQmVycnkgMTAuMysgZG9lcyBub3QgcmVxdWlyZSBGYXN0Y2xpY2sgbGlicmFyeS5cblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mdGxhYnMvZmFzdGNsaWNrL2lzc3Vlcy8yNTFcblx0XHRcdGlmIChibGFja2JlcnJ5VmVyc2lvblsxXSA+PSAxMCAmJiBibGFja2JlcnJ5VmVyc2lvblsyXSA+PSAzKSB7XG5cdFx0XHRcdG1ldGFWaWV3cG9ydCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT12aWV3cG9ydF0nKTtcblxuXHRcdFx0XHRpZiAobWV0YVZpZXdwb3J0KSB7XG5cdFx0XHRcdFx0Ly8gdXNlci1zY2FsYWJsZT1ubyBlbGltaW5hdGVzIGNsaWNrIGRlbGF5LlxuXHRcdFx0XHRcdGlmIChtZXRhVmlld3BvcnQuY29udGVudC5pbmRleE9mKCd1c2VyLXNjYWxhYmxlPW5vJykgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gd2lkdGg9ZGV2aWNlLXdpZHRoIChvciBsZXNzIHRoYW4gZGV2aWNlLXdpZHRoKSBlbGltaW5hdGVzIGNsaWNrIGRlbGF5LlxuXHRcdFx0XHRcdGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGggPD0gd2luZG93Lm91dGVyV2lkdGgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElFMTAgd2l0aCAtbXMtdG91Y2gtYWN0aW9uOiBub25lIG9yIG1hbmlwdWxhdGlvbiwgd2hpY2ggZGlzYWJsZXMgZG91YmxlLXRhcC10by16b29tIChpc3N1ZSAjOTcpXG5cdFx0aWYgKGxheWVyLnN0eWxlLm1zVG91Y2hBY3Rpb24gPT09ICdub25lJyB8fCBsYXllci5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ21hbmlwdWxhdGlvbicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEZpcmVmb3ggdmVyc2lvbiAtIHplcm8gZm9yIG90aGVyIGJyb3dzZXJzXG5cdFx0ZmlyZWZveFZlcnNpb24gPSArKC9GaXJlZm94XFwvKFswLTldKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgWywwXSlbMV07XG5cblx0XHRpZiAoZmlyZWZveFZlcnNpb24gPj0gMjcpIHtcblx0XHRcdC8vIEZpcmVmb3ggMjcrIGRvZXMgbm90IGhhdmUgdGFwIGRlbGF5IGlmIHRoZSBjb250ZW50IGlzIG5vdCB6b29tYWJsZSAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTkyMjg5NlxuXG5cdFx0XHRtZXRhVmlld3BvcnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJyk7XG5cdFx0XHRpZiAobWV0YVZpZXdwb3J0ICYmIChtZXRhVmlld3BvcnQuY29udGVudC5pbmRleE9mKCd1c2VyLXNjYWxhYmxlPW5vJykgIT09IC0xIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCA8PSB3aW5kb3cub3V0ZXJXaWR0aCkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSUUxMTogcHJlZml4ZWQgLW1zLXRvdWNoLWFjdGlvbiBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCBpdCdzIHJlY29tbWVuZGVkIHRvIHVzZSBub24tcHJlZml4ZWQgdmVyc2lvblxuXHRcdC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2FwcHMvSGg3NjczMTMuYXNweFxuXHRcdGlmIChsYXllci5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ25vbmUnIHx8IGxheWVyLnN0eWxlLnRvdWNoQWN0aW9uID09PSAnbWFuaXB1bGF0aW9uJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIEZhc3RDbGljayBvYmplY3Rcblx0ICpcblx0ICogQHBhcmFtIHtFbGVtZW50fSBsYXllciBUaGUgbGF5ZXIgdG8gbGlzdGVuIG9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzXG5cdCAqL1xuXHRGYXN0Q2xpY2suYXR0YWNoID0gZnVuY3Rpb24obGF5ZXIsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gbmV3IEZhc3RDbGljayhsYXllciwgb3B0aW9ucyk7XG5cdH07XG5cblxuXHRpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXG5cdFx0Ly8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBGYXN0Q2xpY2s7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IEZhc3RDbGljay5hdHRhY2g7XG5cdFx0bW9kdWxlLmV4cG9ydHMuRmFzdENsaWNrID0gRmFzdENsaWNrO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5GYXN0Q2xpY2sgPSBGYXN0Q2xpY2s7XG5cdH1cbn0oKSk7XG4iLCIvKipcbiAqIE1pY3JvRXZlbnQgLSB0byBtYWtlIGFueSBqcyBvYmplY3QgYW4gZXZlbnQgZW1pdHRlciAoc2VydmVyIG9yIGJyb3dzZXIpXG4gKiBcbiAqIC0gcHVyZSBqYXZhc2NyaXB0IC0gc2VydmVyIGNvbXBhdGlibGUsIGJyb3dzZXIgY29tcGF0aWJsZVxuICogLSBkb250IHJlbHkgb24gdGhlIGJyb3dzZXIgZG9tc1xuICogLSBzdXBlciBzaW1wbGUgLSB5b3UgZ2V0IGl0IGltbWVkaWF0ZWx5LCBubyBteXN0ZXJ5LCBubyBtYWdpYyBpbnZvbHZlZFxuICpcbiAqIC0gY3JlYXRlIGEgTWljcm9FdmVudERlYnVnIHdpdGggZ29vZGllcyB0byBkZWJ1Z1xuICogICAtIG1ha2UgaXQgc2FmZXIgdG8gdXNlXG4qL1xuXG4vKiogTk9URTogVGhpcyBsaWJyYXJ5IGlzIGN1c3RvbWl6ZWQgZm9yIE9uc2VuIFVJLiAqL1xuXG52YXIgTWljcm9FdmVudCAgPSBmdW5jdGlvbigpe307XG5NaWNyb0V2ZW50LnByb3RvdHlwZSAgPSB7XG4gIG9uICA6IGZ1bmN0aW9uKGV2ZW50LCBmY3Qpe1xuICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdID0gdGhpcy5fZXZlbnRzW2V2ZW50XSB8fCBbXTtcbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdLnB1c2goZmN0KTtcbiAgfSxcbiAgb25jZSA6IGZ1bmN0aW9uKGV2ZW50LCBmY3Qpe1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vZmYoZXZlbnQsIHdyYXBwZXIpO1xuICAgICAgcmV0dXJuIGZjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgdGhpcy5vbihldmVudCwgd3JhcHBlcik7XG4gIH0sXG4gIG9mZiAgOiBmdW5jdGlvbihldmVudCwgZmN0KXtcbiAgICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gICAgaWYoIGV2ZW50IGluIHRoaXMuX2V2ZW50cyA9PT0gZmFsc2UgICkgIHJldHVybjtcbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdLnNwbGljZSh0aGlzLl9ldmVudHNbZXZlbnRdLmluZGV4T2YoZmN0KSwgMSk7XG4gIH0sXG4gIGVtaXQgOiBmdW5jdGlvbihldmVudCAvKiAsIGFyZ3MuLi4gKi8pe1xuICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICBpZiggZXZlbnQgaW4gdGhpcy5fZXZlbnRzID09PSBmYWxzZSAgKSAgcmV0dXJuO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9ldmVudHNbZXZlbnRdLmxlbmd0aDsgaSsrKXtcbiAgICAgIHRoaXMuX2V2ZW50c1tldmVudF1baV0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIG1peGluIHdpbGwgZGVsZWdhdGUgYWxsIE1pY3JvRXZlbnQuanMgZnVuY3Rpb24gaW4gdGhlIGRlc3RpbmF0aW9uIG9iamVjdFxuICpcbiAqIC0gcmVxdWlyZSgnTWljcm9FdmVudCcpLm1peGluKEZvb2Jhcikgd2lsbCBtYWtlIEZvb2JhciBhYmxlIHRvIHVzZSBNaWNyb0V2ZW50XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRoZSBvYmplY3Qgd2hpY2ggd2lsbCBzdXBwb3J0IE1pY3JvRXZlbnRcbiovXG5NaWNyb0V2ZW50Lm1peGluICA9IGZ1bmN0aW9uKGRlc3RPYmplY3Qpe1xuICB2YXIgcHJvcHMgPSBbJ29uJywgJ29uY2UnLCAnb2ZmJywgJ2VtaXQnXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArKyl7XG4gICAgaWYoIHR5cGVvZiBkZXN0T2JqZWN0ID09PSAnZnVuY3Rpb24nICl7XG4gICAgICBkZXN0T2JqZWN0LnByb3RvdHlwZVtwcm9wc1tpXV0gID0gTWljcm9FdmVudC5wcm90b3R5cGVbcHJvcHNbaV1dO1xuICAgIH1lbHNle1xuICAgICAgZGVzdE9iamVjdFtwcm9wc1tpXV0gPSBNaWNyb0V2ZW50LnByb3RvdHlwZVtwcm9wc1tpXV07XG4gICAgfVxuICB9XG59XG5cbi8vIGV4cG9ydCBpbiBjb21tb24ganNcbmlmKCB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmICgnZXhwb3J0cycgaW4gbW9kdWxlKSl7XG4gIG1vZHVsZS5leHBvcnRzICA9IE1pY3JvRXZlbnQ7XG59XG4iLCIvKiBNb2Rlcm5penIgMi42LjIgKEN1c3RvbSBCdWlsZCkgfCBNSVQgJiBCU0RcbiAqIEJ1aWxkOiBodHRwOi8vbW9kZXJuaXpyLmNvbS9kb3dubG9hZC8jLWJvcmRlcnJhZGl1cy1ib3hzaGFkb3ctY3NzYW5pbWF0aW9ucy1jc3N0cmFuc2Zvcm1zLWNzc3RyYW5zZm9ybXMzZC1jc3N0cmFuc2l0aW9ucy1jYW52YXMtc3ZnLXNoaXYtY3NzY2xhc3Nlcy10ZXN0c3R5bGVzLXRlc3Rwcm9wLXRlc3RhbGxwcm9wcy1wcmVmaXhlcy1kb21wcmVmaXhlcy1sb2FkXG4gKi9cbjtcblxuXG5cbndpbmRvdy5Nb2Rlcm5penIgPSAoZnVuY3Rpb24oIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCApIHtcblxuICAgIHZhciB2ZXJzaW9uID0gJzIuNi4yJyxcblxuICAgIE1vZGVybml6ciA9IHt9LFxuXG4gICAgZW5hYmxlQ2xhc3NlcyA9IHRydWUsXG5cbiAgICBkb2NFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuXG4gICAgbW9kID0gJ21vZGVybml6cicsXG4gICAgbW9kRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobW9kKSxcbiAgICBtU3R5bGUgPSBtb2RFbGVtLnN0eWxlLFxuXG4gICAgaW5wdXRFbGVtICAsXG5cblxuICAgIHRvU3RyaW5nID0ge30udG9TdHJpbmcsXG5cbiAgICBwcmVmaXhlcyA9ICcgLXdlYmtpdC0gLW1vei0gLW8tIC1tcy0gJy5zcGxpdCgnICcpLFxuXG5cblxuICAgIG9tUHJlZml4ZXMgPSAnV2Via2l0IE1veiBPIG1zJyxcblxuICAgIGNzc29tUHJlZml4ZXMgPSBvbVByZWZpeGVzLnNwbGl0KCcgJyksXG5cbiAgICBkb21QcmVmaXhlcyA9IG9tUHJlZml4ZXMudG9Mb3dlckNhc2UoKS5zcGxpdCgnICcpLFxuXG4gICAgbnMgPSB7J3N2Zyc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyd9LFxuXG4gICAgdGVzdHMgPSB7fSxcbiAgICBpbnB1dHMgPSB7fSxcbiAgICBhdHRycyA9IHt9LFxuXG4gICAgY2xhc3NlcyA9IFtdLFxuXG4gICAgc2xpY2UgPSBjbGFzc2VzLnNsaWNlLFxuXG4gICAgZmVhdHVyZU5hbWUsIFxuXG5cbiAgICBpbmplY3RFbGVtZW50V2l0aFN0eWxlcyA9IGZ1bmN0aW9uKCBydWxlLCBjYWxsYmFjaywgbm9kZXMsIHRlc3RuYW1lcyApIHtcblxuICAgICAgdmFyIHN0eWxlLCByZXQsIG5vZGUsIGRvY092ZXJmbG93LFxuICAgICAgICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgICAgICAgICAgICAgIGJvZHkgPSBkb2N1bWVudC5ib2R5LFxuICAgICAgICAgICAgICAgIGZha2VCb2R5ID0gYm9keSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG5cbiAgICAgIGlmICggcGFyc2VJbnQobm9kZXMsIDEwKSApIHtcbiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG5vZGVzLS0gKSB7XG4gICAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgbm9kZS5pZCA9IHRlc3RuYW1lcyA/IHRlc3RuYW1lc1tub2Rlc10gOiBtb2QgKyAobm9kZXMgKyAxKTtcbiAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN0eWxlID0gWycmIzE3MzsnLCc8c3R5bGUgaWQ9XCJzJywgbW9kLCAnXCI+JywgcnVsZSwgJzwvc3R5bGU+J10uam9pbignJyk7XG4gICAgICBkaXYuaWQgPSBtb2Q7XG4gICAgICAgICAgKGJvZHkgPyBkaXYgOiBmYWtlQm9keSkuaW5uZXJIVE1MICs9IHN0eWxlO1xuICAgICAgZmFrZUJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgIGlmICggIWJvZHkgKSB7XG4gICAgICAgICAgICAgICAgZmFrZUJvZHkuc3R5bGUuYmFja2dyb3VuZCA9ICcnO1xuICAgICAgICAgICAgICAgIGZha2VCb2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICAgICAgZG9jT3ZlcmZsb3cgPSBkb2NFbGVtZW50LnN0eWxlLm92ZXJmbG93O1xuICAgICAgICAgIGRvY0VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgICBkb2NFbGVtZW50LmFwcGVuZENoaWxkKGZha2VCb2R5KTtcbiAgICAgIH1cblxuICAgICAgcmV0ID0gY2FsbGJhY2soZGl2LCBydWxlKTtcbiAgICAgICAgaWYgKCAhYm9keSApIHtcbiAgICAgICAgICBmYWtlQm9keS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZha2VCb2R5KTtcbiAgICAgICAgICBkb2NFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gZG9jT3ZlcmZsb3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhIXJldDtcblxuICAgIH0sXG4gICAgX2hhc093blByb3BlcnR5ID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSwgaGFzT3duUHJvcDtcblxuICAgIGlmICggIWlzKF9oYXNPd25Qcm9wZXJ0eSwgJ3VuZGVmaW5lZCcpICYmICFpcyhfaGFzT3duUHJvcGVydHkuY2FsbCwgJ3VuZGVmaW5lZCcpICkge1xuICAgICAgaGFzT3duUHJvcCA9IGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGFzT3duUHJvcCA9IGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5KSB7IFxuICAgICAgICByZXR1cm4gKChwcm9wZXJ0eSBpbiBvYmplY3QpICYmIGlzKG9iamVjdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGVbcHJvcGVydHldLCAndW5kZWZpbmVkJykpO1xuICAgICAgfTtcbiAgICB9XG5cblxuICAgIGlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHtcbiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG5cbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgIGJvdW5kID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG5cbiAgICAgICAgICAgICAgdmFyIEYgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICAgIEYucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgICAgICAgdmFyIHNlbGYgPSBuZXcgRigpO1xuXG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgICBzZWxmLFxuICAgICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcblxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGJvdW5kO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRDc3MoIHN0ciApIHtcbiAgICAgICAgbVN0eWxlLmNzc1RleHQgPSBzdHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0Q3NzQWxsKCBzdHIxLCBzdHIyICkge1xuICAgICAgICByZXR1cm4gc2V0Q3NzKHByZWZpeGVzLmpvaW4oc3RyMSArICc7JykgKyAoIHN0cjIgfHwgJycgKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXMoIG9iaiwgdHlwZSApIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IHR5cGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29udGFpbnMoIHN0ciwgc3Vic3RyICkge1xuICAgICAgICByZXR1cm4gISF+KCcnICsgc3RyKS5pbmRleE9mKHN1YnN0cik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGVzdFByb3BzKCBwcm9wcywgcHJlZml4ZWQgKSB7XG4gICAgICAgIGZvciAoIHZhciBpIGluIHByb3BzICkge1xuICAgICAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgICAgIGlmICggIWNvbnRhaW5zKHByb3AsIFwiLVwiKSAmJiBtU3R5bGVbcHJvcF0gIT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ZWQgPT0gJ3BmeCcgPyBwcm9wIDogdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGVzdERPTVByb3BzKCBwcm9wcywgb2JqLCBlbGVtICkge1xuICAgICAgICBmb3IgKCB2YXIgaSBpbiBwcm9wcyApIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gb2JqW3Byb3BzW2ldXTtcbiAgICAgICAgICAgIGlmICggaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbSA9PT0gZmFsc2UpIHJldHVybiBwcm9wc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcyhpdGVtLCAnZnVuY3Rpb24nKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmJpbmQoZWxlbSB8fCBvYmopO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHJvcHNBbGwoIHByb3AsIHByZWZpeGVkLCBlbGVtICkge1xuXG4gICAgICAgIHZhciB1Y1Byb3AgID0gcHJvcC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3Auc2xpY2UoMSksXG4gICAgICAgICAgICBwcm9wcyAgID0gKHByb3AgKyAnICcgKyBjc3NvbVByZWZpeGVzLmpvaW4odWNQcm9wICsgJyAnKSArIHVjUHJvcCkuc3BsaXQoJyAnKTtcblxuICAgICAgICAgICAgaWYoaXMocHJlZml4ZWQsIFwic3RyaW5nXCIpIHx8IGlzKHByZWZpeGVkLCBcInVuZGVmaW5lZFwiKSkge1xuICAgICAgICAgIHJldHVybiB0ZXN0UHJvcHMocHJvcHMsIHByZWZpeGVkKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wcyA9IChwcm9wICsgJyAnICsgKGRvbVByZWZpeGVzKS5qb2luKHVjUHJvcCArICcgJykgKyB1Y1Byb3ApLnNwbGl0KCcgJyk7XG4gICAgICAgICAgcmV0dXJuIHRlc3RET01Qcm9wcyhwcm9wcywgcHJlZml4ZWQsIGVsZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIHRlc3RzWydjYW52YXMnXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICByZXR1cm4gISEoZWxlbS5nZXRDb250ZXh0ICYmIGVsZW0uZ2V0Q29udGV4dCgnMmQnKSk7XG4gICAgfTtcbiAgICB0ZXN0c1snYm9yZGVycmFkaXVzJ10gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQcm9wc0FsbCgnYm9yZGVyUmFkaXVzJyk7XG4gICAgfTtcblxuICAgIHRlc3RzWydib3hzaGFkb3cnXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGVzdFByb3BzQWxsKCdib3hTaGFkb3cnKTtcbiAgICB9O1xuICAgIHRlc3RzWydjc3NhbmltYXRpb25zJ10gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQcm9wc0FsbCgnYW5pbWF0aW9uTmFtZScpO1xuICAgIH07XG5cblxuXG4gICAgdGVzdHNbJ2Nzc3RyYW5zZm9ybXMnXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gISF0ZXN0UHJvcHNBbGwoJ3RyYW5zZm9ybScpO1xuICAgIH07XG5cblxuICAgIHRlc3RzWydjc3N0cmFuc2Zvcm1zM2QnXSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciByZXQgPSAhIXRlc3RQcm9wc0FsbCgncGVyc3BlY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZXQgJiYgJ3dlYmtpdFBlcnNwZWN0aXZlJyBpbiBkb2NFbGVtZW50LnN0eWxlICkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgaW5qZWN0RWxlbWVudFdpdGhTdHlsZXMoJ0BtZWRpYSAodHJhbnNmb3JtLTNkKSwoLXdlYmtpdC10cmFuc2Zvcm0tM2QpeyNtb2Rlcm5penJ7bGVmdDo5cHg7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjNweDt9fScsIGZ1bmN0aW9uKCBub2RlLCBydWxlICkge1xuICAgICAgICAgICAgcmV0ID0gbm9kZS5vZmZzZXRMZWZ0ID09PSA5ICYmIG5vZGUub2Zmc2V0SGVpZ2h0ID09PSAzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuXG4gICAgdGVzdHNbJ2Nzc3RyYW5zaXRpb25zJ10gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQcm9wc0FsbCgndHJhbnNpdGlvbicpO1xuICAgIH07XG5cblxuXG4gICAgdGVzdHNbJ3N2ZyddID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyAmJiAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhucy5zdmcsICdzdmcnKS5jcmVhdGVTVkdSZWN0O1xuICAgIH07XG4gICAgZm9yICggdmFyIGZlYXR1cmUgaW4gdGVzdHMgKSB7XG4gICAgICAgIGlmICggaGFzT3duUHJvcCh0ZXN0cywgZmVhdHVyZSkgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZSAgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBNb2Rlcm5penJbZmVhdHVyZU5hbWVdID0gdGVzdHNbZmVhdHVyZV0oKTtcblxuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKChNb2Rlcm5penJbZmVhdHVyZU5hbWVdID8gJycgOiAnbm8tJykgKyBmZWF0dXJlTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgIE1vZGVybml6ci5hZGRUZXN0ID0gZnVuY3Rpb24gKCBmZWF0dXJlLCB0ZXN0ICkge1xuICAgICAgIGlmICggdHlwZW9mIGZlYXR1cmUgPT0gJ29iamVjdCcgKSB7XG4gICAgICAgICBmb3IgKCB2YXIga2V5IGluIGZlYXR1cmUgKSB7XG4gICAgICAgICAgIGlmICggaGFzT3duUHJvcCggZmVhdHVyZSwga2V5ICkgKSB7XG4gICAgICAgICAgICAgTW9kZXJuaXpyLmFkZFRlc3QoIGtleSwgZmVhdHVyZVsga2V5IF0gKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgIGZlYXR1cmUgPSBmZWF0dXJlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgIGlmICggTW9kZXJuaXpyW2ZlYXR1cmVdICE9PSB1bmRlZmluZWQgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGVybml6cjtcbiAgICAgICAgIH1cblxuICAgICAgICAgdGVzdCA9IHR5cGVvZiB0ZXN0ID09ICdmdW5jdGlvbicgPyB0ZXN0KCkgOiB0ZXN0O1xuXG4gICAgICAgICBpZiAodHlwZW9mIGVuYWJsZUNsYXNzZXMgIT09IFwidW5kZWZpbmVkXCIgJiYgZW5hYmxlQ2xhc3Nlcykge1xuICAgICAgICAgICBkb2NFbGVtZW50LmNsYXNzTmFtZSArPSAnICcgKyAodGVzdCA/ICcnIDogJ25vLScpICsgZmVhdHVyZTtcbiAgICAgICAgIH1cbiAgICAgICAgIE1vZGVybml6cltmZWF0dXJlXSA9IHRlc3Q7XG5cbiAgICAgICB9XG5cbiAgICAgICByZXR1cm4gTW9kZXJuaXpyOyBcbiAgICAgfTtcblxuXG4gICAgc2V0Q3NzKCcnKTtcbiAgICBtb2RFbGVtID0gaW5wdXRFbGVtID0gbnVsbDtcblxuICAgIDsoZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHdpbmRvdy5odG1sNSB8fCB7fTtcblxuICAgICAgICB2YXIgcmVTa2lwID0gL148fF4oPzpidXR0b258bWFwfHNlbGVjdHx0ZXh0YXJlYXxvYmplY3R8aWZyYW1lfG9wdGlvbnxvcHRncm91cCkkL2k7XG5cbiAgICAgICAgdmFyIHNhdmVDbG9uZXMgPSAvXig/OmF8Ynxjb2RlfGRpdnxmaWVsZHNldHxoMXxoMnxoM3xoNHxoNXxoNnxpfGxhYmVsfGxpfG9sfHB8cXxzcGFufHN0cm9uZ3xzdHlsZXx0YWJsZXx0Ym9keXx0ZHx0aHx0cnx1bCkkL2k7XG5cbiAgICAgICAgdmFyIHN1cHBvcnRzSHRtbDVTdHlsZXM7XG5cbiAgICAgICAgdmFyIGV4cGFuZG8gPSAnX2h0bWw1c2hpdic7XG5cbiAgICAgICAgdmFyIGV4cGFuSUQgPSAwO1xuXG4gICAgICAgIHZhciBleHBhbmRvRGF0YSA9IHt9O1xuXG4gICAgICAgIHZhciBzdXBwb3J0c1Vua25vd25FbGVtZW50cztcblxuICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBhLmlubmVySFRNTCA9ICc8eHl6PjwveHl6Pic7XG4gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzSHRtbDVTdHlsZXMgPSAoJ2hpZGRlbicgaW4gYSk7XG5cbiAgICAgICAgICAgIHN1cHBvcnRzVW5rbm93bkVsZW1lbnRzID0gYS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxIHx8IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KSgnYScpO1xuICAgICAgICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgZnJhZy5jbG9uZU5vZGUgPT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZnJhZy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGZyYWcuY3JlYXRlRWxlbWVudCA9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgc3VwcG9ydHNIdG1sNVN0eWxlcyA9IHRydWU7XG4gICAgICAgICAgc3VwcG9ydHNVbmtub3duRWxlbWVudHMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIH0oKSk7ICAgICAgICBmdW5jdGlvbiBhZGRTdHlsZVNoZWV0KG93bmVyRG9jdW1lbnQsIGNzc1RleHQpIHtcbiAgICAgICAgdmFyIHAgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKSxcbiAgICAgICAgICAgIHBhcmVudCA9IG93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSB8fCBvd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuICAgICAgICBwLmlubmVySFRNTCA9ICd4PHN0eWxlPicgKyBjc3NUZXh0ICsgJzwvc3R5bGU+JztcbiAgICAgICAgcmV0dXJuIHBhcmVudC5pbnNlcnRCZWZvcmUocC5sYXN0Q2hpbGQsIHBhcmVudC5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBnZXRFbGVtZW50cygpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gaHRtbDUuZWxlbWVudHM7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZWxlbWVudHMgPT0gJ3N0cmluZycgPyBlbGVtZW50cy5zcGxpdCgnICcpIDogZWxlbWVudHM7XG4gICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBnZXRFeHBhbmRvRGF0YShvd25lckRvY3VtZW50KSB7XG4gICAgICAgIHZhciBkYXRhID0gZXhwYW5kb0RhdGFbb3duZXJEb2N1bWVudFtleHBhbmRvXV07XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IHt9O1xuICAgICAgICAgICAgZXhwYW5JRCsrO1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudFtleHBhbmRvXSA9IGV4cGFuSUQ7XG4gICAgICAgICAgICBleHBhbmRvRGF0YVtleHBhbklEXSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChub2RlTmFtZSwgb3duZXJEb2N1bWVudCwgZGF0YSl7XG4gICAgICAgIGlmICghb3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudCA9IGRvY3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmKHN1cHBvcnRzVW5rbm93bkVsZW1lbnRzKXtcbiAgICAgICAgICAgIHJldHVybiBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgZGF0YSA9IGdldEV4cGFuZG9EYXRhKG93bmVyRG9jdW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBub2RlO1xuXG4gICAgICAgIGlmIChkYXRhLmNhY2hlW25vZGVOYW1lXSkge1xuICAgICAgICAgICAgbm9kZSA9IGRhdGEuY2FjaGVbbm9kZU5hbWVdLmNsb25lTm9kZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHNhdmVDbG9uZXMudGVzdChub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIG5vZGUgPSAoZGF0YS5jYWNoZVtub2RlTmFtZV0gPSBkYXRhLmNyZWF0ZUVsZW0obm9kZU5hbWUpKS5jbG9uZU5vZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBkYXRhLmNyZWF0ZUVsZW0obm9kZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmNhbkhhdmVDaGlsZHJlbiAmJiAhcmVTa2lwLnRlc3Qobm9kZU5hbWUpID8gZGF0YS5mcmFnLmFwcGVuZENoaWxkKG5vZGUpIDogbm9kZTtcbiAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVEb2N1bWVudEZyYWdtZW50KG93bmVyRG9jdW1lbnQsIGRhdGEpe1xuICAgICAgICBpZiAoIW93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZihzdXBwb3J0c1Vua25vd25FbGVtZW50cyl7XG4gICAgICAgICAgICByZXR1cm4gb3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IGRhdGEgfHwgZ2V0RXhwYW5kb0RhdGEob3duZXJEb2N1bWVudCk7XG4gICAgICAgIHZhciBjbG9uZSA9IGRhdGEuZnJhZy5jbG9uZU5vZGUoKSxcbiAgICAgICAgICAgIGkgPSAwLFxuICAgICAgICAgICAgZWxlbXMgPSBnZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgbCA9IGVsZW1zLmxlbmd0aDtcbiAgICAgICAgZm9yKDtpPGw7aSsrKXtcbiAgICAgICAgICAgIGNsb25lLmNyZWF0ZUVsZW1lbnQoZWxlbXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzaGl2TWV0aG9kcyhvd25lckRvY3VtZW50LCBkYXRhKSB7XG4gICAgICAgIGlmICghZGF0YS5jYWNoZSkge1xuICAgICAgICAgICAgZGF0YS5jYWNoZSA9IHt9O1xuICAgICAgICAgICAgZGF0YS5jcmVhdGVFbGVtID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50O1xuICAgICAgICAgICAgZGF0YS5jcmVhdGVGcmFnID0gb3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICAgICAgZGF0YS5mcmFnID0gZGF0YS5jcmVhdGVGcmFnKCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uKG5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFodG1sNS5zaGl2TWV0aG9kcykge1xuICAgICAgICAgICAgICByZXR1cm4gZGF0YS5jcmVhdGVFbGVtKG5vZGVOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQobm9kZU5hbWUsIG93bmVyRG9jdW1lbnQsIGRhdGEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCA9IEZ1bmN0aW9uKCdoLGYnLCAncmV0dXJuIGZ1bmN0aW9uKCl7JyArXG4gICAgICAgICAgJ3ZhciBuPWYuY2xvbmVOb2RlKCksYz1uLmNyZWF0ZUVsZW1lbnQ7JyArXG4gICAgICAgICAgJ2guc2hpdk1ldGhvZHMmJignICtcbiAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudHMoKS5qb2luKCkucmVwbGFjZSgvXFx3Ky9nLCBmdW5jdGlvbihub2RlTmFtZSkge1xuICAgICAgICAgICAgICBkYXRhLmNyZWF0ZUVsZW0obm9kZU5hbWUpO1xuICAgICAgICAgICAgICBkYXRhLmZyYWcuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiAnYyhcIicgKyBub2RlTmFtZSArICdcIiknO1xuICAgICAgICAgICAgfSkgK1xuICAgICAgICAgICcpO3JldHVybiBufSdcbiAgICAgICAgKShodG1sNSwgZGF0YS5mcmFnKTtcbiAgICAgIH0gICAgICAgIGZ1bmN0aW9uIHNoaXZEb2N1bWVudChvd25lckRvY3VtZW50KSB7XG4gICAgICAgIGlmICghb3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudCA9IGRvY3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRhID0gZ2V0RXhwYW5kb0RhdGEob3duZXJEb2N1bWVudCk7XG5cbiAgICAgICAgaWYgKGh0bWw1LnNoaXZDU1MgJiYgIXN1cHBvcnRzSHRtbDVTdHlsZXMgJiYgIWRhdGEuaGFzQ1NTKSB7XG4gICAgICAgICAgZGF0YS5oYXNDU1MgPSAhIWFkZFN0eWxlU2hlZXQob3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgJ2FydGljbGUsYXNpZGUsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja30nICtcbiAgICAgICAgICAgICAgICAgICAgJ21hcmt7YmFja2dyb3VuZDojRkYwO2NvbG9yOiMwMDB9J1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdXBwb3J0c1Vua25vd25FbGVtZW50cykge1xuICAgICAgICAgIHNoaXZNZXRob2RzKG93bmVyRG9jdW1lbnQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvd25lckRvY3VtZW50O1xuICAgICAgfSAgICAgICAgdmFyIGh0bWw1ID0ge1xuXG4gICAgICAgICAgICAnZWxlbWVudHMnOiBvcHRpb25zLmVsZW1lbnRzIHx8ICdhYmJyIGFydGljbGUgYXNpZGUgYXVkaW8gYmRpIGNhbnZhcyBkYXRhIGRhdGFsaXN0IGRldGFpbHMgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGhlYWRlciBoZ3JvdXAgbWFyayBtZXRlciBuYXYgb3V0cHV0IHByb2dyZXNzIHNlY3Rpb24gc3VtbWFyeSB0aW1lIHZpZGVvJyxcblxuICAgICAgICAgICAgJ3NoaXZDU1MnOiAob3B0aW9ucy5zaGl2Q1NTICE9PSBmYWxzZSksXG5cbiAgICAgICAgICAgICdzdXBwb3J0c1Vua25vd25FbGVtZW50cyc6IHN1cHBvcnRzVW5rbm93bkVsZW1lbnRzLFxuXG4gICAgICAgICAgICAnc2hpdk1ldGhvZHMnOiAob3B0aW9ucy5zaGl2TWV0aG9kcyAhPT0gZmFsc2UpLFxuXG4gICAgICAgICAgICAndHlwZSc6ICdkZWZhdWx0JyxcblxuICAgICAgICAgICAgJ3NoaXZEb2N1bWVudCc6IHNoaXZEb2N1bWVudCxcblxuICAgICAgICAgICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcblxuICAgICAgICAgICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudDogY3JlYXRlRG9jdW1lbnRGcmFnbWVudFxuICAgICAgfTsgICAgICAgIHdpbmRvdy5odG1sNSA9IGh0bWw1O1xuXG4gICAgICAgIHNoaXZEb2N1bWVudChkb2N1bWVudCk7XG5cbiAgICB9KHRoaXMsIGRvY3VtZW50KSk7XG5cbiAgICBNb2Rlcm5penIuX3ZlcnNpb24gICAgICA9IHZlcnNpb247XG5cbiAgICBNb2Rlcm5penIuX3ByZWZpeGVzICAgICA9IHByZWZpeGVzO1xuICAgIE1vZGVybml6ci5fZG9tUHJlZml4ZXMgID0gZG9tUHJlZml4ZXM7XG4gICAgTW9kZXJuaXpyLl9jc3NvbVByZWZpeGVzICA9IGNzc29tUHJlZml4ZXM7XG5cblxuXG4gICAgTW9kZXJuaXpyLnRlc3RQcm9wICAgICAgPSBmdW5jdGlvbihwcm9wKXtcbiAgICAgICAgcmV0dXJuIHRlc3RQcm9wcyhbcHJvcF0pO1xuICAgIH07XG5cbiAgICBNb2Rlcm5penIudGVzdEFsbFByb3BzICA9IHRlc3RQcm9wc0FsbDtcblxuXG4gICAgTW9kZXJuaXpyLnRlc3RTdHlsZXMgICAgPSBpbmplY3RFbGVtZW50V2l0aFN0eWxlczsgICAgZG9jRWxlbWVudC5jbGFzc05hbWUgPSBkb2NFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC8oXnxcXHMpbm8tanMoXFxzfCQpLywgJyQxJDInKSArXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5hYmxlQ2xhc3NlcyA/ICcganMgJyArIGNsYXNzZXMuam9pbignICcpIDogJycpO1xuXG4gICAgcmV0dXJuIE1vZGVybml6cjtcblxufSkodGhpcywgdGhpcy5kb2N1bWVudCk7XG4vKnllcG5vcGUxLjUuNHxXVEZQTCovXG4oZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuXCJbb2JqZWN0IEZ1bmN0aW9uXVwiPT1vLmNhbGwoYSl9ZnVuY3Rpb24gZShhKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYX1mdW5jdGlvbiBmKCl7fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIWF8fFwibG9hZGVkXCI9PWF8fFwiY29tcGxldGVcIj09YXx8XCJ1bmluaXRpYWxpemVkXCI9PWF9ZnVuY3Rpb24gaCgpe3ZhciBhPXAuc2hpZnQoKTtxPTEsYT9hLnQ/bShmdW5jdGlvbigpeyhcImNcIj09YS50P0IuaW5qZWN0Q3NzOkIuaW5qZWN0SnMpKGEucywwLGEuYSxhLngsYS5lLDEpfSwwKTooYSgpLGgoKSk6cT0wfWZ1bmN0aW9uIGkoYSxjLGQsZSxmLGksail7ZnVuY3Rpb24gayhiKXtpZighbyYmZyhsLnJlYWR5U3RhdGUpJiYodS5yPW89MSwhcSYmaCgpLGwub25sb2FkPWwub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsYikpe1wiaW1nXCIhPWEmJm0oZnVuY3Rpb24oKXt0LnJlbW92ZUNoaWxkKGwpfSw1MCk7Zm9yKHZhciBkIGluIHlbY10peVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmeVtjXVtkXS5vbmxvYWQoKX19dmFyIGo9anx8Qi5lcnJvclRpbWVvdXQsbD1iLmNyZWF0ZUVsZW1lbnQoYSksbz0wLHI9MCx1PXt0OmQsczpjLGU6ZixhOmkseDpqfTsxPT09eVtjXSYmKHI9MSx5W2NdPVtdKSxcIm9iamVjdFwiPT1hP2wuZGF0YT1jOihsLnNyYz1jLGwudHlwZT1hKSxsLndpZHRoPWwuaGVpZ2h0PVwiMFwiLGwub25lcnJvcj1sLm9ubG9hZD1sLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2suY2FsbCh0aGlzLHIpfSxwLnNwbGljZShlLDAsdSksXCJpbWdcIiE9YSYmKHJ8fDI9PT15W2NdPyh0Lmluc2VydEJlZm9yZShsLHM/bnVsbDpuKSxtKGssaikpOnlbY10ucHVzaChsKSl9ZnVuY3Rpb24gaihhLGIsYyxkLGYpe3JldHVybiBxPTAsYj1ifHxcImpcIixlKGEpP2koXCJjXCI9PWI/djp1LGEsYix0aGlzLmkrKyxjLGQsZik6KHAuc3BsaWNlKHRoaXMuaSsrLDAsYSksMT09cC5sZW5ndGgmJmgoKSksdGhpc31mdW5jdGlvbiBrKCl7dmFyIGE9QjtyZXR1cm4gYS5sb2FkZXI9e2xvYWQ6aixpOjB9LGF9dmFyIGw9Yi5kb2N1bWVudEVsZW1lbnQsbT1hLnNldFRpbWVvdXQsbj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpWzBdLG89e30udG9TdHJpbmcscD1bXSxxPTAscj1cIk1vekFwcGVhcmFuY2VcImluIGwuc3R5bGUscz1yJiYhIWIuY3JlYXRlUmFuZ2UoKS5jb21wYXJlTm9kZSx0PXM/bDpuLnBhcmVudE5vZGUsbD1hLm9wZXJhJiZcIltvYmplY3QgT3BlcmFdXCI9PW8uY2FsbChhLm9wZXJhKSxsPSEhYi5hdHRhY2hFdmVudCYmIWwsdT1yP1wib2JqZWN0XCI6bD9cInNjcmlwdFwiOlwiaW1nXCIsdj1sP1wic2NyaXB0XCI6dSx3PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblwiW29iamVjdCBBcnJheV1cIj09by5jYWxsKGEpfSx4PVtdLHk9e30sej17dGltZW91dDpmdW5jdGlvbihhLGIpe3JldHVybiBiLmxlbmd0aCYmKGEudGltZW91dD1iWzBdKSxhfX0sQSxCO0I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYT1hLnNwbGl0KFwiIVwiKSxiPXgubGVuZ3RoLGM9YS5wb3AoKSxkPWEubGVuZ3RoLGM9e3VybDpjLG9yaWdVcmw6YyxwcmVmaXhlczphfSxlLGYsZztmb3IoZj0wO2Y8ZDtmKyspZz1hW2ZdLnNwbGl0KFwiPVwiKSwoZT16W2cuc2hpZnQoKV0pJiYoYz1lKGMsZykpO2ZvcihmPTA7ZjxiO2YrKyljPXhbZl0oYyk7cmV0dXJuIGN9ZnVuY3Rpb24gZyhhLGUsZixnLGgpe3ZhciBpPWIoYSksaj1pLmF1dG9DYWxsYmFjaztpLnVybC5zcGxpdChcIi5cIikucG9wKCkuc3BsaXQoXCI/XCIpLnNoaWZ0KCksaS5ieXBhc3N8fChlJiYoZT1kKGUpP2U6ZVthXXx8ZVtnXXx8ZVthLnNwbGl0KFwiL1wiKS5wb3AoKS5zcGxpdChcIj9cIilbMF1dKSxpLmluc3RlYWQ/aS5pbnN0ZWFkKGEsZSxmLGcsaCk6KHlbaS51cmxdP2kubm9leGVjPSEwOnlbaS51cmxdPTEsZi5sb2FkKGkudXJsLGkuZm9yY2VDU1N8fCFpLmZvcmNlSlMmJlwiY3NzXCI9PWkudXJsLnNwbGl0KFwiLlwiKS5wb3AoKS5zcGxpdChcIj9cIikuc2hpZnQoKT9cImNcIjpjLGkubm9leGVjLGkuYXR0cnMsaS50aW1lb3V0KSwoZChlKXx8ZChqKSkmJmYubG9hZChmdW5jdGlvbigpe2soKSxlJiZlKGkub3JpZ1VybCxoLGcpLGomJmooaS5vcmlnVXJsLGgsZykseVtpLnVybF09Mn0pKSl9ZnVuY3Rpb24gaChhLGIpe2Z1bmN0aW9uIGMoYSxjKXtpZihhKXtpZihlKGEpKWN8fChqPWZ1bmN0aW9uKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2suYXBwbHkodGhpcyxhKSxsKCl9KSxnKGEsaixiLDAsaCk7ZWxzZSBpZihPYmplY3QoYSk9PT1hKWZvcihuIGluIG09ZnVuY3Rpb24oKXt2YXIgYj0wLGM7Zm9yKGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiZiKys7cmV0dXJuIGJ9KCksYSlhLmhhc093blByb3BlcnR5KG4pJiYoIWMmJiEtLW0mJihkKGopP2o9ZnVuY3Rpb24oKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ay5hcHBseSh0aGlzLGEpLGwoKX06altuXT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYj1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7YSYmYS5hcHBseSh0aGlzLGIpLGwoKX19KGtbbl0pKSxnKGFbbl0saixiLG4saCkpfWVsc2UhYyYmbCgpfXZhciBoPSEhYS50ZXN0LGk9YS5sb2FkfHxhLmJvdGgsaj1hLmNhbGxiYWNrfHxmLGs9aixsPWEuY29tcGxldGV8fGYsbSxuO2MoaD9hLnllcDphLm5vcGUsISFpKSxpJiZjKGkpfXZhciBpLGosbD10aGlzLnllcG5vcGUubG9hZGVyO2lmKGUoYSkpZyhhLDAsbCwwKTtlbHNlIGlmKHcoYSkpZm9yKGk9MDtpPGEubGVuZ3RoO2krKylqPWFbaV0sZShqKT9nKGosMCxsLDApOncoaik/QihqKTpPYmplY3Qoaik9PT1qJiZoKGosbCk7ZWxzZSBPYmplY3QoYSk9PT1hJiZoKGEsbCl9LEIuYWRkUHJlZml4PWZ1bmN0aW9uKGEsYil7elthXT1ifSxCLmFkZEZpbHRlcj1mdW5jdGlvbihhKXt4LnB1c2goYSl9LEIuZXJyb3JUaW1lb3V0PTFlNCxudWxsPT1iLnJlYWR5U3RhdGUmJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIucmVhZHlTdGF0ZT1cImxvYWRpbmdcIixiLmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsQT1mdW5jdGlvbigpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixBLDApLGIucmVhZHlTdGF0ZT1cImNvbXBsZXRlXCJ9LDApKSxhLnllcG5vcGU9aygpLGEueWVwbm9wZS5leGVjdXRlU3RhY2s9aCxhLnllcG5vcGUuaW5qZWN0SnM9ZnVuY3Rpb24oYSxjLGQsZSxpLGope3ZhciBrPWIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSxsLG8sZT1lfHxCLmVycm9yVGltZW91dDtrLnNyYz1hO2ZvcihvIGluIGQpay5zZXRBdHRyaWJ1dGUobyxkW29dKTtjPWo/aDpjfHxmLGsub25yZWFkeXN0YXRlY2hhbmdlPWsub25sb2FkPWZ1bmN0aW9uKCl7IWwmJmcoay5yZWFkeVN0YXRlKSYmKGw9MSxjKCksay5vbmxvYWQ9ay5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCl9LG0oZnVuY3Rpb24oKXtsfHwobD0xLGMoMSkpfSxlKSxpP2sub25sb2FkKCk6bi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShrLG4pfSxhLnllcG5vcGUuaW5qZWN0Q3NzPWZ1bmN0aW9uKGEsYyxkLGUsZyxpKXt2YXIgZT1iLmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpLGosYz1pP2g6Y3x8ZjtlLmhyZWY9YSxlLnJlbD1cInN0eWxlc2hlZXRcIixlLnR5cGU9XCJ0ZXh0L2Nzc1wiO2ZvcihqIGluIGQpZS5zZXRBdHRyaWJ1dGUoaixkW2pdKTtnfHwobi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLG4pLG0oYywwKSl9fSkodGhpcyxkb2N1bWVudCk7XG5Nb2Rlcm5penIubG9hZD1mdW5jdGlvbigpe3llcG5vcGUuYXBwbHkod2luZG93LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKTt9O1xuOyIsIihmdW5jdGlvbiBlKHQsIG4sIHIpIHtcbiAgZnVuY3Rpb24gcyhvLCB1KSB7XG4gICAgaWYgKCFuW29dKSB7XG4gICAgICBpZiAoIXRbb10pIHtcbiAgICAgICAgdmFyIGEgPSB0eXBlb2YgcmVxdWlyZSA9PSBcImZ1bmN0aW9uXCIgJiYgcmVxdWlyZTtcbiAgICAgICAgaWYgKCF1ICYmIGEpIHJldHVybiBhKG8sICEwKTtcbiAgICAgICAgaWYgKGkpIHJldHVybiBpKG8sICEwKTtcbiAgICAgICAgdmFyIGYgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbyArIFwiJ1wiKTtcbiAgICAgICAgdGhyb3cgZi5jb2RlID0gXCJNT0RVTEVfTk9UX0ZPVU5EXCIsIGY7XG4gICAgICB9XG4gICAgICB2YXIgbCA9IG5bb10gPSB7XG4gICAgICAgIGV4cG9ydHM6IHt9XG4gICAgICB9O1xuICAgICAgdFtvXVswXS5jYWxsKGwuZXhwb3J0cywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgbiA9IHRbb11bMV1bZV07XG4gICAgICAgIHJldHVybiBzKG4gPyBuIDogZSk7XG4gICAgICB9LCBsLCBsLmV4cG9ydHMsIGUsIHQsIG4sIHIpO1xuICAgIH1cbiAgICByZXR1cm4gbltvXS5leHBvcnRzO1xuICB9XG4gIHZhciBpID0gdHlwZW9mIHJlcXVpcmUgPT0gXCJmdW5jdGlvblwiICYmIHJlcXVpcmU7XG4gIGZvciAodmFyIG8gPSAwOyBvIDwgci5sZW5ndGg7IG8rKykgcyhyW29dKTtcbiAgcmV0dXJuIHM7XG59KSh7XG4gIDE6IFsgZnVuY3Rpb24ocmVxdWlyZSwgbW9kdWxlLCBleHBvcnRzKSB7XG4gICAgdmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuICAgIHByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgICB2YXIgY2FuUG9zdCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBvc3RNZXNzYWdlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyO1xuICAgICAgaWYgKGNhblNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZikge1xuICAgICAgICAgIHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGNhblBvc3QpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbihldikge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBldi5zb3VyY2U7XG4gICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09IFwicHJvY2Vzcy10aWNrXCIpIHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKGZuKTtcbiAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoXCJwcm9jZXNzLXRpY2tcIiwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgICAgfTtcbiAgICB9KCk7XG4gICAgcHJvY2Vzcy50aXRsZSA9IFwiYnJvd3NlclwiO1xuICAgIHByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG4gICAgcHJvY2Vzcy5lbnYgPSB7fTtcbiAgICBwcm9jZXNzLmFyZ3YgPSBbXTtcbiAgICBmdW5jdGlvbiBub29wKCkge31cbiAgICBwcm9jZXNzLm9uID0gbm9vcDtcbiAgICBwcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbiAgICBwcm9jZXNzLm9uY2UgPSBub29wO1xuICAgIHByb2Nlc3Mub2ZmID0gbm9vcDtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbiAgICBwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG4gICAgcHJvY2Vzcy5lbWl0ID0gbm9vcDtcbiAgICBwcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9O1xuICAgIHByb2Nlc3MuY3dkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXCIvXCI7XG4gICAgfTtcbiAgICBwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24oZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfTtcbiAgfSwge30gXSxcbiAgMjogWyBmdW5jdGlvbihyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICB2YXIgYXNhcCA9IHJlcXVpcmUoXCJhc2FwXCIpO1xuICAgIG1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcbiAgICBmdW5jdGlvbiBQcm9taXNlKGZuKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXdcIik7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJub3QgYSBmdW5jdGlvblwiKTtcbiAgICAgIHZhciBzdGF0ZSA9IG51bGw7XG4gICAgICB2YXIgdmFsdWUgPSBudWxsO1xuICAgICAgdmFyIGRlZmVycmVkcyA9IFtdO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy50aGVuID0gZnVuY3Rpb24ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBzZWxmLmNvbnN0cnVjdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGhhbmRsZShuZXcgSGFuZGxlcihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcmVzb2x2ZSwgcmVqZWN0KSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShkZWZlcnJlZCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFzYXAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGNiID0gc3RhdGUgPyBkZWZlcnJlZC5vbkZ1bGZpbGxlZCA6IGRlZmVycmVkLm9uUmVqZWN0ZWQ7XG4gICAgICAgICAgaWYgKGNiID09PSBudWxsKSB7XG4gICAgICAgICAgICAoc3RhdGUgPyBkZWZlcnJlZC5yZXNvbHZlIDogZGVmZXJyZWQucmVqZWN0KSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciByZXQ7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldCA9IGNiKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmV0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiByZXNvbHZlKG5ld1ZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi5cIik7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlICYmICh0eXBlb2YgbmV3VmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICAgICAgICB2YXIgdGhlbiA9IG5ld1ZhbHVlLnRoZW47XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBkb1Jlc29sdmUodGhlbi5iaW5kKG5ld1ZhbHVlKSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZSA9IHRydWU7XG4gICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICBmaW5hbGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0KG5ld1ZhbHVlKSB7XG4gICAgICAgIHN0YXRlID0gZmFsc2U7XG4gICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGZpbmFsZSgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZmluYWxlKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGVmZXJyZWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSBoYW5kbGUoZGVmZXJyZWRzW2ldKTtcbiAgICAgICAgZGVmZXJyZWRzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGRvUmVzb2x2ZShmbiwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gSGFuZGxlcihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB0aGlzLm9uRnVsZmlsbGVkID0gdHlwZW9mIG9uRnVsZmlsbGVkID09PSBcImZ1bmN0aW9uXCIgPyBvbkZ1bGZpbGxlZCA6IG51bGw7XG4gICAgICB0aGlzLm9uUmVqZWN0ZWQgPSB0eXBlb2Ygb25SZWplY3RlZCA9PT0gXCJmdW5jdGlvblwiID8gb25SZWplY3RlZCA6IG51bGw7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRvUmVzb2x2ZShmbiwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBmbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgb25GdWxmaWxsZWQodmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgIG9uUmVqZWN0ZWQocmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgb25SZWplY3RlZChleCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAgYXNhcDogNFxuICB9IF0sXG4gIDM6IFsgZnVuY3Rpb24ocmVxdWlyZSwgbW9kdWxlLCBleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgdmFyIFByb21pc2UgPSByZXF1aXJlKFwiLi9jb3JlLmpzXCIpO1xuICAgIHZhciBhc2FwID0gcmVxdWlyZShcImFzYXBcIik7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuICAgIGZ1bmN0aW9uIFZhbHVlUHJvbWlzZSh2YWx1ZSkge1xuICAgICAgdGhpcy50aGVuID0gZnVuY3Rpb24ob25GdWxmaWxsZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkZ1bGZpbGxlZCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGFzYXAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXNvbHZlKG9uRnVsZmlsbGVkKHZhbHVlKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICByZWplY3QoZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIFZhbHVlUHJvbWlzZS5wcm90b3R5cGUgPSBQcm9taXNlLnByb3RvdHlwZTtcbiAgICB2YXIgVFJVRSA9IG5ldyBWYWx1ZVByb21pc2UodHJ1ZSk7XG4gICAgdmFyIEZBTFNFID0gbmV3IFZhbHVlUHJvbWlzZShmYWxzZSk7XG4gICAgdmFyIE5VTEwgPSBuZXcgVmFsdWVQcm9taXNlKG51bGwpO1xuICAgIHZhciBVTkRFRklORUQgPSBuZXcgVmFsdWVQcm9taXNlKHVuZGVmaW5lZCk7XG4gICAgdmFyIFpFUk8gPSBuZXcgVmFsdWVQcm9taXNlKDApO1xuICAgIHZhciBFTVBUWVNUUklORyA9IG5ldyBWYWx1ZVByb21pc2UoXCJcIik7XG4gICAgUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIE5VTEw7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFVOREVGSU5FRDtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIFRSVUU7XG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gRkFMU0U7XG4gICAgICBpZiAodmFsdWUgPT09IDApIHJldHVybiBaRVJPO1xuICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSByZXR1cm4gRU1QVFlTVFJJTkc7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIHRoZW4gPSB2YWx1ZS50aGVuO1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UodGhlbi5iaW5kKHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgVmFsdWVQcm9taXNlKHZhbHVlKTtcbiAgICB9O1xuICAgIFByb21pc2UuYWxsID0gZnVuY3Rpb24oYXJyKSB7XG4gICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFycik7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJlc29sdmUoW10pO1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gYXJncy5sZW5ndGg7XG4gICAgICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHZhbCAmJiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHZhciB0aGVuID0gdmFsLnRoZW47XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdGhlbi5jYWxsKHZhbCwgZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgICByZXMoaSwgdmFsKTtcbiAgICAgICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJnc1tpXSA9IHZhbDtcbiAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgICAgICByZXNvbHZlKGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICByZWplY3QoZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZWplY3QodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBQcm9taXNlLnJhY2UgPSBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFByb21pc2UucHJvdG90eXBlW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbihvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xuICAgIH07XG4gIH0sIHtcbiAgICBcIi4vY29yZS5qc1wiOiAyLFxuICAgIGFzYXA6IDRcbiAgfSBdLFxuICA0OiBbIGZ1bmN0aW9uKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cykge1xuICAgIChmdW5jdGlvbihwcm9jZXNzKSB7XG4gICAgICB2YXIgaGVhZCA9IHtcbiAgICAgICAgdGFzazogdm9pZCAwLFxuICAgICAgICBuZXh0OiBudWxsXG4gICAgICB9O1xuICAgICAgdmFyIHRhaWwgPSBoZWFkO1xuICAgICAgdmFyIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgICB2YXIgcmVxdWVzdEZsdXNoID0gdm9pZCAwO1xuICAgICAgdmFyIGlzTm9kZUpTID0gZmFsc2U7XG4gICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgd2hpbGUgKGhlYWQubmV4dCkge1xuICAgICAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICAgICAgdmFyIHRhc2sgPSBoZWFkLnRhc2s7XG4gICAgICAgICAgaGVhZC50YXNrID0gdm9pZCAwO1xuICAgICAgICAgIHZhciBkb21haW4gPSBoZWFkLmRvbWFpbjtcbiAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICBoZWFkLmRvbWFpbiA9IHZvaWQgMDtcbiAgICAgICAgICAgIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChpc05vZGVKUykge1xuICAgICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZsdXNoLCAwKTtcbiAgICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICAgIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MubmV4dFRpY2spIHtcbiAgICAgICAgaXNOb2RlSlMgPSB0cnVlO1xuICAgICAgICByZXF1ZXN0Rmx1c2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgcmVxdWVzdEZsdXNoID0gc2V0SW1tZWRpYXRlLmJpbmQod2luZG93LCBmbHVzaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxdWVzdEZsdXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoZmx1c2gpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZmx1c2g7XG4gICAgICAgIHJlcXVlc3RGbHVzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0Rmx1c2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZsdXNoLCAwKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGFzYXAodGFzaykge1xuICAgICAgICB0YWlsID0gdGFpbC5uZXh0ID0ge1xuICAgICAgICAgIHRhc2s6IHRhc2ssXG4gICAgICAgICAgZG9tYWluOiBpc05vZGVKUyAmJiBwcm9jZXNzLmRvbWFpbixcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghZmx1c2hpbmcpIHtcbiAgICAgICAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gYXNhcDtcbiAgICB9KS5jYWxsKHRoaXMsIHJlcXVpcmUoXCJfcHJvY2Vzc1wiKSk7XG4gIH0sIHtcbiAgICBfcHJvY2VzczogMVxuICB9IF0sXG4gIDU6IFsgZnVuY3Rpb24ocmVxdWlyZSwgbW9kdWxlLCBleHBvcnRzKSB7XG4gICAgaWYgKHR5cGVvZiBQcm9taXNlLnByb3RvdHlwZS5kb25lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIFByb21pc2UucHJvdG90eXBlLmRvbmUgPSBmdW5jdGlvbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgc2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnRoZW4uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRoaXM7XG4gICAgICAgIHNlbGYudGhlbihudWxsLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9LCB7fSBdLFxuICA2OiBbIGZ1bmN0aW9uKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cykge1xuICAgIHZhciBhc2FwID0gcmVxdWlyZShcImFzYXBcIik7XG4gICAgaWYgKHR5cGVvZiBQcm9taXNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBQcm9taXNlID0gcmVxdWlyZShcIi4vbGliL2NvcmUuanNcIik7XG4gICAgICByZXF1aXJlKFwiLi9saWIvZXM2LWV4dGVuc2lvbnMuanNcIik7XG4gICAgfVxuICAgIHJlcXVpcmUoXCIuL3BvbHlmaWxsLWRvbmUuanNcIik7XG4gIH0sIHtcbiAgICBcIi4vbGliL2NvcmUuanNcIjogMixcbiAgICBcIi4vbGliL2VzNi1leHRlbnNpb25zLmpzXCI6IDMsXG4gICAgXCIuL3BvbHlmaWxsLWRvbmUuanNcIjogNSxcbiAgICBhc2FwOiA0XG4gIH0gXVxufSwge30sIFsgNiBdKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPS9wb2x5ZmlsbHMvcHJvbWlzZS02LjEuMC5qcy5tYXAiLCIvKlxuQ29weXJpZ2h0IChjKSAyMDEyIEJhcm5lc2FuZG5vYmxlLmNvbSwgbGxjLCBEb25hdm9uIFdlc3QsIGFuZCBEb21lbmljIERlbmljb2xhXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG5cIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbmRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xucGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG50aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG5pbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkRcbk5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkVcbkxJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT05cbk9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbiovXG4oZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciBzZXRJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3MpIHtcbiAgICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHBhcnRpYWxseUFwcGxpZWQuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgdGhlIHNhbWUgYXJndW1lbnRzIGFzIHNldEltbWVkaWF0ZSwgYnV0XG4gICAgLy8gcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgbm8gYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIHBhcnRpYWxseUFwcGxpZWQoaGFuZGxlcikge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIChuZXcgRnVuY3Rpb24oXCJcIiArIGhhbmRsZXIpKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocGFydGlhbGx5QXBwbGllZChydW5JZlByZXNlbnQsIGhhbmRsZSksIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKHBhcnRpYWxseUFwcGxpZWQocnVuSWZQcmVzZW50LCBoYW5kbGUpKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICAgICAgc2V0VGltZW91dChwYXJ0aWFsbHlBcHBsaWVkKHJ1bklmUHJlc2VudCwgaGFuZGxlKSwgMCk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0obmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSkpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFZpZXdwb3J0KCkge1xuXG4gICAgICAgIHRoaXMuUFJFX0lPUzdfVklFV1BPUlQgPSBcImluaXRpYWwtc2NhbGU9MSwgbWF4aW11bS1zY2FsZT0xLCB1c2VyLXNjYWxhYmxlPW5vXCI7XG4gICAgICAgIHRoaXMuSU9TN19WSUVXUE9SVCA9IFwiaW5pdGlhbC1zY2FsZT0xLCBtYXhpbXVtLXNjYWxlPTEsIHVzZXItc2NhbGFibGU9bm9cIjtcbiAgICAgICAgdGhpcy5ERUZBVUxUX1ZJRVdQT1JUID0gXCJpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MSwgdXNlci1zY2FsYWJsZT1ub1wiO1xuXG4gICAgICAgIHRoaXMuZW5zdXJlVmlld3BvcnRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMucGxhdGZvcm0gPSB7fTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybS5uYW1lID0gdGhpcy5nZXRQbGF0Zm9ybU5hbWUoKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybS52ZXJzaW9uID0gdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgVmlld3BvcnQucHJvdG90eXBlLmVuc3VyZVZpZXdwb3J0RWxlbWVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPXZpZXdwb3J0XScpO1xuICAgICAgICBpZighdGhpcy52aWV3cG9ydEVsZW1lbnQpe1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZXRhJyk7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5uYW1lID0gXCJ2aWV3cG9ydFwiO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLnZpZXdwb3J0RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVmlld3BvcnQucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbm8tYWRqdXN0JykgPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLm5hbWUgPT0gJ2lvcycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLnZlcnNpb24gPj0gNyAmJiBpc1dlYlZpZXcoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnY29udGVudCcsIHRoaXMuSU9TN19WSUVXUE9SVCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgnY29udGVudCcsIHRoaXMuUFJFX0lPUzdfVklFV1BPUlQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250ZW50JywgdGhpcy5ERUZBVUxUX1ZJRVdQT1JUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlzV2ViVmlldygpIHtcbiAgICAgICAgICAgIHJldHVybiAhISh3aW5kb3cuY29yZG92YSB8fCB3aW5kb3cucGhvbmVnYXAgfHwgd2luZG93LlBob25lR2FwKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBWaWV3cG9ydC5wcm90b3R5cGUuZ2V0UGxhdGZvcm1OYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJhbmRyb2lkXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiaW9zXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1bmtub3duXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIFZpZXdwb3J0LnByb3RvdHlwZS5nZXRQbGF0Zm9ybVZlcnNpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignT1MgJyk7XG4gICAgICAgIHJldHVybiB3aW5kb3cuTnVtYmVyKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnN1YnN0cihzdGFydCArIDMsIDMpLnJlcGxhY2UoJ18nLCAnLicpKTtcbiAgICB9O1xuXG4gICAgd2luZG93LlZpZXdwb3J0ID0gVmlld3BvcnQ7XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuXG53aW5kb3cuRG9vckxvY2sgPSAoKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZ2VuZXJhdGVJZCA9IChmdW5jdGlvbigpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGkrKztcbiAgICB9O1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBEb29yIGxvY2tpbmcgc3lzdGVtLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmxvZ11cbiAgICovXG4gIGNsYXNzIERvb3JMb2NrIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgdGhpcy5fbG9ja0xpc3QgPSBbXTtcbiAgICAgIHRoaXMuX3dhaXRMaXN0ID0gW107XG4gICAgICB0aGlzLl9sb2cgPSBvcHRpb25zLmxvZyB8fCBmdW5jdGlvbigpIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgbG9jay5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBDYWxsYmFjayBmb3IgdW5sb2NraW5nLlxuICAgICAqL1xuICAgIGxvY2soKSB7XG4gICAgICBjb25zdCB1bmxvY2sgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VubG9jayh1bmxvY2spO1xuICAgICAgfTtcbiAgICAgIHVubG9jay5pZCA9IGdlbmVyYXRlSWQoKTtcbiAgICAgIHRoaXMuX2xvY2tMaXN0LnB1c2godW5sb2NrKTtcbiAgICAgIHRoaXMuX2xvZygnbG9jazogJyArICh1bmxvY2suaWQpKTtcblxuICAgICAgcmV0dXJuIHVubG9jaztcbiAgICB9XG5cbiAgICBfdW5sb2NrKGZuKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xvY2tMaXN0LmluZGV4T2YoZm4pO1xuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZnVuY3Rpb24gaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGxvY2sgbGlzdC4nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbG9ja0xpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuX2xvZygndW5sb2NrOiAnICsgZm4uaWQpO1xuXG4gICAgICB0aGlzLl90cnlUb0ZyZWVXYWl0TGlzdCgpO1xuICAgIH1cblxuICAgIF90cnlUb0ZyZWVXYWl0TGlzdCgpIHtcbiAgICAgIHdoaWxlICghdGhpcy5pc0xvY2tlZCgpICYmIHRoaXMuX3dhaXRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5fd2FpdExpc3Quc2hpZnQoKSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIHdhaXRpbmcgdW5sb2NrZWQgZG9vci5cbiAgICAgKlxuICAgICAqIEBwYXJhbXMge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBvbiB1bmxvY2tpbmcgdGhlIGRvb3IgY29tcGxldGVseS5cbiAgICAgKi9cbiAgICB3YWl0VW5sb2NrKGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIShjYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjYWxsYmFjayBwYXJhbSBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzTG9ja2VkKCkpIHtcbiAgICAgICAgdGhpcy5fd2FpdExpc3QucHVzaChjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNMb2NrZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbG9ja0xpc3QubGVuZ3RoID4gMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRG9vckxvY2s7XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgY29uc3QgdXRpbCA9IHtcbiAgICBfcmVhZHk6IGZhbHNlLFxuXG4gICAgX2RvbUNvbnRlbnRMb2FkZWQ6IGZhbHNlLFxuXG4gICAgX29uRE9NQ29udGVudExvYWRlZDogKCkgPT4ge1xuICAgICAgdXRpbC5fZG9tQ29udGVudExvYWRlZCA9IHRydWU7XG5cbiAgICAgIGlmIChvbnMuaXNXZWJWaWV3KCkpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xuICAgICAgICAgIHV0aWwuX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXRpbC5fcmVhZHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRCYWNrQnV0dG9uTGlzdGVuZXI6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICBpZiAoIXRoaXMuX2RvbUNvbnRlbnRMb2FkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgYWZ0ZXIgRE9NQ29udGVudExvYWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcmVhZHkpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVtb3ZlQmFja0J1dHRvbkxpc3RlbmVyOiBmdW5jdGlvbihmbikge1xuICAgICAgaWYgKCF0aGlzLl9kb21Db250ZW50TG9hZGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGFmdGVyIERPTUNvbnRlbnRMb2FkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3JlYWR5KSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdiYWNrYnV0dG9uJywgZm4sIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdiYWNrYnV0dG9uJywgZm4sIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHV0aWwuX29uRE9NQ29udGVudExvYWRlZCgpLCBmYWxzZSk7XG5cbiAgY29uc3QgSGFuZGxlclJlcG9zaXRvcnkgPSB7XG4gICAgX3N0b3JlOiB7fSxcblxuICAgIF9nZW5JZDogKCgpID0+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiAoKSA9PiBpKys7XG4gICAgfSkoKSxcblxuICAgIHNldDogZnVuY3Rpb24oZWxlbWVudCwgaGFuZGxlcikge1xuICAgICAgaWYgKGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCA9IEhhbmRsZXJSZXBvc2l0b3J5Ll9nZW5JZCgpO1xuICAgICAgdGhpcy5fc3RvcmVbaWRdID0gaGFuZGxlcjtcbiAgICB9LFxuXG4gICAgcmVtb3ZlOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICBpZiAoZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0b3JlW2VsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkXTtcbiAgICAgICAgZGVsZXRlIGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQ7XG5cbiAgICAgIGlmICghdGhpcy5fc3RvcmVbaWRdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fc3RvcmVbaWRdO1xuICAgIH0sXG5cbiAgICBoYXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQ7XG5cbiAgICAgIHJldHVybiAhIXRoaXMuX3N0b3JlW2lkXTtcbiAgICB9XG4gIH07XG5cbiAgY2xhc3MgRGV2aWNlYmFja0J1dHRvbkRpc3BhdGNoZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9ib3VuZENhbGxiYWNrID0gdGhpcy5fY2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0byBoYW5kbGUgJ2JhY2tidXR0b24nIGV2ZW50cy5cbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgICB1dGlsLmFkZEJhY2tCdXR0b25MaXN0ZW5lcih0aGlzLl9ib3VuZENhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHRvIGhhbmRsZSAnYmFja2J1dHRvbicgZXZlbnRzLlxuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICBpZiAodGhpcy5faXNFbmFibGVkKSB7XG4gICAgICAgIHV0aWwucmVtb3ZlQmFja0J1dHRvbkxpc3RlbmVyKHRoaXMuX2JvdW5kQ2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlIGEgJ2JhY2tidXR0b24nIGV2ZW50IG1hbnVhbGx5LlxuICAgICAqL1xuICAgIGZpcmVEZXZpY2VCYWNrQnV0dG9uRXZlbnQoKSB7XG4gICAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgZXZlbnQuaW5pdEV2ZW50KCdiYWNrYnV0dG9uJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9XG5cbiAgICBfY2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kaXNwYXRjaERldmljZUJhY2tCdXR0b25FdmVudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGNyZWF0ZUhhbmRsZXIoZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEZ1bmN0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgICAgIF9jYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIF9lbGVtZW50OiBlbGVtZW50LFxuXG4gICAgICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIEhhbmRsZXJSZXBvc2l0b3J5LnJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXRMaXN0ZW5lcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgSGFuZGxlclJlcG9zaXRvcnkuc2V0KGVsZW1lbnQsIHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzRW5hYmxlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIEhhbmRsZXJSZXBvc2l0b3J5LmdldChlbGVtZW50KSA9PT0gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBIYW5kbGVyUmVwb3NpdG9yeS5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaGFuZGxlci5lbmFibGUoKTtcblxuICAgICAgcmV0dXJuIGhhbmRsZXI7XG4gICAgfVxuXG4gICAgX2Rpc3BhdGNoRGV2aWNlQmFja0J1dHRvbkV2ZW50KCkge1xuICAgICAgY29uc3QgdHJlZSA9IHRoaXMuX2NhcHR1cmVUcmVlKCk7XG4gICAgICAvL3RoaXMuX2R1bXBUcmVlKHRyZWUpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZmluZEhhbmRsZXJMZWFmRWxlbWVudCh0cmVlKTtcbiAgICAgIC8vdGhpcy5fZHVtcFBhcmVudHMoZWxlbWVudCk7XG5cbiAgICAgIGxldCBoYW5kbGVyID0gSGFuZGxlclJlcG9zaXRvcnkuZ2V0KGVsZW1lbnQpO1xuICAgICAgaGFuZGxlci5fY2FsbGJhY2soY3JlYXRlRXZlbnQoZWxlbWVudCkpO1xuXG4gICAgICBmdW5jdGlvbiBjcmVhdGVFdmVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgY2FsbFBhcmVudEhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlclJlcG9zaXRvcnkuZ2V0KHBhcmVudCk7XG4gICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuX2NhbGxiYWNrKGNyZWF0ZUV2ZW50KHBhcmVudCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZHVtcFBhcmVudHMoZWxlbWVudCkge1xuICAgICAgd2hpbGUgKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICsgJy4nICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpO1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBfY2FwdHVyZVRyZWUoKSB7XG4gICAgICByZXR1cm4gY3JlYXRlVHJlZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgZnVuY3Rpb24gY3JlYXRlVHJlZShlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICBjaGlsZHJlbjogQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgYXJyYXlPZihlbGVtZW50LmNoaWxkcmVuKS5tYXAoZnVuY3Rpb24oY2hpbGRFbGVtZW50KSB7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNoaWxkRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIUhhbmRsZXJSZXBvc2l0b3J5LmhhcyhjaGlsZEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlVHJlZShjaGlsZEVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhSGFuZGxlclJlcG9zaXRvcnkuaGFzKHJlc3VsdC5lbGVtZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbcmVzdWx0XTtcbiAgICAgICAgICB9KSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYXJyYXlPZih0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godGFyZ2V0W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIF9kdW1wVHJlZShub2RlKSB7XG4gICAgICBfZHVtcChub2RlLCAwKTtcblxuICAgICAgZnVuY3Rpb24gX2R1bXAobm9kZSwgbGV2ZWwpIHtcbiAgICAgICAgY29uc3QgcGFkID0gbmV3IEFycmF5KGxldmVsICsgMSkuam9pbignICAnKTtcbiAgICAgICAgY29uc29sZS5sb2cocGFkICsgbm9kZS5lbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIF9kdW1wKG5vZGUsIGxldmVsICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmVlXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2ZpbmRIYW5kbGVyTGVhZkVsZW1lbnQodHJlZSkge1xuICAgICAgcmV0dXJuIGZpbmQodHJlZSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZpbmQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5lbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbmQobm9kZS5jaGlsZHJlblswXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGROb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkTm9kZS5lbGVtZW50O1xuICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgICBpZiAoIWxlZnQpIHtcbiAgICAgICAgICAgIHJldHVybiByaWdodDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsZWZ0WiA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGxlZnQsICcnKS56SW5kZXgsIDEwKTtcbiAgICAgICAgICBjb25zdCByaWdodFogPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyaWdodCwgJycpLnpJbmRleCwgMTApO1xuXG4gICAgICAgICAgaWYgKCFpc05hTihsZWZ0WikgJiYgIWlzTmFOKHJpZ2h0WikpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0WiA+IHJpZ2h0WiA/IGxlZnQgOiByaWdodDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhcHR1cmluZyBiYWNrYnV0dG9uLWhhbmRsZXIgaXMgZmFpbHVyZS4nKTtcbiAgICAgICAgfSwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25zLl9kZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciA9IG5ldyBEZXZpY2ViYWNrQnV0dG9uRGlzcGF0Y2hlcigpO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgb25zLl9kZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlci5lbmFibGUoKTtcbiAgfSk7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBvbnMuX3JlYWR5TG9jayA9IG5ldyBEb29yTG9jaygpO1xuICBvbnMuX2NvbmZpZyA9IHtcbiAgICBhdXRvU3RhdHVzQmFyRmlsbDogdHJ1ZSxcbiAgICBhbmltYXRpb25zRGlzYWJsZWQ6IGZhbHNlXG4gIH07XG5cbiAgd2FpdERldmljZVJlYWR5KCk7XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBvbnMuaXNSZWFkeSA9ICgpID0+IHtcbiAgICByZXR1cm4gIW9ucy5fcmVhZHlMb2NrLmlzTG9ja2VkKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBvbnMuaXNXZWJWaWV3ID0gKCkgPT4ge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXNXZWJWaWV3KCkgbWV0aG9kIGlzIGF2YWlsYWJsZSBhZnRlciBkb20gY29udGVudHMgbG9hZGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiAhISh3aW5kb3cuY29yZG92YSB8fCB3aW5kb3cucGhvbmVnYXAgfHwgd2luZG93LlBob25lR2FwKTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9ucy5yZWFkeSA9IGNhbGxiYWNrID0+IHtcbiAgICBpZiAob25zLmlzUmVhZHkoKSkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25zLl9yZWFkeUxvY2sud2FpdFVubG9jayhjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKi9cbiAgb25zLnNldERlZmF1bHREZXZpY2VCYWNrQnV0dG9uTGlzdGVuZXIgPSBmdW5jdGlvbihsaXN0ZW5lcikge1xuICAgIG9ucy5fZGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyLnNldExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogRGlzYWJsZSB0aGlzIGZyYW1ld29yayB0byBoYW5kbGUgY29yZG92YSBcImJhY2tidXR0b25cIiBldmVudC5cbiAgICovXG4gIG9ucy5kaXNhYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmRpc2FibGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogRW5hYmxlIHRoaXMgZnJhbWV3b3JrIHRvIGhhbmRsZSBjb3Jkb3ZhIFwiYmFja2J1dHRvblwiIGV2ZW50LlxuICAgKi9cbiAgb25zLmVuYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgb25zLl9kZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlci5lbmFibGUoKTtcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBFbmFibGUgc3RhdHVzIGJhciBmaWxsIGZlYXR1cmUgb24gaU9TNyBhbmQgYWJvdmUuXG4gICAqL1xuICBvbnMuZW5hYmxlQXV0b1N0YXR1c0JhckZpbGwgPSAoKSA9PiB7XG4gICAgaWYgKG9ucy5pc1JlYWR5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG9ucy5pc1JlYWR5KCkgaXMgdHJ1ZS4nKTtcbiAgICB9XG4gICAgb25zLl9jb25maWcuYXV0b1N0YXR1c0JhckZpbGwgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHN0YXR1cyBiYXIgZmlsbCBmZWF0dXJlIG9uIGlPUzcgYW5kIGFib3ZlLlxuICAgKi9cbiAgb25zLmRpc2FibGVBdXRvU3RhdHVzQmFyRmlsbCA9ICgpID0+IHtcbiAgICBpZiAob25zLmlzUmVhZHkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgb25zLmlzUmVhZHkoKSBpcyB0cnVlLicpO1xuICAgIH1cbiAgICBvbnMuX2NvbmZpZy5hdXRvU3RhdHVzQmFyRmlsbCA9IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFsbCBhbmltYXRpb25zLiBDb3VsZCBiZSBoYW5keSBmb3IgdGVzdGluZyBhbmQgb2xkZXIgZGV2aWNlcy5cbiAgICovXG4gIG9ucy5kaXNhYmxlQW5pbWF0aW9ucyA9ICgpID0+IHtcbiAgICBvbnMuX2NvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgYW5pbWF0aW9ucyAoZGVmYXVsdCkuXG4gICAqL1xuICBvbnMuZW5hYmxlQW5pbWF0aW9ucyA9ICgpID0+IHtcbiAgICBvbnMuX2NvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQgPSBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5saW5rXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgb25zLl9jcmVhdGVQb3BvdmVyT3JpZ2luYWwgPSBmdW5jdGlvbihwYWdlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoIXBhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFnZSB1cmwgbXVzdCBiZSBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiBvbnMuX2ludGVybmFsLmdldFBhZ2VIVE1MQXN5bmMocGFnZSkudGhlbihodG1sID0+IHtcbiAgICAgIGNvbnN0IGRpdiA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2PicgKyBodG1sICsgJzwvZGl2PicpO1xuXG4gICAgICBjb25zdCBwb3BvdmVyID0gZGl2LnF1ZXJ5U2VsZWN0b3IoJ29ucy1wb3BvdmVyJyk7XG4gICAgICBpZiAoIXBvcG92ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8b25zLXBvcG92ZXI+IGVsZW1lbnQgaXMgbm90IHByb3ZpZGVkIG9uIFwiJHtwYWdlfVwiIHBhZ2UuYCk7XG4gICAgICB9XG4gICAgICBDdXN0b21FbGVtZW50cy51cGdyYWRlKHBvcG92ZXIpO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3BvdmVyKTtcblxuICAgICAgaWYgKG9wdGlvbnMubGluayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIG9wdGlvbnMubGluayhwb3BvdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBvcG92ZXI7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5jcmVhdGVQb3BvdmVyID0gb25zLl9jcmVhdGVQb3BvdmVyT3JpZ2luYWw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMubGlua11cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5fY3JlYXRlRGlhbG9nT3JpZ2luYWwgPSBmdW5jdGlvbihwYWdlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoIXBhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFnZSB1cmwgbXVzdCBiZSBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiBvbnMuX2ludGVybmFsLmdldFBhZ2VIVE1MQXN5bmMocGFnZSkudGhlbihodG1sID0+IHtcbiAgICAgIGh0bWwgPSBodG1sLm1hdGNoKC88b25zLWRpYWxvZy9naSkgPyBgPGRpdj4ke2h0bWx9PC9kaXY+YCA6IGA8b25zLWRpYWxvZz4ke2h0bWx9PC9vbnMtZGlhbG9nPmA7XG4gICAgICBjb25zdCBkaXYgPSBvbnMuX3V0aWwuY3JlYXRlRWxlbWVudCgnPGRpdj4nICsgaHRtbCArICc8L2Rpdj4nKTtcblxuICAgICAgY29uc3QgZGlhbG9nID0gZGl2LnF1ZXJ5U2VsZWN0b3IoJ29ucy1kaWFsb2cnKTtcbiAgICAgIGlmICghZGlhbG9nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgPG9ucy1kaWFsb2c+IGVsZW1lbnQgaXMgbm90IHByb3ZpZGVkIG9uIFwiJHtwYWdlfVwiIHBhZ2UuYCk7XG4gICAgICB9XG4gICAgICBDdXN0b21FbGVtZW50cy51cGdyYWRlKGRpYWxvZyk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZyk7XG5cbiAgICAgIGlmIChvcHRpb25zLmxpbmsgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICBvcHRpb25zLmxpbmsoZGlhbG9nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgb25zLmNyZWF0ZURpYWxvZyA9IG9ucy5fY3JlYXRlRGlhbG9nT3JpZ2luYWw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMubGlua11cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5fY3JlYXRlQWxlcnREaWFsb2dPcmlnaW5hbCA9IGZ1bmN0aW9uKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmICghcGFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYWdlIHVybCBtdXN0IGJlIGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKGh0bWwgPT4ge1xuICAgICAgaHRtbCA9IGh0bWwubWF0Y2goLzxvbnMtYWxlcnQtZGlhbG9nL2dpKSA/IGA8ZGl2PiR7aHRtbH08L2Rpdj5gIDogYDxvbnMtYWxlcnQtZGlhbG9nPiR7aHRtbH08L29ucy1hbGVydC1kaWFsb2c+YDtcbiAgICAgIGNvbnN0IGRpdiA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2PicgKyBodG1sICsgJzwvZGl2PicpO1xuXG4gICAgICBjb25zdCBhbGVydERpYWxvZyA9IGRpdi5xdWVyeVNlbGVjdG9yKCdvbnMtYWxlcnQtZGlhbG9nJyk7XG4gICAgICBpZiAoIWFsZXJ0RGlhbG9nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgPG9ucy1hbGVydC1kaWFsb2c+IGVsZW1lbnQgaXMgbm90IHByb3ZpZGVkIG9uIFwiJHtwYWdlfVwiIHBhZ2UuYCk7XG4gICAgICB9XG4gICAgICBDdXN0b21FbGVtZW50cy51cGdyYWRlKGFsZXJ0RGlhbG9nKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYWxlcnREaWFsb2cpO1xuXG4gICAgICBpZiAob3B0aW9ucy5saW5rIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgb3B0aW9ucy5saW5rKGFsZXJ0RGlhbG9nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsZXJ0RGlhbG9nO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmxpbmtdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBvbnMuY3JlYXRlQWxlcnREaWFsb2dPcmlnaW5hbCA9IG9ucy5fY3JlYXRlQWxlcnREaWFsb2dPcmlnaW5hbDtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlua1xuICAgKi9cbiAgb25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyT3JpZ2luYWwgPSBmdW5jdGlvbihwYWdlLCBsaW5rKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBvbnMuX3V0aWwuYXJyYXlGcm9tKHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbb25zLWxvYWRpbmctcGxhY2Vob2xkZXJdJykpO1xuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVsZW1lbnRzXG4gICAgICAgIC5maWx0ZXIoZWxlbWVudCA9PiAhZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKSlcbiAgICAgICAgLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ29ucy1sb2FkaW5nLXBsYWNlaG9sZGVyJywgcGFnZSk7XG4gICAgICAgICAgb25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyKGVsZW1lbnQsIHBhZ2UsIGxpbmspO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBvbnMtbG9hZGluZy1wbGFjZWhvbGRlciBleGlzdHMuJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgKi9cbiAgb25zLnJlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIgPSBvbnMuX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXJPcmlnaW5hbDtcblxuICBvbnMuX3NldHVwTG9hZGluZ1BsYWNlSG9sZGVycyA9IGZ1bmN0aW9uKCkge1xuICAgIG9ucy5yZWFkeSgoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IG9ucy5fdXRpbC5hcnJheUZyb20od2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbnMtbG9hZGluZy1wbGFjZWhvbGRlcl0nKSk7XG5cbiAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnb25zLWxvYWRpbmctcGxhY2Vob2xkZXInKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG9ucy5fcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlcihlbGVtZW50LCBwYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgb25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyID0gZnVuY3Rpb24oZWxlbWVudCwgcGFnZSwgbGluaykge1xuICAgIGxpbmsgPSBsaW5rIHx8IGZ1bmN0aW9uKGVsZW1lbnQsIGRvbmUpIHsgZG9uZSgpOyB9O1xuICAgIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKGh0bWwgPT4ge1xuXG4gICAgICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBvbnMuX3V0aWwuY3JlYXRlRWxlbWVudCgnPGRpdj4nICsgaHRtbCArICc8L2Rpdj4nKTtcbiAgICAgIGNvbnRlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudEVsZW1lbnQpO1xuXG4gICAgICBsaW5rKGNvbnRlbnRFbGVtZW50LCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfSk7XG5cbiAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZWQgdG8gcmVzb2x2ZSBwbGFjZWhvbGRlcjogJyArIGVycm9yKTtcbiAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiB3YWl0RGV2aWNlUmVhZHkoKSB7XG4gICAgY29uc3QgdW5sb2NrRGV2aWNlUmVhZHkgPSBvbnMuX3JlYWR5TG9jay5sb2NrKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICBpZiAob25zLmlzV2ViVmlldygpKSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIHVubG9ja0RldmljZVJlYWR5LCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmxvY2tEZXZpY2VSZWFkeSgpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcbiAgfVxuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbCA9IG9ucy5fdXRpbCB8fCB7fTtcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBkb3QgY2xhc3MgbmFtZSBvciBub2RlIG5hbWUuXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50L251bGx9XG4gICAqL1xuICB1dGlsLmZpbmRDaGlsZCA9IChlbGVtZW50LCBxdWVyeSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoID0gcXVlcnkuc3Vic3RyKDAsIDEpID09PSAnLicgP1xuICAgICAgKG5vZGUpID0+IG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKHF1ZXJ5LnN1YnN0cigxKSkgOlxuICAgICAgKG5vZGUpID0+IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcXVlcnk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBlbGVtZW50LmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKG1hdGNoKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBxdWVyeSBkb3QgY2xhc3MgbmFtZSBvciBub2RlIG5hbWUuXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50L251bGx9XG4gICAqL1xuICB1dGlsLmZpbmRQYXJlbnQgPSAoZWxlbWVudCwgcXVlcnkpID0+IHtcbiAgICBjb25zdCBtYXRjaCA9IHF1ZXJ5LnN1YnN0cigwLCAxKSA9PT0gJy4nID9cbiAgICAgIChub2RlKSA9PiBub2RlLmNsYXNzTGlzdC5jb250YWlucyhxdWVyeS5zdWJzdHIoMSkpIDpcbiAgICAgIChub2RlKSA9PiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5O1xuXG4gICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaChwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqL1xuICB1dGlsLmNyZWF0ZUVsZW1lbnQgPSAoaHRtbCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICBpZiAod3JhcHBlci5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiaHRtbFwiIG11c3QgYmUgb25lIHdyYXBwZXIgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcHBlci5jaGlsZHJlblswXTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqL1xuICB1dGlsLnJlbW92ZUVsZW1lbnQgPSAoZWxlbWVudCkgPT4ge1xuICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH07XG5cbiAgLypcbiAgICogQHBhcmFtIHtPYmplY3R9IGRzdCBEZXN0aW5hdGlvbiBvYmplY3QuXG4gICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzcmMgU291cmNlIG9iamVjdChzKS5cbiAgICogQHJldHVybnMge09iamVjdH0gUmVmZXJlbmNlIHRvIGBkc3RgLlxuICAgKi9cbiAgdXRpbC5leHRlbmQgPSAoZHN0LCAuLi5hcmdzKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJnc1tpXSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJnc1tpXSk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbal07XG4gICAgICAgICAgZHN0W2tleV0gPSBhcmdzW2ldW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHN0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYXJyYXlMaWtlXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgdXRpbC5hcnJheUZyb20gPSAoYXJyYXlMaWtlKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheUxpa2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKGFycmF5TGlrZVtpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBNb2RhbEFuaW1hdG9yIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGltaW5nXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kZWxheVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuZGVsYXkgPSAwO1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IDAuMjtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICB0aGlzLnRpbWluZyA9IG9wdGlvbnMudGltaW5nIHx8IHRoaXMudGltaW5nO1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZHVyYXRpb24gOiB0aGlzLmR1cmF0aW9uO1xuICAgICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXkgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVsYXkgOiB0aGlzLmRlbGF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1vZGFsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzaG93KG1vZGFsLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgaGlkZShtb2RhbCwgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLk1vZGFsQW5pbWF0b3IgPSBNb2RhbEFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY2xhc3MgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGltaW5nXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kZWxheVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvbnMuX3V0aWwuZXh0ZW5kKHtcbiAgICAgICAgdGltaW5nOiAnbGluZWFyJyxcbiAgICAgICAgZHVyYXRpb246ICcwLjQnLFxuICAgICAgICBkZWxheTogJzAnXG4gICAgICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICAgICAgdGhpcy50aW1pbmcgPSBvcHRpb25zLnRpbWluZztcbiAgICAgIHRoaXMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uO1xuICAgICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXk7XG4gICAgfVxuXG4gICAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgPSBOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3I7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBQb3BvdmVyQW5pbWF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kdXJhdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9ucy5fdXRpbC5leHRlbmQoe1xuICAgICAgICB0aW1pbmc6ICdjdWJpYy1iZXppZXIoLjEsIC43LCAuNCwgMSknLFxuICAgICAgICBkdXJhdGlvbjogMC4yLFxuICAgICAgICBkZWxheTogMFxuICAgICAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgICAgIHRoaXMudGltaW5nID0gb3B0aW9ucy50aW1pbmc7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbjtcbiAgICAgIHRoaXMuZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuICAgIH1cblxuICAgIHNob3cocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgaGlkZShwb3BvdmVyLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5Qb3BvdmVyQW5pbWF0b3IgPSBQb3BvdmVyQW5pbWF0b3I7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBBbGVydERpYWxvZ0FuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgICAgdGhpcy50aW1pbmcgPSB0aW1pbmc7XG4gICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgICAqL1xuICAgIHNob3coZGlhbG9nLCBkb25lKSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgICAqL1xuICAgIGhpZGUoZGlhbG9nLCBkb25lKSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgc3R5bGUgYW5pbWF0b3IgZm9yIGFsZXJ0IGRpYWxvZy5cbiAgICovXG4gIGNsYXNzIEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgQWxlcnREaWFsb2dBbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2N1YmljLWJlemllciguMSwgLjcsIC40LCAxKScsIGR1cmF0aW9uID0gMC4yLCBkZWxheSA9IDB9ID0ge30pIHtcbiAgICAgIHN1cGVyKHtkdXJhdGlvbiwgdGltaW5nLCBkZWxheX0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKDAuOSwgMC45LCAxLjApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMC4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKDEuMCwgMS4wLCAxLjApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMS4wLCAxLjAsIDEuMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMC45LCAwLjksIDEuMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBhbGVydCBkaWFsb2cuXG4gICAqL1xuICBjbGFzcyBJT1NBbGVydERpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgQWxlcnREaWFsb2dBbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2N1YmljLWJlemllciguMSwgLjcsIC40LCAxKScsIGR1cmF0aW9uID0gMC4yLCBkZWxheSA9IDB9ID0ge30pIHtcbiAgICAgIHN1cGVyKHtkdXJhdGlvbiwgdGltaW5nLCBkZWxheX0pO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMS4zLCAxLjMsIDEuMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMS4wLCAxLjAsIDEuMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBoaWRlKGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICBvcGFjaXR5OiAwLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLkFsZXJ0RGlhbG9nQW5pbWF0b3IgPSBBbGVydERpYWxvZ0FuaW1hdG9yO1xuICBvbnMuX2ludGVybmFsLkFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yID0gQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3I7XG4gIG9ucy5faW50ZXJuYWwuSU9TQWxlcnREaWFsb2dBbmltYXRvciA9IElPU0FsZXJ0RGlhbG9nQW5pbWF0b3I7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBBbmltYXRvckZhY3Rvcnkge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cy5hbmltYXRvcnMgVGhlIGRpY3Rpb25hcnkgZm9yIGFuaW1hdG9yIGNsYXNzZXNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRzLmJhc2VDbGFzcyBUaGUgYmFzZSBjbGFzcyBvZiBhbmltYXRvcnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0cy5iYXNlQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBiYXNlIGNsYXNzIG9mIGFuaW1hdG9yc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRzLmRlZmF1bHRBbmltYXRpb24gVGhlIGRlZmF1bHQgYW5pbWF0aW9uIG5hbWVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cy5kZWZhdWx0QW5pbWF0aW9uT3B0aW9ucyBUaGUgZGVmYXVsdCBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgIHRoaXMuX2FuaW1hdG9ycyA9IG9wdHMuYW5pbWF0b3JzO1xuICAgICAgdGhpcy5fYmFzZUNsYXNzID0gb3B0cy5iYXNlQ2xhc3M7XG4gICAgICB0aGlzLl9iYXNlQ2xhc3NOYW1lID0gb3B0cy5iYXNlQ2xhc3NOYW1lIHx8IG9wdHMuYmFzZUNsYXNzLm5hbWU7XG4gICAgICB0aGlzLl9hbmltYXRpb24gPSBvcHRzLmRlZmF1bHRBbmltYXRpb24gfHwgJ2RlZmF1bHQnO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uT3B0aW9ucyA9IG9wdHMuZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmICghdGhpcy5fYW5pbWF0b3JzW3RoaXMuX2FuaW1hdGlvbl0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzdWNoIGFuaW1hdGlvbjogJyArIHRoaXMuX2FuaW1hdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGpzb25TdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtPYmplY3QvbnVsbH1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2VKU09OU2FmZWx5KGpzb25TdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqL1xuICAgIHNldEFuaW1hdGlvbk9wdGlvbnMob3B0aW9ucykge1xuICAgICAgdGhpcy5fYW5pbWF0aW9uT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBUaGUgYW5pbWF0aW9uIG5hbWVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc10gVGhlIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRBbmltYXRvciBUaGUgZGVmYXVsdCBhbmltYXRvciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gYW5pbWF0b3IgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBuZXdBbmltYXRvcihvcHRpb25zLCBkZWZhdWx0QW5pbWF0b3IpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICBsZXQgYW5pbWF0b3IgPSBudWxsO1xuXG4gICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gaW5zdGFuY2VvZiB0aGlzLl9iYXNlQ2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuYW5pbWF0aW9uO1xuICAgICAgfVxuXG4gICAgICBsZXQgQW5pbWF0b3IgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYW5pbWF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICBBbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yc1tvcHRpb25zLmFuaW1hdGlvbl07XG4gICAgICB9XG5cbiAgICAgIGlmICghQW5pbWF0b3IgJiYgZGVmYXVsdEFuaW1hdG9yKSB7XG4gICAgICAgIGFuaW1hdG9yID0gZGVmYXVsdEFuaW1hdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQW5pbWF0b3IgPSBBbmltYXRvciB8fCB0aGlzLl9hbmltYXRvcnNbdGhpcy5fYW5pbWF0aW9uXTtcblxuICAgICAgICBjb25zdCBhbmltYXRpb25PcHRzID0gb25zLl91dGlsLmV4dGVuZChcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zLFxuICAgICAgICAgIG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9ucyB8fCB7fSxcbiAgICAgICAgICBvbnMuX2NvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQgPyB7ZHVyYXRpb246IDAsIGRlbGF5OiAwfSA6IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgYW5pbWF0b3IgPSBuZXcgQW5pbWF0b3IoYW5pbWF0aW9uT3B0cyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGFuaW1hdG9yIGluc3RhbmNlb2YgdGhpcy5fYmFzZUNsYXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiYW5pbWF0b3JcIiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgJyArIHRoaXMuX2Jhc2VDbGFzc05hbWUgKyAnLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYW5pbWF0b3I7XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuQW5pbWF0b3JGYWN0b3J5ID0gQW5pbWF0b3JGYWN0b3J5O1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY2xhc3MgQXN5bmNIb29rIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5fY2FsbGJhY2tzID0gW107XG4gICAgICB0aGlzLl9mcm96ZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJlY2VpdmUgYSBmdW5jdGlvbiB0aGF0IHJlY2VpdmUgcmVzdWx0IG9iamVjdCBhbmQgdGFyZ2V0IG9iamVjdCBvcHRpbmFsbHlcbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gcGFzcy10aHJvdWdoIGNhbGxiYWNrIHBhcmFtZXRlclxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBhc3luY0hvb2suYWRkKChuZXh0LCB0YXJnZXQpID0+IG5leHQodGFyZ2V0ICsgdGFyZ2V0KSk7XG4gICAgICogICBhc3luY0hvb2sucnVuKHJlc3VsdCA9PiBjb25zb2xlLmxvZyhyZXN1bHQpLCAyKTsgLy8gcHJpbnQgNFxuICAgICAqL1xuICAgIGFkZChjYWxsYmFjaykge1xuICAgICAgaWYgKHRoaXMuX2Zyb3plbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaG9vayBpcyBmcm96ZW4uJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQSBmdW5jdGlvbiByZWNlaXZlIGEgZnVuY3Rpb24gdGhhdCByZWNlaXZlIHJlc3VsdCBvYmplY3QgYW5kIHRhcmdldCBvYmplY3Qgb3B0aW5hbGx5XG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICByZW1vdmUoY2FsbGJhY2spIHtcbiAgICAgIGlmICh0aGlzLl9mcm96ZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGhvb2sgaXMgZnJvemVuLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGcmVlemUgdGhpcyBob29rLiBBc3luY0hvb2sgZGVueSBhZGQoKSBhbmQgcmVtb3ZlKCkgb3BlcmF0aW9uIGFmdGVyIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuXG4gICAgICovXG4gICAgZnJlZXplKCkge1xuICAgICAgdGhpcy5fZnJvemVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJlY2VpdmUgdGFyZ2V0IG9iamVjdCBvcHRpb25hbGx5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XVxuICAgICAqL1xuICAgIHJ1bihjYWxsYmFjaywgdGFyZ2V0KSB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBjb25zdCBmID0gKCkgPT4ge1xuICAgICAgICBpZiAoaSA8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9jYWxsYmFja3NbaV0oKG5ld1RhcmdldCkgPT4ge1xuICAgICAgICAgICAgdGFyZ2V0ID0gbmV3VGFyZ2V0O1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgZigpO1xuICAgICAgICAgIH0sIHRhcmdldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGYoKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5Bc3luY0hvb2sgPSBBc3luY0hvb2s7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBEaWFsb2dBbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICAgIHRoaXMudGltaW5nID0gdGltaW5nO1xuICAgICAgdGhpcy5kZWxheSA9IGRlbGF5O1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICAgKi9cbiAgICBzaG93KGRpYWxvZywgZG9uZSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICAgKi9cbiAgICBoaWRlKGRpYWxvZywgZG9uZSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbmRyb2lkIHN0eWxlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gICAqL1xuICBjbGFzcyBBbmRyb2lkRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBEaWFsb2dBbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2Vhc2UtaW4tb3V0JywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuM30gPSB7fSkge1xuICAgICAgc3VwZXIoe3RpbWluZywgZGVsYXksIGR1cmF0aW9ufSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC02MCUsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMC4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTYwJSwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBpT1Mgc3R5bGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAgICovXG4gIGNsYXNzIElPU0RpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgRGlhbG9nQW5pbWF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdlYXNlLWluLW91dCcsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjN9ID0ge30pIHtcbiAgICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAzMDAlLCAwKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIDMwMCUsIDApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNsaWRlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gICAqL1xuICBjbGFzcyBTbGlkZURpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgRGlhbG9nQW5pbWF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoLjEsIC43LCAuNCwgMSknLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yfSA9IHt9KSB7XG4gICAgICBzdXBlcih7dGltaW5nLCBkZWxheSwgZHVyYXRpb259KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTUwJSwgLTM1MCUsIDApJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKC01MCUsIC01MCUsIDApJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBoaWRlKGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTUwJSwgLTUwJSwgMCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtNTAlLCAtMzUwJSwgMCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuRGlhbG9nQW5pbWF0b3IgPSBEaWFsb2dBbmltYXRvcjtcbiAgb25zLl9pbnRlcm5hbC5BbmRyb2lkRGlhbG9nQW5pbWF0b3IgPSBBbmRyb2lkRGlhbG9nQW5pbWF0b3I7XG4gIG9ucy5faW50ZXJuYWwuSU9TRGlhbG9nQW5pbWF0b3IgPSBJT1NEaWFsb2dBbmltYXRvcjtcbiAgb25zLl9pbnRlcm5hbC5TbGlkZURpYWxvZ0FuaW1hdG9yID0gU2xpZGVEaWFsb2dBbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgTW9kYWxBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTW9kYWxBbmltYXRvcjtcblxuICAvKipcbiAgICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gICAqL1xuICBjbGFzcyBGYWRlTW9kYWxBbmltYXRvciBleHRlbmRzIE1vZGFsQW5pbWF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucy50aW1pbmcgPSBvcHRpb25zLnRpbWluZyB8fCAnbGluZWFyJztcbiAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uIHx8ICcwLjMnO1xuICAgICAgb3B0aW9ucy5kZWxheSA9IG9wdGlvbnMuZGVsYXkgfHwgMDtcblxuICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNob3cobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQobW9kYWwpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9KVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICB9KVxuICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICAgICAucGxheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1vZGFsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBoaWRlKG1vZGFsLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0KG1vZGFsKVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgfSlcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgIH0pXG4gICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5wbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuRmFkZU1vZGFsQW5pbWF0b3IgPSBGYWRlTW9kYWxBbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuXG4gIC8qKlxuICAgKiBGYWRlLWluIHNjcmVlbiB0cmFuc2l0aW9uLlxuICAgKi9cbiAgY2xhc3MgRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciBleHRlbmRzIE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb25zLl91dGlsLmV4dGVuZCh7XG4gICAgICAgIHRpbWluZzogJ2xpbmVhcicsXG4gICAgICAgIGR1cmF0aW9uOiAnMC40JyxcbiAgICAgICAgZGVsYXk6ICcwJ1xuICAgICAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHB1c2goZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KFtlbnRlclBhZ2UuZWxlbWVudC5fZ2V0Q29udGVudEVsZW1lbnQoKSwgZW50ZXJQYWdlLmVsZW1lbnQuX2dldEJhY2tncm91bmRFbGVtZW50KCldKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlLmVsZW1lbnQuX2dldFRvb2xiYXJFbGVtZW50KCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgICAqL1xuICAgIHBvcChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KFtsZWF2ZVBhZ2UuZWxlbWVudC5fZ2V0Q29udGVudEVsZW1lbnQoKSwgbGVhdmVQYWdlLmVsZW1lbnQuX2dldEJhY2tncm91bmRFbGVtZW50KCldKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UuZWxlbWVudC5fZ2V0VG9vbGJhckVsZW1lbnQoKSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5GYWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IFBvcG92ZXJBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuUG9wb3ZlckFuaW1hdG9yO1xuXG4gIGNsYXNzIEZhZGVQb3BvdmVyQW5pbWF0b3IgZXh0ZW5kcyBQb3BvdmVyQW5pbWF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBvcG92ZXJcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgKi9cbiAgICBzaG93KHBvcG92ZXIsIGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBwb3AgPSBwb3BvdmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyJyk7XG4gICAgICBjb25zdCBtYXNrID0gcG9wb3Zlci5xdWVyeVNlbGVjdG9yKCcucG9wb3Zlci1tYXNrJyk7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICAgIGFuaW1pdChtYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQocG9wKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDEuMywgMS4zLCAxLjApJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMS4wLCAxLjAsICAxLjApJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBvcG92ZXJcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgKi9cbiAgICBoaWRlKHBvcG92ZXIsIGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBwb3AgPSBwb3BvdmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyJyk7XG4gICAgICBjb25zdCBtYXNrID0gcG9wb3Zlci5xdWVyeVNlbGVjdG9yKCcucG9wb3Zlci1tYXNrJyk7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICAgIGFuaW1pdChtYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQocG9wKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5GYWRlUG9wb3ZlckFuaW1hdG9yID0gRmFkZVBvcG92ZXJBbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuXG4gIC8qKlxuICAgKiBTbGlkZSBhbmltYXRvciBmb3IgbmF2aWdhdG9yIHRyYW5zaXRpb24gbGlrZSBpT1MncyBzY3JlZW4gc2xpZGUgdHJhbnNpdGlvbi5cbiAgICovXG4gIGNsYXNzIElPU1NsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvbnMuX3V0aWwuZXh0ZW5kKHtcbiAgICAgICAgZHVyYXRpb246IDAuNCxcbiAgICAgICAgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJyxcbiAgICAgICAgZGVsYXk6IDBcbiAgICAgIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gICAgICBzdXBlcihvcHRpb25zKTtcblxuICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzayA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgb3BhY2l0eTogMDtcIj48L2Rpdj5cbiAgICAgIGApO1xuICAgIH1cblxuICAgIF9kZWNvbXBvc2UocGFnZSkge1xuICAgICAgQ3VzdG9tRWxlbWVudHMudXBncmFkZShwYWdlLmVsZW1lbnQpO1xuICAgICAgY29uc3QgdG9vbGJhciA9IHBhZ2UuZWxlbWVudC5fZ2V0VG9vbGJhckVsZW1lbnQoKTtcbiAgICAgIEN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUodG9vbGJhcik7XG4gICAgICBjb25zdCBsZWZ0ID0gdG9vbGJhci5fZ2V0VG9vbGJhckxlZnRJdGVtc0VsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdG9vbGJhci5fZ2V0VG9vbGJhclJpZ2h0SXRlbXNFbGVtZW50KCk7XG5cbiAgICAgIGNvbnN0IGV4Y2x1ZGVCYWNrQnV0dG9uTGFiZWwgPSBmdW5jdGlvbihlbGVtZW50cykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvbnMtYmFjay1idXR0b24nKSB7XG4gICAgICAgICAgICBjb25zdCBpY29uRWxlbWVudCA9IGVsZW1lbnRzW2ldLnF1ZXJ5U2VsZWN0b3IoJy5vbnMtYmFjay1idXR0b25fX2ljb24nKTtcbiAgICAgICAgICAgIGlmIChpY29uRWxlbWVudCkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaChpY29uRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVsZW1lbnRzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3RoZXIgPSBbXVxuICAgICAgICAuY29uY2F0KGxlZnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwID8gbGVmdCA6IGV4Y2x1ZGVCYWNrQnV0dG9uTGFiZWwobGVmdC5jaGlsZHJlbikpXG4gICAgICAgIC5jb25jYXQocmlnaHQuY2hpbGRyZW4ubGVuZ3RoID09PSAwID8gcmlnaHQgOiBleGNsdWRlQmFja0J1dHRvbkxhYmVsKHJpZ2h0LmNoaWxkcmVuKSk7XG5cbiAgICAgIGNvbnN0IHBhZ2VMYWJlbHMgPSBbXG4gICAgICAgIHRvb2xiYXIuX2dldFRvb2xiYXJDZW50ZXJJdGVtc0VsZW1lbnQoKSxcbiAgICAgICAgdG9vbGJhci5fZ2V0VG9vbGJhckJhY2tCdXR0b25MYWJlbEVsZW1lbnQoKVxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZUxhYmVsczogcGFnZUxhYmVscyxcbiAgICAgICAgb3RoZXI6IG90aGVyLFxuICAgICAgICBjb250ZW50OiBwYWdlLmVsZW1lbnQuX2dldENvbnRlbnRFbGVtZW50KCksXG4gICAgICAgIGJhY2tncm91bmQ6IHBhZ2UuZWxlbWVudC5fZ2V0QmFja2dyb3VuZEVsZW1lbnQoKSxcbiAgICAgICAgdG9vbGJhcjogdG9vbGJhcixcbiAgICAgICAgYm90dG9tVG9vbGJhcjogcGFnZS5lbGVtZW50Ll9nZXRCb3R0b21Ub29sYmFyRWxlbWVudCgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIF9zaG91bGRBbmltYXRlVG9vbGJhcihlbnRlclBhZ2UsIGxlYXZlUGFnZSkge1xuICAgICAgY29uc3QgYm90aFBhZ2VIYXNUb29sYmFyID1cbiAgICAgICAgZW50ZXJQYWdlLmVsZW1lbnQuX2NhbkFuaW1hdGVUb29sYmFyKCkgJiYgbGVhdmVQYWdlLmVsZW1lbnQuX2NhbkFuaW1hdGVUb29sYmFyKCk7XG5cbiAgICAgIHZhciBub0FuZHJvaWRMaWtlVG9vbGJhciA9XG4gICAgICAgICFlbnRlclBhZ2UuZWxlbWVudC5fZ2V0VG9vbGJhckVsZW1lbnQoKS5jbGFzc0xpc3QuY29udGFpbnMoJ25hdmlnYXRpb24tYmFyLS1hbmRyb2lkJykgJiZcbiAgICAgICAgIWxlYXZlUGFnZS5lbGVtZW50Ll9nZXRUb29sYmFyRWxlbWVudCgpLmNsYXNzTGlzdC5jb250YWlucygnbmF2aWdhdGlvbi1iYXItLWFuZHJvaWQnKTtcblxuICAgICAgcmV0dXJuIGJvdGhQYWdlSGFzVG9vbGJhciAmJiBub0FuZHJvaWRMaWtlVG9vbGJhcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICAgIHV0aWwucmVtb3ZlRWxlbWVudCh0aGlzLmJhY2tncm91bmRNYXNrKTtcbiAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGxlYXZlUGFnZS5lbGVtZW50Lm5leHRTaWJsaW5nKTtcblxuICAgICAgY29uc3QgZW50ZXJQYWdlRGVjb21wb3NpdGlvbiA9IHRoaXMuX2RlY29tcG9zZShlbnRlclBhZ2UpO1xuICAgICAgY29uc3QgbGVhdmVQYWdlRGVjb21wb3NpdGlvbiA9IHRoaXMuX2RlY29tcG9zZShsZWF2ZVBhZ2UpO1xuXG4gICAgICBjb25zdCBkZWx0YSA9ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBsZWF2ZVBhZ2UuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDIpICogMC42KTtcbiAgICAgIH0pKCk7XG5cbiAgICAgIGNvbnN0IG1hc2tDbGVhciA9IGFuaW1pdCh0aGlzLmJhY2tncm91bmRNYXNrKVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgIH0pXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgb3BhY2l0eTogMC4xXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgLnF1ZXVlKChkb25lKSA9PiB7XG4gICAgICAgICAgdXRpbC5yZW1vdmVFbGVtZW50KHRoaXMuYmFja2dyb3VuZE1hc2spO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNob3VsZEFuaW1hdGVUb29sYmFyID0gdGhpcy5fc2hvdWxkQW5pbWF0ZVRvb2xiYXIoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UpO1xuXG4gICAgICBpZiAoc2hvdWxkQW5pbWF0ZVRvb2xiYXIpIHtcbiAgICAgICAgZW50ZXJQYWdlLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xuICAgICAgICBsZWF2ZVBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XG5cbiAgICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICAgIG1hc2tDbGVhcixcblxuICAgICAgICAgIGFuaW1pdChbZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGVudGVyUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0pXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwcHgsIDBweCknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLnRvb2xiYXIpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLCAwLCAwLCAwKScsXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkgKyAwLjMpXG4gICAgICAgICAgICAucmVzZXRTdHlsZSh7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjEsXG4gICAgICAgICAgICAgIHRyYW5zaXRpb246XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3IgMC4xcyBsaW5lYXIsICcgK1xuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3IgMC4xcyBsaW5lYXInXG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLnBhZ2VMYWJlbHMpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgnICsgZGVsdGEgKyAncHgsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ub3RoZXIpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtvcGFjaXR5OiAwfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7b3BhY2l0eTogMX0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChbbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0pXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKC0yNSUsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgICAgZW50ZXJQYWdlLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgICAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLnBhZ2VMYWJlbHMpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0nICsgZGVsdGEgKyAncHgsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKCksXG5cbiAgICAgICAgICBhbmltaXQobGVhdmVQYWdlRGVjb21wb3NpdGlvbi5vdGhlcilcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge29wYWNpdHk6IDF9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtvcGFjaXR5OiAwfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpXG5cbiAgICAgICAgKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBlbnRlclBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XG4gICAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcblxuICAgICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgICAgbWFza0NsZWFyLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZS5lbGVtZW50KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMTAwJSwgMHB4LCAwcHgpJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMHB4LCAwcHgsIDBweCknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKCksXG5cbiAgICAgICAgICBhbmltaXQobGVhdmVQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTI1JSwgMHB4LCAwcHgpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICAgIGVudGVyUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICAgICAgICBsZWF2ZVBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnJztcbiAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgICAqL1xuICAgIHBvcChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgZG9uZSkge1xuICAgICAgdXRpbC5yZW1vdmVFbGVtZW50KHRoaXMuYmFja2dyb3VuZE1hc2spO1xuICAgICAgZW50ZXJQYWdlLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgZW50ZXJQYWdlLmVsZW1lbnQubmV4dFNpYmxpbmcpO1xuXG4gICAgICBjb25zdCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGVudGVyUGFnZSk7XG4gICAgICBjb25zdCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGxlYXZlUGFnZSk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCByZWN0ID0gbGVhdmVQYWdlLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKCgocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgLyAyKSAqIDAuNik7XG4gICAgICB9KSgpO1xuXG4gICAgICBjb25zdCBtYXNrQ2xlYXIgPSBhbmltaXQodGhpcy5iYWNrZ3JvdW5kTWFzaylcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjEsXG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgIH0pXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICB9KVxuICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgIC5xdWV1ZSgoZG9uZSkgPT4ge1xuICAgICAgICAgIHV0aWwucmVtb3ZlRWxlbWVudCh0aGlzLmJhY2tncm91bmRNYXNrKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaG91bGRBbmltYXRlVG9vbGJhciA9IHRoaXMuX3Nob3VsZEFuaW1hdGVUb29sYmFyKGVudGVyUGFnZSwgbGVhdmVQYWdlKTtcblxuICAgICAgaWYgKHNob3VsZEFuaW1hdGVUb29sYmFyKSB7XG5cbiAgICAgICAgZW50ZXJQYWdlLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xuICAgICAgICBsZWF2ZVBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XG5cbiAgICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICAgIG1hc2tDbGVhcixcblxuICAgICAgICAgIGFuaW1pdChbZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGVudGVyUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0pXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtMjUlLCAwcHgsIDBweCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuOVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLnBhZ2VMYWJlbHMpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtJyArIGRlbHRhICsgJ3B4LCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLnRvb2xiYXIpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ub3RoZXIpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtvcGFjaXR5OiAwfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7b3BhY2l0eTogMX0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChbbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0pXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMTAwJSwgMHB4LCAwcHgpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KDApXG4gICAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZmluaXNoKSB7XG4gICAgICAgICAgICAgIGVudGVyUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICAgICAgICBsZWF2ZVBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnJztcbiAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24ub3RoZXIpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24udG9vbGJhcilcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICdub25lJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLnBhZ2VMYWJlbHMpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyBkZWx0YSArICdweCwgMCwgMCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgICAgbWFza0NsZWFyLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZS5lbGVtZW50KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTI1JSwgMHB4LCAwcHgpJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjlcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMHB4LCAwcHgsIDBweCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKCksXG5cbiAgICAgICAgICBhbmltaXQobGVhdmVQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMTAwJSwgMHB4LCAwcHgpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihmaW5pc2gpIHtcbiAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuSU9TU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgPSBJT1NTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG5cbiAgY2xhc3MgTGF6eVJlcGVhdERlbGVnYXRlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lIEEgZnVuY3Rpb24gdGhhdCB0YWtlIGl0ZW0gb2JqZWN0IGFzIHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBwcmVwYXJlSXRlbShpbmRleCwgZG9uZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgY291bnRJdGVtcygpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGl0ZW0uZWxlbWVudFxuICAgICAqL1xuICAgIHVwZGF0ZUl0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGNhbGN1bGF0ZUl0ZW1IZWlnaHQoaW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1cbiAgICAgKi9cbiAgICBkZXN0cm95SXRlbShpbmRleCwgaXRlbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgYW4gYWJzdHJhY3QgbWV0aG9kLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGNsYXNzIHByb3ZpZGUgY29yZSBmdW5jdGlvbnMgZm9yIG9ucy1sYXp5LXJlcGVhdC5cbiAgICovXG4gIGNsYXNzIExhenlSZXBlYXRQcm92aWRlciB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHdyYXBwZXJFbGVtZW50XG4gICAgICogQHBhcmFtIHtFbGVtZW50fSB0ZW1wbGF0ZUVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0xhenlSZXBlYXREZWxlZ2F0ZX0gZGVsZWdhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih3cmFwcGVyRWxlbWVudCwgdGVtcGxhdGVFbGVtZW50LCBkZWxlZ2F0ZSkge1xuICAgICAgaWYgKCEoZGVsZWdhdGUgaW5zdGFuY2VvZiBMYXp5UmVwZWF0RGVsZWdhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJkZWxlZ2F0ZVwiIHBhcmFtZXRlciBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIG9ucy5faW50ZXJuYWwuTGF6eVJlcGVhdERlbGVnYXRlLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoISh0ZW1wbGF0ZUVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1widGVtcGxhdGVFbGVtZW50XCIgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRWxlbWVudC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEod3JhcHBlckVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wid3JhcHBlckVsZW1lbnRcIiBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFbGVtZW50LicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSB0ZW1wbGF0ZUVsZW1lbnQ7XG4gICAgICB0aGlzLl93cmFwcGVyRWxlbWVudCA9IHdyYXBwZXJFbGVtZW50O1xuICAgICAgdGhpcy5fZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblxuICAgICAgdGhpcy5fcGFnZUNvbnRlbnQgPSB1dGlsLmZpbmRQYXJlbnQod3JhcHBlckVsZW1lbnQsICcucGFnZV9fY29udGVudCcpO1xuXG4gICAgICBpZiAoIXRoaXMuX3BhZ2VDb250ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25zLWxhenktcmVwZWF0IG11c3QgYmUgYSBkZXNjZW5kYW50IG9mIGFuIDxvbnMtcGFnZT4gZWxlbWVudC4nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXRlbUhlaWdodFN1bSA9IFtdO1xuICAgICAgdGhpcy5fbWF4SW5kZXggPSAwO1xuICAgICAgdGhpcy5fcmVuZGVyZWRJdGVtcyA9IHt9O1xuXG4gICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuXG4gICAgICB0aGlzLl9vbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIF9jb3VudEl0ZW1zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmNvdW50SXRlbXMoKTtcbiAgICB9XG5cbiAgICBfZ2V0SXRlbUhlaWdodChpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY2FsY3VsYXRlSXRlbUhlaWdodChpKTtcbiAgICB9XG5cbiAgICBfZ2V0VG9wT2Zmc2V0KCkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl93cmFwcGVyRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5fd3JhcHBlckVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyYXBwZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9vbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIF9yZW5kZXIoKSB7XG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2dldEl0ZW1zSW5WaWV3KCk7XG4gICAgICBjb25zdCBrZWVwID0ge307XG5cbiAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuX2l0ZW1IZWlnaHRTdW1bdGhpcy5fbWF4SW5kZXhdICsgJ3B4JztcblxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IF9pdGVtID0gaXRlbXNbaV07XG4gICAgICAgIHRoaXMuX3JlbmRlckVsZW1lbnQoX2l0ZW0pO1xuICAgICAgICBrZWVwW19pdGVtLmluZGV4XSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLl9yZW5kZXJlZEl0ZW1zKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZEl0ZW1zLmhhc093blByb3BlcnR5KGtleSkgJiYgIWtlZXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUVsZW1lbnQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgX2lzUmVuZGVyZWQoaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZEl0ZW1zLmhhc093blByb3BlcnR5KGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpdGVtLmluZGV4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGl0ZW0udG9wXG4gICAgICovXG4gICAgX3JlbmRlckVsZW1lbnQoe2luZGV4OiBpbmRleCwgdG9wOiB0b3B9KSB7XG4gICAgICBpZiAodGhpcy5faXNSZW5kZXJlZChpbmRleCkpIHtcbiAgICAgICAgLy8gVXBkYXRlIGNvbnRlbnQgZXZlbiBpZiBpdCdzIGFscmVhZHkgYWRkZWQgdG8gRE9NXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGNoYW5nZXMgd2l0aGluIHRoZSBsaXN0LlxuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdO1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZS51cGRhdGVJdGVtKGluZGV4LCBjdXJyZW50SXRlbSk7XG5cbiAgICAgICAgLy8gRml4IHBvc2l0aW9uLlxuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdLmVsZW1lbnQ7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gdG9wICsgJ3B4JztcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2RlbGVnYXRlLnByZXBhcmVJdGVtKGluZGV4LCAoaXRlbSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBpdGVtLmVsZW1lbnQ7XG5cbiAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gdG9wICsgJ3B4JztcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnMHB4JztcblxuICAgICAgICB0aGlzLl93cmFwcGVyRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJlZEl0ZW1zW2luZGV4XSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICAgKi9cbiAgICBfcmVtb3ZlRWxlbWVudChpbmRleCkge1xuICAgICAgaWYgKCF0aGlzLl9pc1JlbmRlcmVkKGluZGV4KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBpdGVtID0gdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF07XG5cbiAgICAgIHRoaXMuX2RlbGVnYXRlLmRlc3Ryb3lJdGVtKGluZGV4LCBpdGVtKTtcblxuICAgICAgaWYgKGl0ZW0uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIGl0ZW0uZWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGl0ZW0uZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBpdGVtID0gbnVsbDtcblxuICAgICAgZGVsZXRlIHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdO1xuICAgIH1cblxuICAgIF9yZW1vdmVBbGxFbGVtZW50cygpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLl9yZW5kZXJlZEl0ZW1zKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZEl0ZW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB0aGlzLl9yZW1vdmVFbGVtZW50KGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlU3RhcnRJbmRleChjdXJyZW50KSB7XG4gICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgbGV0IGVuZCA9IHRoaXMuX21heEluZGV4O1xuXG4gICAgICAvLyBCaW5hcnkgc2VhcmNoIGZvciBpbmRleCBhdCB0b3Agb2Ygc2NyZWVuIHNvXG4gICAgICAvLyB3ZSBjYW4gc3BlZWQgdXAgcmVuZGVyaW5nLlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChzdGFydCArIGVuZCkgLyAyKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjdXJyZW50ICsgdGhpcy5faXRlbUhlaWdodFN1bVttaWRkbGVdO1xuXG4gICAgICAgIGlmIChlbmQgPCBzdGFydCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgLSB0aGlzLl9nZXRJdGVtSGVpZ2h0KG1pZGRsZSkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIG1pZGRsZTtcbiAgICAgICAgfSBlbHNlIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPj0gMCkge1xuICAgICAgICAgIGVuZCA9IG1pZGRsZSAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3JlY2FsY3VsYXRlSXRlbUhlaWdodFN1bSgpIHtcbiAgICAgIGxldCBzdW1zID0gdGhpcy5faXRlbUhlaWdodFN1bTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBzdW0gPSAwOyBpIDwgTWF0aC5taW4oc3Vtcy5sZW5ndGgsIHRoaXMuX2NvdW50SXRlbXMoKSk7IGkrKykge1xuICAgICAgICBzdW0gKz0gdGhpcy5fZ2V0SXRlbUhlaWdodChpKTtcbiAgICAgICAgc3Vtc1tpXSA9IHN1bTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2V0SXRlbXNJblZpZXcoKSB7XG4gICAgICBjb25zdCB0b3BPZmZzZXQgPSB0aGlzLl9nZXRUb3BPZmZzZXQoKTtcbiAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHRvcE9mZnNldDtcbiAgICAgIGNvbnN0IGNudCA9IHRoaXMuX2NvdW50SXRlbXMoKTtcblxuICAgICAgaWYgKGNudCAhPT0gdGhpcy5faXRlbUNvdW50KXtcbiAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVJdGVtSGVpZ2h0U3VtKCk7XG4gICAgICAgIHRoaXMuX21heEluZGV4ID0gY250IC0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2l0ZW1Db3VudCA9IGNudDtcblxuICAgICAgbGV0IHN0YXJ0SW5kZXggPSB0aGlzLl9jYWxjdWxhdGVTdGFydEluZGV4KHRvcFBvc2l0aW9uKTtcbiAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1heChzdGFydEluZGV4IC0gMzAsIDApO1xuXG4gICAgICBpZiAoc3RhcnRJbmRleCA+IDApIHtcbiAgICAgICAgdG9wUG9zaXRpb24gKz0gdGhpcy5faXRlbUhlaWdodFN1bVtzdGFydEluZGV4IC0gMV07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGNudCAmJiB0b3BQb3NpdGlvbiA8IDQgKiB3aW5kb3cuaW5uZXJIZWlnaHQ7IGkrKykge1xuICAgICAgICBjb25zdCBoID0gdGhpcy5fZ2V0SXRlbUhlaWdodChpKTtcblxuICAgICAgICBpZiAoaSA+PSB0aGlzLl9pdGVtSGVpZ2h0U3VtLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2l0ZW1IZWlnaHRTdW0gPSB0aGlzLl9pdGVtSGVpZ2h0U3VtLmNvbmNhdChuZXcgQXJyYXkoMTAwKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICB0aGlzLl9pdGVtSGVpZ2h0U3VtW2ldID0gdGhpcy5faXRlbUhlaWdodFN1bVtpIC0gMV0gKyBoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2l0ZW1IZWlnaHRTdW1baV0gPSBoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWF4SW5kZXggPSBNYXRoLm1heChpLCB0aGlzLl9tYXhJbmRleCk7XG5cbiAgICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgdG9wOiB0b3BQb3NpdGlvbiAtIHRvcE9mZnNldFxuICAgICAgICB9KTtcblxuICAgICAgICB0b3BQb3NpdGlvbiArPSBoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgdGhpcy5fYm91bmRPbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuX3BhZ2VDb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIHRydWUpO1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIHRydWUpO1xuICAgIH1cblxuICAgIF9yZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHRoaXMuX3BhZ2VDb250ZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIHRydWUpO1xuICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIHRydWUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLl9kZWxlZ2F0ZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9wYXJlbnRFbGVtZW50ID0gdGhpcy5fdGVtcGxhdGVFbGVtZW50ID0gdGhpcy5fZGVsZWdhdGUgPSB0aGlzLl9yZW5kZXJlZEl0ZW1zID0gbnVsbDtcbiAgICAgIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuTGF6eVJlcGVhdFByb3ZpZGVyID0gTGF6eVJlcGVhdFByb3ZpZGVyO1xuICBvbnMuX2ludGVybmFsLkxhenlSZXBlYXREZWxlZ2F0ZSA9IExhenlSZXBlYXREZWxlZ2F0ZTtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuXG4gIC8qKlxuICAgKiBMaWZ0IHNjcmVlbiB0cmFuc2l0aW9uLlxuICAgKi9cbiAgY2xhc3MgTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciBleHRlbmRzIE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb25zLl91dGlsLmV4dGVuZCh7XG4gICAgICAgIGR1cmF0aW9uOiAwLjQsXG4gICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKScsXG4gICAgICAgIGRlbGF5OiAwXG4gICAgICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICAgICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICAgIHRoaXMuYmFja2dyb3VuZE1hc2sgPSBvbnMuX3V0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7XCI+PC9kaXY+XG4gICAgICBgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICAgIHV0aWwucmVtb3ZlRWxlbWVudCh0aGlzLmJhY2tncm91bmRNYXNrKTtcbiAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGxlYXZlUGFnZS5lbGVtZW50KTtcblxuICAgICAgY29uc3QgbWFza0NsZWFyID0gYW5pbWl0KHRoaXMuYmFrY2tncm91bmRNYXNrKVxuICAgICAgICAud2FpdCgwLjYpXG4gICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgbWFzay5yZW1vdmUoKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIG1hc2tDbGVhcixcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAxMDAlLCAwKScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCgwLjIpXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UuZWxlbWVudClcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAtMTAlLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDAuOVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHBvcChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICAgIHV0aWwucmVtb3ZlRWxlbWVudCh0aGlzLmJhY2tncm91bmRNYXNrKTtcbiAgICAgIGVudGVyUGFnZS5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGVudGVyUGFnZS5lbGVtZW50KTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQodGhpcy5iYWNrZ3JvdW5kTWFzaylcbiAgICAgICAgICAud2FpdCgwLjQpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIG1hc2sucmVtb3ZlKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZS5lbGVtZW50KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgLTEwJSwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwLjlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLndhaXQoMC40KVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UuZWxlbWVudClcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMTAwJSwgMCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5MaWZ0TmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cblxuICBjbGFzcyBNb2RpZmllclV0aWwge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYXN0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGN1cnJlbnRcbiAgICAgKi9cbiAgICBzdGF0aWMgZGlmZihsYXN0LCBjdXJyZW50KSB7XG4gICAgICBsYXN0ID0gbWFrZURpY3QoKCcnICsgbGFzdCkudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSBtYWtlRGljdCgoJycgKyBjdXJyZW50KS50cmltKCkpO1xuXG4gICAgICBjb25zdCByZW1vdmVkID0gT2JqZWN0LmtleXMobGFzdCkucmVkdWNlKChyZXN1bHQsIHRva2VuKSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudFt0b2tlbl0pIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sIFtdKTtcblxuICAgICAgY29uc3QgYWRkZWQgPSBPYmplY3Qua2V5cyhjdXJyZW50KS5yZWR1Y2UoKHJlc3VsdCwgdG9rZW4pID0+IHtcbiAgICAgICAgaWYgKCFsYXN0W3Rva2VuXSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSwgW10pO1xuXG4gICAgICByZXR1cm4ge2FkZGVkLCByZW1vdmVkfTtcblxuICAgICAgZnVuY3Rpb24gbWFrZURpY3QobW9kaWZpZXIpIHtcbiAgICAgICAgY29uc3QgZGljdCA9IHt9O1xuICAgICAgICBNb2RpZmllclV0aWwuc3BsaXQobW9kaWZpZXIpLmZvckVhY2godG9rZW4gPT4gZGljdFt0b2tlbl0gPSB0b2tlbik7XG4gICAgICAgIHJldHVybiBkaWN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWZmXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNsYXNzTGlzdFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBhcHBseURpZmZUb0NsYXNzTGlzdChkaWZmLCBjbGFzc0xpc3QsIHRlbXBsYXRlKSB7XG4gICAgICBkaWZmLmFkZGVkXG4gICAgICAgIC5tYXAobW9kaWZpZXIgPT4gdGVtcGxhdGUucmVwbGFjZSgvXFwqL2csIG1vZGlmaWVyKSlcbiAgICAgICAgLmZvckVhY2goa2xhc3MgPT4gY2xhc3NMaXN0LmFkZChrbGFzcykpO1xuXG4gICAgICBkaWZmLnJlbW92ZWRcbiAgICAgICAgLm1hcChtb2RpZmllciA9PiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXCovZywgbW9kaWZpZXIpKVxuICAgICAgICAuZm9yRWFjaChrbGFzcyA9PiBjbGFzc0xpc3QucmVtb3ZlKGtsYXNzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpZmZcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtZVxuICAgICAqL1xuICAgIHN0YXRpYyBhcHBseURpZmZUb0VsZW1lbnQoZGlmZiwgZWxlbWVudCwgc2NoZW1lKSB7XG4gICAgICBmb3IgKGxldCBzZWxlY3RvciBpbiBzY2hlbWUpIHtcbiAgICAgICAgaWYgKHNjaGVtZS5oYXNPd25Qcm9wZXJ0eShzZWxlY3RvcikpIHtcbiAgICAgICAgICBsZXQgdGFyZ2V0RWxlbWVudHMgPSBzZWxlY3RvciA9PT0gJycgPyBbZWxlbWVudF0gOiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIE1vZGlmaWVyVXRpbC5hcHBseURpZmZUb0NsYXNzTGlzdChkaWZmLCB0YXJnZXRFbGVtZW50c1tpXS5jbGFzc0xpc3QsIHNjaGVtZVtzZWxlY3Rvcl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsYXN0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGN1cnJlbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtZVxuICAgICAqL1xuICAgIHN0YXRpYyBvbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCBlbGVtZW50LCBzY2hlbWUpIHtcbiAgICAgIHJldHVybiBNb2RpZmllclV0aWwuYXBwbHlEaWZmVG9FbGVtZW50KE1vZGlmaWVyVXRpbC5kaWZmKGxhc3QsIGN1cnJlbnQpLCBlbGVtZW50LCBzY2hlbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1lXG4gICAgICovXG4gICAgc3RhdGljIGluaXRNb2RpZmllcihlbGVtZW50LCBzY2hlbWUpIHtcbiAgICAgIGNvbnN0IG1vZGlmaWVyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJyk7XG4gICAgICBpZiAodHlwZW9mIG1vZGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIE1vZGlmaWVyVXRpbC5hcHBseURpZmZUb0VsZW1lbnQoe1xuICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgICAgYWRkZWQ6IE1vZGlmaWVyVXRpbC5zcGxpdChtb2RpZmllcilcbiAgICAgIH0sIGVsZW1lbnQsIHNjaGVtZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNwbGl0KG1vZGlmaWVyKSB7XG4gICAgICBpZiAodHlwZW9mIG1vZGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtb2RpZmllci50cmltKCkuc3BsaXQoLyArLykuZmlsdGVyKHRva2VuID0+IHRva2VuICE9PSAnJyk7XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsID0gTW9kaWZpZXJVdGlsO1xufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG5cbiAgY2xhc3MgTmF2aWdhdG9yUGFnZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5wYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5lbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5vcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5uYXZpZ2F0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgIHRoaXMucGFnZSA9IHBhcmFtcy5wYWdlO1xuICAgICAgdGhpcy5uYW1lID0gcGFyYW1zLnBhZ2U7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBwYXJhbXMuZWxlbWVudDtcbiAgICAgIHRoaXMub3B0aW9ucyA9IHBhcmFtcy5vcHRpb25zO1xuICAgICAgdGhpcy5uYXZpZ2F0b3IgPSBwYXJhbXMubmF2aWdhdG9yO1xuXG4gICAgICAvLyBCbG9jayBldmVudHMgd2hpbGUgcGFnZSBpcyBiZWluZyBhbmltYXRlZCB0byBzdG9wIHNjcm9sbGluZywgcHJlc3NpbmcgYnV0dG9ucywgZXRjLlxuICAgICAgdGhpcy5fYmxvY2tFdmVudHMgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdG9yLl9pc1BvcHBpbmcgfHwgdGhpcy5uYXZpZ2F0b3IuX2lzUHVzaGluZykge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX3BvaW50ZXJFdmVudHMuZm9yRWFjaChldmVudCA9PiB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgdGhpcy5fYmxvY2tFdmVudHMpLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZ2V0IF9wb2ludGVyRXZlbnRzKCkge1xuICAgICAgcmV0dXJuIFsndG91Y2hzdGFydCcsICd0b3VjaGVuZCcsICd0b3VjaG1vdmUnLCAnY2xpY2snXTtcbiAgICB9XG5cbiAgICBnZXREZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtQYWdlVmlld31cbiAgICAgKi9cbiAgICBnZXRQYWdlVmlldygpIHtcbiAgICAgIGlmICghdGhpcy5fcGFnZSkge1xuICAgICAgICB0aGlzLl9wYWdlID0gdXRpbC5maW5kUGFyZW50KCdvbnMtcGFnZScpO1xuICAgICAgICBpZiAoIXRoaXMuX3BhZ2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWwgdG8gZmV0Y2ggb25zLXBhZ2UgZWxlbWVudC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIHRoaXMuX3BvaW50ZXJFdmVudHMuZm9yRWFjaChldmVudCA9PiB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgdGhpcy5fYmxvY2tFdmVudHMpLCBmYWxzZSk7XG4gICAgICB1dGlsLnJlbW92ZUVsZW1lbnQodGhpcy5lbGVtZW50KTtcblxuXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubmF2aWdhdG9yLl9wYWdlcy5pbmRleE9mKHRoaXMpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLm5hdmlnYXRvci5fcGFnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5fcGFnZSA9IHRoaXMub3B0aW9ucyA9IHRoaXMubmF2aWdhdG9yID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3aW5kb3cub25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JQYWdlID0gTmF2aWdhdG9yUGFnZTtcbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcblxuICBvbnMuX2ludGVybmFsLm51bGxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBvbnMuX2ludGVybmFsLmlzRW5hYmxlZEF1dG9TdGF0dXNCYXJGaWxsID0gKCkgPT4ge1xuICAgIHJldHVybiAhIW9ucy5fY29uZmlnLmF1dG9TdGF0dXNCYXJGaWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqL1xuICBvbnMuX2ludGVybmFsLm5vcm1hbGl6ZVBhZ2VIVE1MID0gKGh0bWwpID0+IHtcbiAgICBodG1sID0gKCcnICsgaHRtbCkudHJpbSgpO1xuXG4gICAgaWYgKCFodG1sLm1hdGNoKC9ePChvbnMtcGFnZXxvbnMtbmF2aWdhdG9yfG9ucy10YWJiYXJ8b25zLXNsaWRpbmctbWVudXxvbnMtc3BsaXQtdmlldykvKSkge1xuICAgICAgaHRtbCA9ICc8b25zLXBhZ2U+JyArIGh0bWwgKyAnPC9vbnMtcGFnZT4nO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sO1xuICB9O1xuXG4gIG9ucy5faW50ZXJuYWwud2FpdERPTUNvbnRlbnRMb2FkZWQgPSAoY2FsbGJhY2spID0+IHtcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ3VuaW5pdGlhbGl6ZWQnKSB7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIG9ucy5faW50ZXJuYWwuc2hvdWxkRmlsbFN0YXR1c0JhciA9IChlbGVtZW50KSA9PiB7XG4gICAgaWYgKG9ucy5faW50ZXJuYWwuaXNFbmFibGVkQXV0b1N0YXR1c0JhckZpbGwoKSAmJiBvbnMucGxhdGZvcm0uaXNXZWJWaWV3KCkgJiYgb25zLnBsYXRmb3JtLmlzSU9TN2Fib3ZlKCkpIHtcbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ25vLXN0YXR1cy1iYXItZmlsbCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBvbnMuX2ludGVybmFsLnRlbXBsYXRlU3RvcmUgPSB7XG4gICAgX3N0b3JhZ2U6IHt9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgICAqIEByZXR1cm4ge1N0cmluZy9udWxsfSB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBvbnMuX2ludGVybmFsLnRlbXBsYXRlU3RvcmUuX3N0b3JhZ2Vba2V5XSB8fCBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gICAgICovXG4gICAgc2V0KGtleSwgdGVtcGxhdGUpIHtcbiAgICAgIG9ucy5faW50ZXJuYWwudGVtcGxhdGVTdG9yZS5fc3RvcmFnZVtrZXldID0gdGVtcGxhdGU7XG4gICAgfVxuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ190ZW1wbGF0ZWxvYWRlZCcsIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy10ZW1wbGF0ZScpIHtcbiAgICAgIG9ucy5faW50ZXJuYWwudGVtcGxhdGVTdG9yZS5zZXQoZS50ZW1wbGF0ZUlkLCBlLnRlbXBsYXRlKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgcmVnaXN0ZXIoJ3NjcmlwdFt0eXBlPVwidGV4dC9vbnMtdGVtcGxhdGVcIl0nKTtcbiAgICByZWdpc3Rlcignc2NyaXB0W3R5cGU9XCJ0ZXh0L3RlbXBsYXRlXCJdJyk7XG4gICAgcmVnaXN0ZXIoJ3NjcmlwdFt0eXBlPVwidGV4dC9uZy10ZW1wbGF0ZVwiXScpO1xuXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXIocXVlcnkpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb25zLl9pbnRlcm5hbC50ZW1wbGF0ZVN0b3JlLnNldCh0ZW1wbGF0ZXNbaV0uZ2V0QXR0cmlidXRlKCdpZCcpLCB0ZW1wbGF0ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBcbiAgICovXG4gIG9ucy5faW50ZXJuYWwuZ2V0VGVtcGxhdGVIVE1MQXN5bmMgPSBmdW5jdGlvbihwYWdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gb25zLl9pbnRlcm5hbC50ZW1wbGF0ZVN0b3JlLmdldChwYWdlKTtcblxuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICBjb25zdCBodG1sID0gdHlwZW9mIGNhY2hlID09PSAnc3RyaW5nJyA/IGNhY2hlIDogY2FjaGVbMV07XG4gICAgICAgICAgcmVzb2x2ZShodG1sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICB4aHIub3BlbignR0VUJywgcGFnZSwgdHJ1ZSk7XG4gICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0geGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIHJlc29sdmUoaHRtbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGFnZSBpcyBub3QgZm91bmQ6ICR7cGFnZX1gKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHhoci5zZW5kKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogQHJldHVybiB7UHJvbWlzZX0gXG4gICAqL1xuICBvbnMuX2ludGVybmFsLmdldFBhZ2VIVE1MQXN5bmMgPSBmdW5jdGlvbihwYWdlKSB7XG4gICAgcmV0dXJuIG9ucy5faW50ZXJuYWwuZ2V0VGVtcGxhdGVIVE1MQXN5bmMocGFnZSkudGhlbihodG1sID0+IG5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpKTtcblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpIHtcbiAgICAgIGh0bWwgPSAoJycgKyBodG1sKS50cmltKCk7XG5cbiAgICAgIGlmICghaHRtbC5tYXRjaCgvXjwob25zLXBhZ2V8b25zLW5hdmlnYXRvcnxvbnMtdGFiYmFyfG9ucy1zbGlkaW5nLW1lbnV8b25zLXNwbGl0LXZpZXcpLykpIHtcbiAgICAgICAgaHRtbCA9ICc8b25zLXBhZ2U+JyArIGh0bWwgKyAnPC9vbnMtcGFnZT4nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gIH07XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuXG4gIG9ucy5ub3RpZmljYXRpb24gPSB7fTtcblxuICBvbnMubm90aWZpY2F0aW9uLl9jcmVhdGVBbGVydERpYWxvZyA9IGZ1bmN0aW9uKHRpdGxlLCBtZXNzYWdlLFxuICAgIGJ1dHRvbkxhYmVscywgcHJpbWFyeUJ1dHRvbkluZGV4LCBtb2RpZmllciwgYW5pbWF0aW9uLCBjYWxsYmFjayxcbiAgICBtZXNzYWdlSXNIVE1MLCBjYW5jZWxhYmxlLCBwcm9tcHREaWFsb2csIGF1dG9mb2N1cywgcGxhY2Vob2xkZXIsXG4gICAgc3VibWl0T25FbnRlciwgY29tcGlsZSkge1xuXG4gICAgY29tcGlsZSA9IGNvbXBpbGUgfHwgKChvYmplY3QpID0+IG9iamVjdCk7XG5cbiAgICBsZXQgZGlhbG9nRWxlbWVudCA9IHV0aWwuY3JlYXRlRWxlbWVudCgnPG9ucy1hbGVydC1kaWFsb2c+PC9vbnMtYWxlcnQtZGlhbG9nPicpO1xuICAgIGxldCB0aXRsZUVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctdGl0bGVcIj48L2Rpdj4nKTtcbiAgICBsZXQgbWVzc2FnZUVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctY29udGVudFwiPjwvZGl2PicpO1xuICAgIGxldCBmb290ZXJFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWZvb3RlclwiPjwvZGl2PicpO1xuICAgIGxldCBpbnB1dEVsZW1lbnQ7XG5cbiAgICBpZiAobW9kaWZpZXIpIHtcbiAgICAgIGRpYWxvZ0VsZW1lbnQuc2V0QXR0cmlidXRlKCdtb2RpZmllcicsIG1vZGlmaWVyKTtcbiAgICB9XG5cbiAgICBkaWFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJywgYW5pbWF0aW9uKTtcblxuICAgIGlmIChtZXNzYWdlSXNIVE1MKSB7XG4gICAgICBtZXNzYWdlRWxlbWVudC5pbm5lckhUTUwgPSBtZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZGlhbG9nRWxlbWVudC5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xuICAgIGRpYWxvZ0VsZW1lbnQuYXBwZW5kQ2hpbGQobWVzc2FnZUVsZW1lbnQpO1xuXG4gICAgaWYgKHByb21wdERpYWxvZykge1xuICAgICAgaW5wdXRFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KCc8aW5wdXQgY2xhc3M9XCJ0ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj48L2lucHV0PicpO1xuICAgICAgaW5wdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCBwbGFjZWhvbGRlcik7XG4gICAgICBpbnB1dEVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBpbnB1dEVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJzEwcHgnO1xuXG4gICAgICBtZXNzYWdlRWxlbWVudC5hcHBlbmRDaGlsZChpbnB1dEVsZW1lbnQpO1xuXG4gICAgICBpZiAoc3VibWl0T25FbnRlcikge1xuICAgICAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5oaWRlKHtcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpYWxvZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZm9vdGVyRWxlbWVudCk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xuXG4gICAgY29tcGlsZShkaWFsb2dFbGVtZW50KTtcblxuICAgIGlmIChidXR0b25MYWJlbHMubGVuZ3RoIDw9IDIpIHtcbiAgICAgIGZvb3RlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nLWZvb3Rlci0tb25lJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24oaSkge1xuICAgICAgbGV0IGJ1dHRvbkVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxidXR0b24gY2xhc3M9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCI+PC9idXR0b24+Jyk7XG4gICAgICBidXR0b25FbGVtZW50LnRleHRDb250ZW50ID0gYnV0dG9uTGFiZWxzW2ldO1xuXG4gICAgICBpZiAoaSA9PSBwcmltYXJ5QnV0dG9uSW5kZXgpIHtcbiAgICAgICAgYnV0dG9uRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhbGVydC1kaWFsb2ctYnV0dG9uLS1wcmltYWwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1dHRvbkxhYmVscy5sZW5ndGggPD0gMikge1xuICAgICAgICBidXR0b25FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FsZXJ0LWRpYWxvZy1idXR0b24tLW9uZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbkNsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGJ1dHRvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCBmYWxzZSk7XG5cbiAgICAgICAgZGlhbG9nRWxlbWVudC5oaWRlKHtcbiAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAocHJvbXB0RGlhbG9nKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjYWxsYmFjayhpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGlhbG9nRWxlbWVudCA9IGlucHV0RWxlbWVudCA9IGJ1dHRvbkVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBidXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgZmFsc2UpO1xuICAgICAgZm9vdGVyRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b25FbGVtZW50KTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNyZWF0ZUJ1dHRvbihpKTtcbiAgICB9XG5cbiAgICBpZiAoY2FuY2VsYWJsZSkge1xuICAgICAgZGlhbG9nRWxlbWVudC5zZXRDYW5jZWxhYmxlKGNhbmNlbGFibGUpO1xuICAgICAgZGlhbG9nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5jZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHByb21wdERpYWxvZykge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKC0xKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIGRpYWxvZ0VsZW1lbnQgPSBudWxsO1xuICAgICAgICAgIGlucHV0RWxlbWVudCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGRpYWxvZ0VsZW1lbnQuc2hvdyh7XG4gICAgICBjYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChpbnB1dEVsZW1lbnQgJiYgcHJvbXB0RGlhbG9nICYmIGF1dG9mb2N1cykge1xuICAgICAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aXRsZUVsZW1lbnQgPSBtZXNzYWdlRWxlbWVudCA9IGZvb3RlckVsZW1lbnQgPSBudWxsO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkaWFsb2dFbGVtZW50KTtcbiAgfTtcblxuICBvbnMubm90aWZpY2F0aW9uLl9hbGVydE9yaWdpbmFsID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGJ1dHRvbkxhYmVsOiAnT0snLFxuICAgICAgYW5pbWF0aW9uOiAnZGVmYXVsdCcsXG4gICAgICB0aXRsZTogJ0FsZXJ0JyxcbiAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHt9XG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy5tZXNzYWdlICYmICFvcHRpb25zLm1lc3NhZ2VIVE1MKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsZXJ0IGRpYWxvZyBtdXN0IGNvbnRhaW4gYSBtZXNzYWdlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBvbnMubm90aWZpY2F0aW9uLl9jcmVhdGVBbGVydERpYWxvZyhcbiAgICAgIG9wdGlvbnMudGl0bGUsXG4gICAgICBvcHRpb25zLm1lc3NhZ2UgfHwgb3B0aW9ucy5tZXNzYWdlSFRNTCxcbiAgICAgIFtvcHRpb25zLmJ1dHRvbkxhYmVsXSxcbiAgICAgIDAsXG4gICAgICBvcHRpb25zLm1vZGlmaWVyLFxuICAgICAgb3B0aW9ucy5hbmltYXRpb24sXG4gICAgICBvcHRpb25zLmNhbGxiYWNrLFxuICAgICAgIW9wdGlvbnMubWVzc2FnZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsXG4gICAgICBvcHRpb25zLmNvbXBpbGVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VIVE1MXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYnV0dG9uTGFiZWxdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1vZGlmaWVyXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY29tcGlsZV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5ub3RpZmljYXRpb24uYWxlcnQgPSBvbnMubm90aWZpY2F0aW9uLl9hbGVydE9yaWdpbmFsO1xuXG4gIG9ucy5ub3RpZmljYXRpb24uX2NvbmZpcm1PcmlnaW5hbCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBidXR0b25MYWJlbHM6IFsnQ2FuY2VsJywgJ09LJ10sXG4gICAgICBwcmltYXJ5QnV0dG9uSW5kZXg6IDEsXG4gICAgICBhbmltYXRpb246ICdkZWZhdWx0JyxcbiAgICAgIHRpdGxlOiAnQ29uZmlybScsXG4gICAgICBjYWxsYmFjazogZnVuY3Rpb24oKSB7fSxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFvcHRpb25zLm1lc3NhZ2UgJiYgIW9wdGlvbnMubWVzc2FnZUhUTUwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlybSBkaWFsb2cgbXVzdCBjb250YWluIGEgbWVzc2FnZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb25zLm5vdGlmaWNhdGlvbi5fY3JlYXRlQWxlcnREaWFsb2coXG4gICAgICBvcHRpb25zLnRpdGxlLFxuICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IG9wdGlvbnMubWVzc2FnZUhUTUwsXG4gICAgICBvcHRpb25zLmJ1dHRvbkxhYmVscyxcbiAgICAgIG9wdGlvbnMucHJpbWFyeUJ1dHRvbkluZGV4LFxuICAgICAgb3B0aW9ucy5tb2RpZmllcixcbiAgICAgIG9wdGlvbnMuYW5pbWF0aW9uLFxuICAgICAgb3B0aW9ucy5jYWxsYmFjayxcbiAgICAgICFvcHRpb25zLm1lc3NhZ2UgPyB0cnVlIDogZmFsc2UsXG4gICAgICBvcHRpb25zLmNhbmNlbGFibGUsXG4gICAgICBmYWxzZSwgZmFsc2UsXG4gICAgICBvcHRpb25zLmNvbXBpbGVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VIVE1MXVxuICAgKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5idXR0b25MYWJlbHNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXhdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2FuY2VsYWJsZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jb21waWxlXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgb25zLm5vdGlmaWNhdGlvbi5jb25maXJtID0gb25zLm5vdGlmaWNhdGlvbi5fY29uZmlybU9yaWdpbmFsO1xuXG4gIG9ucy5ub3RpZmljYXRpb24uX3Byb21wdE9yaWdpbmFsID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGJ1dHRvbkxhYmVsOiAnT0snLFxuICAgICAgYW5pbWF0aW9uOiAnZGVmYXVsdCcsXG4gICAgICB0aXRsZTogJ0FsZXJ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHt9LFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgICBzdWJtaXRPbkVudGVyOiB0cnVlXG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy5tZXNzYWdlICYmICFvcHRpb25zLm1lc3NhZ2VIVE1MKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb21wdCBkaWFsb2cgbXVzdCBjb250YWluIGEgbWVzc2FnZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb25zLm5vdGlmaWNhdGlvbi5fY3JlYXRlQWxlcnREaWFsb2coXG4gICAgICBvcHRpb25zLnRpdGxlLFxuICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IG9wdGlvbnMubWVzc2FnZUhUTUwsXG4gICAgICBbb3B0aW9ucy5idXR0b25MYWJlbF0sXG4gICAgICAwLFxuICAgICAgb3B0aW9ucy5tb2RpZmllcixcbiAgICAgIG9wdGlvbnMuYW5pbWF0aW9uLFxuICAgICAgb3B0aW9ucy5jYWxsYmFjayxcbiAgICAgICFvcHRpb25zLm1lc3NhZ2UgPyB0cnVlIDogZmFsc2UsXG4gICAgICBvcHRpb25zLmNhbmNlbGFibGUsXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5hdXRvZm9jdXMsXG4gICAgICBvcHRpb25zLnBsYWNlaG9sZGVyLFxuICAgICAgb3B0aW9ucy5zdWJtaXRPbkVudGVyLFxuICAgICAgb3B0aW9ucy5jb21waWxlXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlSFRNTF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJ1dHRvbkxhYmVsXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNhbmNlbGFibGVdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wbGFjZWhvbGRlcl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9mb2N1c11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY29tcGlsZV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5ub3RpZmljYXRpb24ucHJvbXB0ID0gb25zLm5vdGlmaWNhdGlvbi5fcHJvbXB0T3JpZ2luYWw7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gIGNvbnN0IGNyZWF0ZSA9ICgpID0+IHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICAvLyBhY3R1YWwgaW1wbGVtZW50YXRpb24gdG8gZGV0ZWN0IGlmIHdoZXRoZXIgY3VycmVudCBzY3JlZW4gaXMgcG9ydHJhaXQgb3Igbm90XG4gICAgICBfaXNQb3J0cmFpdDogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgICAqL1xuICAgICAgaXNQb3J0cmFpdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BvcnRyYWl0KCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICAgKi9cbiAgICAgIGlzTGFuZHNjYXBlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzUG9ydHJhaXQoKTtcbiAgICAgIH0sXG5cbiAgICAgIF9pbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHRoaXMuX29uRE9NQ29udGVudExvYWRlZC5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCdvcmllbnRhdGlvbicgaW4gd2luZG93KSB7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uUmVzaXplLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lzUG9ydHJhaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0ID4gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBfb25ET01Db250ZW50TG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5faW5zdGFsbElzUG9ydHJhaXRJbXBsZW1lbnRhdGlvbigpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIHtpc1BvcnRyYWl0OiB0aGlzLmlzUG9ydHJhaXQoKX0pO1xuICAgICAgfSxcblxuICAgICAgX2luc3RhbGxJc1BvcnRyYWl0SW1wbGVtZW50YXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBpc1BvcnRyYWl0ID0gd2luZG93LmlubmVyV2lkdGggPCB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgICAgaWYgKCEoJ29yaWVudGF0aW9uJyBpbiB3aW5kb3cpKSB7XG4gICAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93Lm9yaWVudGF0aW9uICUgMTgwID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5vcmllbnRhdGlvbiAlIDE4MCkgPT09IDAgPyBpc1BvcnRyYWl0IDogIWlzUG9ydHJhaXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9pc1BvcnRyYWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMod2luZG93Lm9yaWVudGF0aW9uICUgMTgwKSA9PT0gOTAgPyBpc1BvcnRyYWl0IDogIWlzUG9ydHJhaXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgX29uT3JpZW50YXRpb25DaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBpc1BvcnRyYWl0ID0gdGhpcy5faXNQb3J0cmFpdCgpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBkaW1lbnNpb25zIHRvIGNoYW5nZSBiZWNhdXNlXG4gICAgICAgIC8vIG9mIEFuZHJvaWQgaW5jb25zaXN0ZW5jeS5cbiAgICAgICAgbGV0IG5JdGVyID0gMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgbkl0ZXIrKztcblxuICAgICAgICAgIGNvbnN0IHcgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgICBjb25zdCBoID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgICAgICAgaWYgKChpc1BvcnRyYWl0ICYmIHcgPD0gaCkgfHxcbiAgICAgICAgICAgICAoIWlzUG9ydHJhaXQgJiYgdyA+PSBoKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCB7aXNQb3J0cmFpdDogaXNQb3J0cmFpdH0pO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChuSXRlciA9PT0gNTApIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IGlzUG9ydHJhaXR9KTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMjApO1xuICAgICAgfSxcblxuICAgICAgLy8gUnVuIG9uIG5vdCBtb2JpbGUgYnJvd3Nlci5cbiAgICAgIF9vblJlc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IHRoaXMuaXNQb3J0cmFpdCgpfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIE1pY3JvRXZlbnQubWl4aW4ob2JqKTtcblxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgb25zLm9yaWVudGF0aW9uID0gY3JlYXRlKCkuX2luaXQoKTtcbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBvbnMucGxhdGZvcm0gPSB7XG5cbiAgICAvKipcbiAgICAgKiBBbGwgZWxlbWVudHMgd2lsbCBiZSByZW5kZXJlZCBhcyBpZiB0aGUgYXBwIHdhcyBydW5uaW5nIG9uIHRoaXMgcGxhdGZvcm0uXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICBfcmVuZGVyUGxhdGZvcm06IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwbGF0Zm9ybSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudHMuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IFwib3BlcmFcIiwgXCJmaXJlZm94XCIsIFwic2FmYXJpXCIsIFwiY2hyb21lXCIsIFwiaWVcIiwgXCJhbmRyb2lkXCIsIFwiYmxhY2tiZXJyeVwiLCBcImlvc1wiIG9yIFwid3BcIi5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBsYXRmb3JtIE5hbWUgb2YgdGhlIHBsYXRmb3JtLlxuICAgICAqL1xuICAgIHNlbGVjdDogZnVuY3Rpb24ocGxhdGZvcm0pIHtcbiAgICAgIG9ucy5wbGF0Zm9ybS5fcmVuZGVyUGxhdGZvcm0gPSBwbGF0Zm9ybS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1dlYlZpZXc6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG9ucy5pc1dlYlZpZXcoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0lPUzogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ2lvcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gL2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQW5kcm9pZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIC9BbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0FuZHJvaWRQaG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gL0FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9Nb2JpbGUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQW5kcm9pZFRhYmxldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gL0FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICEvTW9iaWxlL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1dQOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnd3AnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIC9XaW5kb3dzIFBob25lfElFTW9iaWxlfFdQRGVza3RvcC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNJUGhvbmU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIC9pUGhvbmUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzSVBhZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gL2lQYWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQmxhY2tCZXJyeTogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ2JsYWNrYmVycnknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIC9CbGFja0JlcnJ5fFJJTSBUYWJsZXQgT1N8QkIxMC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNPcGVyYTogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ29wZXJhJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoISF3aW5kb3cub3BlcmEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgT1BSLycpID49IDApO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzRmlyZWZveDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ2ZpcmVmb3gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1NhZmFyaTogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ3NhZmFyaSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cuSFRNTEVsZW1lbnQpLmluZGV4T2YoJ0NvbnN0cnVjdG9yJykgPiAwKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0Nocm9tZTogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ2Nocm9tZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKCEhd2luZG93LmNocm9tZSAmJiAhKCEhd2luZG93Lm9wZXJhIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignIE9QUi8nKSA+PSAwKSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNJRTogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAob25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm4gb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9PT0gJ2llJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZSB8fCAhIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0lPUzdhYm92ZTogZnVuY3Rpb24oKSB7XG4gICAgICBpZigvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgY29uc3QgdmVyID0gKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xcYlswLTldK19bMC05XSsoPzpfWzAtOV0rKT9cXGIvKSB8fCBbJyddKVswXS5yZXBsYWNlKC9fL2csICcuJyk7XG4gICAgICAgIHJldHVybiAocGFyc2VJbnQodmVyLnNwbGl0KCcuJylbMF0pID49IDcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBvbnMuc29mdHdhcmVLZXlib2FyZCA9IG5ldyBNaWNyb0V2ZW50KCk7XG4gIG9ucy5zb2Z0d2FyZUtleWJvYXJkLl92aXNpYmxlID0gZmFsc2U7XG5cbiAgY29uc3Qgb25TaG93ID0gKCkgPT4ge1xuICAgIG9ucy5zb2Z0d2FyZUtleWJvYXJkLl92aXNpYmxlID0gdHJ1ZTtcbiAgICBvbnMuc29mdHdhcmVLZXlib2FyZC5lbWl0KCdzaG93Jyk7XG4gIH07XG5cbiAgY29uc3Qgb25IaWRlID0gKCkgPT4ge1xuICAgIG9ucy5zb2Z0d2FyZUtleWJvYXJkLl92aXNpYmxlID0gZmFsc2U7XG4gICAgb25zLnNvZnR3YXJlS2V5Ym9hcmQuZW1pdCgnaGlkZScpO1xuICB9O1xuXG4gIGNvbnN0IGJpbmRFdmVudHMgPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBLZXlib2FyZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJ0aW5tb3NlL2NvcmRvdmEta2V5Ym9hcmQvYmxvYi85NWYzZGEzYTM4ZDhmOGUxZmE0MWZiZjQwMTQ1MzUyYzEzNTM1YTAwL1JFQURNRS5tZFxuICAgICAgS2V5Ym9hcmQub25zaG93ID0gb25TaG93O1xuICAgICAgS2V5Ym9hcmQub25oaWRlID0gb25IaWRlO1xuICAgICAgb25zLnNvZnR3YXJlS2V5Ym9hcmQuZW1pdCgnaW5pdCcsIHt2aXNpYmxlOiBLZXlib2FyZC5pc1Zpc2libGV9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29yZG92YS5wbHVnaW5zICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29yZG92YS5wbHVnaW5zLktleWJvYXJkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RyaWZ0eWNvL2lvbmljLXBsdWdpbnMta2V5Ym9hcmQvYmxvYi9jYTI3ZWNmL1JFQURNRS5tZFxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ25hdGl2ZS5rZXlib2FyZHNob3cnLCBvblNob3cpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ25hdGl2ZS5rZXlib2FyZGhpZGUnLCBvbkhpZGUpO1xuICAgICAgb25zLnNvZnR3YXJlS2V5Ym9hcmQuZW1pdCgnaW5pdCcsIHt2aXNpYmxlOiBjb3Jkb3ZhLnBsdWdpbnMuS2V5Ym9hcmQuaXNWaXNpYmxlfSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBub1BsdWdpbkVycm9yID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2Fybignb25zLWtleWJvYXJkOiBDb3Jkb3ZhIEtleWJvYXJkIHBsdWdpbiBpcyBub3QgcHJlc2VudC4nKTtcbiAgfTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcbiAgICBpZiAoIWJpbmRFdmVudHMoKSkge1xuICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tvbnMta2V5Ym9hcmQtYWN0aXZlXScpIHx8XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tvbnMta2V5Ym9hcmQtaW5hY3RpdmVdJykpIHtcbiAgICAgICAgbm9QbHVnaW5FcnJvcigpO1xuICAgICAgfVxuXG4gICAgICBvbnMuc29mdHdhcmVLZXlib2FyZC5vbiA9IG5vUGx1Z2luRXJyb3I7XG4gICAgfVxuICB9KTtcbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcblxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuXG4gIC8qKlxuICAgKiBTbGlkZSBhbmltYXRvciBmb3IgbmF2aWdhdG9yIHRyYW5zaXRpb24uXG4gICAqL1xuICBjbGFzcyBTaW1wbGVTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciBleHRlbmRzIE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb25zLl91dGlsLmV4dGVuZCh7XG4gICAgICAgIGR1cmF0aW9uOiAwLjMsXG4gICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC40LCAxKScsXG4gICAgICAgIGRlbGF5OiAwXG4gICAgICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICAgICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICAgIHRoaXMuYmFja2dyb3VuZE1hc2sgPSBvbnMuX3V0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IG9wYWNpdHk6IDA7XCI+PC9kaXY+XG4gICAgICBgKTtcbiAgICAgIHRoaXMuYmxhY2tNYXNrT3BhY2l0eSA9IDAuNDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICAgIHV0aWwucmVtb3ZlRWxlbWVudCh0aGlzLmJhY2tncm91bmRNYXNrKTtcbiAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGxlYXZlUGFnZS5lbGVtZW50Lm5leHRTaWJsaW5nKTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQodGhpcy5iYWNrZ3JvdW5kTWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogdGhpcy5ibGFja01hc2tPcGFjaXR5XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIG1hc2sucmVtb3ZlKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZS5lbGVtZW50KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMTAwJSwgMCwgMCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICBhbmltaXQobGVhdmVQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKC00NSUsIDBweCwgMHB4KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAud2FpdCgwLjIpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAgICovXG4gICAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBkb25lKSB7XG4gICAgICB1dGlsLnJlbW92ZUVsZW1lbnQodGhpcy5iYWNrZ3JvdW5kTWFzayk7XG4gICAgICBlbnRlclBhZ2UuZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmJhY2tncm91bmRNYXNrLCBlbnRlclBhZ2UuZWxlbWVudC5uZXh0U2libGluZyk7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IHRoaXMuYmxhY2tNYXNrT3BhY2l0eSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBtYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChlbnRlclBhZ2UuZWxlbWVudClcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKC00NSUsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDAuOVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMHB4LCAwcHgsIDBweCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKCksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZS5lbGVtZW50KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMHB4LCAwcHgsIDBweCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwcHgsIDBweCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCgwLjIpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGZpbmlzaCkge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuU2ltcGxlU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgPSBTaW1wbGVTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIFRhYmJhckFuaW1hdG9yIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGltaW5nXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kZWxheVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICB0aGlzLnRpbWluZyA9IG9wdGlvbnMudGltaW5nIHx8ICdsaW5lYXInO1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZHVyYXRpb24gOiAnMC40JztcbiAgICAgIHRoaXMuZGVsYXkgPSBvcHRpb25zLmRlbGF5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlbGF5IDogJzAnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZW50ZXJQYWdlIG9ucy1wYWdlIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGxlYXZlUGFnZSBvbnMtcGFnZSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGVudGVyUGFnZUluZGV4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlYXZlUGFnZUluZGV4XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgICAqL1xuICAgIGFwcGx5KGVudGVyUGFnZSwgbGVhdmVQYWdlLCBlbnRlclBhZ2VJbmRleCwgbGVhdmVQYWdlSW5kZXgsIGRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG4gIH1cblxuXG4gIGNsYXNzIFRhYmJhck5vbmVBbmltYXRvciBleHRlbmRzIFRhYmJhckFuaW1hdG9yIHtcbiAgICBhcHBseShlbnRlclBhZ2UsIGxlYXZlUGFnZSwgZW50ZXJJbmRleCwgbGVhdmVJbmRleCwgZG9uZSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsYXNzIFRhYmJhckZhZGVBbmltYXRvciBleHRlbmRzIFRhYmJhckFuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMudGltaW5nID0gb3B0aW9ucy50aW1pbmcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMudGltaW5nIDogJ2xpbmVhcic7XG4gICAgICBvcHRpb25zLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kdXJhdGlvbiA6ICcwLjQnO1xuICAgICAgb3B0aW9ucy5kZWxheSA9IG9wdGlvbnMuZGVsYXkgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVsYXkgOiAnMCc7XG5cbiAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGFwcGx5KGVudGVyUGFnZSwgbGVhdmVQYWdlLCBlbnRlclBhZ2VJbmRleCwgbGVhdmVQYWdlSW5kZXgsIGRvbmUpIHtcbiAgICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICAgIGFuaW1pdChlbnRlclBhZ2UpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG5cbiAgY2xhc3MgVGFiYmFyU2xpZGVBbmltYXRvciBleHRlbmRzIFRhYmJhckFuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMudGltaW5nID0gb3B0aW9ucy50aW1pbmcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMudGltaW5nIDogJ2Vhc2UtaW4nO1xuICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZHVyYXRpb24gOiAnMC4xNSc7XG4gICAgICBvcHRpb25zLmRlbGF5ID0gb3B0aW9ucy5kZWxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZWxheSA6ICcwJztcblxuICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtqcUxpdGV9IGVudGVyUGFnZVxuICAgICAqIEBwYXJhbSB7anFMaXRlfSBsZWF2ZVBhZ2VcbiAgICAgKi9cbiAgICBhcHBseShlbnRlclBhZ2UsIGxlYXZlUGFnZSwgZW50ZXJJbmRleCwgbGVhdmVJbmRleCwgZG9uZSkge1xuICAgICAgY29uc3Qgc2duID0gZW50ZXJJbmRleCA+IGxlYXZlSW5kZXg7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICAgIGFuaW1pdChlbnRlclBhZ2UpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKCcgKyAoc2duID8gJycgOiAnLScpICsgJzEwMCUsIDAsIDApJyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKCcgKyAoc2duID8gJy0nIDogJycpICsgJzEwMCUsIDAsIDApJyxcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLlRhYmJhckFuaW1hdG9yID0gVGFiYmFyQW5pbWF0b3I7XG4gIG9ucy5faW50ZXJuYWwuVGFiYmFyRmFkZUFuaW1hdG9yID0gVGFiYmFyRmFkZUFuaW1hdG9yO1xuICBvbnMuX2ludGVybmFsLlRhYmJhck5vbmVBbmltYXRvciA9IFRhYmJhck5vbmVBbmltYXRvcjtcbiAgb25zLl9pbnRlcm5hbC5UYWJiYXJTbGlkZUFuaW1hdG9yID0gVGFiYmFyU2xpZGVBbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuXG4vKipcbiAqIE1pbmltYWwgYW5pbWF0aW9uIGxpYnJhcnkgZm9yIG1hbmFnaW5nIGNzcyB0cmFuc2l0aW9uIG9uIG1vYmlsZSBicm93c2Vycy5cbiAqL1xud2luZG93LmFuaW1pdCA9IChmdW5jdGlvbigpe1xuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICovXG4gIHZhciBBbmltaXQgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFuaW1pdCkpIHtcbiAgICAgIHJldHVybiBuZXcgQW5pbWl0KGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMgPSBbZWxlbWVudF07XG4gICAgfSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWxlbWVudCkgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgb3IgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy50cmFuc2l0aW9uUXVldWUgPSBbXTtcbiAgICB0aGlzLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3QgPSBbXTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtYW5pbWl0LW9yaWctc3R5bGUnKSkge1xuICAgICAgICBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWFuaW1pdC1vcmlnLXN0eWxlJywgc2VsZi5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XSB8fCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWl0LW9yaWctc3R5bGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBBbmltaXQucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtBcnJheX1cbiAgICAgKi9cbiAgICB0cmFuc2l0aW9uUXVldWU6IHVuZGVmaW5lZCxcblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgZWxlbWVudDogdW5kZWZpbmVkLFxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgYW5pbWF0aW9uIHNlcXVlbmNlIHdpdGggcGFzc2VkIGFuaW1hdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHBsYXk6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblF1ZXVlLnB1c2goZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUXVldWUgdHJhbnNpdGlvbiBhbmltYXRpb25zIG9yIG90aGVyIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogZS5nLiBhbmltaXQoZWx0KS5xdWV1ZSh7Y29sb3I6ICdyZWQnfSlcbiAgICAgKiBlLmcuIGFuaW1pdChlbHQpLnF1ZXVlKHtjb2xvcjogJ3JlZCd9LCB7ZHVyYXRpb246IDAuNH0pXG4gICAgICogZS5nLiBhbmltaXQoZWx0KS5xdWV1ZSh7Y3NzOiB7Y29sb3I6ICdyZWQnfSwgZHVyYXRpb246IDAuMn0pXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHxBbmltaXQuVHJhbnNpdGlvbnxGdW5jdGlvbn0gdHJhbnNpdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKi9cbiAgICBxdWV1ZTogZnVuY3Rpb24odHJhbnNpdGlvbiwgb3B0aW9ucykge1xuICAgICAgdmFyIHF1ZXVlID0gdGhpcy50cmFuc2l0aW9uUXVldWU7XG5cbiAgICAgIGlmICh0cmFuc2l0aW9uICYmIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5jc3MgPSB0cmFuc2l0aW9uO1xuICAgICAgICB0cmFuc2l0aW9uID0gbmV3IEFuaW1pdC5UcmFuc2l0aW9uKG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoISh0cmFuc2l0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdHJhbnNpdGlvbiBpbnN0YW5jZW9mIEFuaW1pdC5UcmFuc2l0aW9uKSkge1xuICAgICAgICBpZiAodHJhbnNpdGlvbi5jc3MpIHtcbiAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IEFuaW1pdC5UcmFuc2l0aW9uKHRyYW5zaXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyYW5zaXRpb24gPSBuZXcgQW5pbWl0LlRyYW5zaXRpb24oe1xuICAgICAgICAgICAgY3NzOiB0cmFuc2l0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICBxdWV1ZS5wdXNoKHRyYW5zaXRpb24pO1xuICAgICAgfSBlbHNlIGlmICh0cmFuc2l0aW9uIGluc3RhbmNlb2YgQW5pbWl0LlRyYW5zaXRpb24pIHtcbiAgICAgICAgcXVldWUucHVzaCh0cmFuc2l0aW9uLmJ1aWxkKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUXVldWUgdHJhbnNpdGlvbiBhbmltYXRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGbG9hdH0gc2Vjb25kc1xuICAgICAqL1xuICAgIHdhaXQ6IGZ1bmN0aW9uKHNlY29uZHMpIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvblF1ZXVlLnB1c2goZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICBzZXRUaW1lb3V0KGRvbmUsIDEwMDAgKiBzZWNvbmRzKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgZWxlbWVudCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7RmxvYXR9IFtvcHRpb25zLmR1cmF0aW9uXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1pbmddXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRyYW5zaXRpb25dXG4gICAgICovXG4gICAgcmVzZXRTdHlsZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb24gJiYgIW9wdGlvbnMuZHVyYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIm9wdGlvbnMuZHVyYXRpb25cIiBpcyByZXF1aXJlZCB3aGVuIFwib3B0aW9ucy50cmFuc2l0aW9uXCIgaXMgZW5hYmxlZC4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbiB8fCAob3B0aW9ucy5kdXJhdGlvbiAmJiBvcHRpb25zLmR1cmF0aW9uID4gMCkpIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25WYWx1ZSA9IG9wdGlvbnMudHJhbnNpdGlvbiB8fCAoJ2FsbCAnICsgb3B0aW9ucy5kdXJhdGlvbiArICdzICcgKyAob3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcicpKTtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25TdHlsZSA9ICd0cmFuc2l0aW9uOiAnICsgdHJhbnNpdGlvblZhbHVlICsgJzsgLScgKyBBbmltaXQucHJlZml4ICsgJy10cmFuc2l0aW9uOiAnICsgdHJhbnNpdGlvblZhbHVlICsgJzsnO1xuXG4gICAgICAgIHRoaXMudHJhbnNpdGlvblF1ZXVlLnB1c2goZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG5cbiAgICAgICAgICAvLyB0cmFuc2l0aW9uIGFuZCBzdHlsZSBzZXR0aW5nc1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbQW5pbWl0LnByZWZpeCArICdUcmFuc2l0aW9uJ10gPSB0cmFuc2l0aW9uVmFsdWU7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uVmFsdWU7XG5cbiAgICAgICAgICAgIHZhciBzdHlsZVZhbHVlID0gKHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0gPyBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdICsgJzsgJyA6ICcnKSArIHRyYW5zaXRpb25TdHlsZTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlVmFsdWUpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gYWRkIFwidHJhbnNpdGlvbmVuZFwiIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gdXRpbC5hZGRPblRyYW5zaXRpb25FbmQoZWxlbWVudHNbMF0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gZm9yIGZhaWwgc2FmZS5cbiAgICAgICAgICB2YXIgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9LCBvcHRpb25zLmR1cmF0aW9uICogMTAwMCAqIDEuNCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIC8vIENsZWFyIHRyYW5zaXRpb24gYW5pbWF0aW9uIHNldHRpbmdzLlxuICAgICAgICBzZWxmLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlW0FuaW1pdC5wcmVmaXggKyAnVHJhbnNpdGlvbiddID0gJ25vbmUnO1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgICAgIGlmIChzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdKSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgYW5pbWF0aW9uIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIHN0YXJ0QW5pbWF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuX2RlcXVldWVUcmFuc2l0aW9uKCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGVxdWV1ZVRyYW5zaXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSB0aGlzLnRyYW5zaXRpb25RdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFuc2l0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ3VycmVudCB0cmFuc2l0aW9uIGV4aXN0cy4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2l0aW9uID0gdHJhbnNpdGlvbjtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjYWxsZWQgPSBmYWxzZTtcblxuICAgICAgdmFyIGRvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHNlbGYuX2N1cnJlbnRUcmFuc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHNlbGYuX2RlcXVldWVUcmFuc2l0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlOiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB0d2ljZS4nKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdHJhbnNpdGlvbi5jYWxsKHRoaXMsIGRvbmUpO1xuICAgICAgfVxuICAgIH1cblxuICB9O1xuXG4gIEFuaW1pdC5jc3NQcm9wZXJ0eURpY3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJycpO1xuICAgIHZhciBkaWN0ID0ge307XG4gICAgdmFyIGEgPSAnQScuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeiA9ICd6Jy5jaGFyQ29kZUF0KDApO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgICAgaWYgKHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmIChhIDw9IGtleS5jaGFyQ29kZUF0KDApICYmIHogPj0ga2V5LmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgICAgICBpZiAoa2V5ICE9PSAnY3NzVGV4dCcgJiYga2V5ICE9PSAncGFyZW50VGV4dCcgJiYga2V5ICE9PSAnbGVuZ3RoJykge1xuICAgICAgICAgICAgZGljdFtrZXldID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGljdDtcbiAgfSkoKTtcblxuICBBbmltaXQuaGFzQ3NzUHJvcGVydHkgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuICEhQW5pbWl0LmNzc1Byb3BlcnR5RGljdFtuYW1lXTtcbiAgfTtcblxuICAvKipcbiAgICogVmVuZG9yIHByZWZpeCBmb3IgY3NzIHByb3BlcnR5LlxuICAgKi9cbiAgQW5pbWl0LnByZWZpeCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnJyksXG4gICAgICBwcmUgPSAoQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgICAgIC5jYWxsKHN0eWxlcylcbiAgICAgICAgLmpvaW4oJycpIFxuICAgICAgICAubWF0Y2goLy0obW96fHdlYmtpdHxtcyktLykgfHwgKHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVxuICAgICAgKVsxXTtcbiAgICByZXR1cm4gcHJlO1xuICB9KSgpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FuaW1pdH0gYXJndW1lbnRzXG4gICAqL1xuICBBbmltaXQucnVuQWxsID0gZnVuY3Rpb24oLyogYXJndW1lbnRzLi4uICovKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3VtZW50c1tpXS5wbGF5KCk7XG4gICAgfVxuICB9O1xuXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7RmxvYXR9IFtvcHRpb25zLmR1cmF0aW9uXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucHJvcGVydHldXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1pbmddXG4gICAqL1xuICBBbmltaXQuVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA9IHRoaXMub3B0aW9ucy5kdXJhdGlvbiB8fCAwO1xuICAgIHRoaXMub3B0aW9ucy50aW1pbmcgPSB0aGlzLm9wdGlvbnMudGltaW5nIHx8ICdsaW5lYXInO1xuICAgIHRoaXMub3B0aW9ucy5jc3MgPSB0aGlzLm9wdGlvbnMuY3NzIHx8IHt9O1xuICAgIHRoaXMub3B0aW9ucy5wcm9wZXJ0eSA9IHRoaXMub3B0aW9ucy5wcm9wZXJ0eSB8fCAnYWxsJztcbiAgfTtcblxuICBBbmltaXQuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHJldHVybiB7RnVuY3Rpb259XG4gICAgICovXG4gICAgYnVpbGQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcHRpb25zLmNzcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5jc3MgaXMgcmVxdWlyZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjc3MgPSBjcmVhdGVBY3R1YWxDc3NQcm9wcyh0aGlzLm9wdGlvbnMuY3NzKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25WYWx1ZSA9IHV0aWwuYnVpbGRUcmFuc2l0aW9uVmFsdWUodGhpcy5vcHRpb25zKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgICAgICAgdmFyIHRpbWVvdXQgPSBzZWxmLm9wdGlvbnMuZHVyYXRpb24gKiAxMDAwICogMS40O1xuXG4gICAgICAgICAgdmFyIHJlbW92ZUxpc3RlbmVycyA9IHV0aWwuYWRkT25UcmFuc2l0aW9uRW5kKGVsZW1lbnRzWzBdLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW0FuaW1pdC5wcmVmaXggKyAnVHJhbnNpdGlvbiddID0gdHJhbnNpdGlvblZhbHVlO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gdHJhbnNpdGlvblZhbHVlO1xuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjc3MpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlW25hbWVdID0gY3NzW25hbWVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbiA8PSAwKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG5cbiAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbQW5pbWl0LnByZWZpeCArICdUcmFuc2l0aW9uJ10gPSAnbm9uZSc7XG4gICAgICAgICAgICBlbGVtZW50LnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZV0gPSBjc3NbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzWzBdLm9mZnNldEhlaWdodDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDMwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUFjdHVhbENzc1Byb3BzKGNzcykge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjc3NbbmFtZV07XG4gICAgICAgICAgbmFtZSA9IHV0aWwubm9ybWFsaXplU3R5bGVOYW1lKG5hbWUpO1xuICAgICAgICAgIHZhciBwcmVmaXhlZCA9IEFuaW1pdC5wcmVmaXggKyB1dGlsLmNhcGl0YWxpemUobmFtZSk7XG5cbiAgICAgICAgICBpZiAoQW5pbWl0LmNzc1Byb3BlcnR5RGljdFtuYW1lXSkge1xuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChBbmltaXQuY3NzUHJvcGVydHlEaWN0W3ByZWZpeGVkXSkge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWZpeGVkXSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRbcHJlZml4ZWRdID0gdmFsdWU7XG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICB9XG4gIH07XG5cbiAgdmFyIHV0aWwgPSB7XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHN0eWxlIHByb3BlcnR5IG5hbWUuXG4gICAgICovXG4gICAgbm9ybWFsaXplU3R5bGVOYW1lOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8tW2EtekEtWl0vZywgZnVuY3Rpb24oYWxsKSB7XG4gICAgICAgIHJldHVybiBhbGwuc2xpY2UoMSkudG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gICAgfSxcblxuICAgIC8vIGNhcGl0YWxpemUgc3RyaW5nXG4gICAgY2FwaXRhbGl6ZSA6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucHJvcGVydHlcbiAgICAgKiBAcGFyYW0ge0Zsb2F0fSBwYXJhbXMuZHVyYXRpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRpbWluZ1xuICAgICAqL1xuICAgIGJ1aWxkVHJhbnNpdGlvblZhbHVlOiBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICAgIHBhcmFtcy5wcm9wZXJ0eSA9IHBhcmFtcy5wcm9wZXJ0eSB8fCAnYWxsJztcbiAgICAgIHBhcmFtcy5kdXJhdGlvbiA9IHBhcmFtcy5kdXJhdGlvbiB8fCAwLjQ7XG4gICAgICBwYXJhbXMudGltaW5nID0gcGFyYW1zLnRpbWluZyB8fCAnbGluZWFyJztcblxuICAgICAgdmFyIHByb3BzID0gcGFyYW1zLnByb3BlcnR5LnNwbGl0KC8gKy8pO1xuXG4gICAgICByZXR1cm4gcHJvcHMubWFwKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIHByb3AgKyAnICcgKyBwYXJhbXMuZHVyYXRpb24gKyAncyAnICsgcGFyYW1zLnRpbWluZztcbiAgICAgIH0pLmpvaW4oJywgJyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBldmVudCBoYW5kbGVyIG9uIFwidHJhbnNpdGlvbmVuZFwiIGV2ZW50LlxuICAgICAqL1xuICAgIGFkZE9uVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHV0aWwuX3RyYW5zaXRpb25FbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdXRpbC5fdHJhbnNpdGlvbkVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbiwgZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZW1vdmVMaXN0ZW5lcnM7XG4gICAgfSxcblxuICAgIF90cmFuc2l0aW9uRW5kRXZlbnRzOiAoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoQW5pbWl0LnByZWZpeCA9PT0gJ3dlYmtpdCcgfHwgQW5pbWl0LnByZWZpeCA9PT0gJ28nIHx8IEFuaW1pdC5wcmVmaXggPT09ICdtb3onIHx8IEFuaW1pdC5wcmVmaXggPT09ICdtcycpIHtcbiAgICAgICAgcmV0dXJuIFtBbmltaXQucHJlZml4ICsgJ1RyYW5zaXRpb25FbmQnLCAndHJhbnNpdGlvbmVuZCddO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gWyd0cmFuc2l0aW9uZW5kJ107XG4gICAgfSkoKVxuXG4gIH07XG5cbiAgcmV0dXJuIEFuaW1pdDtcbn0pKCk7XG4iLCIvKlxuICogR2VzdHVyZSBkZXRlY3RvciBsaWJyYXJ5IHRoYXQgZm9ya2VkIGZyb20gZ2l0aHViLmNvbS9FaWdodE1lZGlhL2hhbW1lci5qcy5cbiAqL1xuXG4oZnVuY3Rpb24od2luZG93KSB7XG4gICd1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG4gKiBAcmV0dXJuIHtHZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2V9XG4gKi9cbnZhciBHZXN0dXJlRGV0ZWN0b3IgPSBmdW5jdGlvbiBHZXN0dXJlRGV0ZWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEdlc3R1cmVEZXRlY3Rvci5JbnN0YW5jZShlbGVtZW50LCBvcHRpb25zIHx8IHt9KTtcbn07XG5cbi8qKlxuICogZGVmYXVsdCBzZXR0aW5ncy5cbiAqIG1vcmUgc2V0dGluZ3MgYXJlIGRlZmluZWQgcGVyIGdlc3R1cmUgYXQgYC9nZXN0dXJlc2AuIEVhY2ggZ2VzdHVyZSBjYW4gYmUgZGlzYWJsZWQvZW5hYmxlZFxuICogYnkgc2V0dGluZyBpdCdzIG5hbWUgKGxpa2UgYHN3aXBlYCkgdG8gZmFsc2UuXG4gKiBZb3UgY2FuIHNldCB0aGUgZGVmYXVsdHMgZm9yIGFsbCBpbnN0YW5jZXMgYnkgY2hhbmdpbmcgdGhpcyBvYmplY3QgYmVmb3JlIGNyZWF0aW5nIGFuIGluc3RhbmNlLlxuICogQGV4YW1wbGVcbiAqIGBgYGBcbiAqICBHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMuZHJhZyA9IGZhbHNlO1xuICogIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5iZWhhdmlvci50b3VjaEFjdGlvbiA9ICdwYW4teSc7XG4gKiAgZGVsZXRlIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5iZWhhdmlvci51c2VyU2VsZWN0O1xuICogYGBgYFxuICogQHByb3BlcnR5IGRlZmF1bHRzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMgPSB7XG4gIGJlaGF2aW9yOiB7XG4gICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgIHRvdWNoQWN0aW9uOiAncGFuLXknLFxuICAgIHRvdWNoQ2FsbG91dDogJ25vbmUnLFxuICAgIGNvbnRlbnRab29taW5nOiAnbm9uZScsXG4gICAgdXNlckRyYWc6ICdub25lJyxcbiAgICB0YXBIaWdobGlnaHRDb2xvcjogJ3JnYmEoMCwwLDAsMCknXG4gIH1cbn07XG5cbi8qKlxuICogR2VzdHVyZURldGVjdG9yIGRvY3VtZW50IHdoZXJlIHRoZSBiYXNlIGV2ZW50cyBhcmUgYWRkZWQgYXRcbiAqIEBwcm9wZXJ0eSBET0NVTUVOVFxuICogQHR5cGUge0hUTUxFbGVtZW50fVxuICogQGRlZmF1bHQgd2luZG93LmRvY3VtZW50XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5ET0NVTUVOVCA9IGRvY3VtZW50O1xuXG4vKipcbiAqIGRldGVjdCBzdXBwb3J0IGZvciBwb2ludGVyIGV2ZW50c1xuICogQHByb3BlcnR5IEhBU19QT0lOVEVSRVZFTlRTXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTID0gbmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkIHx8IG5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkO1xuXG4vKipcbiAqIGRldGVjdCBzdXBwb3J0IGZvciB0b3VjaCBldmVudHNcbiAqIEBwcm9wZXJ0eSBIQVNfVE9VQ0hFVkVOVFNcbiAqIEB0eXBlIHtCb29sZWFufVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSEFTX1RPVUNIRVZFTlRTID0gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyk7XG5cbi8qKlxuICogZGV0ZWN0IG1vYmlsZSBicm93c2Vyc1xuICogQHByb3BlcnR5IElTX01PQklMRVxuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5JU19NT0JJTEUgPSAvbW9iaWxlfHRhYmxldHxpcChhZHxob25lfG9kKXxhbmRyb2lkfHNpbGsvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG4vKipcbiAqIGRldGVjdCBpZiB3ZSB3YW50IHRvIHN1cHBvcnQgbW91c2VldmVudHMgYXQgYWxsXG4gKiBAcHJvcGVydHkgTk9fTU9VU0VFVkVOVFNcbiAqIEB0eXBlIHtCb29sZWFufVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuTk9fTU9VU0VFVkVOVFMgPSAoR2VzdHVyZURldGVjdG9yLkhBU19UT1VDSEVWRU5UUyAmJiBHZXN0dXJlRGV0ZWN0b3IuSVNfTU9CSUxFKSB8fCBHZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFM7XG5cbi8qKlxuICogaW50ZXJ2YWwgaW4gd2hpY2ggR2VzdHVyZURldGVjdG9yIHJlY2FsY3VsYXRlcyBjdXJyZW50IHZlbG9jaXR5L2RpcmVjdGlvbi9hbmdsZSBpbiBtc1xuICogQHByb3BlcnR5IENBTENVTEFURV9JTlRFUlZBTFxuICogQHR5cGUge051bWJlcn1cbiAqIEBkZWZhdWx0IDI1XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5DQUxDVUxBVEVfSU5URVJWQUwgPSAyNTtcblxuLyoqXG4gKiBldmVudHR5cGVzIHBlciB0b3VjaGV2ZW50IChzdGFydCwgbW92ZSwgZW5kKSBhcmUgZmlsbGVkIGJ5IGBFdmVudC5kZXRlcm1pbmVFdmVudFR5cGVzYCBvbiBgc2V0dXBgXG4gKiB0aGUgb2JqZWN0IGNvbnRhaW5zIHRoZSBET00gZXZlbnQgbmFtZXMgcGVyIHR5cGUgKGBFVkVOVF9TVEFSVGAsIGBFVkVOVF9NT1ZFYCwgYEVWRU5UX0VORGApXG4gKiBAcHJvcGVydHkgRVZFTlRfVFlQRVNcbiAqIEBwcml2YXRlXG4gKiBAd3JpdGVPbmNlXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG52YXIgRVZFTlRfVFlQRVMgPSB7fTtcblxuLyoqXG4gKiBkaXJlY3Rpb24gc3RyaW5ncywgZm9yIHNhZmUgY29tcGFyaXNvbnNcbiAqIEBwcm9wZXJ0eSBESVJFQ1RJT05fRE9XTnxMRUZUfFVQfFJJR0hUXG4gKiBAZmluYWxcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVmYXVsdCAnZG93bicgJ2xlZnQnICd1cCcgJ3JpZ2h0J1xuICovXG52YXIgRElSRUNUSU9OX0RPV04gPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX0RPV04gPSAnZG93bic7XG52YXIgRElSRUNUSU9OX0xFRlQgPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX0xFRlQgPSAnbGVmdCc7XG52YXIgRElSRUNUSU9OX1VQID0gR2VzdHVyZURldGVjdG9yLkRJUkVDVElPTl9VUCA9ICd1cCc7XG52YXIgRElSRUNUSU9OX1JJR0hUID0gR2VzdHVyZURldGVjdG9yLkRJUkVDVElPTl9SSUdIVCA9ICdyaWdodCc7XG5cbi8qKlxuICogcG9pbnRlcnR5cGUgc3RyaW5ncywgZm9yIHNhZmUgY29tcGFyaXNvbnNcbiAqIEBwcm9wZXJ0eSBQT0lOVEVSX01PVVNFfFRPVUNIfFBFTlxuICogQGZpbmFsXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlZmF1bHQgJ21vdXNlJyAndG91Y2gnICdwZW4nXG4gKi9cbnZhciBQT0lOVEVSX01PVVNFID0gR2VzdHVyZURldGVjdG9yLlBPSU5URVJfTU9VU0UgPSAnbW91c2UnO1xudmFyIFBPSU5URVJfVE9VQ0ggPSBHZXN0dXJlRGV0ZWN0b3IuUE9JTlRFUl9UT1VDSCA9ICd0b3VjaCc7XG52YXIgUE9JTlRFUl9QRU4gPSBHZXN0dXJlRGV0ZWN0b3IuUE9JTlRFUl9QRU4gPSAncGVuJztcblxuLyoqXG4gKiBldmVudHR5cGVzXG4gKiBAcHJvcGVydHkgRVZFTlRfU1RBUlR8TU9WRXxFTkR8UkVMRUFTRXxUT1VDSFxuICogQGZpbmFsXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlZmF1bHQgJ3N0YXJ0JyAnY2hhbmdlJyAnbW92ZScgJ2VuZCcgJ3JlbGVhc2UnICd0b3VjaCdcbiAqL1xudmFyIEVWRU5UX1NUQVJUID0gR2VzdHVyZURldGVjdG9yLkVWRU5UX1NUQVJUID0gJ3N0YXJ0JztcbnZhciBFVkVOVF9NT1ZFID0gR2VzdHVyZURldGVjdG9yLkVWRU5UX01PVkUgPSAnbW92ZSc7XG52YXIgRVZFTlRfRU5EID0gR2VzdHVyZURldGVjdG9yLkVWRU5UX0VORCA9ICdlbmQnO1xudmFyIEVWRU5UX1JFTEVBU0UgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfUkVMRUFTRSA9ICdyZWxlYXNlJztcbnZhciBFVkVOVF9UT1VDSCA9IEdlc3R1cmVEZXRlY3Rvci5FVkVOVF9UT1VDSCA9ICd0b3VjaCc7XG5cbi8qKlxuICogaWYgdGhlIHdpbmRvdyBldmVudHMgYXJlIHNldC4uLlxuICogQHByb3BlcnR5IFJFQURZXG4gKiBAd3JpdGVPbmNlXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqIEBkZWZhdWx0IGZhbHNlXG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5SRUFEWSA9IGZhbHNlO1xuXG4vKipcbiAqIHBsdWdpbnMgbmFtZXNwYWNlXG4gKiBAcHJvcGVydHkgcGx1Z2luc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xuR2VzdHVyZURldGVjdG9yLnBsdWdpbnMgPSBHZXN0dXJlRGV0ZWN0b3IucGx1Z2lucyB8fCB7fTtcblxuLyoqXG4gKiBnZXN0dXJlcyBuYW1lc3BhY2VcbiAqIHNlZSBgL2dlc3R1cmVzYCBmb3IgdGhlIGRlZmluaXRpb25zXG4gKiBAcHJvcGVydHkgZ2VzdHVyZXNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcyA9IEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcyB8fCB7fTtcblxuLyoqXG4gKiBzZXR1cCBldmVudHMgdG8gZGV0ZWN0IGdlc3R1cmVzIG9uIHRoZSBkb2N1bWVudFxuICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBjcmVhdGluZyBhbiBuZXcgaW5zdGFuY2VcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldHVwKCkge1xuICBpZihHZXN0dXJlRGV0ZWN0b3IuUkVBRFkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmaW5kIHdoYXQgZXZlbnR0eXBlcyB3ZSBhZGQgbGlzdGVuZXJzIHRvXG4gIEV2ZW50LmRldGVybWluZUV2ZW50VHlwZXMoKTtcblxuICAvLyBSZWdpc3RlciBhbGwgZ2VzdHVyZXMgaW5zaWRlIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlc1xuICBVdGlscy5lYWNoKEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcywgZnVuY3Rpb24oZ2VzdHVyZSkge1xuICAgIERldGVjdGlvbi5yZWdpc3RlcihnZXN0dXJlKTtcbiAgfSk7XG5cbiAgLy8gQWRkIHRvdWNoIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnRcbiAgRXZlbnQub25Ub3VjaChHZXN0dXJlRGV0ZWN0b3IuRE9DVU1FTlQsIEVWRU5UX01PVkUsIERldGVjdGlvbi5kZXRlY3QpO1xuICBFdmVudC5vblRvdWNoKEdlc3R1cmVEZXRlY3Rvci5ET0NVTUVOVCwgRVZFTlRfRU5ELCBEZXRlY3Rpb24uZGV0ZWN0KTtcblxuICAvLyBHZXN0dXJlRGV0ZWN0b3IgaXMgcmVhZHkuLi4hXG4gIEdlc3R1cmVEZXRlY3Rvci5SRUFEWSA9IHRydWU7XG59XG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqXG4gKiBAY2xhc3MgVXRpbHNcbiAqIEBzdGF0aWNcbiAqL1xudmFyIFV0aWxzID0gR2VzdHVyZURldGVjdG9yLnV0aWxzID0ge1xuICAvKipcbiAgICogZXh0ZW5kIG1ldGhvZCwgY291bGQgYWxzbyBiZSB1c2VkIGZvciBjbG9uaW5nIHdoZW4gYGRlc3RgIGlzIGFuIGVtcHR5IG9iamVjdC5cbiAgICogY2hhbmdlcyB0aGUgZGVzdCBvYmplY3RcbiAgICogQG1ldGhvZCBleHRlbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV0gIGRvIGEgbWVyZ2VcbiAgICogQHJldHVybiB7T2JqZWN0fSBkZXN0XG4gICAqL1xuICBleHRlbmQ6IGZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMsIG1lcmdlKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChkZXN0W2tleV0gPT09IHVuZGVmaW5lZCB8fCAhbWVyZ2UpKSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbiAgfSxcblxuICAvKipcbiAgICogc2ltcGxlIGFkZEV2ZW50TGlzdGVuZXIgd3JhcHBlclxuICAgKiBAbWV0aG9kIG9uXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgb246IGZ1bmN0aW9uIG9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgcmVtb3ZlRXZlbnRMaXN0ZW5lciB3cmFwcGVyXG4gICAqIEBtZXRob2Qgb2ZmXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZvckVhY2ggb3ZlciBhcnJheXMgYW5kIG9iamVjdHNcbiAgICogQG1ldGhvZCBlYWNoXG4gICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0b3JcbiAgICogQHBhcmFtIHthbnl9IGl0ZXJhdG9yLml0ZW1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGl0ZXJhdG9yLmluZGV4XG4gICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBpdGVyYXRvci5vYmogdGhlIHNvdXJjZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdmFsdWUgdG8gdXNlIGFzIGB0aGlzYCBpbiB0aGUgaXRlcmF0b3JcbiAgICovXG4gIGVhY2g6IGZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIHZhciBpLCBsZW47XG5cbiAgICAvLyBuYXRpdmUgZm9yRWFjaCBvbiBhcnJheXNcbiAgICBpZignZm9yRWFjaCcgaW4gb2JqKSB7XG4gICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgICAvLyBhcnJheXNcbiAgICB9IGVsc2UgaWYob2JqLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IoaSA9IDAsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZihpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9iamVjdHNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKGkgaW4gb2JqKSB7XG4gICAgICAgIGlmKG9iai5oYXNPd25Qcm9wZXJ0eShpKSAmJlxuICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogZmluZCBpZiBhIHN0cmluZyBjb250YWlucyB0aGUgc3RyaW5nIHVzaW5nIGluZGV4T2ZcbiAgICogQG1ldGhvZCBpblN0clxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGZvdW5kXG4gICAqL1xuICBpblN0cjogZnVuY3Rpb24gaW5TdHIoc3JjLCBmaW5kKSB7XG4gICAgcmV0dXJuIHNyYy5pbmRleE9mKGZpbmQpID4gLTE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZpbmQgaWYgYSBhcnJheSBjb250YWlucyB0aGUgb2JqZWN0IHVzaW5nIGluZGV4T2Ygb3IgYSBzaW1wbGUgcG9seWZpbGxcbiAgICogQG1ldGhvZCBpbkFycmF5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHJldHVybiB7Qm9vbGVhbnxOdW1iZXJ9IGZhbHNlIHdoZW4gbm90IGZvdW5kLCBvciB0aGUgaW5kZXhcbiAgICovXG4gIGluQXJyYXk6IGZ1bmN0aW9uIGluQXJyYXkoc3JjLCBmaW5kKSB7XG4gICAgaWYoc3JjLmluZGV4T2YpIHtcbiAgICAgIHZhciBpbmRleCA9IHNyYy5pbmRleE9mKGZpbmQpO1xuICAgICAgcmV0dXJuIChpbmRleCA9PT0gLTEpID8gZmFsc2UgOiBpbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gc3JjLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmKHNyY1tpXSA9PT0gZmluZCkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0IChgYXJndW1lbnRzYCwgYHRvdWNobGlzdGApIHRvIGFuIGFycmF5XG4gICAqIEBtZXRob2QgdG9BcnJheVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwob2JqLCAwKTtcbiAgfSxcblxuICAvKipcbiAgICogZmluZCBpZiBhIG5vZGUgaXMgaW4gdGhlIGdpdmVuIHBhcmVudFxuICAgKiBAbWV0aG9kIGhhc1BhcmVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBmb3VuZFxuICAgKi9cbiAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gICAgd2hpbGUobm9kZSkge1xuICAgICAgaWYobm9kZSA9PSBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGdldCB0aGUgY2VudGVyIG9mIGFsbCB0aGUgdG91Y2hlc1xuICAgKiBAbWV0aG9kIGdldENlbnRlclxuICAgKiBAcGFyYW0ge0FycmF5fSB0b3VjaGVzXG4gICAqIEByZXR1cm4ge09iamVjdH0gY2VudGVyIGNvbnRhaW5zIGBwYWdlWGAsIGBwYWdlWWAsIGBjbGllbnRYYCBhbmQgYGNsaWVudFlgIHByb3BlcnRpZXNcbiAgICovXG4gIGdldENlbnRlcjogZnVuY3Rpb24gZ2V0Q2VudGVyKHRvdWNoZXMpIHtcbiAgICB2YXIgcGFnZVggPSBbXSxcbiAgICAgICAgcGFnZVkgPSBbXSxcbiAgICAgICAgY2xpZW50WCA9IFtdLFxuICAgICAgICBjbGllbnRZID0gW10sXG4gICAgICAgIG1pbiA9IE1hdGgubWluLFxuICAgICAgICBtYXggPSBNYXRoLm1heDtcblxuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB3aGVuIG9ubHkgb25lIHRvdWNoXG4gICAgaWYodG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2VYOiB0b3VjaGVzWzBdLnBhZ2VYLFxuICAgICAgICBwYWdlWTogdG91Y2hlc1swXS5wYWdlWSxcbiAgICAgICAgY2xpZW50WDogdG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaGVzWzBdLmNsaWVudFlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgVXRpbHMuZWFjaCh0b3VjaGVzLCBmdW5jdGlvbih0b3VjaCkge1xuICAgICAgcGFnZVgucHVzaCh0b3VjaC5wYWdlWCk7XG4gICAgICBwYWdlWS5wdXNoKHRvdWNoLnBhZ2VZKTtcbiAgICAgIGNsaWVudFgucHVzaCh0b3VjaC5jbGllbnRYKTtcbiAgICAgIGNsaWVudFkucHVzaCh0b3VjaC5jbGllbnRZKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYWdlWDogKG1pbi5hcHBseShNYXRoLCBwYWdlWCkgKyBtYXguYXBwbHkoTWF0aCwgcGFnZVgpKSAvIDIsXG4gICAgICBwYWdlWTogKG1pbi5hcHBseShNYXRoLCBwYWdlWSkgKyBtYXguYXBwbHkoTWF0aCwgcGFnZVkpKSAvIDIsXG4gICAgICBjbGllbnRYOiAobWluLmFwcGx5KE1hdGgsIGNsaWVudFgpICsgbWF4LmFwcGx5KE1hdGgsIGNsaWVudFgpKSAvIDIsXG4gICAgICBjbGllbnRZOiAobWluLmFwcGx5KE1hdGgsIGNsaWVudFkpICsgbWF4LmFwcGx5KE1hdGgsIGNsaWVudFkpKSAvIDJcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGJldHdlZW4gdHdvIHBvaW50cy4gdW5pdCBpcyBpbiBweCBwZXIgbXMuXG4gICAqIEBtZXRob2QgZ2V0VmVsb2NpdHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhVGltZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFYXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVlcbiAgICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICAgKi9cbiAgZ2V0VmVsb2NpdHk6IGZ1bmN0aW9uIGdldFZlbG9jaXR5KGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5hYnMoZGVsdGFYIC8gZGVsdGFUaW1lKSB8fCAwLFxuICAgICAgeTogTWF0aC5hYnMoZGVsdGFZIC8gZGVsdGFUaW1lKSB8fCAwXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICAgKiBAbWV0aG9kIGdldEFuZ2xlXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMVxuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDJcbiAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgKi9cbiAgZ2V0QW5nbGU6IGZ1bmN0aW9uIGdldEFuZ2xlKHRvdWNoMSwgdG91Y2gyKSB7XG4gICAgdmFyIHggPSB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYLFxuICAgICAgICB5ID0gdG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WTtcblxuICAgIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogMTgwIC8gTWF0aC5QSTtcbiAgfSxcblxuICAvKipcbiAgICogZG8gYSBzbWFsbCBjb21wYXJpc29uIHRvIGdldCB0aGUgZGlyZWN0aW9uIGJldHdlZW4gdHdvIHRvdWNoZXMuXG4gICAqIEBtZXRob2QgZ2V0RGlyZWN0aW9uXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMVxuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDJcbiAgICogQHJldHVybiB7U3RyaW5nfSBkaXJlY3Rpb24gbWF0Y2hlcyBgRElSRUNUSU9OX0xFRlR8UklHSFR8VVB8RE9XTmBcbiAgICovXG4gIGdldERpcmVjdGlvbjogZnVuY3Rpb24gZ2V0RGlyZWN0aW9uKHRvdWNoMSwgdG91Y2gyKSB7XG4gICAgdmFyIHggPSBNYXRoLmFicyh0b3VjaDEuY2xpZW50WCAtIHRvdWNoMi5jbGllbnRYKSxcbiAgICAgICAgeSA9IE1hdGguYWJzKHRvdWNoMS5jbGllbnRZIC0gdG91Y2gyLmNsaWVudFkpO1xuXG4gICAgaWYoeCA+PSB5KSB7XG4gICAgICByZXR1cm4gdG91Y2gxLmNsaWVudFggLSB0b3VjaDIuY2xpZW50WCA+IDAgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICB9XG4gICAgcmV0dXJuIHRvdWNoMS5jbGllbnRZIC0gdG91Y2gyLmNsaWVudFkgPiAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gdG91Y2hlc1xuICAgKiBAbWV0aG9kIGdldERpc3RhbmNlXG4gICAqIEBwYXJhbSB7VG91Y2h9dG91Y2gxXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuICBnZXREaXN0YW5jZTogZnVuY3Rpb24gZ2V0RGlzdGFuY2UodG91Y2gxLCB0b3VjaDIpIHtcbiAgICB2YXIgeCA9IHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFgsXG4gICAgICAgIHkgPSB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZO1xuXG4gICAgcmV0dXJuIE1hdGguc3FydCgoeCAqIHgpICsgKHkgKiB5KSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yIGJldHdlZW4gdHdvIHRvdWNoTGlzdHNcbiAgICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gICAqIEBtZXRob2QgZ2V0U2NhbGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHNjYWxlXG4gICAqL1xuICBnZXRTY2FsZTogZnVuY3Rpb24gZ2V0U2NhbGUoc3RhcnQsIGVuZCkge1xuICAgIC8vIG5lZWQgdHdvIGZpbmdlcnMuLi5cbiAgICBpZihzdGFydC5sZW5ndGggPj0gMiAmJiBlbmQubGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERpc3RhbmNlKGVuZFswXSwgZW5kWzFdKSAvIHRoaXMuZ2V0RGlzdGFuY2Uoc3RhcnRbMF0sIHN0YXJ0WzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIDE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgcm90YXRpb24gZGVncmVlcyBiZXR3ZWVuIHR3byB0b3VjaExpc3RzXG4gICAqIEBtZXRob2QgZ2V0Um90YXRpb25cbiAgICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gICAqL1xuICBnZXRSb3RhdGlvbjogZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIC8vIG5lZWQgdHdvIGZpbmdlcnNcbiAgICBpZihzdGFydC5sZW5ndGggPj0gMiAmJiBlbmQubGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEFuZ2xlKGVuZFsxXSwgZW5kWzBdKSAtIHRoaXMuZ2V0QW5nbGUoc3RhcnRbMV0sIHN0YXJ0WzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZpbmQgb3V0IGlmIHRoZSBkaXJlY3Rpb24gaXMgdmVydGljYWwgICAqXG4gICAqIEBtZXRob2QgaXNWZXJ0aWNhbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0aW9uIG1hdGNoZXMgYERJUkVDVElPTl9VUHxET1dOYFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBpc192ZXJ0aWNhbFxuICAgKi9cbiAgaXNWZXJ0aWNhbDogZnVuY3Rpb24gaXNWZXJ0aWNhbChkaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gZGlyZWN0aW9uID09IERJUkVDVElPTl9VUCB8fCBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0RPV047XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNldCBjc3MgcHJvcGVydGllcyB3aXRoIHRoZWlyIHByZWZpeGVzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3RvZ2dsZT10cnVlXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgc2V0UHJlZml4ZWRDc3M6IGZ1bmN0aW9uIHNldFByZWZpeGVkQ3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlLCB0b2dnbGUpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSBbJycsICdXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXTtcbiAgICBwcm9wID0gVXRpbHMudG9DYW1lbENhc2UocHJvcCk7XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcHJvcDtcbiAgICAgIC8vIHByZWZpeGVzXG4gICAgICBpZihwcmVmaXhlc1tpXSkge1xuICAgICAgICBwID0gcHJlZml4ZXNbaV0gKyBwLnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwLnNsaWNlKDEpO1xuICAgICAgfVxuXG4gICAgICAvLyB0ZXN0IHRoZSBzdHlsZVxuICAgICAgaWYocCBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbcF0gPSAodG9nZ2xlID09PSBudWxsIHx8IHRvZ2dsZSkgJiYgdmFsdWUgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogdG9nZ2xlIGJyb3dzZXIgZGVmYXVsdCBiZWhhdmlvciBieSBzZXR0aW5nIGNzcyBwcm9wZXJ0aWVzLlxuICAgKiBgdXNlclNlbGVjdD0nbm9uZSdgIGFsc28gc2V0cyBgZWxlbWVudC5vbnNlbGVjdHN0YXJ0YCB0byBmYWxzZVxuICAgKiBgdXNlckRyYWc9J25vbmUnYCBhbHNvIHNldHMgYGVsZW1lbnQub25kcmFnc3RhcnRgIHRvIGZhbHNlXG4gICAqXG4gICAqIEBtZXRob2QgdG9nZ2xlQmVoYXZpb3JcbiAgICogQHBhcmFtIHtIdG1sRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtCb29sZWFufSBbdG9nZ2xlPXRydWVdXG4gICAqL1xuICB0b2dnbGVCZWhhdmlvcjogZnVuY3Rpb24gdG9nZ2xlQmVoYXZpb3IoZWxlbWVudCwgcHJvcHMsIHRvZ2dsZSkge1xuICAgIGlmKCFwcm9wcyB8fCAhZWxlbWVudCB8fCAhZWxlbWVudC5zdHlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNldCB0aGUgY3NzIHByb3BlcnRpZXNcbiAgICBVdGlscy5lYWNoKHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcHJvcCkge1xuICAgICAgVXRpbHMuc2V0UHJlZml4ZWRDc3MoZWxlbWVudCwgcHJvcCwgdmFsdWUsIHRvZ2dsZSk7XG4gICAgfSk7XG5cbiAgICB2YXIgZmFsc2VGbiA9IHRvZ2dsZSAmJiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gYWxzbyB0aGUgZGlzYWJsZSBvbnNlbGVjdHN0YXJ0XG4gICAgaWYocHJvcHMudXNlclNlbGVjdCA9PSAnbm9uZScpIHtcbiAgICAgIGVsZW1lbnQub25zZWxlY3RzdGFydCA9IGZhbHNlRm47XG4gICAgfVxuICAgIC8vIGFuZCBkaXNhYmxlIG9uZHJhZ3N0YXJ0XG4gICAgaWYocHJvcHMudXNlckRyYWcgPT0gJ25vbmUnKSB7XG4gICAgICBlbGVtZW50Lm9uZHJhZ3N0YXJ0ID0gZmFsc2VGbjtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgYSBzdHJpbmcgd2l0aCB1bmRlcnNjb3JlcyB0byBjYW1lbENhc2VcbiAgICogc28gcHJldmVudF9kZWZhdWx0IGJlY29tZXMgcHJldmVudERlZmF1bHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGNhbWVsQ2FzZVN0clxuICAgKi9cbiAgdG9DYW1lbENhc2U6IGZ1bmN0aW9uIHRvQ2FtZWxDYXNlKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW18tXShbYS16XSkvZywgZnVuY3Rpb24ocykge1xuICAgICAgcmV0dXJuIHNbMV0udG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgfVxufTtcblxuXG4vKipcbiAqIEBtb2R1bGUgR2VzdHVyZURldGVjdG9yXG4gKi9cbi8qKlxuICogQGNsYXNzIEV2ZW50XG4gKiBAc3RhdGljXG4gKi9cbnZhciBFdmVudCA9IEdlc3R1cmVEZXRlY3Rvci5ldmVudCA9IHtcbiAgLyoqXG4gICAqIHdoZW4gdG91Y2ggZXZlbnRzIGhhdmUgYmVlbiBmaXJlZCwgdGhpcyBpcyB0cnVlXG4gICAqIHRoaXMgaXMgdXNlZCB0byBzdG9wIG1vdXNlIGV2ZW50c1xuICAgKiBAcHJvcGVydHkgcHJldmVudF9tb3VzZWV2ZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIHByZXZlbnRNb3VzZUV2ZW50czogZmFsc2UsXG5cbiAgLyoqXG4gICAqIGlmIEVWRU5UX1NUQVJUIGhhcyBiZWVuIGZpcmVkXG4gICAqIEBwcm9wZXJ0eSBzdGFydGVkXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgc3RhcnRlZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIHdoZW4gdGhlIG1vdXNlIGlzIGhvbGQgZG93biwgdGhpcyBpcyB0cnVlXG4gICAqIEBwcm9wZXJ0eSBzaG91bGRfZGV0ZWN0XG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgc2hvdWxkRGV0ZWN0OiBmYWxzZSxcblxuICAvKipcbiAgICogc2ltcGxlIGV2ZW50IGJpbmRlciB3aXRoIGEgaG9vayBhbmQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdHlwZXNcbiAgICogQG1ldGhvZCBvblxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hvb2tdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBob29rLnR5cGVcbiAgICovXG4gIG9uOiBmdW5jdGlvbiBvbihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBob29rKSB7XG4gICAgdmFyIHR5cGVzID0gdHlwZS5zcGxpdCgnICcpO1xuICAgIFV0aWxzLmVhY2godHlwZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIFV0aWxzLm9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpO1xuICAgICAgaG9vayAmJiBob29rKHR5cGUpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgZXZlbnQgdW5iaW5kZXIgd2l0aCBhIGhvb2sgYW5kIHN1cHBvcnQgZm9yIG11bHRpcGxlIHR5cGVzXG4gICAqIEBtZXRob2Qgb2ZmXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaG9va11cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvb2sudHlwZVxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgaG9vaykge1xuICAgIHZhciB0eXBlcyA9IHR5cGUuc3BsaXQoJyAnKTtcbiAgICBVdGlscy5lYWNoKHR5cGVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBVdGlscy5vZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlcik7XG4gICAgICBob29rICYmIGhvb2sodHlwZSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHRoZSBjb3JlIHRvdWNoIGV2ZW50IGhhbmRsZXIuXG4gICAqIHRoaXMgZmluZHMgb3V0IGlmIHdlIHNob3VsZCB0byBkZXRlY3QgZ2VzdHVyZXNcbiAgICogQG1ldGhvZCBvblRvdWNoXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZSBtYXRjaGVzIGBFVkVOVF9TVEFSVHxNT1ZFfEVORGBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcmV0dXJuIG9uVG91Y2hIYW5kbGVyIHtGdW5jdGlvbn0gdGhlIGNvcmUgZXZlbnQgaGFuZGxlclxuICAgKi9cbiAgb25Ub3VjaDogZnVuY3Rpb24gb25Ub3VjaChlbGVtZW50LCBldmVudFR5cGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgb25Ub3VjaEhhbmRsZXIgPSBmdW5jdGlvbiBvblRvdWNoSGFuZGxlcihldikge1xuICAgICAgdmFyIHNyY1R5cGUgPSBldi50eXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgaXNQb2ludGVyID0gR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTLFxuICAgICAgICAgIGlzTW91c2UgPSBVdGlscy5pblN0cihzcmNUeXBlLCAnbW91c2UnKSxcbiAgICAgICAgICB0cmlnZ2VyVHlwZTtcblxuICAgICAgLy8gaWYgd2UgYXJlIGluIGEgbW91c2VldmVudCwgYnV0IHRoZXJlIGhhcyBiZWVuIGEgdG91Y2hldmVudCB0cmlnZ2VyZWQgaW4gdGhpcyBzZXNzaW9uXG4gICAgICAvLyB3ZSB3YW50IHRvIGRvIG5vdGhpbmcuIHNpbXBseSBicmVhayBvdXQgb2YgdGhlIGV2ZW50LlxuICAgICAgaWYoaXNNb3VzZSAmJiBzZWxmLnByZXZlbnRNb3VzZUV2ZW50cykge1xuICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gbW91c2VidXR0b24gbXVzdCBiZSBkb3duXG4gICAgICB9IGVsc2UgaWYoaXNNb3VzZSAmJiBldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQgJiYgZXYuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIHNlbGYucHJldmVudE1vdXNlRXZlbnRzID0gZmFsc2U7XG4gICAgICAgIHNlbGYuc2hvdWxkRGV0ZWN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZihpc1BvaW50ZXIgJiYgZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICAgIHNlbGYuc2hvdWxkRGV0ZWN0ID0gKGV2LmJ1dHRvbnMgPT09IDEgfHwgUG9pbnRlckV2ZW50Lm1hdGNoVHlwZShQT0lOVEVSX1RPVUNILCBldikpO1xuICAgICAgICAvLyBqdXN0IGEgdmFsaWQgc3RhcnQgZXZlbnQsIGJ1dCBubyBtb3VzZVxuICAgICAgfSBlbHNlIGlmKCFpc01vdXNlICYmIGV2ZW50VHlwZSA9PSBFVkVOVF9TVEFSVCkge1xuICAgICAgICBzZWxmLnByZXZlbnRNb3VzZUV2ZW50cyA9IHRydWU7XG4gICAgICAgIHNlbGYuc2hvdWxkRGV0ZWN0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIHRoZSBwb2ludGVyIGV2ZW50IGJlZm9yZSBlbnRlcmluZyB0aGUgZGV0ZWN0aW9uXG4gICAgICBpZihpc1BvaW50ZXIgJiYgZXZlbnRUeXBlICE9IEVWRU5UX0VORCkge1xuICAgICAgICBQb2ludGVyRXZlbnQudXBkYXRlUG9pbnRlcihldmVudFR5cGUsIGV2KTtcbiAgICAgIH1cblxuICAgICAgLy8gd2UgYXJlIGluIGEgdG91Y2gvZG93biBzdGF0ZSwgc28gYWxsb3dlZCBkZXRlY3Rpb24gb2YgZ2VzdHVyZXNcbiAgICAgIGlmKHNlbGYuc2hvdWxkRGV0ZWN0KSB7XG4gICAgICAgIHRyaWdnZXJUeXBlID0gc2VsZi5kb0RldGVjdC5jYWxsKHNlbGYsIGV2LCBldmVudFR5cGUsIGVsZW1lbnQsIGhhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyAuLi5hbmQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgZGV0ZWN0aW9uXG4gICAgICAvLyBzbyByZXNldCBldmVyeXRoaW5nIHRvIHN0YXJ0IGVhY2ggZGV0ZWN0aW9uIHRvdGFsbHkgZnJlc2hcbiAgICAgIGlmKHRyaWdnZXJUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgICBzZWxmLnByZXZlbnRNb3VzZUV2ZW50cyA9IGZhbHNlO1xuICAgICAgICBzZWxmLnNob3VsZERldGVjdCA9IGZhbHNlO1xuICAgICAgICBQb2ludGVyRXZlbnQucmVzZXQoKTtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBwb2ludGVyZXZlbnQgb2JqZWN0IGFmdGVyIHRoZSBkZXRlY3Rpb25cbiAgICAgIH1cblxuICAgICAgaWYoaXNQb2ludGVyICYmIGV2ZW50VHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgICAgUG9pbnRlckV2ZW50LnVwZGF0ZVBvaW50ZXIoZXZlbnRUeXBlLCBldik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub24oZWxlbWVudCwgRVZFTlRfVFlQRVNbZXZlbnRUeXBlXSwgb25Ub3VjaEhhbmRsZXIpO1xuICAgIHJldHVybiBvblRvdWNoSGFuZGxlcjtcbiAgfSxcblxuICAvKipcbiAgICogdGhlIGNvcmUgZGV0ZWN0aW9uIG1ldGhvZFxuICAgKiB0aGlzIGZpbmRzIG91dCB3aGF0IEdlc3R1cmVEZXRlY3Rvci10b3VjaC1ldmVudHMgdG8gdHJpZ2dlclxuICAgKiBAbWV0aG9kIGRvRGV0ZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogQHJldHVybiB7U3RyaW5nfSB0cmlnZ2VyVHlwZSBtYXRjaGVzIGBFVkVOVF9TVEFSVHxNT1ZFfEVORGBcbiAgICovXG4gIGRvRGV0ZWN0OiBmdW5jdGlvbiBkb0RldGVjdChldiwgZXZlbnRUeXBlLCBlbGVtZW50LCBoYW5kbGVyKSB7XG4gICAgdmFyIHRvdWNoTGlzdCA9IHRoaXMuZ2V0VG91Y2hMaXN0KGV2LCBldmVudFR5cGUpO1xuICAgIHZhciB0b3VjaExpc3RMZW5ndGggPSB0b3VjaExpc3QubGVuZ3RoO1xuICAgIHZhciB0cmlnZ2VyVHlwZSA9IGV2ZW50VHlwZTtcbiAgICB2YXIgdHJpZ2dlckNoYW5nZSA9IHRvdWNoTGlzdC50cmlnZ2VyOyAvLyB1c2VkIGJ5IGZha2VNdWx0aXRvdWNoIHBsdWdpblxuICAgIHZhciBjaGFuZ2VkTGVuZ3RoID0gdG91Y2hMaXN0TGVuZ3RoO1xuXG4gICAgLy8gYXQgZWFjaCB0b3VjaHN0YXJ0LWxpa2UgZXZlbnQgd2Ugd2FudCBhbHNvIHdhbnQgdG8gdHJpZ2dlciBhIFRPVUNIIGV2ZW50Li4uXG4gICAgaWYoZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlID0gRVZFTlRfVE9VQ0g7XG4gICAgICAvLyAuLi50aGUgc2FtZSBmb3IgYSB0b3VjaGVuZC1saWtlIGV2ZW50XG4gICAgfSBlbHNlIGlmKGV2ZW50VHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgIHRyaWdnZXJDaGFuZ2UgPSBFVkVOVF9SRUxFQVNFO1xuXG4gICAgICAvLyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHRvdWNoZXMgaGF2ZSBiZWVuIHJlbW92ZWRcbiAgICAgIGNoYW5nZWRMZW5ndGggPSB0b3VjaExpc3QubGVuZ3RoIC0gKChldi5jaGFuZ2VkVG91Y2hlcykgPyBldi5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggOiAxKTtcbiAgICB9XG5cbiAgICAvLyBhZnRlciB0aGVyZSBhcmUgc3RpbGwgdG91Y2hlcyBvbiB0aGUgc2NyZWVuLFxuICAgIC8vIHdlIGp1c3Qgd2FudCB0byB0cmlnZ2VyIGEgTU9WRSBldmVudC4gc28gY2hhbmdlIHRoZSBTVEFSVCBvciBFTkQgdG8gYSBNT1ZFXG4gICAgLy8gYnV0IG9ubHkgYWZ0ZXIgZGV0ZWN0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQsIHRoZSBmaXJzdCB0aW1lIHdlIGFjdHVhbGx5IHdhbnQgYSBTVEFSVFxuICAgIGlmKGNoYW5nZWRMZW5ndGggPiAwICYmIHRoaXMuc3RhcnRlZCkge1xuICAgICAgdHJpZ2dlclR5cGUgPSBFVkVOVF9NT1ZFO1xuICAgIH1cblxuICAgIC8vIGRldGVjdGlvbiBoYXMgYmVlbiBzdGFydGVkLCB3ZSBrZWVwIHRyYWNrIG9mIHRoaXMsIHNlZSBhYm92ZVxuICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG5cbiAgICAvLyBnZW5lcmF0ZSBzb21lIGV2ZW50IGRhdGEsIHNvbWUgYmFzaWMgaW5mb3JtYXRpb25cbiAgICB2YXIgZXZEYXRhID0gdGhpcy5jb2xsZWN0RXZlbnREYXRhKGVsZW1lbnQsIHRyaWdnZXJUeXBlLCB0b3VjaExpc3QsIGV2KTtcblxuICAgIC8vIHRyaWdnZXIgdGhlIHRyaWdnZXJUeXBlIGV2ZW50IGJlZm9yZSB0aGUgY2hhbmdlIChUT1VDSCwgUkVMRUFTRSkgZXZlbnRzXG4gICAgLy8gYnV0IHRoZSBFTkQgZXZlbnQgc2hvdWxkIGJlIGF0IGxhc3RcbiAgICBpZihldmVudFR5cGUgIT0gRVZFTlRfRU5EKSB7XG4gICAgICBoYW5kbGVyLmNhbGwoRGV0ZWN0aW9uLCBldkRhdGEpO1xuICAgIH1cblxuICAgIC8vIHRyaWdnZXIgYSBjaGFuZ2UgKFRPVUNILCBSRUxFQVNFKSBldmVudCwgdGhpcyBtZWFucyB0aGUgbGVuZ3RoIG9mIHRoZSB0b3VjaGVzIGNoYW5nZWRcbiAgICBpZih0cmlnZ2VyQ2hhbmdlKSB7XG4gICAgICBldkRhdGEuY2hhbmdlZExlbmd0aCA9IGNoYW5nZWRMZW5ndGg7XG4gICAgICBldkRhdGEuZXZlbnRUeXBlID0gdHJpZ2dlckNoYW5nZTtcblxuICAgICAgaGFuZGxlci5jYWxsKERldGVjdGlvbiwgZXZEYXRhKTtcblxuICAgICAgZXZEYXRhLmV2ZW50VHlwZSA9IHRyaWdnZXJUeXBlO1xuICAgICAgZGVsZXRlIGV2RGF0YS5jaGFuZ2VkTGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIHRyaWdnZXIgdGhlIEVORCBldmVudFxuICAgIGlmKHRyaWdnZXJUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgaGFuZGxlci5jYWxsKERldGVjdGlvbiwgZXZEYXRhKTtcblxuICAgICAgLy8gLi4uYW5kIHdlIGFyZSBkb25lIHdpdGggdGhlIGRldGVjdGlvblxuICAgICAgLy8gc28gcmVzZXQgZXZlcnl0aGluZyB0byBzdGFydCBlYWNoIGRldGVjdGlvbiB0b3RhbGx5IGZyZXNoXG4gICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJpZ2dlclR5cGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgZGlmZmVyZW50IGV2ZW50cyBmb3IgZWFjaCBkZXZpY2UvYnJvd3NlclxuICAgKiBkZXRlcm1pbmUgd2hhdCB3ZSBuZWVkIGFuZCBzZXQgdGhlbSBpbiB0aGUgRVZFTlRfVFlQRVMgY29uc3RhbnRcbiAgICogdGhlIGBvblRvdWNoYCBtZXRob2QgaXMgYmluZCB0byB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgKiBAbWV0aG9kIGRldGVybWluZUV2ZW50VHlwZXNcbiAgICogQHJldHVybiB7T2JqZWN0fSBldmVudHNcbiAgICovXG4gIGRldGVybWluZUV2ZW50VHlwZXM6IGZ1bmN0aW9uIGRldGVybWluZUV2ZW50VHlwZXMoKSB7XG4gICAgdmFyIHR5cGVzO1xuICAgIGlmKEdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUykge1xuICAgICAgaWYod2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgICAgICB0eXBlcyA9IFtcbiAgICAgICAgICAncG9pbnRlcmRvd24nLFxuICAgICAgICAgICdwb2ludGVybW92ZScsXG4gICAgICAgICAgJ3BvaW50ZXJ1cCBwb2ludGVyY2FuY2VsIGxvc3Rwb2ludGVyY2FwdHVyZSdcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVzID0gW1xuICAgICAgICAgICdNU1BvaW50ZXJEb3duJyxcbiAgICAgICAgICAnTVNQb2ludGVyTW92ZScsXG4gICAgICAgICAgJ01TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCBNU0xvc3RQb2ludGVyQ2FwdHVyZSdcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoR2VzdHVyZURldGVjdG9yLk5PX01PVVNFRVZFTlRTKSB7XG4gICAgICB0eXBlcyA9IFtcbiAgICAgICAgJ3RvdWNoc3RhcnQnLFxuICAgICAgICAndG91Y2htb3ZlJyxcbiAgICAgICAgJ3RvdWNoZW5kIHRvdWNoY2FuY2VsJ1xuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZXMgPSBbXG4gICAgICAgICd0b3VjaHN0YXJ0IG1vdXNlZG93bicsXG4gICAgICAgICd0b3VjaG1vdmUgbW91c2Vtb3ZlJyxcbiAgICAgICAgJ3RvdWNoZW5kIHRvdWNoY2FuY2VsIG1vdXNldXAnXG4gICAgICBdO1xuICAgIH1cblxuICAgIEVWRU5UX1RZUEVTW0VWRU5UX1NUQVJUXSA9IHR5cGVzWzBdO1xuICAgIEVWRU5UX1RZUEVTW0VWRU5UX01PVkVdID0gdHlwZXNbMV07XG4gICAgRVZFTlRfVFlQRVNbRVZFTlRfRU5EXSA9IHR5cGVzWzJdO1xuICAgIHJldHVybiBFVkVOVF9UWVBFUztcbiAgfSxcblxuICAvKipcbiAgICogY3JlYXRlIHRvdWNoTGlzdCBkZXBlbmRpbmcgb24gdGhlIGV2ZW50XG4gICAqIEBtZXRob2QgZ2V0VG91Y2hMaXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlXG4gICAqIEByZXR1cm4ge0FycmF5fSB0b3VjaGVzXG4gICAqL1xuICBnZXRUb3VjaExpc3Q6IGZ1bmN0aW9uIGdldFRvdWNoTGlzdChldiwgZXZlbnRUeXBlKSB7XG4gICAgLy8gZ2V0IHRoZSBmYWtlIHBvaW50ZXJFdmVudCB0b3VjaGxpc3RcbiAgICBpZihHZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFMpIHtcbiAgICAgIHJldHVybiBQb2ludGVyRXZlbnQuZ2V0VG91Y2hMaXN0KCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSB0b3VjaGxpc3RcbiAgICBpZihldi50b3VjaGVzKSB7XG4gICAgICBpZihldmVudFR5cGUgPT0gRVZFTlRfTU9WRSkge1xuICAgICAgICByZXR1cm4gZXYudG91Y2hlcztcbiAgICAgIH1cblxuICAgICAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gICAgICB2YXIgY29uY2F0ID0gW10uY29uY2F0KFV0aWxzLnRvQXJyYXkoZXYudG91Y2hlcyksIFV0aWxzLnRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpKTtcbiAgICAgIHZhciB0b3VjaExpc3QgPSBbXTtcblxuICAgICAgVXRpbHMuZWFjaChjb25jYXQsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIGlmKFV0aWxzLmluQXJyYXkoaWRlbnRpZmllcnMsIHRvdWNoLmlkZW50aWZpZXIpID09PSBmYWxzZSkge1xuICAgICAgICAgIHRvdWNoTGlzdC5wdXNoKHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZGVudGlmaWVycy5wdXNoKHRvdWNoLmlkZW50aWZpZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0b3VjaExpc3Q7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBmYWtlIHRvdWNoTGlzdCBmcm9tIG1vdXNlIHBvc2l0aW9uXG4gICAgZXYuaWRlbnRpZmllciA9IDE7XG4gICAgcmV0dXJuIFtldl07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvbGxlY3QgYmFzaWMgZXZlbnQgZGF0YVxuICAgKiBAbWV0aG9kIGNvbGxlY3RFdmVudERhdGFcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKiBAcGFyYW0ge0FycmF5fSB0b3VjaGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGV2XG4gICAqL1xuICBjb2xsZWN0RXZlbnREYXRhOiBmdW5jdGlvbiBjb2xsZWN0RXZlbnREYXRhKGVsZW1lbnQsIGV2ZW50VHlwZSwgdG91Y2hlcywgZXYpIHtcbiAgICAvLyBmaW5kIG91dCBwb2ludGVyVHlwZVxuICAgIHZhciBwb2ludGVyVHlwZSA9IFBPSU5URVJfVE9VQ0g7XG4gICAgaWYoVXRpbHMuaW5TdHIoZXYudHlwZSwgJ21vdXNlJykgfHwgUG9pbnRlckV2ZW50Lm1hdGNoVHlwZShQT0lOVEVSX01PVVNFLCBldikpIHtcbiAgICAgIHBvaW50ZXJUeXBlID0gUE9JTlRFUl9NT1VTRTtcbiAgICB9IGVsc2UgaWYoUG9pbnRlckV2ZW50Lm1hdGNoVHlwZShQT0lOVEVSX1BFTiwgZXYpKSB7XG4gICAgICBwb2ludGVyVHlwZSA9IFBPSU5URVJfUEVOO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjZW50ZXI6IFV0aWxzLmdldENlbnRlcih0b3VjaGVzKSxcbiAgICAgIHRpbWVTdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHRhcmdldDogZXYudGFyZ2V0LFxuICAgICAgdG91Y2hlczogdG91Y2hlcyxcbiAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgcG9pbnRlclR5cGU6IHBvaW50ZXJUeXBlLFxuICAgICAgc3JjRXZlbnQ6IGV2LFxuXG4gICAgICAvKipcbiAgICAgICAqIHByZXZlbnQgdGhlIGJyb3dzZXIgZGVmYXVsdCBhY3Rpb25zXG4gICAgICAgKiBtb3N0bHkgdXNlZCB0byBkaXNhYmxlIHNjcm9sbGluZyBvZiB0aGUgYnJvd3NlclxuICAgICAgICovXG4gICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzcmNFdmVudCA9IHRoaXMuc3JjRXZlbnQ7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnRNYW5pcHVsYXRpb24gJiYgc3JjRXZlbnQucHJldmVudE1hbmlwdWxhdGlvbigpO1xuICAgICAgICBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCAmJiBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBzdG9wIGJ1YmJsaW5nIHRoZSBldmVudCB1cCB0byBpdHMgcGFyZW50c1xuICAgICAgICovXG4gICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNyY0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBpbW1lZGlhdGVseSBzdG9wIGdlc3R1cmUgZGV0ZWN0aW9uXG4gICAgICAgKiBtaWdodCBiZSB1c2VmdWwgYWZ0ZXIgYSBzd2lwZSB3YXMgZGV0ZWN0ZWRcbiAgICAgICAqIEByZXR1cm4geyp9XG4gICAgICAgKi9cbiAgICAgIHN0b3BEZXRlY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRGV0ZWN0aW9uLnN0b3BEZXRlY3QoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqXG4gKiBAY2xhc3MgUG9pbnRlckV2ZW50XG4gKiBAc3RhdGljXG4gKi9cbnZhciBQb2ludGVyRXZlbnQgPSBHZXN0dXJlRGV0ZWN0b3IuUG9pbnRlckV2ZW50ID0ge1xuICAvKipcbiAgICogaG9sZHMgYWxsIHBvaW50ZXJzLCBieSBgaWRlbnRpZmllcmBcbiAgICogQHByb3BlcnR5IHBvaW50ZXJzXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBwb2ludGVyczoge30sXG5cbiAgLyoqXG4gICAqIGdldCB0aGUgcG9pbnRlcnMgYXMgYW4gYXJyYXlcbiAgICogQG1ldGhvZCBnZXRUb3VjaExpc3RcbiAgICogQHJldHVybiB7QXJyYXl9IHRvdWNobGlzdFxuICAgKi9cbiAgZ2V0VG91Y2hMaXN0OiBmdW5jdGlvbiBnZXRUb3VjaExpc3QoKSB7XG4gICAgdmFyIHRvdWNobGlzdCA9IFtdO1xuICAgIC8vIHdlIGNhbiB1c2UgZm9yRWFjaCBzaW5jZSBwb2ludGVyRXZlbnRzIG9ubHkgaXMgaW4gSUUxMFxuICAgIFV0aWxzLmVhY2godGhpcy5wb2ludGVycywgZnVuY3Rpb24ocG9pbnRlcikge1xuICAgICAgdG91Y2hsaXN0LnB1c2gocG9pbnRlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvdWNobGlzdDtcbiAgfSxcblxuICAvKipcbiAgICogdXBkYXRlIHRoZSBwb3NpdGlvbiBvZiBhIHBvaW50ZXJcbiAgICogQG1ldGhvZCB1cGRhdGVQb2ludGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwb2ludGVyRXZlbnRcbiAgICovXG4gIHVwZGF0ZVBvaW50ZXI6IGZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXIoZXZlbnRUeXBlLCBwb2ludGVyRXZlbnQpIHtcbiAgICBpZihldmVudFR5cGUgPT0gRVZFTlRfRU5EIHx8IChldmVudFR5cGUgIT0gRVZFTlRfRU5EICYmIHBvaW50ZXJFdmVudC5idXR0b25zICE9PSAxKSkge1xuICAgICAgZGVsZXRlIHRoaXMucG9pbnRlcnNbcG9pbnRlckV2ZW50LnBvaW50ZXJJZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvaW50ZXJFdmVudC5pZGVudGlmaWVyID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgIHRoaXMucG9pbnRlcnNbcG9pbnRlckV2ZW50LnBvaW50ZXJJZF0gPSBwb2ludGVyRXZlbnQ7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjaGVjayBpZiBldiBtYXRjaGVzIHBvaW50ZXJ0eXBlXG4gICAqIEBtZXRob2QgbWF0Y2hUeXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwb2ludGVyVHlwZSBtYXRjaGVzIGBQT0lOVEVSX01PVVNFfFRPVUNIfFBFTmBcbiAgICogQHBhcmFtIHtQb2ludGVyRXZlbnR9IGV2XG4gICAqL1xuICBtYXRjaFR5cGU6IGZ1bmN0aW9uIG1hdGNoVHlwZShwb2ludGVyVHlwZSwgZXYpIHtcbiAgICBpZighZXYucG9pbnRlclR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHQgPSBldi5wb2ludGVyVHlwZSxcbiAgICAgICAgdHlwZXMgPSB7fTtcblxuICAgIHR5cGVzW1BPSU5URVJfTU9VU0VdID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfTU9VU0UgfHwgUE9JTlRFUl9NT1VTRSkpO1xuICAgIHR5cGVzW1BPSU5URVJfVE9VQ0hdID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfVE9VQ0ggfHwgUE9JTlRFUl9UT1VDSCkpO1xuICAgIHR5cGVzW1BPSU5URVJfUEVOXSA9IChwdCA9PT0gKGV2Lk1TUE9JTlRFUl9UWVBFX1BFTiB8fCBQT0lOVEVSX1BFTikpO1xuICAgIHJldHVybiB0eXBlc1twb2ludGVyVHlwZV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlc2V0IHRoZSBzdG9yZWQgcG9pbnRlcnNcbiAgICogQG1ldGhvZCByZXNldFxuICAgKi9cbiAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0TGlzdCgpIHtcbiAgICB0aGlzLnBvaW50ZXJzID0ge307XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICpcbiAqIEBjbGFzcyBEZXRlY3Rpb25cbiAqIEBzdGF0aWNcbiAqL1xudmFyIERldGVjdGlvbiA9IEdlc3R1cmVEZXRlY3Rvci5kZXRlY3Rpb24gPSB7XG4gIC8vIGNvbnRhaW5zIGFsbCByZWdpc3RlcmVkIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcyBpbiB0aGUgY29ycmVjdCBvcmRlclxuICBnZXN0dXJlczogW10sXG5cbiAgLy8gZGF0YSBvZiB0aGUgY3VycmVudCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBkZXRlY3Rpb24gc2Vzc2lvblxuICBjdXJyZW50OiBudWxsLFxuXG4gIC8vIHRoZSBwcmV2aW91cyBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBzZXNzaW9uIGRhdGFcbiAgLy8gaXMgYSBmdWxsIGNsb25lIG9mIHRoZSBwcmV2aW91cyBnZXN0dXJlLmN1cnJlbnQgb2JqZWN0XG4gIHByZXZpb3VzOiBudWxsLFxuXG4gIC8vIHdoZW4gdGhpcyBiZWNvbWVzIHRydWUsIG5vIGdlc3R1cmVzIGFyZSBmaXJlZFxuICBzdG9wcGVkOiBmYWxzZSxcblxuICAvKipcbiAgICogc3RhcnQgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgZGV0ZWN0aW9uXG4gICAqIEBtZXRob2Qgc3RhcnREZXRlY3RcbiAgICogQHBhcmFtIHtHZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2V9IGluc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50RGF0YVxuICAgKi9cbiAgc3RhcnREZXRlY3Q6IGZ1bmN0aW9uIHN0YXJ0RGV0ZWN0KGluc3QsIGV2ZW50RGF0YSkge1xuICAgIC8vIGFscmVhZHkgYnVzeSB3aXRoIGEgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgZGV0ZWN0aW9uIG9uIGFuIGVsZW1lbnRcbiAgICBpZih0aGlzLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZTtcblxuICAgIC8vIGhvbGRzIGN1cnJlbnQgc2Vzc2lvblxuICAgIHRoaXMuY3VycmVudCA9IHtcbiAgICAgIGluc3Q6IGluc3QsIC8vIHJlZmVyZW5jZSB0byBHZXN0dXJlRGV0ZWN0b3JJbnN0YW5jZSB3ZSdyZSB3b3JraW5nIGZvclxuICAgICAgc3RhcnRFdmVudDogVXRpbHMuZXh0ZW5kKHt9LCBldmVudERhdGEpLCAvLyBzdGFydCBldmVudERhdGEgZm9yIGRpc3RhbmNlcywgdGltaW5nIGV0Y1xuICAgICAgbGFzdEV2ZW50OiBmYWxzZSwgLy8gbGFzdCBldmVudERhdGFcbiAgICAgIGxhc3RDYWxjRXZlbnQ6IGZhbHNlLCAvLyBsYXN0IGV2ZW50RGF0YSBmb3IgY2FsY3VsYXRpb25zLlxuICAgICAgZnV0dXJlQ2FsY0V2ZW50OiBmYWxzZSwgLy8gbGFzdCBldmVudERhdGEgZm9yIGNhbGN1bGF0aW9ucy5cbiAgICAgIGxhc3RDYWxjRGF0YToge30sIC8vIGxhc3QgbGFzdENhbGNEYXRhXG4gICAgICBuYW1lOiAnJyAvLyBjdXJyZW50IGdlc3R1cmUgd2UncmUgaW4vZGV0ZWN0ZWQsIGNhbiBiZSAndGFwJywgJ2hvbGQnIGV0Y1xuICAgIH07XG5cbiAgICB0aGlzLmRldGVjdChldmVudERhdGEpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICogQG1ldGhvZCBkZXRlY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50RGF0YVxuICAgKiBAcmV0dXJuIHthbnl9XG4gICAqL1xuICBkZXRlY3Q6IGZ1bmN0aW9uIGRldGVjdChldmVudERhdGEpIHtcbiAgICBpZighdGhpcy5jdXJyZW50IHx8IHRoaXMuc3RvcHBlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGV4dGVuZCBldmVudCBkYXRhIHdpdGggY2FsY3VsYXRpb25zIGFib3V0IHNjYWxlLCBkaXN0YW5jZSBldGNcbiAgICBldmVudERhdGEgPSB0aGlzLmV4dGVuZEV2ZW50RGF0YShldmVudERhdGEpO1xuXG4gICAgLy8gR2VzdHVyZURldGVjdG9yIGluc3RhbmNlIGFuZCBpbnN0YW5jZSBvcHRpb25zXG4gICAgdmFyIGluc3QgPSB0aGlzLmN1cnJlbnQuaW5zdCxcbiAgICAgICAgaW5zdE9wdGlvbnMgPSBpbnN0Lm9wdGlvbnM7XG5cbiAgICAvLyBjYWxsIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGhhbmRsZXJzXG4gICAgVXRpbHMuZWFjaCh0aGlzLmdlc3R1cmVzLCBmdW5jdGlvbiB0cmlnZ2VyR2VzdHVyZShnZXN0dXJlKSB7XG4gICAgICAvLyBvbmx5IHdoZW4gdGhlIGluc3RhbmNlIG9wdGlvbnMgaGF2ZSBlbmFibGVkIHRoaXMgZ2VzdHVyZVxuICAgICAgaWYoIXRoaXMuc3RvcHBlZCAmJiBpbnN0LmVuYWJsZWQgJiYgaW5zdE9wdGlvbnNbZ2VzdHVyZS5uYW1lXSkge1xuICAgICAgICBnZXN0dXJlLmhhbmRsZXIuY2FsbChnZXN0dXJlLCBldmVudERhdGEsIGluc3QpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuXG4gICAgLy8gc3RvcmUgYXMgcHJldmlvdXMgZXZlbnQgZXZlbnRcbiAgICBpZih0aGlzLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuY3VycmVudC5sYXN0RXZlbnQgPSBldmVudERhdGE7XG4gICAgfVxuXG4gICAgaWYoZXZlbnREYXRhLmV2ZW50VHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgIHRoaXMuc3RvcERldGVjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBldmVudERhdGE7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNsZWFyIHRoZSBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSB2YXJzXG4gICAqIHRoaXMgaXMgY2FsbGVkIG9uIGVuZERldGVjdCwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgd2hlbiBhIGZpbmFsIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGhhcyBiZWVuIGRldGVjdGVkXG4gICAqIHRvIHN0b3Agb3RoZXIgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzIGZyb20gYmVpbmcgZmlyZWRcbiAgICogQG1ldGhvZCBzdG9wRGV0ZWN0XG4gICAqL1xuICBzdG9wRGV0ZWN0OiBmdW5jdGlvbiBzdG9wRGV0ZWN0KCkge1xuICAgIC8vIGNsb25lIGN1cnJlbnQgZGF0YSB0byB0aGUgc3RvcmUgYXMgdGhlIHByZXZpb3VzIGdlc3R1cmVcbiAgICAvLyB1c2VkIGZvciB0aGUgZG91YmxlIHRhcCBnZXN0dXJlLCBzaW5jZSB0aGlzIGlzIGFuIG90aGVyIGdlc3R1cmUgZGV0ZWN0IHNlc3Npb25cbiAgICB0aGlzLnByZXZpb3VzID0gVXRpbHMuZXh0ZW5kKHt9LCB0aGlzLmN1cnJlbnQpO1xuXG4gICAgLy8gcmVzZXQgdGhlIGN1cnJlbnRcbiAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB2ZWxvY2l0eSwgYW5nbGUgYW5kIGRpcmVjdGlvblxuICAgKiBAbWV0aG9kIGdldFZlbG9jaXR5RGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHBhcmFtIHtPYmplY3R9IGNlbnRlclxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhWVxuICAgKi9cbiAgZ2V0Q2FsY3VsYXRlZERhdGE6IGZ1bmN0aW9uIGdldENhbGN1bGF0ZWREYXRhKGV2LCBjZW50ZXIsIGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpIHtcbiAgICB2YXIgY3VyID0gdGhpcy5jdXJyZW50LFxuICAgICAgICByZWNhbGMgPSBmYWxzZSxcbiAgICAgICAgY2FsY0V2ID0gY3VyLmxhc3RDYWxjRXZlbnQsXG4gICAgICAgIGNhbGNEYXRhID0gY3VyLmxhc3RDYWxjRGF0YTtcblxuICAgIGlmKGNhbGNFdiAmJiBldi50aW1lU3RhbXAgLSBjYWxjRXYudGltZVN0YW1wID4gR2VzdHVyZURldGVjdG9yLkNBTENVTEFURV9JTlRFUlZBTCkge1xuICAgICAgY2VudGVyID0gY2FsY0V2LmNlbnRlcjtcbiAgICAgIGRlbHRhVGltZSA9IGV2LnRpbWVTdGFtcCAtIGNhbGNFdi50aW1lU3RhbXA7XG4gICAgICBkZWx0YVggPSBldi5jZW50ZXIuY2xpZW50WCAtIGNhbGNFdi5jZW50ZXIuY2xpZW50WDtcbiAgICAgIGRlbHRhWSA9IGV2LmNlbnRlci5jbGllbnRZIC0gY2FsY0V2LmNlbnRlci5jbGllbnRZO1xuICAgICAgcmVjYWxjID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZihldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0ggfHwgZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgIGN1ci5mdXR1cmVDYWxjRXZlbnQgPSBldjtcbiAgICB9XG5cbiAgICBpZighY3VyLmxhc3RDYWxjRXZlbnQgfHwgcmVjYWxjKSB7XG4gICAgICBjYWxjRGF0YS52ZWxvY2l0eSA9IFV0aWxzLmdldFZlbG9jaXR5KGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgY2FsY0RhdGEuYW5nbGUgPSBVdGlscy5nZXRBbmdsZShjZW50ZXIsIGV2LmNlbnRlcik7XG4gICAgICBjYWxjRGF0YS5kaXJlY3Rpb24gPSBVdGlscy5nZXREaXJlY3Rpb24oY2VudGVyLCBldi5jZW50ZXIpO1xuXG4gICAgICBjdXIubGFzdENhbGNFdmVudCA9IGN1ci5mdXR1cmVDYWxjRXZlbnQgfHwgZXY7XG4gICAgICBjdXIuZnV0dXJlQ2FsY0V2ZW50ID0gZXY7XG4gICAgfVxuXG4gICAgZXYudmVsb2NpdHlYID0gY2FsY0RhdGEudmVsb2NpdHkueDtcbiAgICBldi52ZWxvY2l0eVkgPSBjYWxjRGF0YS52ZWxvY2l0eS55O1xuICAgIGV2LmludGVyaW1BbmdsZSA9IGNhbGNEYXRhLmFuZ2xlO1xuICAgIGV2LmludGVyaW1EaXJlY3Rpb24gPSBjYWxjRGF0YS5kaXJlY3Rpb247XG4gIH0sXG5cbiAgLyoqXG4gICAqIGV4dGVuZCBldmVudERhdGEgZm9yIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlc1xuICAgKiBAbWV0aG9kIGV4dGVuZEV2ZW50RGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHJldHVybiB7T2JqZWN0fSBldlxuICAgKi9cbiAgZXh0ZW5kRXZlbnREYXRhOiBmdW5jdGlvbiBleHRlbmRFdmVudERhdGEoZXYpIHtcbiAgICB2YXIgY3VyID0gdGhpcy5jdXJyZW50LFxuICAgICAgICBzdGFydEV2ID0gY3VyLnN0YXJ0RXZlbnQsXG4gICAgICAgIGxhc3RFdiA9IGN1ci5sYXN0RXZlbnQgfHwgc3RhcnRFdjtcblxuICAgIC8vIHVwZGF0ZSB0aGUgc3RhcnQgdG91Y2hsaXN0IHRvIGNhbGN1bGF0ZSB0aGUgc2NhbGUvcm90YXRpb25cbiAgICBpZihldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0ggfHwgZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgIHN0YXJ0RXYudG91Y2hlcyA9IFtdO1xuICAgICAgVXRpbHMuZWFjaChldi50b3VjaGVzLCBmdW5jdGlvbih0b3VjaCkge1xuICAgICAgICBzdGFydEV2LnRvdWNoZXMucHVzaCh7XG4gICAgICAgICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIGRlbHRhVGltZSA9IGV2LnRpbWVTdGFtcCAtIHN0YXJ0RXYudGltZVN0YW1wLFxuICAgICAgICBkZWx0YVggPSBldi5jZW50ZXIuY2xpZW50WCAtIHN0YXJ0RXYuY2VudGVyLmNsaWVudFgsXG4gICAgICAgIGRlbHRhWSA9IGV2LmNlbnRlci5jbGllbnRZIC0gc3RhcnRFdi5jZW50ZXIuY2xpZW50WTtcblxuICAgIHRoaXMuZ2V0Q2FsY3VsYXRlZERhdGEoZXYsIGxhc3RFdi5jZW50ZXIsIGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgVXRpbHMuZXh0ZW5kKGV2LCB7XG4gICAgICBzdGFydEV2ZW50OiBzdGFydEV2LFxuXG4gICAgICBkZWx0YVRpbWU6IGRlbHRhVGltZSxcbiAgICAgIGRlbHRhWDogZGVsdGFYLFxuICAgICAgZGVsdGFZOiBkZWx0YVksXG5cbiAgICAgIGRpc3RhbmNlOiBVdGlscy5nZXREaXN0YW5jZShzdGFydEV2LmNlbnRlciwgZXYuY2VudGVyKSxcbiAgICAgIGFuZ2xlOiBVdGlscy5nZXRBbmdsZShzdGFydEV2LmNlbnRlciwgZXYuY2VudGVyKSxcbiAgICAgIGRpcmVjdGlvbjogVXRpbHMuZ2V0RGlyZWN0aW9uKHN0YXJ0RXYuY2VudGVyLCBldi5jZW50ZXIpLFxuICAgICAgc2NhbGU6IFV0aWxzLmdldFNjYWxlKHN0YXJ0RXYudG91Y2hlcywgZXYudG91Y2hlcyksXG4gICAgICByb3RhdGlvbjogVXRpbHMuZ2V0Um90YXRpb24oc3RhcnRFdi50b3VjaGVzLCBldi50b3VjaGVzKVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV2O1xuICB9LFxuXG4gIC8qKlxuICAgKiByZWdpc3RlciBuZXcgZ2VzdHVyZVxuICAgKiBAbWV0aG9kIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBnZXN0dXJlIG9iamVjdCwgc2VlIGBnZXN0dXJlcy9gIGZvciBkb2N1bWVudGF0aW9uXG4gICAqIEByZXR1cm4ge0FycmF5fSBnZXN0dXJlc1xuICAgKi9cbiAgcmVnaXN0ZXI6IGZ1bmN0aW9uIHJlZ2lzdGVyKGdlc3R1cmUpIHtcbiAgICAvLyBhZGQgYW4gZW5hYmxlIGdlc3R1cmUgb3B0aW9ucyBpZiB0aGVyZSBpcyBubyBnaXZlblxuICAgIHZhciBvcHRpb25zID0gZ2VzdHVyZS5kZWZhdWx0cyB8fCB7fTtcbiAgICBpZihvcHRpb25zW2dlc3R1cmUubmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9uc1tnZXN0dXJlLm5hbWVdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBleHRlbmQgR2VzdHVyZURldGVjdG9yIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBvcHRpb25zXG4gICAgVXRpbHMuZXh0ZW5kKEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cywgb3B0aW9ucywgdHJ1ZSk7XG5cbiAgICAvLyBzZXQgaXRzIGluZGV4XG4gICAgZ2VzdHVyZS5pbmRleCA9IGdlc3R1cmUuaW5kZXggfHwgMTAwMDtcblxuICAgIC8vIGFkZCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSB0byB0aGUgbGlzdFxuICAgIHRoaXMuZ2VzdHVyZXMucHVzaChnZXN0dXJlKTtcblxuICAgIC8vIHNvcnQgdGhlIGxpc3QgYnkgaW5kZXhcbiAgICB0aGlzLmdlc3R1cmVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgaWYoYS5pbmRleCA8IGIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYoYS5pbmRleCA+IGIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmdlc3R1cmVzO1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqL1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgR2VzdHVyZURldGVjdG9yIGluc3RhbmNlXG4gKiBhbGwgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHRoZSBpbnN0YW5jZSBpdHNlbGYsIHNvIGl0IGlzIGNoYWluYWJsZS5cbiAqXG4gKiBAY2xhc3MgSW5zdGFuY2VcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBvcHRpb25zIGFyZSBtZXJnZWQgd2l0aCBgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzYFxuICogQHJldHVybiB7R2VzdHVyZURldGVjdG9yLkluc3RhbmNlfVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBzZXR1cCBHZXN0dXJlRGV0ZWN0b3JKUyB3aW5kb3cgZXZlbnRzIGFuZCByZWdpc3RlciBhbGwgZ2VzdHVyZXNcbiAgLy8gdGhpcyBhbHNvIHNldHMgdXAgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICBzZXR1cCgpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZWxlbWVudFxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZW5hYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogb3B0aW9ucywgbWVyZ2VkIHdpdGggdGhlIGRlZmF1bHRzXG4gICAqIG9wdGlvbnMgd2l0aCBhbiBfIGFyZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBVdGlscy5lYWNoKG9wdGlvbnMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgZGVsZXRlIG9wdGlvbnNbbmFtZV07XG4gICAgb3B0aW9uc1tVdGlscy50b0NhbWVsQ2FzZShuYW1lKV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgdGhpcy5vcHRpb25zID0gVXRpbHMuZXh0ZW5kKFV0aWxzLmV4dGVuZCh7fSwgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzKSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgLy8gYWRkIHNvbWUgY3NzIHRvIHRoZSBlbGVtZW50IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIgZnJvbSBkb2luZyBpdHMgbmF0aXZlIGJlaGF2aW9yXG4gIGlmKHRoaXMub3B0aW9ucy5iZWhhdmlvcikge1xuICAgIFV0aWxzLnRvZ2dsZUJlaGF2aW9yKHRoaXMuZWxlbWVudCwgdGhpcy5vcHRpb25zLmJlaGF2aW9yLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBldmVudCBzdGFydCBoYW5kbGVyIG9uIHRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBkZXRlY3Rpb25cbiAgICogQHByb3BlcnR5IGV2ZW50U3RhcnRIYW5kbGVyXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICB0aGlzLmV2ZW50U3RhcnRIYW5kbGVyID0gRXZlbnQub25Ub3VjaChlbGVtZW50LCBFVkVOVF9TVEFSVCwgZnVuY3Rpb24oZXYpIHtcbiAgICBpZihzZWxmLmVuYWJsZWQgJiYgZXYuZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICBEZXRlY3Rpb24uc3RhcnREZXRlY3Qoc2VsZiwgZXYpO1xuICAgIH0gZWxzZSBpZihldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0gpIHtcbiAgICAgIERldGVjdGlvbi5kZXRlY3QoZXYpO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIGtlZXAgYSBsaXN0IG9mIHVzZXIgZXZlbnQgaGFuZGxlcnMgd2hpY2ggbmVlZHMgdG8gYmUgcmVtb3ZlZCB3aGVuIGNhbGxpbmcgJ2Rpc3Bvc2UnXG4gICAqIEBwcm9wZXJ0eSBldmVudEhhbmRsZXJzXG4gICAqIEB0eXBlIHtBcnJheX1cbiAgICovXG4gIHRoaXMuZXZlbnRIYW5kbGVycyA9IFtdO1xufTtcblxuR2VzdHVyZURldGVjdG9yLkluc3RhbmNlLnByb3RvdHlwZSA9IHtcbiAgLyoqXG4gICAqIGJpbmQgZXZlbnRzIHRvIHRoZSBpbnN0YW5jZVxuICAgKiBAbWV0aG9kIG9uXG4gICAqIEBjaGFpbmFibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGdlc3R1cmVzIG11bHRpcGxlIGdlc3R1cmVzIGJ5IHNwbGl0dGluZyB3aXRoIGEgc3BhY2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge09iamVjdH0gaGFuZGxlci5ldiBldmVudCBvYmplY3RcbiAgICovXG4gIG9uOiBmdW5jdGlvbiBvbkV2ZW50KGdlc3R1cmVzLCBoYW5kbGVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIEV2ZW50Lm9uKHNlbGYuZWxlbWVudCwgZ2VzdHVyZXMsIGhhbmRsZXIsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHNlbGYuZXZlbnRIYW5kbGVycy5wdXNoKHsgZ2VzdHVyZTogdHlwZSwgaGFuZGxlcjogaGFuZGxlciB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcblxuICAvKipcbiAgICogdW5iaW5kIGV2ZW50cyB0byB0aGUgaW5zdGFuY2VcbiAgICogQG1ldGhvZCBvZmZcbiAgICogQGNoYWluYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZ2VzdHVyZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmZFdmVudChnZXN0dXJlcywgaGFuZGxlcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIEV2ZW50Lm9mZihzZWxmLmVsZW1lbnQsIGdlc3R1cmVzLCBoYW5kbGVyLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgaW5kZXggPSBVdGlscy5pbkFycmF5KHsgZ2VzdHVyZTogdHlwZSwgaGFuZGxlcjogaGFuZGxlciB9KTtcbiAgICAgIGlmKGluZGV4ICE9PSBmYWxzZSkge1xuICAgICAgICBzZWxmLmV2ZW50SGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcblxuICAvKipcbiAgICogdHJpZ2dlciBnZXN0dXJlIGV2ZW50XG4gICAqIEBtZXRob2QgdHJpZ2dlclxuICAgKiBAY2hhaW5hYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXVxuICAgKi9cbiAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGdlc3R1cmUsIGV2ZW50RGF0YSkge1xuICAgIC8vIG9wdGlvbmFsXG4gICAgaWYoIWV2ZW50RGF0YSkge1xuICAgICAgZXZlbnREYXRhID0ge307XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIERPTSBldmVudFxuICAgIHZhciBldmVudCA9IEdlc3R1cmVEZXRlY3Rvci5ET0NVTUVOVC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5pbml0RXZlbnQoZ2VzdHVyZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZXZlbnQuZ2VzdHVyZSA9IGV2ZW50RGF0YTtcblxuICAgIC8vIHRyaWdnZXIgb24gdGhlIHRhcmdldCBpZiBpdCBpcyBpbiB0aGUgaW5zdGFuY2UgZWxlbWVudCxcbiAgICAvLyB0aGlzIGlzIGZvciBldmVudCBkZWxlZ2F0aW9uIHRyaWNrc1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuICAgIGlmKFV0aWxzLmhhc1BhcmVudChldmVudERhdGEudGFyZ2V0LCBlbGVtZW50KSkge1xuICAgICAgZWxlbWVudCA9IGV2ZW50RGF0YS50YXJnZXQ7XG4gICAgfVxuXG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogZW5hYmxlIG9mIGRpc2FibGUgR2VzdHVyZURldGVjdG9yLmpzIGRldGVjdGlvblxuICAgKiBAbWV0aG9kIGVuYWJsZVxuICAgKiBAY2hhaW5hYmxlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RhdGVcbiAgICovXG4gIGVuYWJsZTogZnVuY3Rpb24gZW5hYmxlKHN0YXRlKSB7XG4gICAgdGhpcy5lbmFibGVkID0gc3RhdGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGRpc3Bvc2UgdGhpcyBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2VcbiAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAqIEByZXR1cm4ge051bGx9XG4gICAqL1xuICBkaXNwb3NlOiBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgIHZhciBpLCBlaDtcblxuICAgIC8vIHVuZG8gYWxsIGNoYW5nZXMgbWFkZSBieSBzdG9wX2Jyb3dzZXJfYmVoYXZpb3JcbiAgICBVdGlscy50b2dnbGVCZWhhdmlvcih0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5iZWhhdmlvciwgZmFsc2UpO1xuXG4gICAgLy8gdW5iaW5kIGFsbCBjdXN0b20gZXZlbnQgaGFuZGxlcnNcbiAgICBmb3IoaSA9IC0xOyAoZWggPSB0aGlzLmV2ZW50SGFuZGxlcnNbKytpXSk7KSB7XG4gICAgICBVdGlscy5vZmYodGhpcy5lbGVtZW50LCBlaC5nZXN0dXJlLCBlaC5oYW5kbGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBbXTtcblxuICAgIC8vIHVuYmluZCB0aGUgc3RhcnQgZXZlbnQgbGlzdGVuZXJcbiAgICBFdmVudC5vZmYodGhpcy5lbGVtZW50LCBFVkVOVF9UWVBFU1tFVkVOVF9TVEFSVF0sIHRoaXMuZXZlbnRTdGFydEhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIGdlc3R1cmVzXG4gKi9cbi8qKlxuICogTW92ZSB3aXRoIHggZmluZ2VycyAoZGVmYXVsdCAxKSBhcm91bmQgb24gdGhlIHBhZ2UuXG4gKiBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3IgaXMgYSBnb29kIHdheSB0byBpbXByb3ZlIGZlZWwgYW5kIHdvcmtpbmcuXG4gKiBgYGBgXG4gKiAgR2VzdHVyZURldGVjdG9ydGltZS5vbihcImRyYWdcIiwgZnVuY3Rpb24oZXYpIHtcbiAqICAgIGNvbnNvbGUubG9nKGV2KTtcbiAqICAgIGV2Lmdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcbiAqICB9KTtcbiAqIGBgYGBcbiAqXG4gKiBAY2xhc3MgRHJhZ1xuICogQHN0YXRpY1xuICovXG4vKipcbiAqIEBldmVudCBkcmFnXG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ3N0YXJ0XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ2VuZFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYXBsZWZ0XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ3JpZ2h0XG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ3VwXG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ2Rvd25cbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqL1xuKGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHRyaWdnZXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGRyYWdHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgdmFyIGN1ciA9IERldGVjdGlvbi5jdXJyZW50O1xuXG4gICAgLy8gbWF4IHRvdWNoZXNcbiAgICBpZihpbnN0Lm9wdGlvbnMuZHJhZ01heFRvdWNoZXMgPiAwICYmXG4gICAgICBldi50b3VjaGVzLmxlbmd0aCA+IGluc3Qub3B0aW9ucy5kcmFnTWF4VG91Y2hlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaChldi5ldmVudFR5cGUpIHtcbiAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRVZFTlRfTU9WRTpcbiAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgLy8gb3Igd2UgY2FuIGJlIGFscmVhZHkgaW4gZHJhZ2dpbmdcbiAgICAgIGlmKGV2LmRpc3RhbmNlIDwgaW5zdC5vcHRpb25zLmRyYWdNaW5EaXN0YW5jZSAmJlxuICAgICAgICBjdXIubmFtZSAhPSBuYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0Q2VudGVyID0gY3VyLnN0YXJ0RXZlbnQuY2VudGVyO1xuXG4gICAgICAvLyB3ZSBhcmUgZHJhZ2dpbmchXG4gICAgICBpZihjdXIubmFtZSAhPSBuYW1lKSB7XG4gICAgICAgIGN1ci5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYoaW5zdC5vcHRpb25zLmRyYWdEaXN0YW5jZUNvcnJlY3Rpb24gJiYgZXYuZGlzdGFuY2UgPiAwKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIGRyYWcgaXMgdHJpZ2dlcmVkLCBzZXQgdGhlIGV2ZW50IGNlbnRlciB0byBkcmFnTWluRGlzdGFuY2UgcGl4ZWxzIGZyb20gdGhlIG9yaWdpbmFsIGV2ZW50IGNlbnRlci5cbiAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgY29ycmVjdGlvbiwgdGhlIGRyYWdnZWQgZGlzdGFuY2Ugd291bGQganVtcHN0YXJ0IGF0IGRyYWdNaW5EaXN0YW5jZSBwaXhlbHMgaW5zdGVhZCBvZiBhdCAwLlxuICAgICAgICAgIC8vIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBzYXZlIHRoZSBvcmlnaW5hbCBzdGFydCBwb2ludCBzb21ld2hlcmVcbiAgICAgICAgICB2YXIgZmFjdG9yID0gTWF0aC5hYnMoaW5zdC5vcHRpb25zLmRyYWdNaW5EaXN0YW5jZSAvIGV2LmRpc3RhbmNlKTtcbiAgICAgICAgICBzdGFydENlbnRlci5wYWdlWCArPSBldi5kZWx0YVggKiBmYWN0b3I7XG4gICAgICAgICAgc3RhcnRDZW50ZXIucGFnZVkgKz0gZXYuZGVsdGFZICogZmFjdG9yO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLmNsaWVudFggKz0gZXYuZGVsdGFYICogZmFjdG9yO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLmNsaWVudFkgKz0gZXYuZGVsdGFZICogZmFjdG9yO1xuXG4gICAgICAgICAgLy8gcmVjYWxjdWxhdGUgZXZlbnQgZGF0YSB1c2luZyBuZXcgc3RhcnQgcG9pbnRcbiAgICAgICAgICBldiA9IERldGVjdGlvbi5leHRlbmRFdmVudERhdGEoZXYpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGxvY2sgZHJhZyB0byBheGlzP1xuICAgICAgaWYoY3VyLmxhc3RFdmVudC5kcmFnTG9ja1RvQXhpcyB8fFxuICAgICAgICAoIGluc3Qub3B0aW9ucy5kcmFnTG9ja1RvQXhpcyAmJlxuICAgICAgICAgIGluc3Qub3B0aW9ucy5kcmFnTG9ja01pbkRpc3RhbmNlIDw9IGV2LmRpc3RhbmNlXG4gICAgICAgICkpIHtcbiAgICAgICAgICBldi5kcmFnTG9ja1RvQXhpcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBrZWVwIGRpcmVjdGlvbiBvbiB0aGUgYXhpcyB0aGF0IHRoZSBkcmFnIGdlc3R1cmUgc3RhcnRlZCBvblxuICAgICAgICB2YXIgbGFzdERpcmVjdGlvbiA9IGN1ci5sYXN0RXZlbnQuZGlyZWN0aW9uO1xuICAgICAgICBpZihldi5kcmFnTG9ja1RvQXhpcyAmJiBsYXN0RGlyZWN0aW9uICE9PSBldi5kaXJlY3Rpb24pIHtcbiAgICAgICAgICBpZihVdGlscy5pc1ZlcnRpY2FsKGxhc3REaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBldi5kaXJlY3Rpb24gPSAoZXYuZGVsdGFZIDwgMCkgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXYuZGlyZWN0aW9uID0gKGV2LmRlbHRhWCA8IDApID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgdGltZSwgdHJpZ2dlciBkcmFnc3RhcnQgZXZlbnRcbiAgICAgICAgaWYoIXRyaWdnZXJlZCkge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ3N0YXJ0JywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIGV2ZW50c1xuICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSwgZXYpO1xuICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSArIGV2LmRpcmVjdGlvbiwgZXYpO1xuXG4gICAgICAgIHZhciBpc1ZlcnRpY2FsID0gVXRpbHMuaXNWZXJ0aWNhbChldi5kaXJlY3Rpb24pO1xuXG4gICAgICAgIC8vIGJsb2NrIHRoZSBicm93c2VyIGV2ZW50c1xuICAgICAgICBpZigoaW5zdC5vcHRpb25zLmRyYWdCbG9ja1ZlcnRpY2FsICYmIGlzVmVydGljYWwpIHx8XG4gICAgICAgICAgKGluc3Qub3B0aW9ucy5kcmFnQmxvY2tIb3Jpem9udGFsICYmICFpc1ZlcnRpY2FsKSkge1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfUkVMRUFTRTpcbiAgICAgICAgaWYodHJpZ2dlcmVkICYmIGV2LmNoYW5nZWRMZW5ndGggPD0gaW5zdC5vcHRpb25zLmRyYWdNYXhUb3VjaGVzKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnZW5kJywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX0VORDpcbiAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5EcmFnID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiA1MCxcbiAgICAgIGhhbmRsZXI6IGRyYWdHZXN0dXJlLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1pbmltYWwgbW92ZW1lbnQgdGhhdCBoYXZlIHRvIGJlIG1hZGUgYmVmb3JlIHRoZSBkcmFnIGV2ZW50IGdldHMgdHJpZ2dlcmVkXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTWluRGlzdGFuY2VcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdNaW5EaXN0YW5jZTogMTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBkcmFnRGlzdGFuY2VDb3JyZWN0aW9uIHRvIHRydWUgdG8gbWFrZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGRyYWdcbiAgICAgICAgICogYmUgY2FsY3VsYXRlZCBmcm9tIHdoZXJlIHRoZSBkcmFnIHdhcyB0cmlnZ2VyZWQsIG5vdCBmcm9tIHdoZXJlIHRoZSB0b3VjaCBzdGFydGVkLlxuICAgICAgICAgKiBVc2VmdWwgdG8gYXZvaWQgYSBqZXJrLXN0YXJ0aW5nIGRyYWcsIHdoaWNoIGNhbiBtYWtlIGZpbmUtYWRqdXN0bWVudHNcbiAgICAgICAgICogdGhyb3VnaCBkcmFnZ2luZyBkaWZmaWN1bHQsIGFuZCBiZSB2aXN1YWxseSB1bmFwcGVhbGluZy5cbiAgICAgICAgICogQHByb3BlcnR5IGRyYWdEaXN0YW5jZUNvcnJlY3Rpb25cbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdEaXN0YW5jZUNvcnJlY3Rpb246IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHNldCAwIGZvciB1bmxpbWl0ZWQsIGJ1dCB0aGlzIGNhbiBjb25mbGljdCB3aXRoIHRyYW5zZm9ybVxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ01heFRvdWNoZXNcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ01heFRvdWNoZXM6IDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHByZXZlbnQgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yIHdoZW4gZHJhZ2dpbmcgb2NjdXJzXG4gICAgICAgICAqIGJlIGNhcmVmdWwgd2l0aCBpdCwgaXQgbWFrZXMgdGhlIGVsZW1lbnQgYSBibG9ja2luZyBlbGVtZW50XG4gICAgICAgICAqIHdoZW4geW91IGFyZSB1c2luZyB0aGUgZHJhZyBnZXN0dXJlLCBpdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gc2V0IHRoaXMgdHJ1ZVxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Jsb2NrSG9yaXpvbnRhbFxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdCbG9ja0hvcml6b250YWw6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBzYW1lIGFzIGBkcmFnQmxvY2tIb3Jpem9udGFsYCwgYnV0IGZvciB2ZXJ0aWNhbCBtb3ZlbWVudFxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Jsb2NrVmVydGljYWxcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnQmxvY2tWZXJ0aWNhbDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRyYWdMb2NrVG9BeGlzIGtlZXBzIHRoZSBkcmFnIGdlc3R1cmUgb24gdGhlIGF4aXMgdGhhdCBpdCBzdGFydGVkIG9uLFxuICAgICAgICAgKiBJdCBkaXNhbGxvd3MgdmVydGljYWwgZGlyZWN0aW9ucyBpZiB0aGUgaW5pdGlhbCBkaXJlY3Rpb24gd2FzIGhvcml6b250YWwsIGFuZCB2aWNlIHZlcnNhLlxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0xvY2tUb0F4aXNcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTG9ja1RvQXhpczogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRyYWcgbG9jayBvbmx5IGtpY2tzIGluIHdoZW4gZGlzdGFuY2UgPiBkcmFnTG9ja01pbkRpc3RhbmNlXG4gICAgICAgICAqIFRoaXMgd2F5LCBsb2NraW5nIG9jY3VycyBvbmx5IHdoZW4gdGhlIGRpc3RhbmNlIGhhcyBiZWNvbWUgbGFyZ2UgZW5vdWdoIHRvIHJlbGlhYmx5IGRldGVybWluZSB0aGUgZGlyZWN0aW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTG9ja01pbkRpc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDI1XG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTG9ja01pbkRpc3RhbmNlOiAyNVxuICAgICAgfVxuICAgIH07XG4gIH0pKCdkcmFnJyk7XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGEgc2ltcGxlIGdlc3R1cmUgZXZlbnQsIHNvIHlvdSBjYW4gZG8gYW55dGhpbmcgaW4geW91ciBoYW5kbGVyLlxuICAgKiBvbmx5IHVzYWJsZSBpZiB5b3Uga25vdyB3aGF0IHlvdXIgZG9pbmcuLi5cbiAgICpcbiAgICogQGNsYXNzIEdlc3R1cmVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLkdlc3R1cmUgPSB7XG4gICAgbmFtZTogJ2dlc3R1cmUnLFxuICAgIGluZGV4OiAxMzM3LFxuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIHJlbGVhc2VHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lLCBldik7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogVG91Y2ggc3RheXMgYXQgdGhlIHNhbWUgcGxhY2UgZm9yIHggdGltZVxuICAgKlxuICAgKiBAY2xhc3MgSG9sZFxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IGhvbGRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgdGltZXI7XG5cbiAgICBmdW5jdGlvbiBob2xkR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnMsXG4gICAgICAgICAgY3VycmVudCA9IERldGVjdGlvbi5jdXJyZW50O1xuXG4gICAgICBzd2l0Y2goZXYuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgZ2VzdHVyZSBzbyB3ZSBjYW4gY2hlY2sgaW4gdGhlIHRpbWVvdXQgaWYgaXQgc3RpbGwgaXNcbiAgICAgICAgY3VycmVudC5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBzZXQgdGltZXIgYW5kIGlmIGFmdGVyIHRoZSB0aW1lb3V0IGl0IHN0aWxsIGlzIGhvbGQsXG4gICAgICAgIC8vIHdlIHRyaWdnZXIgdGhlIGhvbGQgZXZlbnRcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmKGN1cnJlbnQgJiYgY3VycmVudC5uYW1lID09IG5hbWUpIHtcbiAgICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lLCBldik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBvcHRpb25zLmhvbGRUaW1lb3V0KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfTU9WRTpcbiAgICAgICAgaWYoZXYuZGlzdGFuY2UgPiBvcHRpb25zLmhvbGRUaHJlc2hvbGQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX1JFTEVBU0U6XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Ib2xkID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiAxMCxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJvcGVydHkgaG9sZFRpbWVvdXRcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgNTAwXG4gICAgICAgICAqL1xuICAgICAgICBob2xkVGltZW91dDogNTAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtb3ZlbWVudCBhbGxvd2VkIHdoaWxlIGhvbGRpbmdcbiAgICAgICAgICogQHByb3BlcnR5IGhvbGRUaHJlc2hvbGRcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMlxuICAgICAgICAgKi9cbiAgICAgICAgaG9sZFRocmVzaG9sZDogMlxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGhvbGRHZXN0dXJlXG4gICAgfTtcbiAgfSkoJ2hvbGQnKTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIHdoZW4gYSB0b3VjaCBpcyBiZWluZyByZWxlYXNlZCBmcm9tIHRoZSBwYWdlXG4gICAqXG4gICAqIEBjbGFzcyBSZWxlYXNlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgcmVsZWFzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5SZWxlYXNlID0ge1xuICAgIG5hbWU6ICdyZWxlYXNlJyxcbiAgICBpbmRleDogSW5maW5pdHksXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gcmVsZWFzZUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGlmKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9SRUxFQVNFKSB7XG4gICAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUsIGV2KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB0cmlnZ2VycyBzd2lwZSBldmVudHMgd2hlbiB0aGUgZW5kIHZlbG9jaXR5IGlzIGFib3ZlIHRoZSB0aHJlc2hvbGRcbiAgICogZm9yIGJlc3QgdXNhZ2UsIHNldCBgcHJldmVudERlZmF1bHRgIChvbiB0aGUgZHJhZyBnZXN0dXJlKSB0byBgdHJ1ZWBcbiAgICogYGBgYFxuICAgKiAgR2VzdHVyZURldGVjdG9ydGltZS5vbihcImRyYWdsZWZ0IHN3aXBlbGVmdFwiLCBmdW5jdGlvbihldikge1xuICAgKiAgICBjb25zb2xlLmxvZyhldik7XG4gICAqICAgIGV2Lmdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcbiAgICogIH0pO1xuICAgKiBgYGBgXG4gICAqXG4gICAqIEBjbGFzcyBTd2lwZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZWxlZnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBlcmlnaHRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBldXBcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBlZG93blxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Td2lwZSA9IHtcbiAgICBuYW1lOiAnc3dpcGUnLFxuICAgIGluZGV4OiA0MCxcbiAgICBkZWZhdWx0czoge1xuICAgICAgLyoqXG4gICAgICAgKiBAcHJvcGVydHkgc3dpcGVNaW5Ub3VjaGVzXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICovXG4gICAgICBzd2lwZU1pblRvdWNoZXM6IDEsXG5cbiAgICAgIC8qKlxuICAgICAgICogQHByb3BlcnR5IHN3aXBlTWF4VG91Y2hlc1xuICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAqL1xuICAgICAgc3dpcGVNYXhUb3VjaGVzOiAxLFxuXG4gICAgICAvKipcbiAgICAgICAqIGhvcml6b250YWwgc3dpcGUgdmVsb2NpdHlcbiAgICAgICAqIEBwcm9wZXJ0eSBzd2lwZVZlbG9jaXR5WFxuICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAqIEBkZWZhdWx0IDAuNlxuICAgICAgICovXG4gICAgICBzd2lwZVZlbG9jaXR5WDogMC42LFxuXG4gICAgICAvKipcbiAgICAgICAqIHZlcnRpY2FsIHN3aXBlIHZlbG9jaXR5XG4gICAgICAgKiBAcHJvcGVydHkgc3dpcGVWZWxvY2l0eVlcbiAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgKiBAZGVmYXVsdCAwLjZcbiAgICAgICAqL1xuICAgICAgc3dpcGVWZWxvY2l0eVk6IDAuNlxuICAgIH0sXG5cbiAgICBoYW5kbGVyOiBmdW5jdGlvbiBzd2lwZUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGlmKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9SRUxFQVNFKSB7XG4gICAgICAgIHZhciB0b3VjaGVzID0gZXYudG91Y2hlcy5sZW5ndGgsXG4gICAgICAgICAgICBvcHRpb25zID0gaW5zdC5vcHRpb25zO1xuXG4gICAgICAgIC8vIG1heCB0b3VjaGVzXG4gICAgICAgIGlmKHRvdWNoZXMgPCBvcHRpb25zLnN3aXBlTWluVG91Y2hlcyB8fFxuICAgICAgICAgIHRvdWNoZXMgPiBvcHRpb25zLnN3aXBlTWF4VG91Y2hlcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgICAvLyBvciB3ZSBjYW4gYmUgYWxyZWFkeSBpbiBkcmFnZ2luZ1xuICAgICAgICBpZihldi52ZWxvY2l0eVggPiBvcHRpb25zLnN3aXBlVmVsb2NpdHlYIHx8XG4gICAgICAgICAgZXYudmVsb2NpdHlZID4gb3B0aW9ucy5zd2lwZVZlbG9jaXR5WSkge1xuICAgICAgICAgIC8vIHRyaWdnZXIgc3dpcGUgZXZlbnRzXG4gICAgICAgICAgaW5zdC50cmlnZ2VyKHRoaXMubmFtZSwgZXYpO1xuICAgICAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUgKyBldi5kaXJlY3Rpb24sIGV2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIFNpbmdsZSB0YXAgYW5kIGEgZG91YmxlIHRhcCBvbiBhIHBsYWNlXG4gICAqXG4gICAqIEBjbGFzcyBUYXBcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0YXBcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IGRvdWJsZXRhcFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqL1xuICAoZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBoYXNNb3ZlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdGFwR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnMsXG4gICAgICAgICAgY3VycmVudCA9IERldGVjdGlvbi5jdXJyZW50LFxuICAgICAgICAgIHByZXYgPSBEZXRlY3Rpb24ucHJldmlvdXMsXG4gICAgICAgICAgc2luY2VQcmV2LFxuICAgICAgICAgIGRpZERvdWJsZVRhcDtcblxuICAgICAgc3dpdGNoKGV2LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBFVkVOVF9TVEFSVDpcbiAgICAgICAgaGFzTW92ZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfTU9WRTpcbiAgICAgICAgaGFzTW92ZWQgPSBoYXNNb3ZlZCB8fCAoZXYuZGlzdGFuY2UgPiBvcHRpb25zLnRhcE1heERpc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfRU5EOlxuICAgICAgICBpZighVXRpbHMuaW5TdHIoZXYuc3JjRXZlbnQudHlwZSwgJ2NhbmNlbCcpICYmIGV2LmRlbHRhVGltZSA8IG9wdGlvbnMudGFwTWF4VGltZSAmJiAhaGFzTW92ZWQpIHtcbiAgICAgICAgICAvLyBwcmV2aW91cyBnZXN0dXJlLCBmb3IgdGhlIGRvdWJsZSB0YXAgc2luY2UgdGhlc2UgYXJlIHR3byBkaWZmZXJlbnQgZ2VzdHVyZSBkZXRlY3Rpb25zXG4gICAgICAgICAgc2luY2VQcmV2ID0gcHJldiAmJiBwcmV2Lmxhc3RFdmVudCAmJiBldi50aW1lU3RhbXAgLSBwcmV2Lmxhc3RFdmVudC50aW1lU3RhbXA7XG4gICAgICAgICAgZGlkRG91YmxlVGFwID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBjaGVjayBpZiBkb3VibGUgdGFwXG4gICAgICAgICAgaWYocHJldiAmJiBwcmV2Lm5hbWUgPT0gbmFtZSAmJlxuICAgICAgICAgICAgKHNpbmNlUHJldiAmJiBzaW5jZVByZXYgPCBvcHRpb25zLmRvdWJsZVRhcEludGVydmFsKSAmJlxuICAgICAgICAgICAgZXYuZGlzdGFuY2UgPCBvcHRpb25zLmRvdWJsZVRhcERpc3RhbmNlKSB7XG4gICAgICAgICAgICBpbnN0LnRyaWdnZXIoJ2RvdWJsZXRhcCcsIGV2KTtcbiAgICAgICAgICAgIGRpZERvdWJsZVRhcCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZG8gYSBzaW5nbGUgdGFwXG4gICAgICAgICAgaWYoIWRpZERvdWJsZVRhcCB8fCBvcHRpb25zLnRhcEFsd2F5cykge1xuICAgICAgICAgICAgY3VycmVudC5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIGluc3QudHJpZ2dlcihjdXJyZW50Lm5hbWUsIGV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLlRhcCA9IHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBpbmRleDogMTAwLFxuICAgICAgaGFuZGxlcjogdGFwR2VzdHVyZSxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggdGltZSBvZiBhIHRhcCwgdGhpcyBpcyBmb3IgdGhlIHNsb3cgdGFwcGVyc1xuICAgICAgICAgKiBAcHJvcGVydHkgdGFwTWF4VGltZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAyNTBcbiAgICAgICAgICovXG4gICAgICAgIHRhcE1heFRpbWU6IDI1MCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogbWF4IGRpc3RhbmNlIG9mIG1vdmVtZW50IG9mIGEgdGFwLCB0aGlzIGlzIGZvciB0aGUgc2xvdyB0YXBwZXJzXG4gICAgICAgICAqIEBwcm9wZXJ0eSB0YXBNYXhEaXN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICAgKi9cbiAgICAgICAgdGFwTWF4RGlzdGFuY2U6IDEwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbHdheXMgdHJpZ2dlciB0aGUgYHRhcGAgZXZlbnQsIGV2ZW4gd2hpbGUgZG91YmxlLXRhcHBpbmdcbiAgICAgICAgICogQHByb3BlcnR5IHRhcEFsd2F5c1xuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGFwQWx3YXlzOiB0cnVlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggZGlzdGFuY2UgYmV0d2VlbiB0d28gdGFwc1xuICAgICAgICAgKiBAcHJvcGVydHkgZG91YmxlVGFwRGlzdGFuY2VcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAgICovXG4gICAgICAgIGRvdWJsZVRhcERpc3RhbmNlOiAyMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogbWF4IHRpbWUgYmV0d2VlbiB0d28gdGFwc1xuICAgICAgICAgKiBAcHJvcGVydHkgZG91YmxlVGFwSW50ZXJ2YWxcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMzAwXG4gICAgICAgICAqL1xuICAgICAgICBkb3VibGVUYXBJbnRlcnZhbDogMzAwXG4gICAgICB9XG4gICAgfTtcbiAgfSkoJ3RhcCcpO1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogd2hlbiBhIHRvdWNoIGlzIGJlaW5nIHRvdWNoZWQgYXQgdGhlIHBhZ2VcbiAgICpcbiAgICogQGNsYXNzIFRvdWNoXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgdG91Y2hcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuVG91Y2ggPSB7XG4gICAgbmFtZTogJ3RvdWNoJyxcbiAgICBpbmRleDogLUluZmluaXR5LFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAvKipcbiAgICAgICAqIGNhbGwgcHJldmVudERlZmF1bHQgYXQgdG91Y2hzdGFydCwgYW5kIG1ha2VzIHRoZSBlbGVtZW50IGJsb2NraW5nIGJ5IGRpc2FibGluZyB0aGUgc2Nyb2xsaW5nIG9mIHRoZSBwYWdlLFxuICAgICAgICogYnV0IGl0IGltcHJvdmVzIGdlc3R1cmVzIGxpa2UgdHJhbnNmb3JtaW5nIGFuZCBkcmFnZ2luZy5cbiAgICAgICAqIGJlIGNhcmVmdWwgd2l0aCB1c2luZyB0aGlzLCBpdCBjYW4gYmUgdmVyeSBhbm5veWluZyBmb3IgdXNlcnMgdG8gYmUgc3R1Y2sgb24gdGhlIHBhZ2VcbiAgICAgICAqIEBwcm9wZXJ0eSBwcmV2ZW50RGVmYXVsdFxuICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICogZGlzYWJsZSBtb3VzZSBldmVudHMsIHNvIG9ubHkgdG91Y2ggKG9yIHBlbiEpIGlucHV0IHRyaWdnZXJzIGV2ZW50c1xuICAgICAgICogQHByb3BlcnR5IHByZXZlbnRNb3VzZVxuICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBwcmV2ZW50TW91c2U6IGZhbHNlXG4gICAgfSxcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiB0b3VjaEdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGlmKGluc3Qub3B0aW9ucy5wcmV2ZW50TW91c2UgJiYgZXYucG9pbnRlclR5cGUgPT0gUE9JTlRFUl9NT1VTRSkge1xuICAgICAgICBldi5zdG9wRGV0ZWN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYoaW5zdC5vcHRpb25zLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCkge1xuICAgICAgICBpbnN0LnRyaWdnZXIoJ3RvdWNoJywgZXYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIFVzZXIgd2FudCB0byBzY2FsZSBvciByb3RhdGUgd2l0aCAyIGZpbmdlcnNcbiAgICogUHJldmVudGluZyB0aGUgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yIGlzIGEgZ29vZCB3YXkgdG8gaW1wcm92ZSBmZWVsIGFuZCB3b3JraW5nLiBUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlXG4gICAqIGBwcmV2ZW50RGVmYXVsdGAgb3B0aW9uLlxuICAgKlxuICAgKiBAY2xhc3MgVHJhbnNmb3JtXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgdHJhbnNmb3JtXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0cmFuc2Zvcm1zdGFydFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgdHJhbnNmb3JtZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBwaW5jaGluXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBwaW5jaG91dFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgcm90YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICovXG4gIChmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIHRyaWdnZXJlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgc3dpdGNoKGV2LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBFVkVOVF9TVEFSVDpcbiAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX01PVkU6XG4gICAgICAgIC8vIGF0IGxlYXN0IG11bHRpdG91Y2hcbiAgICAgICAgaWYoZXYudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNjYWxlVGhyZXNob2xkID0gTWF0aC5hYnMoMSAtIGV2LnNjYWxlKTtcbiAgICAgICAgdmFyIHJvdGF0aW9uVGhyZXNob2xkID0gTWF0aC5hYnMoZXYucm90YXRpb24pO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgICAvLyBvciB3ZSBjYW4gYmUgYWxyZWFkeSBpbiBkcmFnZ2luZ1xuICAgICAgICBpZihzY2FsZVRocmVzaG9sZCA8IGluc3Qub3B0aW9ucy50cmFuc2Zvcm1NaW5TY2FsZSAmJlxuICAgICAgICAgIHJvdGF0aW9uVGhyZXNob2xkIDwgaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblJvdGF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2UgYXJlIHRyYW5zZm9ybWluZyFcbiAgICAgICAgRGV0ZWN0aW9uLmN1cnJlbnQubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gZmlyc3QgdGltZSwgdHJpZ2dlciBkcmFnc3RhcnQgZXZlbnRcbiAgICAgICAgaWYoIXRyaWdnZXJlZCkge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ3N0YXJ0JywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSwgZXYpOyAvLyBiYXNpYyB0cmFuc2Zvcm0gZXZlbnRcblxuICAgICAgICAvLyB0cmlnZ2VyIHJvdGF0ZSBldmVudFxuICAgICAgICBpZihyb3RhdGlvblRocmVzaG9sZCA+IGluc3Qub3B0aW9ucy50cmFuc2Zvcm1NaW5Sb3RhdGlvbikge1xuICAgICAgICAgIGluc3QudHJpZ2dlcigncm90YXRlJywgZXYpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJpZ2dlciBwaW5jaCBldmVudFxuICAgICAgICBpZihzY2FsZVRocmVzaG9sZCA+IGluc3Qub3B0aW9ucy50cmFuc2Zvcm1NaW5TY2FsZSkge1xuICAgICAgICAgIGluc3QudHJpZ2dlcigncGluY2gnLCBldik7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKCdwaW5jaCcgKyAoZXYuc2NhbGUgPCAxID8gJ2luJyA6ICdvdXQnKSwgZXYpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX1JFTEVBU0U6XG4gICAgICAgIGlmKHRyaWdnZXJlZCAmJiBldi5jaGFuZ2VkTGVuZ3RoIDwgMikge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ2VuZCcsIGV2KTtcbiAgICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuVHJhbnNmb3JtID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiA0NSxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtaW5pbWFsIHNjYWxlIGZhY3Rvciwgbm8gc2NhbGUgaXMgMSwgem9vbWluIGlzIHRvIDAgYW5kIHpvb21vdXQgdW50aWwgaGlnaGVyIHRoZW4gMVxuICAgICAgICAgKiBAcHJvcGVydHkgdHJhbnNmb3JtTWluU2NhbGVcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMC4wMVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtTWluU2NhbGU6IDAuMDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJvdGF0aW9uIGluIGRlZ3JlZXNcbiAgICAgICAgICogQHByb3BlcnR5IHRyYW5zZm9ybU1pblJvdGF0aW9uXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZm9ybU1pblJvdGF0aW9uOiAxXG4gICAgICB9LFxuXG4gICAgICBoYW5kbGVyOiB0cmFuc2Zvcm1HZXN0dXJlXG4gICAgfTtcbiAgfSkoJ3RyYW5zZm9ybScpO1xuXG4gIC8vIEFNRCBleHBvcnRcbiAgaWYodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gR2VzdHVyZURldGVjdG9yO1xuICAgIH0pO1xuICAgIC8vIGNvbW1vbmpzIGV4cG9ydFxuICB9IGVsc2UgaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEdlc3R1cmVEZXRlY3RvcjtcbiAgICAvLyBicm93c2VyIGV4cG9ydFxuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9O1xuICAgIHdpbmRvdy5vbnMuR2VzdHVyZURldGVjdG9yID0gR2VzdHVyZURldGVjdG9yO1xuICB9XG5cbn0pKHdpbmRvdyk7XG4iLCIoKG9ucykgPT4ge1xuXG4gIC8vIGZhc3RjbGlja1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IEZhc3RDbGljay5hdHRhY2goZG9jdW1lbnQuYm9keSksIGZhbHNlKTtcblxuICAvLyBvbnMuX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlclxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICBvbnMuX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih3aW5kb3cuZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgbmF2aWdhdG9yLmFwcC5leGl0QXBwKCk7XG4gICAgfSk7XG4gIH0sIGZhbHNlKTtcblxuICAvLyBzZXR1cCBsb2FkaW5nIHBsYWNlaG9sZGVyXG4gIG9ucy5yZWFkeShmdW5jdGlvbigpIHtcbiAgICBvbnMuX3NldHVwTG9hZGluZ1BsYWNlSG9sZGVycygpO1xuICB9KTtcblxuICAvLyB2aWV3cG9ydC5qc1xuICBuZXcgVmlld3BvcnQoKS5zZXR1cCgpO1xuXG4gIC8vIG1vZGVybml6ZVxuICBNb2Rlcm5penIudGVzdFN0eWxlcygnI21vZGVybml6ciB7IC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoIH0nLCBmdW5jdGlvbihlbGVtLCBydWxlKSB7XG4gICAgTW9kZXJuaXpyLmFkZFRlc3QoXG4gICAgICAnb3ZlcmZsb3d0b3VjaCcsXG4gICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZycpID09ICd0b3VjaCcpO1xuICB9KTtcblxuICAvLyBCYXNlRWxlbWVudFxuICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgb25zLl9CYXNlRWxlbWVudCA9ICgpID0+IHt9O1xuICAgIG9ucy5fQmFzZUVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIH0gZWxzZSB7XG4gICAgb25zLl9CYXNlRWxlbWVudCA9IEhUTUxFbGVtZW50O1xuICB9XG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG4gIGNvbnN0IHNjaGVtZSA9IHtcbiAgICAnJzogJ2FsZXJ0LWRpYWxvZy0tKicsXG4gICAgJy5hbGVydC1kaWFsb2ctdGl0bGUnOiAnYWxlcnQtZGlhbG9nLXRpdGxlLS0qJyxcbiAgICAnLmFsZXJ0LWRpYWxvZy1jb250ZW50JzogJ2FsZXJ0LWRpYWxvZy1jb250ZW50LS0qJ1xuICB9O1xuICBjb25zdCBBbmltYXRvckZhY3RvcnkgPSBvbnMuX2ludGVybmFsLkFuaW1hdG9yRmFjdG9yeTtcbiAgY29uc3QgQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLkFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yO1xuICBjb25zdCBJT1NBbGVydERpYWxvZ0FuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5JT1NBbGVydERpYWxvZ0FuaW1hdG9yO1xuICBjb25zdCBTbGlkZURpYWxvZ0FuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5TbGlkZURpYWxvZ0FuaW1hdG9yO1xuICBjb25zdCBBbGVydERpYWxvZ0FuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5BbGVydERpYWxvZ0FuaW1hdG9yO1xuXG4gIGNsYXNzIEFsZXJ0RGlhbG9nRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgZ2V0IF90aXRsZUVsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5hbGVydC1kaWFsb2ctdGl0bGUnKTtcbiAgICB9XG5cbiAgICBnZXQgX2NvbnRlbnRFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuYWxlcnQtZGlhbG9nLWNvbnRlbnQnKTtcbiAgICB9XG5cbiAgICBnZXQgX2RpYWxvZygpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIHRoaXMuX21hc2sgPSB0aGlzLl9jcmVhdGVNYXNrKHRoaXMuZ2V0QXR0cmlidXRlKCdtYXNrLWNvbG9yJykpO1xuXG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX2FuaW1hdG9yRmFjdG9yeSA9IG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgICBhbmltYXRvcnM6IE9uc0FsZXJ0RGlhbG9nRWxlbWVudC5fYW5pbWF0b3JEaWN0LFxuICAgICAgICBiYXNlQ2xhc3M6IEFsZXJ0RGlhbG9nQW5pbWF0b3IsXG4gICAgICAgIGJhc2VDbGFzc05hbWU6ICdBbGVydERpYWxvZ0FuaW1hdG9yJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpLFxuICAgICAgICBkZWZhdWx0QW5pbWF0aW9uT3B0aW9uczogQW5pbWF0b3JGYWN0b3J5LnBhcnNlSlNPTlNhZmVseSh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSlcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLl9kb29yTG9jayA9IG5ldyBEb29yTG9jaygpO1xuICAgICAgdGhpcy5fYm91bmRDYW5jZWwgPSB0aGlzLl9jYW5jZWwuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBfY29tcGlsZSgpIHtcbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuc3R5bGUuekluZGV4ID0gJzIwMDAxJztcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nJyk7XG5cbiAgICAgIGlmIChvbnMucGxhdGZvcm0uaXNBbmRyb2lkKCkpIHtcbiAgICAgICAgbGV0IG1vZGlmaWVyID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ21vZGlmaWVyJykgPyB0aGlzLmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSA6ICcnO1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbW9kaWZpZXInLCAobW9kaWZpZXIgKyAnIGFuZHJvaWQnKS50cmltKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgb3IgZW5hYmxlIGFsZXJ0IGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXREaXNhYmxlZChkaXNhYmxlZCkge1xuICAgICAgaWYgKHR5cGVvZiBkaXNhYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4uJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIGFsZXJ0IGRpYWxvZyBpcyBkaXNhYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNEaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlIGFsZXJ0IGRpYWxvZyBjYW5jZWxhYmxlIG9yIHVuY2FuY2VsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRDYW5jZWxhYmxlKGNhbmNlbGFibGUpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FuY2VsYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4uJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5jZWxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjYW5jZWxhYmxlJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2NhbmNlbGFibGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGFsZXJ0IGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBhbmltYXRpb24gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXSBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXSBjYWxsYmFjayBhZnRlciBkaWFsb2cgaXMgc2hvd25cbiAgICAgKi9cbiAgICBzaG93KG9wdGlvbnMgPSB7fSkge1xuICAgICAgbGV0IGNhbmNlbCA9IGZhbHNlO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3ByZXNob3cnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGFsZXJ0RGlhbG9nOiB0aGlzLFxuICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoIWNhbmNlbCkge1xuICAgICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bmxvY2sgPSB0aGlzLl9kb29yTG9jay5sb2NrKCk7XG5cbiAgICAgICAgICB0aGlzLl9tYXNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIHRoaXMuX21hc2suc3R5bGUub3BhY2l0eSA9IDE7XG4gICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgIGNvbnN0IGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuICAgICAgICAgIGFuaW1hdG9yLnNob3codGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3Bvc3RzaG93Jywge1xuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXRhaWw6IHthbGVydERpYWxvZzogdGhpc31cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGUgYWxlcnQgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdIGNhbGxiYWNrIGFmdGVyIGRpYWxvZyBpcyBoaWRkZW5cbiAgICAgKi9cbiAgICBoaWRlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgbGV0IGNhbmNlbCA9IGZhbHNlO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3ByZWhpZGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGFsZXJ0RGlhbG9nOiB0aGlzLFxuICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoIWNhbmNlbCkge1xuICAgICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bmxvY2sgPSB0aGlzLl9kb29yTG9jay5sb2NrKCk7XG5cbiAgICAgICAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zKTtcbiAgICAgICAgICBhbmltYXRvci5oaWRlKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMuX21hc2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHVubG9jaygpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncG9zdGhpZGUnLCB7XG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgIGRldGFpbDoge2FsZXJ0RGlhbG9nOiB0aGlzfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiBhbGVydCBkaWFsb2cgaXMgdmlzaWJsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTaG93bigpIHtcbiAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgYWxlcnQgZGlhbG9nLlxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX21hc2sucGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLl9tYXNrLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fbWFzayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNDYW5jZWxhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdjYW5jZWxhYmxlJyk7XG4gICAgfVxuXG4gICAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgICAgaWYgKHRoaXMuaXNDYW5jZWxhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5fY2FuY2VsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9jYW5jZWwoKSB7XG4gICAgICBpZiAodGhpcy5pc0NhbmNlbGFibGUoKSkge1xuICAgICAgICB0aGlzLmhpZGUoe1xuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjYW5jZWwnLCB7YnViYmxlczogdHJ1ZX0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9jcmVhdGVNYXNrKGNvbG9yKSB7XG4gICAgICB0aGlzLl9tYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2PjwvZGl2PicpO1xuICAgICAgdGhpcy5fbWFzay5jbGFzc0xpc3QuYWRkKCdhbGVydC1kaWFsb2ctbWFzaycpO1xuICAgICAgdGhpcy5fbWFzay5zdHlsZS56SW5kZXggPSAyMDAwMDtcbiAgICAgIHRoaXMuX21hc2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIHRoaXMuX21hc2suc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fbWFzayk7XG4gICAgICByZXR1cm4gdGhpcy5fbWFzaztcbiAgICB9XG5cbiAgICBhdHRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgdGhpcy5fb25EZXZpY2VCYWNrQnV0dG9uLmJpbmQodGhpcykpO1xuXG4gICAgICB0aGlzLl9tYXNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRDYW5jZWwsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkZXRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgICB0aGlzLl9tYXNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRDYW5jZWwuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zQWxlcnREaWFsb2dFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0FsZXJ0RGlhbG9nRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWFsZXJ0LWRpYWxvZycsIHtcbiAgICAgIHByb3RvdHlwZTogQWxlcnREaWFsb2dFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuXG4gICAgd2luZG93Lk9uc0FsZXJ0RGlhbG9nRWxlbWVudC5fYW5pbWF0b3JEaWN0ID0ge1xuICAgICAgJ2RlZmF1bHQnOiBvbnMucGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciA6IElPU0FsZXJ0RGlhbG9nQW5pbWF0b3IsXG4gICAgICAnZmFkZSc6IG9ucy5wbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIDogSU9TQWxlcnREaWFsb2dBbmltYXRvcixcbiAgICAgICdzbGlkZSc6IFNsaWRlRGlhbG9nQW5pbWF0b3IsXG4gICAgICAnbm9uZSc6IEFsZXJ0RGlhbG9nQW5pbWF0b3JcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge0RpYWxvZ0FuaW1hdG9yfSBBbmltYXRvclxuICAgICAqL1xuICAgIHdpbmRvdy5PbnNBbGVydERpYWxvZ0VsZW1lbnQucmVnaXN0ZXJBbmltYXRvciA9IGZ1bmN0aW9uKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgICBpZiAoIShBbmltYXRvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBBbGVydERpYWxvZ0FuaW1hdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiQW5pbWF0b3JcIiBwYXJhbSBtdXN0IGluaGVyaXQgRGlhbG9nQW5pbWF0b3InKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICAgIH07XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG4gIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgPHNwYW5cbiAgICAgIGNsYXNzPVwidG9vbGJhci1idXR0b24tLXF1aWV0XCJcbiAgICAgIHN0eWxlPVwiaGVpZ2h0OiA0NHB4OyBsaW5lLWhlaWdodDogMDsgcGFkZGluZzogMCAxMHB4IDAgMDsgcG9zaXRpb246IHJlbGF0aXZlO1wiPlxuXG4gICAgICA8aSBjbGFzcz1cImlvbi1pb3MtYXJyb3ctYmFjayBvbnMtYmFjay1idXR0b25fX2ljb25cIlxuICAgICAgICBzdHlsZT1cIlxuICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiA0NHB4O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMzZweDtcbiAgICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgICAgIHdpZHRoOiAxNnB4O1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICBwYWRkaW5nLXRvcDogMXB4O1wiPjwvaT5cblxuICAgICAgPHNwYW5cbiAgICAgICAgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGxpbmUtaGVpZ2h0OiA0NHB4OyBoZWlnaHQ6IDQ0cHg7XCJcbiAgICAgICAgY2xhc3M9XCJiYWNrLWJ1dHRvbl9fbGFiZWxcIj48L3NwYW4+XG4gICAgPC9zcGFuPlxuICBgKTtcbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcudG9vbGJhci1idXR0b24tLXF1aWV0JzogJ3Rvb2xiYXItYnV0dG9uLS0qJ1xuICB9O1xuXG4gIGNsYXNzIEJhY2tCdXR0b25FbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICB0aGlzLl9ib3VuZE9uQ2xpY2sgPSB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBjb25zdCBpbm5lciA9IHRlbXBsYXRlLnF1ZXJ5U2VsZWN0b3IoJy5iYWNrLWJ1dHRvbl9fbGFiZWwnKTtcbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbm5lci5pbm5lckhUTUwudHJpbSgpID09PSAnJykge1xuICAgICAgICBpbm5lci50ZXh0Q29udGVudCA9ICdCYWNrJztcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGUpO1xuICAgIH1cblxuICAgIF9vbkNsaWNrKCkge1xuICAgICAgY29uc3QgbmF2aWdhdG9yID0gdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtbmF2aWdhdG9yJyk7XG4gICAgICBpZiAobmF2aWdhdG9yKSB7XG4gICAgICAgIG5hdmlnYXRvci5wb3BQYWdlKHtjYW5jZWxJZlJ1bm5pbmc6IHRydWV9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2ssIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXdpbmRvdy5PbnNCYWNrQnV0dG9uRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNCYWNrQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWJhY2stYnV0dG9uJywge1xuICAgICAgcHJvdG90eXBlOiBCYWNrQnV0dG9uRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBzY2hlbWUgPSB7Jyc6ICdib3R0b20tYmFyLS0qJ307XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuXG4gIGNsYXNzIEJvdHRvbVRvb2xiYXJFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2JvdHRvbS1iYXInKTtcbiAgICAgIHRoaXMuc3R5bGUuekluZGV4ID0gJzAnO1xuICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlKCkge1xuICAgICAgY29uc3QgaW5saW5lID0gdHlwZW9mIHRoaXMuZ2V0QXR0cmlidXRlKCdpbmxpbmUnKSA9PT0gJ3N0cmluZyc7XG5cbiAgICAgIHRoaXMuc3R5bGUucG9zaXRpb24gPSBpbmxpbmUgPyAnc3RhdGljJyA6ICdhYnNvbHV0ZSc7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zQm90dG9tVG9vbGJhckVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zQm90dG9tVG9vbGJhckVsZW1lbnQgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy1ib3R0b20tdG9vbGJhcicsIHtcbiAgICAgIHByb3RvdHlwZTogQm90dG9tVG9vbGJhckVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0geycnOiAnYnV0dG9uLS0qJ307XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuXG4gIGNsYXNzIEJ1dHRvbkVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnYnV0dG9uJyk7XG5cbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0J1dHRvbkVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWJ1dHRvbicsIHtcbiAgICAgIHByb3RvdHlwZTogQnV0dG9uRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcbiAgY29uc3Qgc2NoZW1lID0geycnOiAnY2Fyb3VzZWwtaXRlbS0tKid9O1xuXG4gIGNsYXNzIENhcm91c2VsSXRlbUVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXdpbmRvdy5PbnNDYXJvdXNlbEl0ZW1FbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0Nhcm91c2VsSXRlbUVsZW1lbnQgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy1jYXJvdXNlbC1pdGVtJywge1xuICAgICAgcHJvdG90eXBlOiBDYXJvdXNlbEl0ZW1FbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCBzY2hlbWUgPSB7Jyc6ICdjYXJvdXNlbC0tKid9O1xuXG4gIGNvbnN0IFZlcnRpY2FsTW9kZVRyYWl0ID0ge1xuXG4gICAgX2dldFNjcm9sbERlbHRhOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lmdlc3R1cmUuZGVsdGFZO1xuICAgIH0sXG5cbiAgICBfZ2V0U2Nyb2xsVmVsb2NpdHk6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQuZ2VzdHVyZS52ZWxvY2l0eVk7XG4gICAgfSxcblxuICAgIF9nZXRFbGVtZW50U2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXRoaXMuX2N1cnJlbnRFbGVtZW50U2l6ZSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50RWxlbWVudFNpemUgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRFbGVtZW50U2l6ZTtcbiAgICB9LFxuXG4gICAgX2dlbmVyYXRlU2Nyb2xsVHJhbnNmb3JtOiBmdW5jdGlvbihzY3JvbGwpIHtcbiAgICAgIHJldHVybiAndHJhbnNsYXRlM2QoMHB4LCAnICsgLXNjcm9sbCArICdweCwgMHB4KSc7XG4gICAgfSxcblxuICAgIF9sYXlvdXRDYXJvdXNlbEl0ZW1zOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtRWxlbWVudHMoKTtcblxuICAgICAgY29uc3Qgc2l6ZUF0dHIgPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1TaXplQXR0cigpO1xuICAgICAgY29uc3Qgc2l6ZUluZm8gPSB0aGlzLl9kZWNvbXBvc2VTaXplU3RyaW5nKHNpemVBdHRyKTtcblxuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpO1xuICAgICAgY29uc3QgdG90YWxXaWR0aCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggfHwgMDtcbiAgICAgIGNvbnN0IGZpbmFsV2lkdGggPSB0b3RhbFdpZHRoIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nTGVmdCwgMTApIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nUmlnaHQsIDEwKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLmhlaWdodCA9IHNpemVBdHRyO1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS53aWR0aCA9IGZpbmFsV2lkdGggKyAncHgnO1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS50b3AgPSAoaSAqIHNpemVJbmZvLm51bWJlcikgKyBzaXplSW5mby51bml0O1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBIb3Jpem9udGFsTW9kZVRyYWl0ID0ge1xuXG4gICAgX2dldFNjcm9sbERlbHRhOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lmdlc3R1cmUuZGVsdGFYO1xuICAgIH0sXG5cbiAgICBfZ2V0U2Nyb2xsVmVsb2NpdHk6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQuZ2VzdHVyZS52ZWxvY2l0eVg7XG4gICAgfSxcblxuICAgIF9nZXRFbGVtZW50U2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXRoaXMuX2N1cnJlbnRFbGVtZW50U2l6ZSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50RWxlbWVudFNpemUgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudEVsZW1lbnRTaXplO1xuICAgIH0sXG5cbiAgICBfZ2VuZXJhdGVTY3JvbGxUcmFuc2Zvcm06IGZ1bmN0aW9uKHNjcm9sbCkge1xuICAgICAgcmV0dXJuICd0cmFuc2xhdGUzZCgnICsgLXNjcm9sbCArICdweCwgMHB4LCAwcHgpJztcbiAgICB9LFxuXG4gICAgX2xheW91dENhcm91c2VsSXRlbXM6IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1FbGVtZW50cygpO1xuXG4gICAgICBjb25zdCBzaXplQXR0ciA9IHRoaXMuX2dldENhcm91c2VsSXRlbVNpemVBdHRyKCk7XG4gICAgICBjb25zdCBzaXplSW5mbyA9IHRoaXMuX2RlY29tcG9zZVNpemVTdHJpbmcoc2l6ZUF0dHIpO1xuXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gICAgICBjb25zdCB0b3RhbEhlaWdodCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IHx8IDA7XG4gICAgICBjb25zdCBmaW5hbEhlaWdodCA9IHRvdGFsSGVpZ2h0IC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wLCAxMCkgLSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLmhlaWdodCA9IGZpbmFsSGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUud2lkdGggPSBzaXplQXR0cjtcbiAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUubGVmdCA9IChpICogc2l6ZUluZm8ubnVtYmVyKSArIHNpemVJbmZvLnVuaXQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNsYXNzIENhcm91c2VsRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICAgICAgdGhpcy5fZG9vckxvY2sgPSBuZXcgRG9vckxvY2soKTtcbiAgICAgIHRoaXMuX3Njcm9sbCA9IDA7XG4gICAgICB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSAwO1xuXG4gICAgICB0aGlzLl9ib3VuZE9uRHJhZyA9IHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPbkRyYWdFbmQgPSB0aGlzLl9vbkRyYWdFbmQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuX2JvdW5kT25SZXNpemUgPSB0aGlzLl9vblJlc2l6ZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLl9taXhpbih0aGlzLl9pc1ZlcnRpY2FsKCkgPyBWZXJ0aWNhbE1vZGVUcmFpdCA6IEhvcml6b250YWxNb2RlVHJhaXQpO1xuXG4gICAgICB0aGlzLl9sYXlvdXRDYXJvdXNlbEl0ZW1zKCk7XG4gICAgICB0aGlzLl9zZXR1cEluaXRpYWxJbmRleCgpO1xuXG4gICAgICB0aGlzLl9zYXZlTGFzdFN0YXRlKCk7XG4gICAgfVxuXG4gICAgX29uUmVzaXplKCkge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgX29uRGlyZWN0aW9uQ2hhbmdlKCkge1xuICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwoKSkge1xuICAgICAgICB0aGlzLnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5zdHlsZS5vdmVyZmxvd1kgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3R5bGUub3ZlcmZsb3dYID0gJyc7XG4gICAgICAgIHRoaXMuc3R5bGUub3ZlcmZsb3dZID0gJ2F1dG8nO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICBfc2F2ZUxhc3RTdGF0ZSgpIHtcbiAgICAgIHRoaXMuX2xhc3RTdGF0ZSA9IHtcbiAgICAgICAgZWxlbWVudFNpemU6IHRoaXMuX2dldENhcm91c2VsSXRlbVNpemUoKSxcbiAgICAgICAgY2Fyb3VzZWxFbGVtZW50Q291bnQ6IHRoaXMuX2dldENhcm91c2VsSXRlbUNvdW50KCksXG4gICAgICAgIHdpZHRoOiB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1TaXplKCkgKiB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1Db3VudCgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBfZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpIHtcbiAgICAgIGNvbnN0IHNpemVBdHRyID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZUF0dHIoKTtcbiAgICAgIGNvbnN0IHNpemVJbmZvID0gdGhpcy5fZGVjb21wb3NlU2l6ZVN0cmluZyhzaXplQXR0cik7XG4gICAgICBjb25zdCBlbGVtZW50U2l6ZSA9IHRoaXMuX2dldEVsZW1lbnRTaXplKCk7XG5cbiAgICAgIGlmIChzaXplSW5mby51bml0ID09PSAnJScpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoc2l6ZUluZm8ubnVtYmVyIC8gMTAwICogZWxlbWVudFNpemUpO1xuICAgICAgfSBlbHNlIGlmIChzaXplSW5mby51bml0ID09PSAncHgnKSB7XG4gICAgICAgIHJldHVybiBzaXplSW5mby5udW1iZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgX2dldEluaXRpYWxJbmRleCgpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2luaXRpYWwtaW5kZXgnKSwgMTApO1xuXG4gICAgICBpZiAodHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihpbmRleCwgdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtQ291bnQoKSAtIDEpLCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICAgKi9cbiAgICBfZ2V0Q2Fyb3VzZWxJdGVtU2l6ZUF0dHIoKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9ICdpdGVtLScgKyAodGhpcy5faXNWZXJ0aWNhbCgpID8gJ2hlaWdodCcgOiAnd2lkdGgnKTtcbiAgICAgIGNvbnN0IGl0ZW1TaXplQXR0ciA9ICgnJyArIHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSkudHJpbSgpO1xuXG4gICAgICByZXR1cm4gaXRlbVNpemVBdHRyLm1hdGNoKC9eXFxkKyhweHwlKSQvKSA/IGl0ZW1TaXplQXR0ciA6ICcxMDAlJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgX2RlY29tcG9zZVNpemVTdHJpbmcoc2l6ZSkge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IHNpemUubWF0Y2goL14oXFxkKykocHh8JSkvKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbnVtYmVyOiBwYXJzZUludChtYXRjaGVzWzFdLCAxMCksXG4gICAgICAgIHVuaXQ6IG1hdGNoZXNbMl0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIF9zZXR1cEluaXRpYWxJbmRleCgpIHtcbiAgICAgIHRoaXMuX3Njcm9sbCA9IHRoaXMuX2dldENhcm91c2VsSXRlbVNpemUoKSAqIHRoaXMuX2dldEluaXRpYWxJbmRleCgpO1xuICAgICAgdGhpcy5fbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fZ2V0SW5pdGlhbEluZGV4KCk7XG4gICAgICB0aGlzLl9zY3JvbGxUbyh0aGlzLl9zY3JvbGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3dpcGVhYmxlXG4gICAgICovXG4gICAgc2V0U3dpcGVhYmxlKHN3aXBlYWJsZSkge1xuICAgICAgaWYgKHN3aXBlYWJsZSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc3dpcGVhYmxlJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N3aXBlYWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTd2lwZWFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ3N3aXBlYWJsZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSByYXRpb1xuICAgICAqL1xuICAgIHNldEF1dG9TY3JvbGxSYXRpbyhyYXRpbykge1xuICAgICAgaWYgKHJhdGlvIDwgMC4wIHx8IHJhdGlvID4gMS4wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByYXRpby4nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2F1dG8tc2Nyb2xsLXJhdGlvJywgcmF0aW8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRBdXRvU2Nyb2xsUmF0aW8oKSB7XG4gICAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2F1dG8tc2Nyb2xsLXJhdGlvJyk7XG5cbiAgICAgIGlmICghYXR0cikge1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHBhcnNlRmxvYXQoYXR0cik7XG4gICAgICBpZiAoc2Nyb2xsUmF0aW8gPCAwLjAgfHwgc2Nyb2xsUmF0aW8gPiAxLjApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJhdGlvLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNOYU4oc2Nyb2xsUmF0aW8pID8gMC41IDogc2Nyb2xsUmF0aW87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAgICovXG4gICAgc2V0QWN0aXZlQ2Fyb3VzZWxJdGVtSW5kZXgoaW5kZXgsIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICBpbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1Db3VudCgpIC0gMSkpO1xuICAgICAgY29uc3Qgc2Nyb2xsID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpICogaW5kZXg7XG4gICAgICBjb25zdCBtYXggPSB0aGlzLl9jYWxjdWxhdGVNYXhTY3JvbGwoKTtcblxuICAgICAgdGhpcy5fc2Nyb2xsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4LCBzY3JvbGwpKTtcbiAgICAgIHRoaXMuX3Njcm9sbFRvKHRoaXMuX3Njcm9sbCwge2FuaW1hdGU6IG9wdGlvbnMuYW5pbWF0aW9uICE9PSAnbm9uZScsIGNhbGxiYWNrOiBvcHRpb25zLmNhbGxiYWNrfSk7XG5cbiAgICAgIHRoaXMuX3RyeUZpcmVQb3N0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgZ2V0QWN0aXZlQ2Fyb3VzZWxJdGVtSW5kZXgoKSB7XG4gICAgICBjb25zdCBzY3JvbGwgPSB0aGlzLl9zY3JvbGw7XG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuX2dldENhcm91c2VsSXRlbUNvdW50KCk7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpO1xuXG4gICAgICBpZiAoc2Nyb2xsIDwgMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIGlmIChzaXplICogaSA8PSBzY3JvbGwgJiYgc2l6ZSAqIChpICsgMSkgPiBzY3JvbGwpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBtYXggY2Fyb3VzZWwgaW5kZXhcbiAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgICAqL1xuICAgIG5leHQob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0QWN0aXZlQ2Fyb3VzZWxJdGVtSW5kZXgodGhpcy5nZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleCgpICsgMSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAgICovXG4gICAgcHJldihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleCh0aGlzLmdldEFjdGl2ZUNhcm91c2VsSXRlbUluZGV4KCkgLSAxLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKi9cbiAgICBzZXRBdXRvU2Nyb2xsRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXV0by1zY3JvbGwnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYXV0by1zY3JvbGwnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQXV0b1Njcm9sbEVuYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2F1dG8tc2Nyb2xsJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkaXNhYmxlZFxuICAgICAqL1xuICAgIHNldERpc2FibGVkKGRpc2FibGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2Nyb2xsYWJsZVxuICAgICAqL1xuICAgIHNldE92ZXJzY3JvbGxhYmxlKHNjcm9sbGFibGUpIHtcbiAgICAgIGlmIChzY3JvbGxhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdvdmVyc2Nyb2xsYWJsZScsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdvdmVyc2Nyb2xsYWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNPdmVyc2Nyb2xsYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnb3ZlcnNjcm9sbGFibGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIF9pc0VuYWJsZWRDaGFuZ2VFdmVudCgpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRTaXplID0gdGhpcy5fZ2V0RWxlbWVudFNpemUoKTtcbiAgICAgIGNvbnN0IGNhcm91c2VsSXRlbVNpemUgPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1TaXplKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmlzQXV0b1Njcm9sbEVuYWJsZWQoKSAmJiBlbGVtZW50U2l6ZSA9PT0gY2Fyb3VzZWxJdGVtU2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIF9pc1ZlcnRpY2FsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nKSA9PT0gJ3ZlcnRpY2FsJztcbiAgICB9XG5cbiAgICBfcHJlcGFyZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbmV3IG9ucy5HZXN0dXJlRGV0ZWN0b3IodGhpcywge1xuICAgICAgICBkcmFnTWluRGlzdGFuY2U6IDFcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3Iub24oJ2RyYWcgZHJhZ2xlZnQgZHJhZ3JpZ2h0IGRyYWd1cCBkcmFnZG93biBzd2lwZSBzd2lwZWxlZnQgc3dpcGVyaWdodCBzd2lwZXVwIHN3aXBlZG93bicsIHRoaXMuX2JvdW5kT25EcmFnKTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vbignZHJhZ2VuZCcsIHRoaXMuX2JvdW5kT25EcmFnRW5kKTtcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25SZXNpemUsIHRydWUpO1xuICAgIH1cblxuICAgIF9yZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vZmYoJ2RyYWcgZHJhZ2xlZnQgZHJhZ3JpZ2h0IGRyYWd1cCBkcmFnZG93biBzd2lwZSBzd2lwZWxlZnQgc3dpcGVyaWdodCBzd2lwZXVwIHN3aXBlZG93bicsIHRoaXMuX2JvdW5kT25EcmFnKTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vZmYoJ2RyYWdlbmQnLCB0aGlzLl9ib3VuZE9uRHJhZ0VuZCk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IuZGlzcG9zZSgpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPblJlc2l6ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgX3RyeUZpcmVQb3N0Q2hhbmdlRXZlbnQoKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmdldEFjdGl2ZUNhcm91c2VsSXRlbUluZGV4KCk7XG5cbiAgICAgIGlmICh0aGlzLl9sYXN0QWN0aXZlSW5kZXggIT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICBjb25zdCBsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9sYXN0QWN0aXZlSW5kZXg7XG4gICAgICAgIHRoaXMuX2xhc3RBY3RpdmVJbmRleCA9IGN1cnJlbnRJbmRleDtcblxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncG9zdGNoYW5nZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgY2Fyb3VzZWw6IHRoaXMsXG4gICAgICAgICAgICBhY3RpdmVJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgbGFzdEFjdGl2ZUluZGV4OiBsYXN0QWN0aXZlSW5kZXhcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9vbkRyYWcoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5pc1N3aXBlYWJsZSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyZWN0aW9uID0gZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb247XG4gICAgICBpZiAoKHRoaXMuX2lzVmVydGljYWwoKSAmJiAoZGlyZWN0aW9uID09PSAnbGVmdCcgfHwgZGlyZWN0aW9uID09PSAncmlnaHQnKSkgfHwgKCF0aGlzLl9pc1ZlcnRpY2FsKCkgJiYgKGRpcmVjdGlvbiA9PT0gJ3VwJyB8fCBkaXJlY3Rpb24gPT09ICdkb3duJykpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIHRoaXMuX2xhc3REcmFnRXZlbnQgPSBldmVudDtcblxuICAgICAgY29uc3Qgc2Nyb2xsID0gdGhpcy5fc2Nyb2xsIC0gdGhpcy5fZ2V0U2Nyb2xsRGVsdGEoZXZlbnQpO1xuICAgICAgdGhpcy5fc2Nyb2xsVG8oc2Nyb2xsKTtcbiAgICAgIGV2ZW50Lmdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdGhpcy5fdHJ5RmlyZVBvc3RDaGFuZ2VFdmVudCgpO1xuICAgIH1cblxuICAgIF9vbkRyYWdFbmQoZXZlbnQpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50U2l6ZSA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCF0aGlzLmlzU3dpcGVhYmxlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zY3JvbGwgPSB0aGlzLl9zY3JvbGwgLSB0aGlzLl9nZXRTY3JvbGxEZWx0YShldmVudCk7XG5cbiAgICAgIGlmICh0aGlzLl9nZXRTY3JvbGxEZWx0YShldmVudCkgIT09IDApIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc092ZXJTY3JvbGwodGhpcy5fc2Nyb2xsKSkge1xuICAgICAgICBsZXQgd2FpdEZvckFjdGlvbiA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvdmVyc2Nyb2xsRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ292ZXJzY3JvbGwnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGNhcm91c2VsOiB0aGlzLFxuICAgICAgICAgICAgYWN0aXZlSW5kZXg6IHRoaXMuZ2V0QWN0aXZlQ2Fyb3VzZWxJdGVtSW5kZXgoKSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy5fZ2V0T3ZlclNjcm9sbERpcmVjdGlvbigpLFxuICAgICAgICAgICAgd2FpdFRvUmV0dXJuOiAocHJvbWlzZSkgPT4ge1xuICAgICAgICAgICAgICB3YWl0Rm9yQWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHRoaXMuX3Njcm9sbFRvS2lsbE92ZXJTY3JvbGwoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG92ZXJzY3JvbGxFdmVudCk7XG5cbiAgICAgICAgaWYgKCF3YWl0Rm9yQWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsVG9LaWxsT3ZlclNjcm9sbCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGFydE1vbWVudHVtU2Nyb2xsKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9sYXN0RHJhZ0V2ZW50ID0gbnVsbDtcblxuICAgICAgZXZlbnQuZ2VzdHVyZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0cmFpdFxuICAgICAqL1xuICAgIF9taXhpbih0cmFpdCkge1xuICAgICAgT2JqZWN0LmtleXModHJhaXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHRyYWl0W2tleV07XG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIF9zdGFydE1vbWVudHVtU2Nyb2xsKCkge1xuICAgICAgaWYgKHRoaXMuX2xhc3REcmFnRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdmVsb2NpdHkgPSB0aGlzLl9nZXRTY3JvbGxWZWxvY2l0eSh0aGlzLl9sYXN0RHJhZ0V2ZW50KTtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSAwLjM7XG4gICAgICAgIGNvbnN0IHNjcm9sbERlbHRhID0gZHVyYXRpb24gKiAxMDAgKiB2ZWxvY2l0eTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsID0gdGhpcy5fbm9ybWFsaXplU2Nyb2xsUG9zaXRpb24oXG4gICAgICAgICAgdGhpcy5fc2Nyb2xsICsgKHRoaXMuX2dldFNjcm9sbERlbHRhKHRoaXMuX2xhc3REcmFnRXZlbnQpID4gMCA/IC1zY3JvbGxEZWx0YSA6IHNjcm9sbERlbHRhKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX3Njcm9sbCA9IHNjcm9sbDtcblxuICAgICAgICBhbmltaXQodGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtRWxlbWVudHMoKSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLl9nZW5lcmF0ZVNjcm9sbFRyYW5zZm9ybSh0aGlzLl9zY3JvbGwpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIHRoaXMuX3RyeUZpcmVQb3N0Q2hhbmdlRXZlbnQoKTtcbiAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgLnBsYXkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbm9ybWFsaXplU2Nyb2xsUG9zaXRpb24oc2Nyb2xsKSB7XG4gICAgICBjb25zdCBtYXggPSB0aGlzLl9jYWxjdWxhdGVNYXhTY3JvbGwoKTtcblxuICAgICAgaWYgKHRoaXMuaXNBdXRvU2Nyb2xsRW5hYmxlZCgpKSB7XG4gICAgICAgIGxldCBhcnIgPSBbXTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2dldENhcm91c2VsSXRlbVNpemUoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2dldENhcm91c2VsSXRlbUNvdW50KCk7IGkrKykge1xuICAgICAgICAgIGlmIChtYXggPj0gaSAqIHNpemUpIHtcbiAgICAgICAgICAgIGFyci5wdXNoKGkgKiBzaXplKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXJyLnB1c2gobWF4KTtcblxuICAgICAgICBhcnIuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgICAgIGxlZnQgPSBNYXRoLmFicyhsZWZ0IC0gc2Nyb2xsKTtcbiAgICAgICAgICByaWdodCA9IE1hdGguYWJzKHJpZ2h0IC0gc2Nyb2xsKTtcblxuICAgICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFyciA9IGFyci5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgcG9zKSB7XG4gICAgICAgICAgcmV0dXJuICFwb3MgfHwgaXRlbSAhPSBhcnJbcG9zIC0gMV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGxhc3RTY3JvbGwgPSB0aGlzLl9sYXN0QWN0aXZlSW5kZXggKiBzaXplO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGguYWJzKHNjcm9sbCAtIGxhc3RTY3JvbGwpIC8gc2l6ZTtcblxuICAgICAgICBpZiAoc2Nyb2xsUmF0aW8gPD0gdGhpcy5nZXRBdXRvU2Nyb2xsUmF0aW8oKSkge1xuICAgICAgICAgIHJldHVybiBsYXN0U2Nyb2xsO1xuICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFJhdGlvID4gdGhpcy5nZXRBdXRvU2Nyb2xsUmF0aW8oKSAmJiBzY3JvbGxSYXRpbyA8IDEuMCkge1xuICAgICAgICAgIGlmIChhcnJbMF0gPT09IGxhc3RTY3JvbGwgJiYgYXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyclswXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHNjcm9sbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0FycmF5fVxuICAgICAqL1xuICAgIF9nZXRDYXJvdXNlbEl0ZW1FbGVtZW50cygpIHtcbiAgICAgIHJldHVybiBvbnMuX3V0aWwuYXJyYXlGcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnb25zLWNhcm91c2VsLWl0ZW0nKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNjcm9sbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKi9cbiAgICBfc2Nyb2xsVG8oc2Nyb2xsLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIGNvbnN0IGlzT3ZlcnNjcm9sbGFibGUgPSB0aGlzLmlzT3ZlcnNjcm9sbGFibGUoKTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplU2Nyb2xsID0gKHNjcm9sbCkgPT4ge1xuICAgICAgICBjb25zdCByYXRpbyA9IDAuMzU7XG5cbiAgICAgICAgaWYgKHNjcm9sbCA8IDApIHtcbiAgICAgICAgICByZXR1cm4gaXNPdmVyc2Nyb2xsYWJsZSA/IE1hdGgucm91bmQoc2Nyb2xsICogcmF0aW8pIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFNjcm9sbCA9IHRoaXMuX2NhbGN1bGF0ZU1heFNjcm9sbCgpO1xuICAgICAgICBpZiAobWF4U2Nyb2xsIDwgc2Nyb2xsKSB7XG4gICAgICAgICAgcmV0dXJuIGlzT3ZlcnNjcm9sbGFibGUgPyBtYXhTY3JvbGwgKyBNYXRoLnJvdW5kKChzY3JvbGwgLSBtYXhTY3JvbGwpICogcmF0aW8pIDogbWF4U2Nyb2xsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNjcm9sbDtcbiAgICAgIH07XG5cbiAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUpIHtcbiAgICAgICAgYW5pbWl0KHRoaXMuX2dldENhcm91c2VsSXRlbUVsZW1lbnRzKCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVTY3JvbGxUcmFuc2Zvcm0obm9ybWFsaXplU2Nyb2xsKHNjcm9sbCkpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IDAuMyxcbiAgICAgICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKSdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wbGF5KG9wdGlvbnMuY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWl0KHRoaXMuX2dldENhcm91c2VsSXRlbUVsZW1lbnRzKCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVTY3JvbGxUcmFuc2Zvcm0obm9ybWFsaXplU2Nyb2xsKHNjcm9sbCkpXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGxheShvcHRpb25zLmNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlTWF4U2Nyb2xsKCkge1xuICAgICAgY29uc3QgbWF4ID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtQ291bnQoKSAqIHRoaXMuX2dldENhcm91c2VsSXRlbVNpemUoKSAtIHRoaXMuX2dldEVsZW1lbnRTaXplKCk7XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKG1heCA8IDAgPyAwIDogbWF4KTsgLy8gTmVlZCB0byByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZS5cbiAgICB9XG5cbiAgICBfaXNPdmVyU2Nyb2xsKHNjcm9sbCkge1xuICAgICAgaWYgKHNjcm9sbCA8IDAgfHwgc2Nyb2xsID4gdGhpcy5fY2FsY3VsYXRlTWF4U2Nyb2xsKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2dldE92ZXJTY3JvbGxEaXJlY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5faXNWZXJ0aWNhbCgpKSB7XG4gICAgICAgIGlmICh0aGlzLl9zY3JvbGwgPD0gMCkge1xuICAgICAgICAgIHJldHVybiAndXAnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHJldHVybiAnZG93bic7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9zY3JvbGwgPD0gMCkge1xuICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfc2Nyb2xsVG9LaWxsT3ZlclNjcm9sbCgpIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gMC40O1xuXG4gICAgICBpZiAodGhpcy5fc2Nyb2xsIDwgMCkge1xuICAgICAgICBhbmltaXQodGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtRWxlbWVudHMoKSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLl9nZW5lcmF0ZVNjcm9sbFRyYW5zZm9ybSgwKVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjQsIC4xLCAxKSdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wbGF5KCk7XG4gICAgICAgIHRoaXMuX3Njcm9sbCA9IDA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdGhpcy5fY2FsY3VsYXRlTWF4U2Nyb2xsKCk7XG5cbiAgICAgIGlmIChtYXhTY3JvbGwgPCB0aGlzLl9zY3JvbGwpIHtcbiAgICAgICAgYW5pbWl0KHRoaXMuX2dldENhcm91c2VsSXRlbUVsZW1lbnRzKCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVTY3JvbGxUcmFuc2Zvcm0obWF4U2Nyb2xsKVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjQsIC4xLCAxKSdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wbGF5KCk7XG4gICAgICAgIHRoaXMuX3Njcm9sbCA9IG1heFNjcm9sbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIF9nZXRDYXJvdXNlbEl0ZW1Db3VudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1FbGVtZW50cygpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoIGNhcm91c2VsIGl0ZW0gbGF5b3V0LlxuICAgICAqL1xuICAgIHJlZnJlc2goKSB7XG4gICAgICAvLyBCdWcgZml4XG4gICAgICBpZiAodGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbWl4aW4odGhpcy5faXNWZXJ0aWNhbCgpID8gVmVydGljYWxNb2RlVHJhaXQgOiBIb3Jpem9udGFsTW9kZVRyYWl0KTtcbiAgICAgIHRoaXMuX2xheW91dENhcm91c2VsSXRlbXMoKTtcblxuICAgICAgaWYgKHRoaXMuX2xhc3RTdGF0ZSAmJiB0aGlzLl9sYXN0U3RhdGUud2lkdGggPiAwKSB7XG4gICAgICAgIGxldCBzY3JvbGwgPSB0aGlzLl9zY3JvbGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzT3ZlclNjcm9sbChzY3JvbGwpKSB7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsVG9LaWxsT3ZlclNjcm9sbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmlzQXV0b1Njcm9sbEVuYWJsZWQoKSkge1xuICAgICAgICAgICAgc2Nyb2xsID0gdGhpcy5fbm9ybWFsaXplU2Nyb2xsUG9zaXRpb24oc2Nyb2xsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9zY3JvbGxUbyhzY3JvbGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NhdmVMYXN0U3RhdGUoKTtcblxuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlZnJlc2gnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge2Nhcm91c2VsOiB0aGlzfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIGZpcnN0KCkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleCgwKTtcbiAgICB9XG5cbiAgICBsYXN0KCkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleChcbiAgICAgICAgTWF0aC5tYXgodGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtQ291bnQoKSAtIDEsIDApXG4gICAgICApO1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9wcmVwYXJlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgdGhpcy5fbGF5b3V0Q2Fyb3VzZWxJdGVtcygpO1xuICAgICAgdGhpcy5fc2V0dXBJbml0aWFsSW5kZXgoKTtcblxuICAgICAgdGhpcy5fc2F2ZUxhc3RTdGF0ZSgpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdkaXJlY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX29uRGlyZWN0aW9uQ2hhbmdlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuICB9XG5cblxuICBpZiAoIXdpbmRvdy5PbnNDYXJvdXNlbEVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zQ2Fyb3VzZWxFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtY2Fyb3VzZWwnLCB7XG4gICAgICBwcm90b3R5cGU6IENhcm91c2VsRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBDb2x1bW5FbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlV2lkdGgoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICd3aWR0aCcpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlV2lkdGgoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlV2lkdGgoKSB7XG4gICAgICBsZXQgd2lkdGggPSB0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICAgIGlmICh0eXBlb2Ygd2lkdGggID09PSAnc3RyaW5nJykge1xuICAgICAgICB3aWR0aCA9ICgnJyArIHdpZHRoKS50cmltKCk7XG4gICAgICAgIHdpZHRoID0gd2lkdGgubWF0Y2goL15cXGQrJC8pID8gd2lkdGggKyAnJScgOiB3aWR0aDtcblxuICAgICAgICB0aGlzLnN0eWxlLndlYmtpdEJveEZsZXggPSAnMCc7XG4gICAgICAgIHRoaXMuc3R5bGUud2Via2l0RmxleCA9ICcwIDAgJyArIHdpZHRoO1xuICAgICAgICB0aGlzLnN0eWxlLm1vekJveEZsZXggPSAnMCc7XG4gICAgICAgIHRoaXMuc3R5bGUubW96RmxleCA9ICcwIDAgJyArIHdpZHRoO1xuICAgICAgICB0aGlzLnN0eWxlLm1zRmxleCA9ICcwIDAgJyArIHdpZHRoO1xuICAgICAgICB0aGlzLnN0eWxlLmZsZXggPSAnMCAwICcgKyB3aWR0aDtcbiAgICAgICAgdGhpcy5zdHlsZS5tYXhXaWR0aCA9IHdpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0NvbEVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zQ29sRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWNvbCcsIHtcbiAgICAgIHByb3RvdHlwZTogQ29sdW1uRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcuZGlhbG9nJzogJ2RpYWxvZy0tKidcbiAgfTtcbiAgY29uc3QgQW5pbWF0b3JGYWN0b3J5ID0gb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3Rvcnk7XG4gIGNvbnN0IEFuZHJvaWREaWFsb2dBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuQW5kcm9pZERpYWxvZ0FuaW1hdG9yO1xuICBjb25zdCBJT1NEaWFsb2dBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuSU9TRGlhbG9nQW5pbWF0b3I7XG4gIGNvbnN0IFNsaWRlRGlhbG9nQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLlNsaWRlRGlhbG9nQW5pbWF0b3I7XG4gIGNvbnN0IERpYWxvZ0FuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5EaWFsb2dBbmltYXRvcjtcbiAgY29uc3QgdGVtcGxhdGVTb3VyY2UgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLW1hc2tcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2dcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCk7XG5cbiAgY2xhc3MgRGlhbG9nRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICAgKi9cbiAgICBnZXQgX21hc2soKSB7XG4gICAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5kaWFsb2ctbWFzaycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAgICovXG4gICAgZ2V0IF9kaWFsb2coKSB7XG4gICAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5kaWFsb2cnKTtcbiAgICB9XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX3Zpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Rvb3JMb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgICB0aGlzLl9ib3VuZENhbmNlbCA9IHRoaXMuX2NhbmNlbC5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgICAgYW5pbWF0b3JzOiBPbnNEaWFsb2dFbGVtZW50Ll9hbmltYXRvckRpY3QsXG4gICAgICAgIGJhc2VDbGFzczogRGlhbG9nQW5pbWF0b3IsXG4gICAgICAgIGJhc2VDbGFzc05hbWU6ICdEaWFsb2dBbmltYXRvcicsXG4gICAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnM6IEFuaW1hdG9yRmFjdG9yeS5wYXJzZUpTT05TYWZlbHkodGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBfY29tcGlsZSgpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBjb25zdCBkaWFsb2cgPSB0ZW1wbGF0ZS5jaGlsZHJlblsxXTtcblxuICAgICAgaWYgKHN0eWxlKSB7XG4gICAgICAgIGRpYWxvZy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGUpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKSB7XG4gICAgICAgIGRpYWxvZy5hcHBlbmRDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodGVtcGxhdGUuZmlyc3RDaGlsZCkge1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRlbXBsYXRlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kaWFsb2cuc3R5bGUuekluZGV4ID0gMjAwMDE7XG4gICAgICB0aGlzLl9tYXNrLnN0eWxlLnpJbmRleCA9IDIwMDAwO1xuXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbm8tc3RhdHVzLWJhci1maWxsJywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgZ2V0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXI7XG4gICAgfVxuXG4gICAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgICAgaWYgKHRoaXMuaXNDYW5jZWxhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5fY2FuY2VsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9jYW5jZWwoKSB7XG4gICAgICBpZiAodGhpcy5pc0NhbmNlbGFibGUoKSkge1xuICAgICAgICB0aGlzLmhpZGUoe1xuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjYW5jZWwnLCB7YnViYmxlczogdHJ1ZX0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdIGNhbGxiYWNrIGFmdGVyIGRpYWxvZyBpcyBzaG93blxuICAgICAqL1xuICAgIHNob3cob3B0aW9ucyA9IHt9KSB7XG4gICAgICBsZXQgY2FuY2VsID0gZmFsc2U7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncHJlc2hvdycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgZGlhbG9nOiB0aGlzLFxuICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoIWNhbmNlbCkge1xuICAgICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bmxvY2sgPSB0aGlzLl9kb29yTG9jay5sb2NrKCk7XG5cbiAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIHRoaXMuX21hc2suc3R5bGUub3BhY2l0eSA9ICcxJztcblxuICAgICAgICAgIGNvbnN0IGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICAgICAgYW5pbWF0b3Iuc2hvdyh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHVubG9jaygpO1xuXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwb3N0c2hvdycsIHtcbiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7ZGlhbG9nOiB0aGlzfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBhbmltYXRpb24gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXSBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXSBjYWxsYmFjayBhZnRlciBkaWFsb2cgaXMgaGlkZGVuXG4gICAgICovXG4gICAgaGlkZShvcHRpb25zID0ge30pIHtcbiAgICAgIGxldCBjYW5jZWwgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwcmVoaWRlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBkaWFsb2c6IHRoaXMsXG4gICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghY2FuY2VsKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcbiAgICAgICAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zKTtcblxuICAgICAgICAgIGFuaW1hdG9yLmhpZGUodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdW5sb2NrKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwb3N0aGlkZScsIHtcbiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7ZGlhbG9nOiB0aGlzfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBkaWFsb2cuXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgZGlhbG9nIGlzIHZpc2libGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzU2hvd24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBkaWFsb2cgaXMgY2FuY2VsYWJsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNDYW5jZWxhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdjYW5jZWxhYmxlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBvciBlbmFibGUgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufVxuICAgICAqL1xuICAgIHNldERpc2FibGVkKGRpc2FibGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGRpc2FibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbi4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgZGlhbG9nIGlzIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2UgZGlhbG9nIGNhbmNlbGFibGUgb3IgdW5jYW5jZWxhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufVxuICAgICAqL1xuICAgIHNldENhbmNlbGFibGUoY2FuY2VsYWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiBjYW5jZWxhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbi4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbmNlbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2NhbmNlbGFibGUnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnY2FuY2VsYWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCB0aGlzLl9vbkRldmljZUJhY2tCdXR0b24uYmluZCh0aGlzKSk7XG5cbiAgICAgIHRoaXMuX21hc2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZENhbmNlbCwgZmFsc2UpO1xuXG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2RldmljZUJhY2tCdXR0b25IYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2RldmljZUJhY2tCdXR0b25IYW5kbGVyID0gbnVsbDtcblxuICAgICAgdGhpcy5fbWFzay5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kQ2FuY2VsLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0RpYWxvZ0VsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zRGlhbG9nRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWRpYWxvZycsIHtcbiAgICAgIHByb3RvdHlwZTogRGlhbG9nRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcblxuICAgIHdpbmRvdy5PbnNEaWFsb2dFbGVtZW50Ll9hbmltYXRvckRpY3QgPSB7XG4gICAgICAnZGVmYXVsdCc6IG9ucy5wbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFuZHJvaWREaWFsb2dBbmltYXRvciA6IElPU0RpYWxvZ0FuaW1hdG9yLFxuICAgICAgJ2ZhZGUnOiBvbnMucGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBBbmRyb2lkRGlhbG9nQW5pbWF0b3IgOiBJT1NEaWFsb2dBbmltYXRvcixcbiAgICAgICdzbGlkZSc6IFNsaWRlRGlhbG9nQW5pbWF0b3IsXG4gICAgICAnbm9uZSc6IERpYWxvZ0FuaW1hdG9yXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtEaWFsb2dBbmltYXRvcn0gQW5pbWF0b3JcbiAgICAgKi9cbiAgICB3aW5kb3cuT25zRGlhbG9nRWxlbWVudC5yZWdpc3RlckFuaW1hdG9yID0gZnVuY3Rpb24obmFtZSwgQW5pbWF0b3IpIHtcbiAgICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIERpYWxvZ0FuaW1hdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiQW5pbWF0b3JcIiBwYXJhbSBtdXN0IGluaGVyaXQgRGlhbG9nQW5pbWF0b3InKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICAgIH07XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY2xhc3MgR2VzdHVyZURldGVjdG9yRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBvbnMuR2VzdHVyZURldGVjdG9yKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0dlc3R1cmVEZXRlY3RvckVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zR2VzdHVyZURldGVjdG9yRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWdlc3R1cmUtZGV0ZWN0b3InLCB7XG4gICAgICBwcm90b3R5cGU6IEdlc3R1cmVEZXRlY3RvckVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY2xhc3MgSWNvbkVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAoWydpY29uJywgJ3NpemUnXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlKCkge1xuICAgICAgdGhpcy5fY2xlYW5DbGFzc0F0dHJpYnV0ZSgpO1xuXG4gICAgICBjb25zdCBidWlsZGVkID0gdGhpcy5fYnVpbGRDbGFzc0FuZFN0eWxlKHRoaXMpO1xuXG4gICAgICBmb3IgKGxldCBrZXkgaW4gYnVpbGRlZC5zdHlsZSkge1xuICAgICAgICBpZiAoYnVpbGRlZC5zdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdHlsZVtrZXldID0gYnVpbGRlZC5zdHlsZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkZWQuY2xhc3NMaXN0LmZvckVhY2goY2xhc3NOYW1lID0+IHRoaXMuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdW5uZWVkZWQgY2xhc3MgdmFsdWUuXG4gICAgICovXG4gICAgX2NsZWFuQ2xhc3NBdHRyaWJ1dGUoKSB7XG4gICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLmNsYXNzTGlzdDtcblxuICAgICAgQXJyYXkuYXBwbHkobnVsbCwgdGhpcy5jbGFzc0xpc3QpLmZpbHRlcihrbGFzcyA9PiB7XG4gICAgICAgIHJldHVybiBrbGFzcyA9PT0gJ2ZhJyB8fCBrbGFzcy5pbmRleE9mKCdmYS0nKSA9PT0gMCB8fCBrbGFzcy5pbmRleE9mKCdpb24tJykgPT09IDA7XG4gICAgICB9KS5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7XG4gICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgIH0pO1xuXG4gICAgICBjbGFzc0xpc3QucmVtb3ZlKCdvbnMtaWNvbi0taW9uJyk7XG4gICAgfVxuXG4gICAgX2J1aWxkQ2xhc3NBbmRTdHlsZSgpIHtcbiAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IFsnb25zLWljb24nXTtcbiAgICAgIGNvbnN0IHN0eWxlID0ge307XG5cbiAgICAgIC8vIGljb25cbiAgICAgIGNvbnN0IGljb25OYW1lID0gJycgKyB0aGlzLmdldEF0dHJpYnV0ZSgnaWNvbicpO1xuICAgICAgaWYgKGljb25OYW1lLmluZGV4T2YoJ2lvbi0nKSA9PT0gMCkge1xuICAgICAgICBjbGFzc0xpc3QucHVzaChpY29uTmFtZSk7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKCdvbnMtaWNvbi0taW9uJyk7XG4gICAgICB9IGVsc2UgaWYgKGljb25OYW1lLmluZGV4T2YoJ2ZhLScpID09PSAwKSB7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKGljb25OYW1lKTtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goJ2ZhJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgnZmEnKTtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goJ2ZhLScgKyBpY29uTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNpemVcbiAgICAgIGNvbnN0IHNpemUgPSAnJyArIHRoaXMuZ2V0QXR0cmlidXRlKCdzaXplJyk7XG4gICAgICBpZiAoc2l6ZS5tYXRjaCgvXlsxLTVdeHxsZyQvKSkge1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgnZmEtJyArIHNpemUpO1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdmb250LXNpemUnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0eWxlLmZvbnRTaXplID0gc2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKCdmYS1sZycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc0xpc3Q6IGNsYXNzTGlzdCxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0ljb25FbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0ljb25FbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtaWNvbicsIHtcbiAgICAgIHByb3RvdHlwZTogSWNvbkVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0geycnOiAnbGlzdF9faGVhZGVyLS0qJ307XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuXG4gIGNsYXNzIExpc3RIZWFkZXJFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdsaXN0X19oZWFkZXInKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0xpc3RIZWFkZXJFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0xpc3RIZWFkZXJFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtbGlzdC1oZWFkZXInLCB7XG4gICAgICBwcm90b3R5cGU6IExpc3RIZWFkZXJFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHNjaGVtZSA9IHsnJzogJ2xpc3RfX2l0ZW0tLSonfTtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG5cbiAgY2xhc3MgTGlzdEl0ZW1FbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdsaXN0X19pdGVtJyk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBvbnMuR2VzdHVyZURldGVjdG9yKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPbkRyYWcgPSB0aGlzLl9vbkRyYWcuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLl9ib3VuZE9uRHJhZyk7XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMuX2JvdW5kT25EcmFnKTtcbiAgICB9XG5cbiAgICBfb25EcmFnKGV2ZW50KSB7XG4gICAgICBsZXQgZyA9IGV2ZW50Lmdlc3R1cmU7XG4gICAgICAvLyBQcmV2ZW50IHZlcnRpY2FsIHNjcm9sbGluZyBpZiB0aGUgdXNlcnMgcGFucyBsZWZ0IG9yIHJpZ2h0LlxuICAgICAgaWYgKHRoaXMuX3Nob3VsZExvY2tPbkRyYWcoKSAmJiBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGcuZGlyZWN0aW9uKSA+IC0xKSB7XG4gICAgICAgIGcucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfc2hvdWxkTG9ja09uRHJhZygpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnbG9jay1vbi1kcmFnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zTGlzdEl0ZW1FbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0xpc3RJdGVtRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWxpc3QtaXRlbScsIHtcbiAgICAgIHByb3RvdHlwZTogTGlzdEl0ZW1FbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHNjaGVtZSA9IHsnJzogJ2xpc3QtLSonfTtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG5cbiAgY2xhc3MgTGlzdEVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2xpc3QnKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0xpc3RFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0xpc3RFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtbGlzdCcsIHtcbiAgICAgIHByb3RvdHlwZTogTGlzdEVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcnOiAnbW9kYWwtLSonLFxuICAgICdtb2RhbF9fY29udGVudCc6ICdtb2RhbC0tKl9fY29udGVudCdcbiAgfTtcblxuICBjb25zdCBBbmltYXRvckZhY3RvcnkgPSBvbnMuX2ludGVybmFsLkFuaW1hdG9yRmFjdG9yeTtcbiAgY29uc3QgTW9kYWxBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTW9kYWxBbmltYXRvcjtcbiAgY29uc3QgRmFkZU1vZGFsQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLkZhZGVNb2RhbEFuaW1hdG9yO1xuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcblxuICBjbGFzcyBNb2RhbEVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2Rvb3JMb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgICAgYW5pbWF0b3JzOiBPbnNNb2RhbEVsZW1lbnQuX2FuaW1hdG9yRGljdCxcbiAgICAgICAgYmFzZUNsYXNzOiBNb2RhbEFuaW1hdG9yLFxuICAgICAgICBiYXNlQ2xhc3NOYW1lOiAnTW9kYWxBbmltYXRvcicsXG4gICAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnM6IEFuaW1hdG9yRmFjdG9yeS5wYXJzZUpTT05TYWZlbHkodGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykpIHx8IHt9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICAgIH1cblxuICAgIGdldERldmljZUJhY2tCdXR0b25IYW5kbGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RldmljZUJhY2tCdXR0b25IYW5kbGVyO1xuICAgIH1cblxuICAgIHNldERldmljZUJhY2tCdXR0b25IYW5kbGVyKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gICAgICB0aGlzLl9vbkRldmljZUJhY2tCdXR0b24gPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBfb25EZXZpY2VCYWNrQnV0dG9uKCkge1xuICAgICAgLy8gRG8gbm90aGluZyBhbmQgc3RvcCBkZXZpY2UtYmFja2J1dHRvbiBoYW5kbGVyIGNoYWluLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF9jb21waWxlKCkge1xuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdtb2RhbCcpO1xuXG4gICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ21vZGFsX19jb250ZW50Jyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkTm9kZXNbMF07XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgIHdyYXBwZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICBpZiAodGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICBzZXRJbW1lZGlhdGUodGhpcy5fZW5zdXJlTm9kZVBvc2l0aW9uLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgdGhpcy5fb25EZXZpY2VCYWNrQnV0dG9uLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIF9lbnN1cmVOb2RlUG9zaXRpb24oKSB7XG4gICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fCB0aGlzLmhhc0F0dHJpYnV0ZSgnaW5saW5lJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgcGFnZSA9IHBhZ2UucGFyZW50Tm9kZTtcblxuICAgICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYWdlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwYWdlLl9yZWdpc3RlckV4dHJhRWxlbWVudCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpc1Nob3duKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgbW9kYWwgdmlldy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBhbmltYXRpb24gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXSBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXSBjYWxsYmFjayBhZnRlciBtb2RhbCBpcyBzaG93blxuICAgICAqL1xuICAgIHNob3cob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcblxuICAgICAgdGhpcy5fZG9vckxvY2sud2FpdFVubG9jaygoKSA9PiB7XG4gICAgICAgIHZhciB1bmxvY2sgPSB0aGlzLl9kb29yTG9jay5sb2NrKCksXG4gICAgICAgICAgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlJztcbiAgICAgICAgYW5pbWF0b3Iuc2hvdyh0aGlzLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSBtb2RhbCB2aWV3LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdIGNhbGxiYWNrIGFmdGVyIG1vZGFsIGlzIHRvZ2dsZWRcbiAgICAgKi9cbiAgICB0b2dnbGUoKSB7XG4gICAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGUgbW9kYWwgdmlldy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBhbmltYXRpb24gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXSBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXSBjYWxsYmFjayBhZnRlciBtb2RhbCBpcyBoaWRkZW5cbiAgICAgKi9cbiAgICBoaWRlKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICB2YXIgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICB2YXIgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpLFxuICAgICAgICAgIGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICAgIGFuaW1hdG9yLmhpZGUodGhpcywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zTW9kYWxFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc01vZGFsRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLW1vZGFsJywge1xuICAgICAgcHJvdG90eXBlOiBNb2RhbEVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG5cbiAgICB3aW5kb3cuT25zTW9kYWxFbGVtZW50Ll9hbmltYXRvckRpY3QgPSB7XG4gICAgICAnZGVmYXVsdCc6IE1vZGFsQW5pbWF0b3IsXG4gICAgICAnZmFkZSc6IEZhZGVNb2RhbEFuaW1hdG9yLFxuICAgICAgJ25vbmUnOiBNb2RhbEFuaW1hdG9yXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICAgKi9cbiAgICB3aW5kb3cuT25zTW9kYWxFbGVtZW50LnJlZ2lzdGVyQW5pbWF0b3IgPSBmdW5jdGlvbihuYW1lLCBBbmltYXRvcikge1xuICAgICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kYWxBbmltYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIkFuaW1hdG9yXCIgcGFyYW0gbXVzdCBpbmhlcml0IE1vZGFsQW5pbWF0b3InKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICAgIH07XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgQW5pbWF0b3JGYWN0b3J5ID0gb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3Rvcnk7XG4gIGNvbnN0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuICBjb25zdCBJT1NTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuSU9TU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3I7XG4gIGNvbnN0IFNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5TaW1wbGVTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgTnVsbE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTnVsbE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcbiAgY29uc3QgQXN5bmNIb29rID0gb25zLl9pbnRlcm5hbC5Bc3luY0hvb2s7XG4gIGNvbnN0IE5hdmlnYXRvclBhZ2UgPSBvbnMuX2ludGVybmFsLk5hdmlnYXRvclBhZ2U7XG5cbiAgY2xhc3MgTmF2aWdhdG9yRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fZG9vckxvY2sgPSBuZXcgRG9vckxvY2soKTtcbiAgICAgIHRoaXMuX3BhZ2VzID0gW107XG4gICAgICB0aGlzLl9ib3VuZE9uRGV2aWNlQmFja0J1dHRvbiA9IHRoaXMuX29uRGV2aWNlQmFja0J1dHRvbi5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5faXNQdXNoaW5nID0gdGhpcy5faXNQb3BwaW5nID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuX2luaXRpYWxIVE1MID0gdGhpcy5pbm5lckhUTUw7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgdGhpcy5fY29tcGlsZVBhZ2VIb29rID0gbmV3IEFzeW5jSG9vaygpO1xuICAgICAgdGhpcy5fbGlua1BhZ2VIb29rID0gbmV3IEFzeW5jSG9vaygpO1xuXG4gICAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgICAgYW5pbWF0b3JzOiB3aW5kb3cuT25zTmF2aWdhdG9yRWxlbWVudC5fdHJhbnNpdGlvbkFuaW1hdG9yRGljdCxcbiAgICAgICAgYmFzZUNsYXNzOiBOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IsXG4gICAgICAgIGJhc2VDbGFzc05hbWU6ICdOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3InLFxuICAgICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJyksXG4gICAgICAgIGRlZmF1bHRBbmltYXRpb25PcHRpb25zOiBBbmltYXRvckZhY3RvcnkucGFyc2VKU09OU2FmZWx5KHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpKSB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBjYW5Qb3BQYWdlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmxlbmd0aCA+IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcGFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICovXG4gICAgcmVwbGFjZVBhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGNvbnN0IG9uVHJhbnNpdGlvbkVuZCA9IG9wdGlvbnMub25UcmFuc2l0aW9uRW5kIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIG9wdGlvbnMub25UcmFuc2l0aW9uRW5kID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcGFnZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuX3BhZ2VzW3RoaXMuX3BhZ2VzLmxlbmd0aCAtIDJdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBvblRyYW5zaXRpb25FbmQoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnB1c2hQYWdlKHBhZ2UsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvcHMgY3VycmVudCBwYWdlIGZyb20gdGhlIHBhZ2Ugc3RhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlZnJlc2hdXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25UcmFuc2l0aW9uRW5kXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2FuY2VsSWZSdW5uaW5nXVxuICAgICAqL1xuICAgIHBvcFBhZ2Uob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmIChvcHRpb25zLmNhbmNlbElmUnVubmluZyAmJiB0aGlzLl9pc1BvcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbnMtbmF2aWdhdG9yXFwncyBwYWdlIHN0YWNrIGlzIGVtcHR5LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2VtaXRQcmVQb3BFdmVudCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlZnJlc2gpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gMjtcblxuICAgICAgICAgIGlmICghdGhpcy5fcGFnZXNbaW5kZXhdLnBhZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVmcmVzaCBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCBwYWdlcyBkaXJlY3RseSBpbnNpZGUgdGhlIE5hdmlnYXRvci4gVXNlIG9ucy10ZW1wbGF0ZSBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyh0aGlzLl9wYWdlc1tpbmRleF0ucGFnZSkudGhlbih0ZW1wbGF0ZUhUTUwgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NyZWF0ZVBhZ2VFbGVtZW50KHRlbXBsYXRlSFRNTCk7XG4gICAgICAgICAgICBjb25zdCBwYWdlT2JqZWN0ID0gdGhpcy5fY3JlYXRlUGFnZU9iamVjdCh0aGlzLl9wYWdlc1tpbmRleF0ucGFnZSwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NvbXBpbGVQYWdlSG9vay5ydW4oKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fbGlua1BhZ2VIb29rLnJ1bigoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIHRoaXMuX3BhZ2VzW2luZGV4XSA/IHRoaXMuX3BhZ2VzW2luZGV4XS5lbGVtZW50IDogbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFnZXMuc3BsaWNlKGluZGV4LCAwLCBwYWdlT2JqZWN0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzW2luZGV4ICsgMV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvcFBhZ2Uob3B0aW9ucywgdW5sb2NrKTtcbiAgICAgICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9LCBlbGVtZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BvcFBhZ2Uob3B0aW9ucywgdW5sb2NrKTtcbiAgICAgICAgfVxuXG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIF9wb3BQYWdlKG9wdGlvbnMsIHVubG9jaykge1xuICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5fcGFnZXMucG9wKCk7XG5cbiAgICAgIGlmICh0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAxXSkge1xuICAgICAgICB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAxXS5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRlclBhZ2UgPSB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAxXTtcblxuICAgICAgLy8gZm9yIFwicG9zdHBvcFwiIGV2ZW50XG4gICAgICBjb25zdCBldmVudERldGFpbCA9IHtcbiAgICAgICAgbGVhdmVQYWdlOiBsZWF2ZVBhZ2UsXG4gICAgICAgIGVudGVyUGFnZTogdGhpcy5fcGFnZXNbdGhpcy5fcGFnZXMubGVuZ3RoIC0gMV0sXG4gICAgICAgIG5hdmlnYXRvcjogdGhpc1xuICAgICAgfTtcblxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGxlYXZlUGFnZS5kZXN0cm95KCk7XG5cbiAgICAgICAgdGhpcy5faXNQb3BwaW5nID0gZmFsc2U7XG4gICAgICAgIHVubG9jaygpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdwb3N0cG9wJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBldmVudERldGFpbFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICBldmVudC5sZWF2ZVBhZ2UgPSBudWxsO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblRyYW5zaXRpb25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRpb25zLm9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9pc1BvcHBpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zLCBsZWF2ZVBhZ2Uub3B0aW9ucy5hbmltYXRvcik7XG4gICAgICBhbmltYXRvci5wb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBwYWdlIG9iamVjdCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIHBhZ2VVcmwgaW50byB0aGUgcGFnZSBzdGFjayBhbmRcbiAgICAgKiBpZiBvcHRpb25zIG9iamVjdCBpcyBzcGVjaWZpZWQsIGFwcGx5IHRoZSBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtTdHJpbmcvTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAgICovXG4gICAgaW5zZXJ0UGFnZShpbmRleCwgcGFnZSwgb3B0aW9ucykge1xuXG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0LiBZb3Ugc3VwcGxpZWQgJyArIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVJbmRleCA9IGluZGV4ID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgIGluZGV4ID0gTWF0aC5hYnModGhpcy5wYWdlcy5sZW5ndGggKyBpbmRleCkgJSB0aGlzLnBhZ2VzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9O1xuXG4gICAgICBpbmRleCA9IG5vcm1hbGl6ZUluZGV4KGluZGV4KTtcblxuICAgICAgaWYgKGluZGV4ID49IHRoaXMucGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnB1c2hQYWdlLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICBjb25zdCB1bmxvY2sgPSB0aGlzLl9kb29yTG9jay5sb2NrKCk7XG5cbiAgICAgICAgb25zLl9pbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jKHBhZ2UpLnRoZW4odGVtcGxhdGVIVE1MID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY3JlYXRlUGFnZUVsZW1lbnQodGVtcGxhdGVIVE1MKTtcblxuICAgICAgICAgIGNvbnN0IHBhZ2VPYmplY3QgPSB0aGlzLl9jcmVhdGVQYWdlT2JqZWN0KHBhZ2UsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgdGhpcy5fY29tcGlsZVBhZ2VIb29rLnJ1bihlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xpbmtQYWdlSG9vay5ydW4oZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoZWxlbWVudCwgdGhpcy5fcGFnZXNbaW5kZXhdLmVsZW1lbnQpO1xuICAgICAgICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXgsIDAsIHBhZ2VPYmplY3QpO1xuXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVubG9jaygpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICB9LCAxMDAwIC8gNjApO1xuICAgICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgcGFnZSdzIG5hdmlnYXRvciBpdGVtLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGFjY2VzcyBvcHRpb25zIHBhc3NlZCBieSBwdXNoUGFnZSgpIG9yIHJlc2V0VG9QYWdlKCkgbWV0aG9kLlxuICAgICAqIGVnLiBvbnMubmF2aWdhdG9yLmdldEN1cnJlbnRQYWdlKCkub3B0aW9uc1xuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRQYWdlKCkge1xuICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzW3RoaXMuX3BhZ2VzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIF9kZXN0cm95KCkge1xuICAgICAgdGhpcy5fcGFnZXMuZm9yRWFjaChmdW5jdGlvbihwYWdlKSB7XG4gICAgICAgIHBhZ2UuZGVzdHJveSgpO1xuICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBnZXQgcGFnZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFnZXMuc2xpY2UoMCk7XG4gICAgfVxuXG4gICAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhpcy5wb3BQYWdlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBwYWdlIHN0YWNrIGFuZCBhZGQgdGhlIHNwZWNpZmllZCBwYWdlVXJsIHRvIHRoZSBwYWdlIHN0YWNrLlxuICAgICAqIElmIG9wdGlvbnMgb2JqZWN0IGlzIHNwZWNpZmllZCwgYXBwbHkgdGhlIG9wdGlvbnMuXG4gICAgICogdGhlIG9wdGlvbnMgb2JqZWN0IGluY2x1ZGUgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgbmF2aWdhdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICovXG4gICAgcmVzZXRUb1BhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmICghb3B0aW9ucy5hbmltYXRvciAmJiAhb3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgb3B0aW9ucy5hbmltYXRpb24gPSAnbm9uZSc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uVHJhbnNpdGlvbkVuZCA9IG9wdGlvbnMub25UcmFuc2l0aW9uRW5kIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIG9wdGlvbnMub25UcmFuc2l0aW9uRW5kID0gKCkgPT4ge1xuICAgICAgICB3aGlsZSAodGhpcy5fcGFnZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuX3BhZ2VzLnNoaWZ0KCkuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIG9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5wdXNoUGFnZShwYWdlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCB0aGlzLl9ib3VuZE9uRGV2aWNlQmFja0J1dHRvbik7XG5cbiAgICAgIHdpbmRvdy5PbnNOYXZpZ2F0b3JFbGVtZW50LnJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2xpbmtQYWdlSG9vay5mcmVlemUoKTtcbiAgICAgICAgICB0aGlzLl9jb21waWxlUGFnZUhvb2suZnJlZXplKCk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSAodGhpcy5faW5pdGlhbEhUTUwgfHwgJycpLm1hdGNoKC9eXFxzKjxvbnMtcGFnZS8pID8gdGhpcy5faW5pdGlhbEhUTUwgOiAnPG9ucy1wYWdlPicgKyB0aGlzLl9pbml0aWFsSFRNTCArICc8L29ucy1wYWdlPic7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY3JlYXRlUGFnZUVsZW1lbnQoaHRtbCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3B1c2hQYWdlRE9NKCcnLCBlbGVtZW50LCB7fSwgZnVuY3Rpb24oKSB7fSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFBhZ2UodGhpcy5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKSwge2FuaW1hdGlvbjogJ25vbmUnfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2luaXRpYWxIVE1MID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgcGFnZVVybCBpbnRvIHRoZSBwYWdlIHN0YWNrIGFuZFxuICAgICAqIGlmIG9wdGlvbnMgb2JqZWN0IGlzIHNwZWNpZmllZCwgYXBwbHkgdGhlIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZy9OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3J9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vblRyYW5zaXRpb25FbmRdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jYW5jZWxJZlJ1bm5pbmddXG4gICAgICovXG4gICAgcHVzaFBhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmIChvcHRpb25zLmNhbmNlbElmUnVubmluZyAmJiB0aGlzLl9pc1B1c2hpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuIFlvdSBzdXBwbGllZCAnICsgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9lbWl0UHJlUHVzaEV2ZW50KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHRoaXMuX3B1c2hQYWdlKHBhZ2UsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBfcHVzaFBhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpO1xuICAgICAgY29uc3QgZG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB1bmxvY2soKTtcbiAgICAgIH07XG5cbiAgICAgIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKHRlbXBsYXRlSFRNTCA9PiB7XG4gICAgICAgIHRoaXMuX3B1c2hQYWdlRE9NKHBhZ2UsIHRoaXMuX2NyZWF0ZVBhZ2VFbGVtZW50KHRlbXBsYXRlSFRNTCksIG9wdGlvbnMsIGRvbmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2UgUGFnZSBuYW1lLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdW5sb2NrXVxuICAgICAqL1xuICAgIF9wdXNoUGFnZURPTShwYWdlLCBlbGVtZW50LCBvcHRpb25zLCB1bmxvY2spIHtcblxuICAgICAgdW5sb2NrID0gdW5sb2NrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgY29uc3QgcGFnZU9iamVjdCA9IHRoaXMuX2NyZWF0ZVBhZ2VPYmplY3QocGFnZSwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgIC8vIGZvciBcInBvc3RwdXNoXCIgZXZlbnRcbiAgICAgIGNvbnN0IGV2ZW50RGV0YWlsID0ge1xuICAgICAgICBlbnRlclBhZ2U6IHBhZ2VPYmplY3QsXG4gICAgICAgIGxlYXZlUGFnZTogdGhpcy5fcGFnZXNbdGhpcy5fcGFnZXMubGVuZ3RoIC0gMV0sXG4gICAgICAgIG5hdmlnYXRvcjogdGhpc1xuICAgICAgfTtcblxuICAgICAgdGhpcy5fcGFnZXMucHVzaChwYWdlT2JqZWN0KTtcblxuICAgICAgY29uc3QgZG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fcGFnZXNbdGhpcy5fcGFnZXMubGVuZ3RoIC0gMl0pIHtcbiAgICAgICAgICB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAyXS5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pc1B1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgdW5sb2NrKCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3Bvc3RwdXNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBldmVudERldGFpbFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblRyYW5zaXRpb25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRpb25zLm9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLl9pc1B1c2hpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLl9jb21waWxlUGFnZUhvb2sucnVuKGVsZW1lbnQgPT4ge1xuICAgICAgICB0aGlzLl9saW5rUGFnZUhvb2sucnVuKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5fcGFnZXMuc2xpY2UoLTIpWzBdO1xuICAgICAgICAgICAgICBjb25zdCBlbnRlclBhZ2UgPSB0aGlzLl9wYWdlcy5zbGljZSgtMSlbMF07XG5cbiAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgb3B0aW9ucy5hbmltYXRvci5wdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBkb25lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAxMDAwIC8gNjApO1xuICAgICAgICB9LCBlbGVtZW50KTtcbiAgICAgIH0sIGVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgaWYgZXZlbnQgaXMgY2FuY2VsZWQuXG4gICAgICovXG4gICAgX2VtaXRQcmVQdXNoRXZlbnQoKSB7XG4gICAgICBsZXQgaXNDYW5jZWxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3ByZXB1c2gnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG5hdmlnYXRvcjogdGhpcyxcbiAgICAgICAgICBjdXJyZW50UGFnZTogdGhpcy5fcGFnZXMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Q3VycmVudFBhZ2UoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNDYW5jZWxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgcmV0dXJuIGlzQ2FuY2VsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciBpZiBldmVudCBpcyBjYW5jZWxlZC5cbiAgICAgKi9cbiAgICBfZW1pdFByZVBvcEV2ZW50KCkge1xuICAgICAgbGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5nZXRDdXJyZW50UGFnZSgpO1xuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3ByZXBvcCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgbmF2aWdhdG9yOiB0aGlzLFxuICAgICAgICAgIC8vIFRPRE86IGN1cnJlbnRQYWdlIHdpbGwgYmUgZGVwcmVjYXRlZFxuICAgICAgICAgIGN1cnJlbnRQYWdlOiBsZWF2ZVBhZ2UsXG4gICAgICAgICAgbGVhdmVQYWdlOiBsZWF2ZVBhZ2UsXG4gICAgICAgICAgZW50ZXJQYWdlOiB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAyXSxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNDYW5jZWxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgIHJldHVybiBpc0NhbmNlbGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBfY3JlYXRlUGFnZU9iamVjdChwYWdlLCBlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zLmFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICByZXR1cm4gbmV3IE5hdmlnYXRvclBhZ2Uoe1xuICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICBuYXZpZ2F0b3I6IHRoaXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVQYWdlRWxlbWVudCh0ZW1wbGF0ZUhUTUwpIHtcbiAgICAgIGNvbnN0IHBhZ2VFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KG9ucy5faW50ZXJuYWwubm9ybWFsaXplUGFnZUhUTUwoJycgKyB0ZW1wbGF0ZUhUTUwpKTtcblxuICAgICAgaWYgKHBhZ2VFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYW4gXCJvbnMtcGFnZVwiIGVsZW1lbnQgdG8gXCJvbnMtbmF2aWdhdG9yXCIuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWdlRWxlbWVudDtcbiAgICB9XG5cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc05hdmlnYXRvckVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zTmF2aWdhdG9yRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLW5hdmlnYXRvcicsIHtcbiAgICAgIHByb3RvdHlwZTogTmF2aWdhdG9yRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcblxuICAgIHdpbmRvdy5PbnNOYXZpZ2F0b3JFbGVtZW50Ll90cmFuc2l0aW9uQW5pbWF0b3JEaWN0ID0ge1xuICAgICAgJ2RlZmF1bHQnOiBvbnMucGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBTaW1wbGVTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA6IElPU1NsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ3NsaWRlJzogb25zLnBsYXRmb3JtLmlzQW5kcm9pZCgpID8gU2ltcGxlU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgOiBJT1NTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcixcbiAgICAgICdzaW1wbGVzbGlkZSc6IFNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ2xpZnQnOiBMaWZ0TmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ2ZhZGUnOiBGYWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ25vbmUnOiBOdWxsTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICAgKi9cbiAgICB3aW5kb3cuT25zTmF2aWdhdG9yRWxlbWVudC5yZWdpc3RlckFuaW1hdG9yID0gZnVuY3Rpb24obmFtZSwgQW5pbWF0b3IpIHtcbiAgICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIkFuaW1hdG9yXCIgcGFyYW0gbXVzdCBpbmhlcml0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmFuc2l0aW9uQW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gICAgfTtcblxuICAgIHdpbmRvdy5PbnNOYXZpZ2F0b3JFbGVtZW50LnJlYWR5ID0gZnVuY3Rpb24oZWxlbWVudCwgZG9uZSkge1xuICAgICAgZG9uZSgpO1xuICAgIH07XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcnOiAncGFnZS0tKicsXG4gICAgJy5wYWdlX19jb250ZW50JzogJ3BhZ2UtLSpfX2NvbnRlbnQnLFxuICAgICcucGFnZV9fYmFja2dyb3VuZCc6ICdwYWdlLS0qX19iYWNrZ3JvdW5kJ1xuICB9O1xuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcbiAgY29uc3QgbnVsbFRvb2xiYXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb25zLXRvb2xiYXInKTtcblxuICBjbGFzcyBQYWdlRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdwYWdlJyk7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdpbml0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7T2JqZWN0L251bGx9XG4gICAgICovXG4gICAgZ2V0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNldERldmljZUJhY2tCdXR0b25IYW5kbGVyKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2dldENvbnRlbnRFbGVtZW50KCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2NvbnRlbnQnKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKCdmYWlsIHRvIGdldCBcIi5wYWdlX19jb250ZW50XCIgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIF9oYXNUb29sYmFyRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiAhIW9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy10b29sYmFyJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBfY2FuQW5pbWF0ZVRvb2xiYXIoKSB7XG4gICAgICBjb25zdCB0b29sYmFyID0gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKTtcbiAgICAgIGlmICh0b29sYmFyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuY2hpbGRyZW47XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRvb2xiYXInICYmICFlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoJ2lubGluZScpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgICAqL1xuICAgIF9nZXRCYWNrZ3JvdW5kRWxlbWVudCgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wYWdlX19iYWNrZ3JvdW5kJyk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcignZmFpbCB0byBnZXQgXCIucGFnZV9fYmFja2dyb3VuZFwiIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2dldEJvdHRvbVRvb2xiYXJFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1ib3R0b20tdG9vbGJhcicpIHx8IG9ucy5faW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAgICAgKi9cbiAgICBfZ2V0VG9vbGJhckVsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKSB8fCBudWxsVG9vbGJhckVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgdG9vbGJhciBlbGVtZW50IHRvIHRoaXMgcGFnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBfcmVnaXN0ZXJUb29sYmFyKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuc2V0QXR0cmlidXRlKCduby1zdGF0dXMtYmFyLWZpbGwnLCAnJyk7XG5cbiAgICAgIGlmIChvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fc3RhdHVzLWJhci1maWxsJykpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoZWxlbWVudCwgdGhpcy5jaGlsZHJlblsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShlbGVtZW50LCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciB0b29sYmFyIGVsZW1lbnQgdG8gdGhpcyBwYWdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqL1xuICAgIF9yZWdpc3RlckJvdHRvbVRvb2xiYXIoZWxlbWVudCkge1xuICAgICAgaWYgKCFvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fc3RhdHVzLWJhci1maWxsJykpIHtcbiAgICAgICAgY29uc3QgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBmaWxsLmNsYXNzTGlzdC5hZGQoJ3BhZ2VfX2JvdHRvbS1iYXItZmlsbCcpO1xuICAgICAgICBmaWxsLnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgICAgIGZpbGwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cbiAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoZmlsbCwgdGhpcy5jaGlsZHJlblswXSk7XG4gICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICBpZiAob25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2JhY2tncm91bmQnKSAmJiBvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fY29udGVudCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYmFja2dyb3VuZC5jbGFzc0xpc3QuYWRkKCdwYWdlX19iYWNrZ3JvdW5kJyk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgncGFnZV9fY29udGVudCcpO1xuXG4gICAgICB3aGlsZSAodGhpcy5jaGlsZE5vZGVzWzBdKSB7XG4gICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7XG4gICAgICAgIGJhY2tncm91bmQuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoYmFja2dyb3VuZCk7XG4gICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcblxuICAgICAgdGhpcy5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgX3JlZ2lzdGVyRXh0cmFFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIGxldCBleHRyYSA9IG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wYWdlX19leHRyYScpO1xuICAgICAgaWYgKCFleHRyYSkge1xuICAgICAgICBleHRyYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBleHRyYS5jbGFzc0xpc3QuYWRkKCdwYWdlX19leHRyYScpO1xuICAgICAgICBleHRyYS5zdHlsZS56SW5kZXggPSAnMTAwMDEnO1xuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShleHRyYSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGV4dHJhLmluc2VydEJlZm9yZShlbGVtZW50LCBudWxsKTtcbiAgICB9XG5cbiAgICBfdHJ5VG9GaWxsU3RhdHVzQmFyKCkge1xuICAgICAgaWYgKG9ucy5faW50ZXJuYWwuc2hvdWxkRmlsbFN0YXR1c0Jhcih0aGlzKSkge1xuICAgICAgICAvLyBBZGp1c3RtZW50cyBmb3IgSU9TN1xuICAgICAgICBjb25zdCBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbGwuY2xhc3NMaXN0LmFkZCgncGFnZV9fc3RhdHVzLWJhci1maWxsJyk7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAnMHB4JztcbiAgICAgICAgZmlsbC5zdHlsZS5oZWlnaHQgPSAnMHB4JztcblxuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShmaWxsLCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZGVzdHJveSgpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkZXN0cm95Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgIGlmICh0aGlzLmdldERldmljZUJhY2tCdXR0b25IYW5kbGVyKCkpIHtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXdpbmRvdy5PbnNQYWdlRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNQYWdlRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXBhZ2UnLCB7XG4gICAgICBwcm90b3R5cGU6IFBhZ2VFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCBzY2hlbWUgPSB7XG4gICAgJy5wb3BvdmVyJzogJ3BvcG92ZXItLSonLFxuICAgICcucG9wb3Zlcl9fY29udGVudCc6ICdwb3BvdmVyX19jb250ZW50LS0qJ1xuICB9O1xuICBjb25zdCBQb3BvdmVyQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLlBvcG92ZXJBbmltYXRvcjtcbiAgY29uc3QgRmFkZVBvcG92ZXJBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuRmFkZVBvcG92ZXJBbmltYXRvcjtcbiAgY29uc3QgdGVtcGxhdGVTb3VyY2UgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1tYXNrXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicG9wb3ZlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlcl9fY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlcl9fYXJyb3dcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcbiAgY29uc3QgQW5pbWF0b3JGYWN0b3J5ID0gb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3Rvcnk7XG5cbiAgY2xhc3MgUG9wb3ZlckVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGdldCBfbWFzaygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzBdO1xuICAgIH1cblxuICAgIGdldCBfcG9wb3ZlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzFdO1xuICAgIH1cblxuICAgIGdldCBfY29udGVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wb3BvdmVyLmNoaWxkcmVuWzBdO1xuICAgIH1cblxuICAgIGdldCBfYXJyb3coKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcG9wb3Zlci5jaGlsZHJlblsxXTtcbiAgICB9XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX21hc2suc3R5bGUuekluZGV4ID0gJzIwMDAwJztcbiAgICAgIHRoaXMuX3BvcG92ZXIuc3R5bGUuekluZGV4ID0gJzIwMDAxJztcblxuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdtYXNrLWNvbG9yJykpIHtcbiAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzay1jb2xvcicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLl9kb29yTG9jayA9IG5ldyBEb29yTG9jaygpO1xuICAgICAgdGhpcy5fYm91bmRPbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9ib3VuZENhbmNlbCA9IHRoaXMuX2NhbmNlbC5iaW5kKHRoaXMpO1xuXG5cbiAgICAgIHRoaXMuX2FuaW1hdG9yRmFjdG9yeSA9IHRoaXMuX2NyZWF0ZUFuaW1hdG9yRmFjdG9yeSgpO1xuICAgIH1cblxuICAgIF9jcmVhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICAgIGFuaW1hdG9yczogd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50Ll9hbmltYXRvckRpY3QsXG4gICAgICAgIGJhc2VDbGFzczogUG9wb3ZlckFuaW1hdG9yLFxuICAgICAgICBiYXNlQ2xhc3NOYW1lOiAnUG9wb3ZlckFuaW1hdG9yJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpIHx8ICdmYWRlJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnM6IEFuaW1hdG9yRmFjdG9yeS5wYXJzZUpTT05TYWZlbHkodGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25EZXZpY2VCYWNrQnV0dG9uKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5pc0NhbmNlbGFibGUoKSkge1xuICAgICAgICB0aGlzLl9jYW5jZWwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50LmNhbGxQYXJlbnRIYW5kbGVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3NldERpcmVjdGlvbihkaXJlY3Rpb24pIHtcbiAgICAgIGxldCBhcnJvd1Bvc2l0aW9uO1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIGFycm93UG9zaXRpb24gPSAncmlnaHQnO1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ3RvcCc7XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSAncmlnaHQnKSB7XG4gICAgICAgIGFycm93UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGlyZWN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb3BvdmVyQ2xhc3NMaXN0ID0gdGhpcy5fcG9wb3Zlci5jbGFzc0xpc3Q7XG4gICAgICBwb3BvdmVyQ2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlci0tdXAnKTtcbiAgICAgIHBvcG92ZXJDbGFzc0xpc3QucmVtb3ZlKCdwb3BvdmVyLS1kb3duJyk7XG4gICAgICBwb3BvdmVyQ2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlci0tbGVmdCcpO1xuICAgICAgcG9wb3ZlckNsYXNzTGlzdC5yZW1vdmUoJ3BvcG92ZXItLXJpZ2h0Jyk7XG4gICAgICBwb3BvdmVyQ2xhc3NMaXN0LmFkZCgncG9wb3Zlci0tJyArIGRpcmVjdGlvbik7XG5cbiAgICAgIGNvbnN0IGFycm93Q2xhc3NMaXN0ID0gdGhpcy5fYXJyb3cuY2xhc3NMaXN0O1xuICAgICAgYXJyb3dDbGFzc0xpc3QucmVtb3ZlKCdwb3BvdmVyX190b3AtYXJyb3cnKTtcbiAgICAgIGFycm93Q2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlcl9fYm90dG9tLWFycm93Jyk7XG4gICAgICBhcnJvd0NsYXNzTGlzdC5yZW1vdmUoJ3BvcG92ZXJfX2xlZnQtYXJyb3cnKTtcbiAgICAgIGFycm93Q2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlcl9fcmlnaHQtYXJyb3cnKTtcbiAgICAgIGFycm93Q2xhc3NMaXN0LmFkZCgncG9wb3Zlcl9fJyArIGFycm93UG9zaXRpb24gKyAnLWFycm93Jyk7XG4gICAgfVxuXG4gICAgX3Bvc2l0aW9uUG9wb3ZlckJ5RGlyZWN0aW9uKHRhcmdldCwgZGlyZWN0aW9uKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuX3BvcG92ZXI7XG4gICAgICBjb25zdCBwb3MgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBsZXQgb3duID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBhcnJvdyA9IGVsLmNoaWxkcmVuWzFdO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMTQ7XG4gICAgICBjb25zdCBtYXJnaW4gPSA2O1xuICAgICAgY29uc3QgcmFkaXVzID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwucXVlcnlTZWxlY3RvcignLnBvcG92ZXJfX2NvbnRlbnQnKSkuYm9yZGVyUmFkaXVzKTtcblxuICAgICAgYXJyb3cuc3R5bGUudG9wID0gJyc7XG4gICAgICBhcnJvdy5zdHlsZS5sZWZ0ID0gJyc7XG5cbiAgICAgIHRoaXMuX3NldERpcmVjdGlvbihkaXJlY3Rpb24pO1xuXG4gICAgICAvLyBQb3NpdGlvbiBwb3BvdmVyIG5leHQgdG8gdGhlIHRhcmdldC5cbiAgICAgIGlmIChbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGRpcmVjdGlvbikgPiAtMSkge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09ICdsZWZ0Jykge1xuICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSAocG9zLnJpZ2h0IC0gcG9zLndpZHRoIC0gb3duLndpZHRoIC0gb2Zmc2V0KSArICdweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwuc3R5bGUubGVmdCA9IChwb3MucmlnaHQgKyBvZmZzZXQpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBlbC5zdHlsZS50b3AgPSAocG9zLmJvdHRvbSAtIHBvcy5oZWlnaHQgLyAyIC0gb3duLmhlaWdodCAvIDIpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gJ3VwJykge1xuICAgICAgICAgIGVsLnN0eWxlLnRvcCA9IChwb3MuYm90dG9tIC0gcG9zLmhlaWdodCAtIG93bi5oZWlnaHQgLSBvZmZzZXQpICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5zdHlsZS50b3AgPSAocG9zLmJvdHRvbSArIG9mZnNldCkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGVsLnN0eWxlLmxlZnQgPSAocG9zLnJpZ2h0IC0gcG9zLndpZHRoIC8gMiAtIG93bi53aWR0aCAvIDIpICsgJ3B4JztcbiAgICAgIH1cblxuICAgICAgb3duID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2lkZSBhbmQgdGhlIGh5cG90aGVudXNlIG9mIHRoZSBhcnJvdy5cbiAgICAgIGNvbnN0IGRpZmYgPSAoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gKHggLyAyKSAqIE1hdGguc3FydCgyKSAtIHggLyAyO1xuICAgICAgfSkocGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoYXJyb3cpLndpZHRoKSk7XG5cbiAgICAgIC8vIFRoaXMgaXMgdGhlIGxpbWl0IGZvciB0aGUgYXJyb3cuIElmIGl0J3MgbW92ZWQgZnVydGhlciB0aGFuIHRoaXMgaXQncyBvdXRzaWRlIHRoZSBwb3BvdmVyLlxuICAgICAgY29uc3QgbGltaXQgPSBtYXJnaW4gKyByYWRpdXMgKyBkaWZmICsgMjtcblxuXG4gICAgICAvLyBLZWVwIHBvcG92ZXIgaW5zaWRlIHdpbmRvdyBhbmQgYXJyb3cgaW5zaWRlIHBvcG92ZXIuXG4gICAgICBpZiAoWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihkaXJlY3Rpb24pID4gLTEpIHtcbiAgICAgICAgaWYgKG93bi50b3AgPCBtYXJnaW4pIHtcbiAgICAgICAgICBhcnJvdy5zdHlsZS50b3AgPSBNYXRoLm1heChvd24uaGVpZ2h0IC8gMiArIG93bi50b3AgLSBtYXJnaW4sIGxpbWl0KSAgKyAncHgnO1xuICAgICAgICAgIGVsLnN0eWxlLnRvcCA9IG1hcmdpbiArICdweCc7XG4gICAgICAgIH0gZWxzZSBpZiAob3duLmJvdHRvbSA+IHdpbmRvdy5pbm5lckhlaWdodCAtIG1hcmdpbikge1xuICAgICAgICAgIGFycm93LnN0eWxlLnRvcCA9IE1hdGgubWluKG93bi5oZWlnaHQgLyAyIC0gKHdpbmRvdy5pbm5lckhlaWdodCAtIG93bi5ib3R0b20pICsgbWFyZ2luLCBvd24uaGVpZ2h0IC0gbGltaXQpICsgJ3B4JztcbiAgICAgICAgICBlbC5zdHlsZS50b3AgPSAod2luZG93LmlubmVySGVpZ2h0IC0gb3duLmhlaWdodCAtIG1hcmdpbikgKyAncHgnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3duLmxlZnQgPCBtYXJnaW4pIHtcbiAgICAgICAgICBhcnJvdy5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgob3duLndpZHRoIC8gMiArIG93bi5sZWZ0IC0gbWFyZ2luLCBsaW1pdCkgKyAncHgnO1xuICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSBtYXJnaW4gKyAncHgnO1xuICAgICAgICB9IGVsc2UgaWYgKG93bi5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoIC0gbWFyZ2luKSB7XG4gICAgICAgICAgYXJyb3cuc3R5bGUubGVmdCA9IE1hdGgubWluKG93bi53aWR0aCAvIDIgLSAod2luZG93LmlubmVyV2lkdGggLSBvd24ucmlnaHQpICsgbWFyZ2luLCBvd24ud2lkdGggLSBsaW1pdCkgKyAncHgnO1xuICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSAod2luZG93LmlubmVyV2lkdGggLSBvd24ud2lkdGggLSBtYXJnaW4pICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IGFuaW1pdCBmcm9tIHJlc3RvcmluZyB0aGUgc3R5bGUuXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYW5pbWl0LW9yaWctc3R5bGUnKTtcbiAgICB9XG5cbiAgICBfcG9zaXRpb25Qb3BvdmVyKHRhcmdldCkge1xuICAgICAgY29uc3QgZGlyZWN0aW9ucyA9ICgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKSB7XG4gICAgICAgICAgcmV0dXJuIFsndXAnLCAnZG93bicsICdsZWZ0JywgJ3JpZ2h0J107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gVGhlIHBvcG92ZXIgc2hvdWxkIGJlIHBsYWNlZCBvbiB0aGUgc2lkZSB3aXRoIHRoZSBtb3N0IHNwYWNlLlxuICAgICAgY29uc3Qgc2NvcmVzID0ge1xuICAgICAgICBsZWZ0OiBwb3NpdGlvbi5sZWZ0LFxuICAgICAgICByaWdodDogd2luZG93LmlubmVyV2lkdGggLSBwb3NpdGlvbi5yaWdodCxcbiAgICAgICAgdXA6IHBvc2l0aW9uLnRvcCxcbiAgICAgICAgZG93bjogd2luZG93LmlubmVySGVpZ2h0IC0gcG9zaXRpb24uYm90dG9tXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvcmRlcmVkRGlyZWN0aW9ucyA9IE9iamVjdC5rZXlzKHNjb3Jlcykuc29ydCgoYSwgYikgPT4gLShzY29yZXNbYV0gLSBzY29yZXNbYl0pKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gb3JkZXJlZERpcmVjdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IG9yZGVyZWREaXJlY3Rpb25zW2ldO1xuICAgICAgICBpZiAoZGlyZWN0aW9ucy5pbmRleE9mKGRpcmVjdGlvbikgPiAtMSkge1xuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3ZlckJ5RGlyZWN0aW9uKHRhcmdldCwgZGlyZWN0aW9uKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfb25DaGFuZ2UoKSB7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3Zlcih0aGlzLl9jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSB0ZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyX19jb250ZW50Jyk7XG4gICAgICBjb25zdCBzdHlsZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodGVtcGxhdGVFbGVtZW50LmNoaWxkcmVuWzBdKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGVFbGVtZW50LmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlKSB7XG4gICAgICAgIHRoaXMuX3BvcG92ZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBvcG92ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbdGFyZ2V0XSB0YXJnZXQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdGFyZ2V0XSBjc3Mgc2VsZWN0b3JcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBbdGFyZ2V0XSBldmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgc2hvdyh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC50YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgdW5kZWZpbmVkJyk7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gJiZcbiAgICAgICAgIShvcHRpb25zLmFuaW1hdGlvbiBpbiB3aW5kb3cuT25zUG9wb3ZlckVsZW1lbnQuX2FuaW1hdG9yRGljdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmltYXRvciAke29wdGlvbnMuYW5pbWF0aW9ufSBpcyBub3QgcmVnaXN0ZXJlZC5gKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncHJlc2hvdycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcG9wb3ZlcjogdGhpcyxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWNhbmNlbGVkKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcblxuICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICB0aGlzLl9jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3Zlcih0YXJnZXQpO1xuXG4gICAgICAgICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG4gICAgICAgICAgYW5pbWF0b3Iuc2hvdyh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHVubG9jaygpO1xuXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncG9zdHNob3cnLCB7XG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgIGRldGFpbDoge3BvcG92ZXI6IHRoaXN9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGUgcG9wb3Zlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgaGlkZShvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncHJlaGlkZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcG9wb3ZlcjogdGhpcyxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWNhbmNlbGVkKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcblxuICAgICAgICAgIGNvbnN0IGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuICAgICAgICAgIGFuaW1hdG9yLmhpZGUodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdW5sb2NrKCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncG9zdGhpZGUnLCB7XG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgIGRldGFpbDoge3BvcG92ZXI6IHRoaXN9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcG9wb3ZlciBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTaG93bigpIHtcbiAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9tYXNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRDYW5jZWwsIGZhbHNlKTtcblxuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgdGhpcy5fb25EZXZpY2VCYWNrQnV0dG9uLmJpbmQodGhpcykpO1xuXG4gICAgICB0aGlzLl9wb3BvdmVyLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgIHRoaXMuX3BvcG92ZXIuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCBmYWxzZSk7XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX21hc2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZENhbmNlbCwgZmFsc2UpO1xuXG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG5cbiAgICAgIHRoaXMuX3BvcG92ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgZmFsc2UpO1xuICAgICAgdGhpcy5fcG9wb3Zlci5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2RpcmVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5fYm91bmRPbkNoYW5nZSgpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2FuaW1hdGlvbicgfHwgbmFtZSA9PT0gJ2FuaW1hdGlvbi1vcHRpb25zJykge1xuICAgICAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSB0aGlzLl9jcmVhdGVBbmltYXRvckZhY3RvcnkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgd2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgYmUgY2FuY2VsYWJsZSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0Q2FuY2VsYWJsZShjYW5jZWxhYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbmNlbGFibGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FuY2VsYWJsZSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2FuY2VsYWJsZScsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdjYW5jZWxhYmxlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgY2FuY2VsYWJsZSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQ2FuY2VsYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnY2FuY2VsYWJsZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIHBvcG92ZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBET00gdHJlZS5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NhbmNlbCgpIHtcbiAgICAgIGlmICh0aGlzLmlzQ2FuY2VsYWJsZSgpKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtcG9wb3ZlcicsIHtcbiAgICAgIHByb3RvdHlwZTogUG9wb3ZlckVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG5cbiAgICB3aW5kb3cuT25zUG9wb3ZlckVsZW1lbnQuX2FuaW1hdG9yRGljdCA9IHtcbiAgICAgICdmYWRlJzogRmFkZVBvcG92ZXJBbmltYXRvcixcbiAgICAgICdub25lJzogUG9wb3ZlckFuaW1hdG9yXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtQb3BvdmVyQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAgICovXG4gICAgd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50LnJlZ2lzdGVyQW5pbWF0b3IgPSBmdW5jdGlvbihuYW1lLCBBbmltYXRvcikge1xuICAgICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgUG9wb3ZlckFuaW1hdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiQW5pbWF0b3JcIiBwYXJhbSBtdXN0IGluaGVyaXQgUG9wb3ZlckFuaW1hdG9yJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9hbmltYXRvckRpY3RbbmFtZV0gPSBBbmltYXRvcjtcbiAgICB9O1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IFNUQVRFX0lOSVRJQUwgPSAnaW5pdGlhbCc7XG4gIGNvbnN0IFNUQVRFX1BSRUFDVElPTiA9ICdwcmVhY3Rpb24nO1xuICBjb25zdCBTVEFURV9BQ1RJT04gPSAnYWN0aW9uJztcbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcblxuICBjbGFzcyBQdWxsSG9va0VsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQgPSB0aGlzLl9jcmVhdGVTY3JvbGxFbGVtZW50KCk7XG4gICAgICB0aGlzLl9wYWdlRWxlbWVudCA9IHRoaXMuX3Njcm9sbEVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgaWYgKCF0aGlzLl9wYWdlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2VfX2NvbnRlbnQnKSAmJiAhdGhpcy5fcGFnZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdvbnMtc2Nyb2xsZXJfX2NvbnRlbnQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzxvbnMtcHVsbC1ob29rPiBtdXN0IGJlIGEgZGlyZWN0IGRlc2NlbmRhbnQgb2YgYW4gPG9ucy1wYWdlPiBvciBhbiA8b25zLXNjcm9sbGVyPiBlbGVtZW50LicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9ib3VuZE9uRHJhZyA9IHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPbkRyYWdTdGFydCA9IHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9ib3VuZE9uRHJhZ0VuZCA9IHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPblNjcm9sbCA9IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiA9IDA7XG5cbiAgICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX0lOSVRJQUwsIHRydWUpO1xuICAgICAgdGhpcy5fc2V0U3R5bGUoKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlU2Nyb2xsRWxlbWVudCgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXYgY2xhc3M9XCJzY3JvbGxcIj48ZGl2PicpO1xuXG4gICAgICBjb25zdCBwYWdlRWxlbWVudCA9IHRoaXMucGFyZW50RWxlbWVudDtcblxuICAgICAgc2Nyb2xsRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzKTtcbiAgICAgIHdoaWxlIChwYWdlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgIHNjcm9sbEVsZW1lbnQuYXBwZW5kQ2hpbGQocGFnZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBwYWdlRWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxFbGVtZW50KTtcblxuICAgICAgcmV0dXJuIHNjcm9sbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgX3NldFN0eWxlKCkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRIZWlnaHQoKTtcblxuICAgICAgdGhpcy5zdHlsZS50b3AgPSAnLScgKyBoZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5zdHlsZS5saW5lSGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICB9XG5cbiAgICBfb25TY3JvbGwoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9wYWdlRWxlbWVudDtcblxuICAgICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wIDwgMCkge1xuICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2dlbmVyYXRlVHJhbnNsYXRpb25UcmFuc2Zvcm0oc2Nyb2xsKSB7XG4gICAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkKDBweCwgJyArIHNjcm9sbCArICdweCwgMHB4KSc7XG4gICAgfVxuXG4gICAgX29uRHJhZyhldmVudCkge1xuICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSWdub3JlIHdoZW4gZHJhZ2dpbmcgbGVmdCBhbmQgcmlnaHQuXG4gICAgICBpZiAoZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb24gPT09ICdsZWZ0JyB8fCBldmVudC5nZXN0dXJlLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEhhY2sgdG8gbWFrZSBpdCB3b3JrIG9uIEFuZHJvaWQgNC40IFdlYlZpZXcuIFNjcm9sbHMgbWFudWFsbHkgbmVhciB0aGUgdG9wIG9mIHRoZSBwYWdlIHNvXG4gICAgICAvLyB0aGVyZSB3aWxsIGJlIG5vIGluZXJ0aWFsIHNjcm9sbCB3aGVuIHNjcm9sbGluZyBkb3duLiBBbGxvd2luZyBkZWZhdWx0IHNjcm9sbGluZyB3aWxsXG4gICAgICAvLyBraWxsIGFsbCAndG91Y2htb3ZlJyBldmVudHMuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fcGFnZUVsZW1lbnQ7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuX3N0YXJ0U2Nyb2xsIC0gZXZlbnQuZ2VzdHVyZS5kZWx0YVk7XG4gICAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb24gIT09ICd1cCcpIHtcbiAgICAgICAgZXZlbnQuZ2VzdHVyZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY3VycmVudFRyYW5zbGF0aW9uID09PSAwICYmIHRoaXMuX2dldEN1cnJlbnRTY3JvbGwoKSA9PT0gMCkge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uRHJhZ0xlbmd0aCA9IGV2ZW50Lmdlc3R1cmUuZGVsdGFZO1xuXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50Lmdlc3R1cmUuaW50ZXJpbURpcmVjdGlvbjtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkRyYWdMZW5ndGggLT0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uRHJhZ0xlbmd0aCArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbCA9IE1hdGgubWF4KGV2ZW50Lmdlc3R1cmUuZGVsdGFZIC0gdGhpcy5fc3RhcnRTY3JvbGwsIDApO1xuXG4gICAgICBpZiAodGhpcy5fdGhyZXNob2xkSGVpZ2h0RW5hYmxlZCgpICYmIHNjcm9sbCA+PSB0aGlzLmdldFRocmVzaG9sZEhlaWdodCgpKSB7XG4gICAgICAgIGV2ZW50Lmdlc3R1cmUuc3RvcERldGVjdCgpO1xuXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfQUNUSU9OKTtcbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGVUbyh0aGlzLmdldEhlaWdodCgpLCB7YW5pbWF0ZTogdHJ1ZX0pO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdEZvckFjdGlvbih0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChzY3JvbGwgPj0gdGhpcy5nZXRIZWlnaHQoKSkge1xuICAgICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9QUkVBQ1RJT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfSU5JVElBTCk7XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oc2Nyb2xsKTtcbiAgICB9XG5cbiAgICBfb25EcmFnU3RhcnQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXJ0U2Nyb2xsID0gdGhpcy5fZ2V0Q3VycmVudFNjcm9sbCgpO1xuICAgIH1cblxuICAgIF9vbkRyYWdFbmQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gPiAwKSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbCA9IHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbjtcblxuICAgICAgICBpZiAoc2Nyb2xsID4gdGhpcy5nZXRIZWlnaHQoKSkge1xuICAgICAgICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX0FDVElPTik7XG5cbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGVUbyh0aGlzLmdldEhlaWdodCgpLCB7YW5pbWF0ZTogdHJ1ZX0pO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdEZvckFjdGlvbih0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oMCwge2FuaW1hdGU6IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2V0QWN0aW9uQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgX3dhaXRGb3JBY3Rpb24oZG9uZSkge1xuICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2suY2FsbChudWxsLCBkb25lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIF9vbkRvbmUoZG9uZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHB1bGwgaG9vayBzdGlsbCBleGlzdHMuXG4gICAgICB0aGlzLl90cmFuc2xhdGVUbygwLCB7YW5pbWF0ZTogdHJ1ZX0pO1xuICAgICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfSU5JVElBTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEhlaWdodCgpIHtcbiAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykgfHwgJzY0JywgMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKi9cbiAgICBzZXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7XG5cbiAgICAgIHRoaXMuX3NldFN0eWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRocmVzaG9sZEhlaWdodFxuICAgICAqL1xuICAgIHNldFRocmVzaG9sZEhlaWdodCh0aHJlc2hvbGRIZWlnaHQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0aHJlc2hvbGQtaGVpZ2h0JywgdGhyZXNob2xkSGVpZ2h0ICsgJ3B4Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFRocmVzaG9sZEhlaWdodCgpIHtcbiAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgndGhyZXNob2xkLWhlaWdodCcpIHx8ICc5NicsIDEwKTtcbiAgICB9XG5cbiAgICBfdGhyZXNob2xkSGVpZ2h0RW5hYmxlZCgpIHtcbiAgICAgIGNvbnN0IHRoID0gdGhpcy5nZXRUaHJlc2hvbGRIZWlnaHQoKTtcbiAgICAgIHJldHVybiB0aCA+IDAgJiYgdGggPj0gdGhpcy5nZXRIZWlnaHQoKTtcbiAgICB9XG5cbiAgICBfc2V0U3RhdGUoc3RhdGUsIG5vRXZlbnQpIHtcbiAgICAgIGNvbnN0IGxhc3RTdGF0ZSA9IHRoaXMuX2dldFN0YXRlKCk7XG5cbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHN0YXRlKTtcblxuICAgICAgaWYgKCFub0V2ZW50ICYmIGxhc3RTdGF0ZSAhPT0gdGhpcy5fZ2V0U3RhdGUoKSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGFuZ2VzdGF0ZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcHVsbEhvb2s6IHRoaXMsXG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBsYXN0U3RhdGU6IGxhc3RTdGF0ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRTdGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc3RhdGUnKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50U3RhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U3RhdGUoKTtcbiAgICB9XG5cbiAgICBfZ2V0Q3VycmVudFNjcm9sbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYWdlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgZ2V0UHVsbERpc3RhbmNlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbjtcbiAgICB9XG5cbiAgICBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIF9pc0NvbnRlbnRGaXhlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZml4ZWQtY29udGVudCcpO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkKGRpc2FibGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2dldFNjcm9sbGFibGVFbGVtZW50KCkge1xuICAgICAgaWYgKHRoaXMuX2lzQ29udGVudEZpeGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Nyb2xsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICAgKi9cbiAgICBfdHJhbnNsYXRlVG8oc2Nyb2xsLCBvcHRpb25zID0ge30pIHtcblxuICAgICAgLy90aGlzLl9zY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gPSBzY3JvbGw7XG4gICAgICAvL30uYmluZCh0aGlzKSk7XG5cbiAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUpIHtcbiAgICAgICAgYW5pbWl0KHRoaXMuX2dldFNjcm9sbGFibGVFbGVtZW50KCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVUcmFuc2xhdGlvblRyYW5zZm9ybShzY3JvbGwpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IDAuMyxcbiAgICAgICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKSdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wbGF5KG9wdGlvbnMuY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWl0KHRoaXMuX2dldFNjcm9sbGFibGVFbGVtZW50KCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVUcmFuc2xhdGlvblRyYW5zZm9ybShzY3JvbGwpXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGxheShvcHRpb25zLmNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2V0TWluaW11bVNjcm9sbCgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IHRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgY29uc3QgcGFnZUhlaWdodCA9IHRoaXMuX3BhZ2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgcmV0dXJuIHNjcm9sbEhlaWdodCA+IHBhZ2VIZWlnaHQgPyAtKHNjcm9sbEhlaWdodCAtIHBhZ2VIZWlnaHQpIDogMDtcbiAgICB9XG5cbiAgICBfY3JlYXRlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgPSBuZXcgb25zLkdlc3R1cmVEZXRlY3Rvcih0aGlzLl9wYWdlRWxlbWVudCwge1xuICAgICAgICBkcmFnTWluRGlzdGFuY2U6IDEsXG4gICAgICAgIGRyYWdEaXN0YW5jZUNvcnJlY3Rpb246IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgLy8gQmluZCBsaXN0ZW5lcnNcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vbignZHJhZycsIHRoaXMuX2JvdW5kT25EcmFnKTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vbignZHJhZ3N0YXJ0JywgdGhpcy5fYm91bmRPbkRyYWdTdGFydCk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3Iub24oJ2RyYWdlbmQnLCB0aGlzLl9ib3VuZE9uRHJhZ0VuZCk7XG5cbiAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQucGFyZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9ib3VuZE9uU2Nyb2xsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgX2Rlc3Ryb3lFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vZmYoJ2RyYWcnLCB0aGlzLl9ib3VuZE9uRHJhZyk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3Iub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLl9ib3VuZE9uRHJhZ1N0YXJ0KTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vZmYoJ2RyYWdlbmQnLCB0aGlzLl9ib3VuZE9uRHJhZ0VuZCk7XG5cbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgPSBudWxsO1xuXG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPblNjcm9sbCwgZmFsc2UpO1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jcmVhdGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXN0cm95RXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1B1bGxIb29rRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNQdWxsSG9va0VsZW1lbnQgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy1wdWxsLWhvb2snLCB7XG4gICAgICBwcm90b3R5cGU6IFB1bGxIb29rRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcblxuICAgIHdpbmRvdy5PbnNQdWxsSG9va0VsZW1lbnQuU1RBVEVfQUNUSU9OID0gU1RBVEVfQUNUSU9OO1xuICAgIHdpbmRvdy5PbnNQdWxsSG9va0VsZW1lbnQuU1RBVEVfSU5JVElBTCA9IFNUQVRFX0lOSVRJQUw7XG4gICAgd2luZG93Lk9uc1B1bGxIb29rRWxlbWVudC5TVEFURV9QUkVBQ1RJT04gPSBTVEFURV9QUkVBQ1RJT047XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG53aW5kb3cuT25zUm93RWxlbWVudCA9IHdpbmRvdy5PbnNSb3dFbGVtZW50ID8gd2luZG93Lk9uc1Jvd0VsZW1lbnQgOiBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy1yb3cnKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbndpbmRvdy5PbnNTY3JvbGxlckVsZW1lbnQgPSB3aW5kb3cuT25zU2Nyb2xsZXJFbGVtZW50ID8gd2luZG93Lk9uc1Njcm9sbGVyRWxlbWVudCA6IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXNjcm9sbGVyJyk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcnOiAnc3dpdGNoLS0qJyxcbiAgICAnc3dpdGNoX19pbnB1dCc6ICdzd2l0Y2gtLSpfX2lucHV0JyxcbiAgICAnc3dpdGNoX190b2dnbGUnOiAnc3dpdGNoLS0qX190b2dnbGUnXG4gIH07XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCB0ZW1wbGF0ZVNvdXJjZSA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICA8ZGl2PlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic3dpdGNoX19pbnB1dFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN3aXRjaF9fdG9nZ2xlXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIGApO1xuXG4gIGxldCBFeHRlbmRhYmxlTGFiZWxFbGVtZW50O1xuICBpZiAodHlwZW9mIEhUTUxMYWJlbEVsZW1lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBmb3IgU2FmYXJpXG4gICAgRXh0ZW5kYWJsZUxhYmVsRWxlbWVudCA9ICgpID0+IHt9O1xuICAgIEV4dGVuZGFibGVMYWJlbEVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgfSBlbHNlIHtcbiAgICBFeHRlbmRhYmxlTGFiZWxFbGVtZW50ID0gSFRNTExhYmVsRWxlbWVudDtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlSWQgPSAoKCkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICByZXR1cm4gKCkgPT4gJ29ucy1zd2l0Y2gtaWQtJyArIChpKyspO1xuICB9KSgpO1xuXG4gIGNsYXNzIFN3aXRjaEVsZW1lbnQgZXh0ZW5kcyBFeHRlbmRhYmxlTGFiZWxFbGVtZW50IHtcblxuICAgIGdldCBjaGVja2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldENoZWNrYm94KCkuY2hlY2tlZDtcbiAgICB9XG5cbiAgICBzZXQgY2hlY2tlZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fZ2V0Q2hlY2tib3goKS5jaGVja2VkID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjaGVja2VkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZUZvckNoZWNrZWRBdHRyaWJ1dGUoKTtcbiAgICB9XG5cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q2hlY2tib3goKS5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICAgIHRoaXMuX2dldENoZWNrYm94KCkuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcblxuICAgICAgdGhpcy5fdXBkYXRlRm9yQ2hlY2tlZEF0dHJpYnV0ZSgpO1xuICAgICAgdGhpcy5fdXBkYXRlRm9yRGlzYWJsZWRBdHRyaWJ1dGUoKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlRm9yQ2hlY2tlZEF0dHJpYnV0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnY2hlY2tlZCcpKSB7XG4gICAgICAgIHRoaXMuX2dldENoZWNrYm94KCkuY2hlY2tlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9nZXRDaGVja2JveCgpLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlRm9yRGlzYWJsZWRBdHRyaWJ1dGUoKSB7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhpcy5fZ2V0Q2hlY2tib3goKS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZ2V0Q2hlY2tib3goKS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ3N3aXRjaCcpO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB3aGlsZSAodGVtcGxhdGUuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jaGlsZHJlblswXSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9nZXRDaGVja2JveCgpLnNldEF0dHJpYnV0ZSgnbmFtZScsIGdlbmVyYXRlSWQoKSk7XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2dldENoZWNrYm94KCkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2dldENoZWNrYm94KCkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgX29uQ2hhbmdlTGlzdGVuZXIoKSB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkICE9PSB0cnVlKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2hlY2tlZCcsICcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIF9pc0NoZWNrZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q2hlY2tib3goKS5jaGVja2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBfc2V0Q2hlY2tlZChpc0NoZWNrZWQpIHtcbiAgICAgIGlzQ2hlY2tlZCA9ICEhaXNDaGVja2VkO1xuXG4gICAgICBjb25zdCBjaGVja2JveCA9IHRoaXMuX2dldENoZWNrYm94KCk7XG5cbiAgICAgIGlmIChjaGVja2JveC5jaGVja2VkICE9IGlzQ2hlY2tlZCkge1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gaXNDaGVja2VkO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRDaGVja2JveCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9Y2hlY2tib3hdJyk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUZvckNoZWNrZWRBdHRyaWJ1dGUoKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICB0aGlzLl91cGRhdGVGb3JEaXNhYmxlZEF0dHJpYnV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1N3aXRjaEVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zU3dpdGNoRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXN3aXRjaCcsIHtcbiAgICAgIHByb3RvdHlwZTogU3dpdGNoRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBzY2hlbWUgPSB7XG4gICAgJyc6ICd0YWItYmFyLS0qX19pdGVtJyxcbiAgICAnLnRhYi1iYXJfX2J1dHRvbic6ICd0YWItYmFyLS0qX19idXR0b24nXG4gIH07XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuICBjb25zdCB0ZW1wbGF0ZVNvdXJjZSA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgPGRpdj5cbiAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0YWItYmFyX19idXR0b24gdGFiLWJhci1pbm5lclwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgKTtcbiAgY29uc3QgZGVmYXVsdElubmVyVGVtcGxhdGVTb3VyY2UgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhcl9faWNvblwiPlxuICAgICAgICA8b25zLWljb24gaWNvbj1cImlvbi1jbG91ZFwiIHN0eWxlPVwiZm9udC1zaXplOiAyOHB4OyBsaW5lLWhlaWdodDogMzRweDsgdmVydGljYWwtYWxpZ246IHRvcDtcIj48L29ucy1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhcl9fbGFiZWxcIj5sYWJlbDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjbGFzcyBUYWJFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICB0aGlzLl9ib3VuZE9uQ2xpY2sgPSB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyk7XG5cbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBfY29tcGlsZSgpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgbGV0IGhhc0NoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSk7XG5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBoYXNDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB3aGlsZSAodGVtcGxhdGUuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jaGlsZHJlblswXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ3RhYi1iYXJfX2l0ZW0nKTtcblxuICAgICAgY29uc3QgYnV0dG9uID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWItYmFyX19idXR0b24nKTtcblxuICAgICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgICAgIHRoaXMuX2hhc0RlZmF1bHRUZW1wbGF0ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGFzRGVmYXVsdFRlbXBsYXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdFRlbXBsYXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURlZmF1bHRUZW1wbGF0ZSgpIHtcbiAgICAgIGlmICghdGhpcy5faGFzRGVmYXVsdFRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWItYmFyX19idXR0b24nKTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBkZWZhdWx0SW5uZXJUZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB3aGlsZSAodGVtcGxhdGUuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHRlbXBsYXRlLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBjb25zdCBpY29uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKTtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XG5cbiAgICAgIGlmICh0eXBlb2YgaWNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZ2V0SWNvbkVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoJ2ljb24nLCBpY29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBidXR0b24ucXVlcnlTZWxlY3RvcignLnRhYi1iYXJfX2ljb24nKTtcbiAgICAgICAgd3JhcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJykge1xuICAgICAgICBnZXRMYWJlbEVsZW1lbnQoKS50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0TGFiZWxFbGVtZW50KCkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnZXRMYWJlbEVsZW1lbnQoKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldExhYmVsRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYucXVlcnlTZWxlY3RvcignLnRhYi1iYXJfX2xhYmVsJyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldEljb25FbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gc2VsZi5xdWVyeVNlbGVjdG9yKCdvbnMtaWNvbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9vbkNsaWNrKCkge1xuICAgICAgY29uc3QgdGFiYmFyID0gdGhpcy5fZmluZFRhYmJhckVsZW1lbnQoKTtcbiAgICAgIGlmICh0YWJiYXIpIHtcbiAgICAgICAgdGFiYmFyLnNldEFjdGl2ZVRhYih0aGlzLl9maW5kVGFiSW5kZXgoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNQZXJzaXN0ZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdwZXJzaXN0ZW50Jyk7XG4gICAgfVxuXG4gICAgX2hhc0RlZmF1bHRUZW1wbGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygndGFiLWJhcl9faXRlbS0tZGVmYXVsdCcpO1xuICAgIH1cblxuICAgIHNldEFjdGl2ZSgpIHtcbiAgICAgIGNvbnN0IHJhZGlvID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJ2lucHV0Jyk7XG4gICAgICByYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cbiAgICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnW29ucy10YWItaW5hY3RpdmVdJykpXG4gICAgICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKTtcbiAgICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnW29ucy10YWItYWN0aXZlXScpKVxuICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmhlcml0Jyk7XG4gICAgfVxuXG4gICAgc2V0SW5hY3RpdmUoKSB7XG4gICAgICBjb25zdCByYWRpbyA9IHV0aWwuZmluZENoaWxkKHRoaXMsICdpbnB1dCcpO1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgICAgdXRpbC5hcnJheUZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdbb25zLXRhYi1pbmFjdGl2ZV0nKSlcbiAgICAgICAgLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5oZXJpdCcpO1xuICAgICAgdXRpbC5hcnJheUZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdbb25zLXRhYi1hY3RpdmVdJykpXG4gICAgICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhvb2tzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhvb2tzLmNvbXBpbGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaG9va3MubGlua1xuICAgICAqL1xuICAgIF9sb2FkUGFnZUVsZW1lbnQoY2FsbGJhY2ssIGhvb2tzKSB7XG4gICAgICBpZiAodGhpcy5pc1BlcnNpc3RlbnQoKSkge1xuICAgICAgICBpZiAoIXRoaXMuX3BhZ2VFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlUGFnZUVsZW1lbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKSwgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGhvb2tzLmNvbXBpbGUucnVuKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBob29rcy5saW5rLnJ1bihlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYWdlRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sodGhpcy5fcGFnZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wYWdlRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NyZWF0ZVBhZ2VFbGVtZW50KHRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJyksIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgX2NyZWF0ZVBhZ2VFbGVtZW50KHBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgICBvbnMuX2ludGVybmFsLmdldFBhZ2VIVE1MQXN5bmMocGFnZSkudGhlbihodG1sID0+IHtcbiAgICAgICAgY2FsbGJhY2sodXRpbC5jcmVhdGVFbGVtZW50KGh0bWwudHJpbSgpKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNhblJlbG9hZCgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5oYXNBdHRyaWJ1dGUoJ25vLXJlbG9hZCcpO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2Vuc3VyZUVsZW1lbnRQb3NpdGlvbigpO1xuXG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2FjdGl2ZScpKSB7XG4gICAgICAgIGNvbnN0IHRhYmJhciA9IHRoaXMuX2ZpbmRUYWJiYXJFbGVtZW50KCk7XG4gICAgICAgIGNvbnN0IHRhYkluZGV4ID0gdGhpcy5fZmluZFRhYkluZGV4KCk7XG5cbiAgICAgICAgd2luZG93Lk9uc1RhYmJhckVsZW1lbnQucmVhZHkodGFiYmFyLCAoKSA9PiB7XG4gICAgICAgICAgdGFiYmFyLnNldEFjdGl2ZVRhYih0YWJJbmRleCwge2FuaW1hdGlvbjogJ25vbmUnfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgX2ZpbmRUYWJiYXJFbGVtZW50KCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSAmJiB0aGlzLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy10YWJiYXInKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudE5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZSAmJiB0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRhYmJhcicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBfZmluZFRhYkluZGV4KCkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnBhcmVudE5vZGUuY2hpbGRyZW47XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzID09PSBlbGVtZW50c1tpXSkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZTogdGFiIGluZGV4IGlzIG5vdCBmb3VuZC4nKTtcbiAgICB9XG5cbiAgICBfZW5zdXJlRWxlbWVudFBvc2l0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLl9maW5kVGFiYmFyRWxlbWVudCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBvbnMtdGFiIGVsZW1lbnQgaXMgbXVzdCBiZSBjaGlsZCBvZiBvbnMtdGFiYmFyIGVsZW1lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmICh0aGlzLl9oYXNEZWZhdWx0VGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdpY29uJyB8fCBuYW1lID09PSAnbGFiZWwnKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdFRlbXBsYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1RhYkVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zVGFiRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXRhYicsIHtcbiAgICAgIHByb3RvdHlwZTogVGFiRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgICBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy10YWJiYXItaXRlbScsIHtcbiAgICAgIHByb3RvdHlwZTogT2JqZWN0LmNyZWF0ZShUYWJFbGVtZW50LnByb3RvdHlwZSlcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgc2NoZW1lID0ge1xuICAgICcudGFiLWJhcl9fY29udGVudCc6ICd0YWItYmFyLS0qX19jb250ZW50JyxcbiAgICAnLnRhYi1iYXInOiAndGFiLWJhci0tKidcbiAgfTtcblxuICB2YXIgQW5pbWF0b3JGYWN0b3J5ID0gb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3Rvcnk7XG4gIHZhciBUYWJiYXJBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuVGFiYmFyQW5pbWF0b3I7XG4gIHZhciBUYWJiYXJGYWRlQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLlRhYmJhckZhZGVBbmltYXRvcjtcbiAgdmFyIFRhYmJhck5vbmVBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuVGFiYmFyTm9uZUFuaW1hdG9yO1xuICB2YXIgVGFiYmFyU2xpZGVBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuVGFiYmFyU2xpZGVBbmltYXRvcjtcblxuICB2YXIgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG4gIHZhciB1dGlsID0gb25zLl91dGlsO1xuXG4gIHZhciBnZW5lcmF0ZUlkID0gKCgpID0+IHtcbiAgICB2YXIgaSA9IDA7XG4gICAgcmV0dXJuICgpID0+ICdvbnMtdGFiYmFyLWdlbi0nICsgKGkrKyk7XG4gIH0pKCk7XG5cbiAgY2xhc3MgVGFiYmFyRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fdGFiYmFySWQgPSBnZW5lcmF0ZUlkKCk7XG5cbiAgICAgIHRoaXMuX2FuaW1hdG9yRmFjdG9yeSA9IG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgICBhbmltYXRvcnM6IFRhYmJhckVsZW1lbnQuX2FuaW1hdG9yRGljdCxcbiAgICAgICAgYmFzZUNsYXNzOiBUYWJiYXJBbmltYXRvcixcbiAgICAgICAgYmFzZUNsYXNzTmFtZTogJ1RhYmJhckFuaW1hdG9yJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpLFxuICAgICAgICBkZWZhdWx0QW5pbWF0aW9uT3B0aW9uczogQW5pbWF0b3JGYWN0b3J5LnBhcnNlSlNPTlNhZmVseSh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgfHwge31cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX2NvbXBpbGVQYWdlSG9vayA9IG5ldyBvbnMuX2ludGVybmFsLkFzeW5jSG9vaygpO1xuICAgICAgdGhpcy5fbGlua1BhZ2VIb29rID0gbmV3IG9ucy5faW50ZXJuYWwuQXN5bmNIb29rKCk7XG4gICAgICB3aW5kb3cuT25zVGFiYmFyRWxlbWVudC5yZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xpbmtQYWdlSG9vay5mcmVlemUoKTtcbiAgICAgICAgdGhpcy5fY29tcGlsZVBhZ2VIb29rLmZyZWV6ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICB2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnb25zLXRhYi1iYXJfX2NvbnRlbnQnKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgndGFiLWJhcl9fY29udGVudCcpO1xuXG4gICAgICB2YXIgdGFiYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0YWJiYXIuY2xhc3NMaXN0LmFkZCgndGFiLWJhcicpO1xuICAgICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ29ucy10YWItYmFyX19mb290ZXInKTtcbiAgICAgIHRhYmJhci5jbGFzc0xpc3QuYWRkKCdvbnMtdGFiYmFyLWlubmVyJyk7XG5cbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHRhYmJhcik7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgdGFiYmFyLmFwcGVuZENoaWxkKHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG5cbiAgICAgIGlmICh0aGlzLl9oYXNUb3BUYWJiYXIoKSkge1xuICAgICAgICB0aGlzLl9wcmVwYXJlRm9yVG9wVGFiYmFyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2hhc1RvcFRhYmJhcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKSA9PT0gJ3RvcCc7XG4gICAgfVxuXG4gICAgX3ByZXBhcmVGb3JUb3BUYWJiYXIoKSB7XG5cbiAgICAgIHZhciBjb250ZW50ID0gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYi1iYXJfX2NvbnRlbnQnKTtcbiAgICAgIHZhciB0YWJiYXIgPSBvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcudGFiLWJhcicpO1xuXG4gICAgICBjb250ZW50LnNldEF0dHJpYnV0ZSgnbm8tc3RhdHVzLWJhci1maWxsJywgJycpO1xuXG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ3RhYi1iYXItLXRvcF9fY29udGVudCcpO1xuICAgICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ3RhYi1iYXItLXRvcCcpO1xuXG4gICAgICB2YXIgcGFnZSA9IG9ucy5fdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtcGFnZScpO1xuICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgdGhpcy5zdHlsZS50b3AgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYWdlLl9nZXRDb250ZW50RWxlbWVudCgpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25zLl9pbnRlcm5hbC5zaG91bGRGaWxsU3RhdHVzQmFyKHRoaXMpKSB7XG4gICAgICAgIC8vIEFkanVzdG1lbnRzIGZvciBJT1M3XG4gICAgICAgIHZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbGwuY2xhc3NMaXN0LmFkZCgndGFiLWJhcl9fc3RhdHVzLWJhci1maWxsJyk7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAnMHB4JztcbiAgICAgICAgZmlsbC5zdHlsZS5oZWlnaHQgPSAnMHB4JztcblxuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShmaWxsLCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2V0VGFiYmFyRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYi1iYXInKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICAgKi9cbiAgICBsb2FkUGFnZShwYWdlLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIG9wdGlvbnMuX3JlbW92ZUVsZW1lbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRQYWdlKHBhZ2UsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgICAqL1xuICAgIF9sb2FkUGFnZShwYWdlLCBvcHRpb25zKSB7XG4gICAgICBPbnNUYWJFbGVtZW50LnByb3RvdHlwZS5fY3JlYXRlUGFnZUVsZW1lbnQocGFnZSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICB0aGlzLl9sb2FkUGFnZURPTUFzeW5jKHBhZ2VFbGVtZW50LCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gcGFnZUVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAgICovXG4gICAgX2xvYWRQYWdlRE9NQXN5bmMocGFnZUVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICB0aGlzLl9jb21waWxlUGFnZUhvb2sucnVuKHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgdGhpcy5fbGlua1BhZ2VIb29rLnJ1bihwYWdlRWxlbWVudCA9PiB7XG4gICAgICAgICAgdGhpcy5fZ2V0Q29udGVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChwYWdlRWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5fc3dpdGNoUGFnZShwYWdlRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIH0sIHBhZ2VFbGVtZW50KTtcbiAgICAgIH0sIHBhZ2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VGFiYmFySWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGFiYmFySWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RWxlbWVudC9udWxsfVxuICAgICAqL1xuICAgIF9nZXRDdXJyZW50UGFnZUVsZW1lbnQoKSB7XG4gICAgICB2YXIgcGFnZXMgPSB0aGlzLl9nZXRDb250ZW50RWxlbWVudCgpLmNoaWxkcmVuO1xuICAgICAgdmFyIHBhZ2UgPSBudWxsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFnZXNbaV0uc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgcGFnZSA9IHBhZ2VzW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwYWdlICYmIHBhZ2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ29ucy1wYWdlJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGU6IHBhZ2UgZWxlbWVudCBtdXN0IGJlIGEgXCJvbnMtcGFnZVwiIGVsZW1lbnQuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuX3JlbW92ZUVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5zZWxlY3RlZFRhYkluZGV4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucHJldmlvdXNUYWJJbmRleFxuICAgICAqL1xuICAgIF9zd2l0Y2hQYWdlKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmdldEFjdGl2ZVRhYkluZGV4KCkgIT09IC0xKSB7XG4gICAgICAgIHZhciBvbGRQYWdlRWxlbWVudCA9IHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuY2hpbGRyZW4ubGVuZ3RoID4gMSA/IHRoaXMuX2dldEN1cnJlbnRQYWdlRWxlbWVudCgpIDogb25zLl9pbnRlcm5hbC5udWxsRWxlbWVudDtcbiAgICAgICAgdmFyIGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICAgIGFuaW1hdG9yLmFwcGx5KGVsZW1lbnQsIG9sZFBhZ2VFbGVtZW50LCBvcHRpb25zLnNlbGVjdGVkVGFiSW5kZXgsIG9wdGlvbnMucHJldmlvdXNUYWJJbmRleCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuX3JlbW92ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChvbGRQYWdlRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgIG9sZFBhZ2VFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob2xkUGFnZUVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvbGRQYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgb3B0aW9ucy5jYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMua2VlcFBhZ2VdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBzdWNjZXNzIG9yIG5vdFxuICAgICAqL1xuICAgIHNldEFjdGl2ZVRhYihpbmRleCwgb3B0aW9ucykge1xuXG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgdmFyIHByZXZpb3VzVGFiID0gdGhpcy5fZ2V0VGFiRWxlbWVudCh0aGlzLmdldEFjdGl2ZVRhYkluZGV4KCkpLFxuICAgICAgICBzZWxlY3RlZFRhYiA9IHRoaXMuX2dldFRhYkVsZW1lbnQoaW5kZXgpLFxuICAgICAgICBwcmV2aW91c1RhYkluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleCgpLFxuICAgICAgICBzZWxlY3RlZFRhYkluZGV4ID0gaW5kZXg7XG5cbiAgICAgIGlmICghc2VsZWN0ZWRUYWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHNlbGVjdGVkVGFiLmhhc0F0dHJpYnV0ZSgnbm8tcmVsb2FkJykgfHwgc2VsZWN0ZWRUYWIuaXNQZXJzaXN0ZW50KCkpICYmIGluZGV4ID09PSBwcmV2aW91c1RhYkluZGV4KSB7XG4gICAgICAgIHZhciBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVhY3RpdmUnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIHRhYkl0ZW06IHNlbGVjdGVkVGFiXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYW5jZWxlZCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwcmVjaGFuZ2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICB0YWJJdGVtOiBzZWxlY3RlZFRhYixcbiAgICAgICAgICBjYW5jZWw6ICgpID0+IGNhbmNlbGVkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgICBzZWxlY3RlZFRhYi5zZXRJbmFjdGl2ZSgpO1xuICAgICAgICBpZiAocHJldmlvdXNUYWIpIHtcbiAgICAgICAgICBwcmV2aW91c1RhYi5zZXRBY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkVGFiLnNldEFjdGl2ZSgpO1xuXG4gICAgICB2YXIgbmVlZExvYWQgPSAhc2VsZWN0ZWRUYWIuaXNMb2FkZWQoKSAmJiAhb3B0aW9ucy5rZWVwUGFnZTtcblxuICAgICAgaWYgKG5lZWRMb2FkKSB7XG4gICAgICAgIHZhciByZW1vdmVFbGVtZW50ID0gdHJ1ZTtcblxuICAgICAgICBpZiAocHJldmlvdXNUYWIgJiYgcHJldmlvdXNUYWIuaXNQZXJzaXN0ZW50KCkpIHtcbiAgICAgICAgICByZW1vdmVFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwb3N0Y2hhbmdlJywge1xuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgdGFiSXRlbTogc2VsZWN0ZWRUYWJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2aW91c1RhYkluZGV4OiBwcmV2aW91c1RhYkluZGV4LFxuICAgICAgICAgIHNlbGVjdGVkVGFiSW5kZXg6IHNlbGVjdGVkVGFiSW5kZXgsXG4gICAgICAgICAgX3JlbW92ZUVsZW1lbnQ6IHJlbW92ZUVsZW1lbnRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBwYXJhbXMuYW5pbWF0aW9uID0gb3B0aW9ucy5hbmltYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRUYWIuaXNQZXJzaXN0ZW50KCkpIHtcbiAgICAgICAgICBzZWxlY3RlZFRhYi5fbG9hZFBhZ2VFbGVtZW50KHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRQZXJzaXN0ZW50UGFnZURPTShwYWdlRWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgICB9LCB7Y29tcGlsZTogdGhpcy5fY29tcGlsZVBhZ2VIb29rLCBsaW5rOiB0aGlzLl9saW5rUGFnZUhvb2t9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUGFnZShzZWxlY3RlZFRhYi5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKSwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1dGlsLmFycmF5RnJvbSh0aGlzLl9nZXRUYWJiYXJFbGVtZW50KCkuY2hpbGRyZW4pLmZvckVhY2goKHRhYikgPT4ge1xuICAgICAgICBpZiAodGFiICE9IHNlbGVjdGVkVGFiKSB7XG4gICAgICAgICAgdGFiLnNldEluYWN0aXZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZWVkTG9hZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncG9zdGNoYW5nZScsIHtcbiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgIHRhYkl0ZW06IHNlbGVjdGVkVGFiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmFuaW1hdGlvblxuICAgICAqL1xuICAgIF9sb2FkUGVyc2lzdGVudFBhZ2VET00oZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB0aGlzLl9nZXRDb250ZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgdGhpcy5fc3dpdGNoUGFnZShlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZpc2libGVcbiAgICAgKi9cbiAgICBzZXRUYWJiYXJWaXNpYmlsaXR5KHZpc2libGUpIHtcbiAgICAgIHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuc3R5bGVbdGhpcy5faGFzVG9wVGFiYmFyKCkgPyAndG9wJyA6ICdib3R0b20nXSA9IHZpc2libGUgPyAnJyA6ICcwcHgnO1xuICAgICAgdGhpcy5fZ2V0VGFiYmFyRWxlbWVudCgpLnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgfVxuXG4gICAgX2dldENvbnRlbnRFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWItYmFyX19jb250ZW50Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBXaGVuIGFjdGl2ZSB0YWIgaXMgbm90IGZvdW5kLCByZXR1cm5zIC0xLlxuICAgICAqL1xuICAgIGdldEFjdGl2ZVRhYkluZGV4KCkge1xuICAgICAgdmFyIHRhYnMgPSB0aGlzLl9nZXRUYWJiYXJFbGVtZW50KCkuY2hpbGRyZW47XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGFic1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRhYicgJiYgdGFic1tpXS5pc0FjdGl2ZSAmJiB0YWJzW2ldLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBXaGVuIGFjdGl2ZSB0YWIgaXMgbm90IGZvdW5kLCByZXR1cm5zIC0xLlxuICAgICAqL1xuICAgIF9nZXRBY3RpdmVUYWJFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFRhYkVsZW1lbnQodGhpcy5nZXRBY3RpdmVUYWJJbmRleCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgICAqL1xuICAgIF9nZXRUYWJFbGVtZW50KGluZGV4KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VGFiYmFyRWxlbWVudCgpLmNoaWxkcmVuW2luZGV4XTtcbiAgICB9XG5cbiAgICBkZXRhY2hlZENhbGxiYWNrKCkgeyB9XG5cbiAgICBhdHRhY2hlZENhbGxiYWNrKCkgeyB9XG5cbiAgICBfZW5zdXJlVGFiRWxlbWVudHMod3JhcHBlcikge1xuICAgICAgLy8gZW5zdXJlIHRoYXQgYWxsIGNoaWxkcmVuIGFyZSBcIm9ucy10YWJcIiBlbGVtZW50IGFmdGVyIGNvbXBpbGUuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd3JhcHBlci5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAod3JhcHBlci5jaGlsZHJlbltpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25zLXRhYicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoaWxkcmVuIG11c3QgYmUgYW4gZWxlbWVudCBvZiBcIm9ucy10YWJcIiBlbGVtZW50cycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBUYWJiYXJFbGVtZW50Ll9hbmltYXRvckRpY3QgPSB7XG4gICAgJ2RlZmF1bHQnOiBUYWJiYXJOb25lQW5pbWF0b3IsXG4gICAgJ2ZhZGUnOiBUYWJiYXJGYWRlQW5pbWF0b3IsXG4gICAgJ3NsaWRlJzogVGFiYmFyU2xpZGVBbmltYXRvcixcbiAgICAnbm9uZSc6IFRhYmJhck5vbmVBbmltYXRvclxuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBBbmltYXRvclxuICAgKi9cbiAgVGFiYmFyRWxlbWVudC5yZWdpc3RlckFuaW1hdG9yID0gZnVuY3Rpb24obmFtZSwgQW5pbWF0b3IpIHtcbiAgICBpZiAoIShBbmltYXRvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBUYWJiYXJBbmltYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJBbmltYXRvclwiIHBhcmFtIG11c3QgaW5oZXJpdCBUYWJiYXJBbmltYXRvcicpO1xuICAgIH1cbiAgICBUYWJiYXJFbGVtZW50Ll9hbmltYXRvckRpY3RbbmFtZV0gPSBBbmltYXRvcjtcbiAgfTtcblxuICBpZiAoIXdpbmRvdy5PbnNUYWJiYXJFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc1RhYmJhckVsZW1lbnQgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy10YWJiYXInLCB7XG4gICAgICBwcm90b3R5cGU6IFRhYmJhckVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG5cbiAgICB3aW5kb3cuT25zVGFiYmFyRWxlbWVudC5yZWFkeSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuICAgIH07XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY2xhc3MgVGVtcGxhdGVFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuaW5uZXJIVE1MO1xuXG4gICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdfdGVtcGxhdGVsb2FkZWQnLCB7YnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZX0pO1xuICAgICAgZXZlbnQudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAgZXZlbnQudGVtcGxhdGVJZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZCcpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1RlbXBsYXRlRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNUZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy10ZW1wbGF0ZScsIHtcbiAgICAgIHByb3RvdHlwZTogVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBzY2hlbWUgPSB7Jyc6ICd0b29sYmFyLWJ1dHRvbi0tKid9O1xuICB2YXIgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG5cbiAgY2xhc3MgVG9vbGJhckJ1dHRvbkVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgndG9vbGJhci1idXR0b24nKTtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi1iYXJfX2xpbmUtaGVpZ2h0Jyk7XG5cbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1Rvb2xiYXJCdXR0b24pIHtcbiAgICB3aW5kb3cuT25zVG9vbGJhckJ1dHRvbiA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXRvb2xiYXItYnV0dG9uJywge1xuICAgICAgcHJvdG90eXBlOiBUb29sYmFyQnV0dG9uRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgc2NoZW1lID0ge1xuICAgICcnOiAnbmF2aWdhdGlvbi1iYXItLSonLFxuICAgICcubmF2aWdhdGlvbi1iYXJfX2xlZnQnOiAnbmF2aWdhdGlvbi1iYXItLSpfX2xlZnQnLFxuICAgICcubmF2aWdhdGlvbi1iYXJfX2NlbnRlcic6ICduYXZpZ2F0aW9uLWJhci0tKl9fY2VudGVyJyxcbiAgICAnLm5hdmlnYXRpb24tYmFyX19yaWdodCc6ICduYXZpZ2F0aW9uLWJhci0tKl9fcmlnaHQnXG4gIH07XG4gIHZhciBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcblxuICBjbGFzcyBUb29sYmFyRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuXG4gICAgICB0aGlzLl90cnlUb0Vuc3VyZU5vZGVQb3NpdGlvbigpO1xuICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3RyeVRvRW5zdXJlTm9kZVBvc2l0aW9uKCkpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX3RyeVRvRW5zdXJlTm9kZVBvc2l0aW9uKCk7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fdHJ5VG9FbnN1cmVOb2RlUG9zaXRpb24oKSk7XG4gICAgfVxuXG4gICAgX3RyeVRvRW5zdXJlTm9kZVBvc2l0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLnBhcmVudE5vZGUgfHwgdGhpcy5oYXNBdHRyaWJ1dGUoJ2lubGluZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25zLXBhZ2UnKSB7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIHBhZ2UgPSBwYWdlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocGFnZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXBhZ2UnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFnZS5fcmVnaXN0ZXJUb29sYmFyKHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgICAqL1xuICAgIF9nZXRUb29sYmFyTGVmdEl0ZW1zRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5sZWZ0JykgfHwgb25zLl9pbnRlcm5hbC5udWxsRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAgICAgKi9cbiAgICBfZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5jZW50ZXInKSB8fCBvbnMuX2ludGVybmFsLm51bGxFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgICAqL1xuICAgIF9nZXRUb29sYmFyUmlnaHRJdGVtc0VsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcucmlnaHQnKSB8fCBvbnMuX2ludGVybmFsLm51bGxFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgICAqL1xuICAgIF9nZXRUb29sYmFyQmFja0J1dHRvbkxhYmVsRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29ucy1iYWNrLWJ1dHRvbiAuYmFjay1idXR0b25fX2xhYmVsJykgfHwgb25zLl9pbnRlcm5hbC5udWxsRWxlbWVudDtcbiAgICB9XG5cbiAgICBfY29tcGlsZSgpIHtcbiAgICAgIHZhciBzaG91bGRBcHBlbmRBbmRyb2lkTW9kaWZpZXIgPSBvbnMucGxhdGZvcm0uaXNBbmRyb2lkKCkgJiYgIXRoaXMuaGFzQXR0cmlidXRlKCdmaXhlZC1zdHlsZScpO1xuICAgICAgdmFyIGlubGluZSA9IHRoaXMuaGFzQXR0cmlidXRlKCdpbmxpbmUnKTtcblxuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLWJhcicpO1xuXG4gICAgICBpZiAoc2hvdWxkQXBwZW5kQW5kcm9pZE1vZGlmaWVyKSB7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi1iYXItLWFuZHJvaWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbmxpbmUpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuc3R5bGUuekluZGV4ID0gJzEwMDAwJztcbiAgICAgICAgdGhpcy5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gICAgICAgIHRoaXMuc3R5bGUucmlnaHQgPSAnMHB4JztcbiAgICAgICAgdGhpcy5zdHlsZS50b3AgPSAnMHB4JztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZW5zdXJlVG9vbGJhckl0ZW1FbGVtZW50cygpO1xuICAgIH1cblxuICAgIF9lbnN1cmVUb29sYmFySXRlbUVsZW1lbnRzKCkge1xuXG4gICAgICB2YXIgaGFzQ2VudGVyQ2xhc3NFbGVtZW50T25seSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIHRoaXMuY2hpbGRyZW5bMF0uY2xhc3NMaXN0LmNvbnRhaW5zKCdjZW50ZXInKTtcbiAgICAgIHZhciBjZW50ZXI7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIGNhc2Ugb2Ygbm90IGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSAhPSAxKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNDZW50ZXJDbGFzc0VsZW1lbnRPbmx5KSB7XG4gICAgICAgIGNlbnRlciA9IHRoaXMuX2Vuc3VyZVRvb2xiYXJJdGVtQ29udGFpbmVyKCdjZW50ZXInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNlbnRlciA9IHRoaXMuX2Vuc3VyZVRvb2xiYXJJdGVtQ29udGFpbmVyKCdjZW50ZXInKTtcbiAgICAgICAgdmFyIGxlZnQgPSB0aGlzLl9lbnN1cmVUb29sYmFySXRlbUNvbnRhaW5lcignbGVmdCcpO1xuICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLl9lbnN1cmVUb29sYmFySXRlbUNvbnRhaW5lcigncmlnaHQnKTtcblxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlblswXSAhPT0gbGVmdCB8fCB0aGlzLmNoaWxkcmVuWzFdICE9PSBjZW50ZXIgfHwgdGhpcy5jaGlsZHJlblsyXSAhPT0gcmlnaHQpIHtcbiAgICAgICAgICBpZiAobGVmdC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKGxlZnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2VudGVyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoY2VudGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJpZ2h0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQocmlnaHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChsZWZ0KTtcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjZW50ZXIpO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHJpZ2h0KTtcblxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjZW50ZXIuY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi1iYXJfX3RpdGxlJyk7XG4gICAgfVxuXG4gICAgX2Vuc3VyZVRvb2xiYXJJdGVtQ29udGFpbmVyKG5hbWUpIHtcbiAgICAgIHZhciBjb250YWluZXIgPSBvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcuJyArIG5hbWUpO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQobmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250YWluZXIuaW5uZXJIVE1MLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcmbmJzcDsnO1xuICAgICAgfVxuXG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbmF2aWdhdGlvbi1iYXJfXycgKyBuYW1lKTtcbiAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgfVxuXG4gIH1cblxuICBpZiAoIXdpbmRvdy5PbnNUb29sYmFyRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNUb29sYmFyRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXRvb2xiYXInLCB7XG4gICAgICBwcm90b3R5cGU6IFRvb2xiYXJFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpbnN0b3JlLWpzY29tcGF0LmpzIiwiQ3VzdG9tRWxlbWVudHMuanMiLCJDdXN0b21FdmVudC5qcyIsImNsYXNzLmpzIiwiZmFzdGNsaWNrLmpzIiwibWljcm9ldmVudC5qcyIsIm1vZGVybml6ci5jdXN0b20uanMiLCJwcm9taXNlLTYuMS4wLmpzIiwic2V0SW1tZWRpYXRlLmpzIiwidmlld3BvcnQuanMiLCJkb29ybG9jay5lczYiLCJkZXZpY2UtYmFjay1idXR0b24tZGlzcGF0Y2hlci5lczYiLCJvbnMuZXM2Iiwib25zLXV0aWwuZXM2IiwibW9kYWwtYW5pbWF0b3IuZXM2IiwibmF2aWdhdG9yLXRyYW5zaXRpb24tYW5pbWF0b3IuZXM2IiwicG9wb3Zlci1hbmltYXRvci5lczYiLCJhbGVydC1kaWFsb2ctYW5pbWF0b3IuZXM2IiwiYW5pbWF0b3ItZmFjdG9yeS5lczYiLCJhc3luYy1ob29rLmVzNiIsImRpYWxvZy1hbmltYXRvci5lczYiLCJmYWRlLW1vZGFsLWFuaW1hdG9yLmVzNiIsImZhZGUtbmF2aWdhdG9yLXRyYW5zaXRpb24tYW5pbWF0b3IuZXM2IiwiZmFkZS1wb3BvdmVyLWFuaW1hdG9yLmVzNiIsImlvcy1zbGlkZS1uYXZpZ2F0b3ItdHJhbnNpdGlvbi1hbmltYXRvci5lczYiLCJsYXp5LXJlcGVhdC1wcm92aWRlci5lczYiLCJsaWZ0LW5hdmlnYXRvci10cmFuc2l0aW9uLWFuaW1hdG9yLmVzNiIsIm1vZGlmaWVyLXV0aWwuZXM2IiwibmF2aWdhdG9yLXBhZ2UuZXM2Iiwib25zLWludGVybmFsLmVzNiIsIm9ucy1ub3RpZmljYXRpb24uZXM2Iiwib25zLW9yaWVudGF0aW9uLmVzNiIsIm9ucy1wYWdlLWF0dHJpYnV0ZS1leHByZXNzaW9uLmVzNiIsIm9ucy1wbGF0Zm9ybS5lczYiLCJvbnMtc29mdHdhcmUta2V5Ym9hcmQuZXM2Iiwic2ltcGxlLXNsaWRlLW5hdmlnYXRvci10cmFuc2l0aW9uLWFuaW1hdG9yLmVzNiIsInRhYmJhci1hbmltYXRvci5lczYiLCJhbmltaXQuanMiLCJvbnMtZ2VzdHVyZS1kZXRlY3Rvci5qcyIsInNldHVwLmVzNiIsIm9ucy1hbGVydC1kaWFsb2cuZXM2Iiwib25zLWJhY2stYnV0dG9uLmVzNiIsIm9ucy1ib3R0b20tdG9vbGJhci5lczYiLCJvbnMtYnV0dG9uLmVzNiIsIm9ucy1jYXJvdXNlbC1pdGVtLmVzNiIsIm9ucy1jYXJvdXNlbC5lczYiLCJvbnMtY29sLmVzNiIsIm9ucy1kaWFsb2cuZXM2Iiwib25zLWdlc3R1cmUtZGV0ZWN0b3IuZXM2Iiwib25zLWljb24uZXM2Iiwib25zLWxpc3QtaGVhZGVyLmVzNiIsIm9ucy1saXN0LWl0ZW0uZXM2Iiwib25zLWxpc3QuZXM2Iiwib25zLW1vZGFsLmVzNiIsIm9ucy1uYXZpZ2F0b3IuZXM2Iiwib25zLXBhZ2UuZXM2Iiwib25zLXBvcG92ZXIuZXM2Iiwib25zLXB1bGwtaG9vay5lczYiLCJvbnMtcm93LmVzNiIsIm9ucy1zY3JvbGxlci5lczYiLCJvbnMtc3dpdGNoLmVzNiIsIm9ucy10YWIuZXM2Iiwib25zLXRhYmJhci5lczYiLCJvbnMtdGVtcGxhdGUuZXM2Iiwib25zLXRvb2xiYXItYnV0dG9uLmVzNiIsIm9ucy10b29sYmFyLmVzNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNTdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDejBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN2WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDeGRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1aEVBLENBQUMsVUFBQyxHQUFHLEVBQUs7OztBQUdSLFFBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7V0FB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LENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzdDLGNBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLEVBQUU7QUFDcEIsaUJBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUksSUFBSSxDQUFDO0FBQzdFLGNBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUM7V0FDOUIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLEVBQUU7QUFDbkQsaUJBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBLEFBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkgsY0FBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQUFBQyxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFJLElBQUksQ0FBQztXQUNsRTtTQUNGLE1BQU07QUFDTCxjQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFO0FBQ3JCLGlCQUFLLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM3RSxjQUFFLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO1dB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bUJBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9COztBQUVELFlBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7QUFDckMsbUJBQVMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1NBQ2hDOztBQUVELGlCQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNuRCxlQUFPLFNBQVMsQ0FBQztPQUNsQjs7O1dBbkpHLGNBQWM7S0FBUyxHQUFHLENBQUMsWUFBWTs7QUF1SjdDLE1BQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUU7QUFDN0IsVUFBTSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFO0FBQ2pFLGVBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztLQUNwQyxDQUFDLENBQUM7R0FDSjtDQUNGLENBQUEsRUFBRyxDQUFDIiwiZmlsZSI6Im9ucy1jb3JlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgT3BlbiBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiAgU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4vLyBKYXZhU2NyaXB0IER5bmFtaWMgQ29udGVudCBzaGltIGZvciBXaW5kb3dzIFN0b3JlIGFwcHNcbihmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAod2luZG93Lk1TQXBwICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKSB7XG5cbiAgICAgICAgLy8gU29tZSBub2RlcyB3aWxsIGhhdmUgYW4gXCJhdHRyaWJ1dGVzXCIgcHJvcGVydHkgd2hpY2ggc2hhZG93cyB0aGUgTm9kZS5wcm90b3R5cGUuYXR0cmlidXRlcyBwcm9wZXJ0eVxuICAgICAgICAvLyAgYW5kIG1lYW5zIHdlIGRvbid0IGFjdHVhbGx5IHNlZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTm9kZSAoaW50ZXJlc3RpbmdseSB0aGUgVlMgZGVidWcgY29uc29sZVxuICAgICAgICAvLyAgYXBwZWFycyB0byBzdWZmZXIgZnJvbSB0aGUgc2FtZSBpc3N1ZSkuXG4gICAgICAgIC8vXG4gICAgICAgIHZhciBFbGVtZW50X3NldEF0dHJpYnV0ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsIFwic2V0QXR0cmlidXRlXCIpLnZhbHVlO1xuICAgICAgICB2YXIgRWxlbWVudF9yZW1vdmVBdHRyaWJ1dGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90eXBlLCBcInJlbW92ZUF0dHJpYnV0ZVwiKS52YWx1ZTtcbiAgICAgICAgdmFyIEhUTUxFbGVtZW50X2luc2VydEFkamFjZW50SFRNTFByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCBcImluc2VydEFkamFjZW50SFRNTFwiKTtcbiAgICAgICAgdmFyIE5vZGVfZ2V0X2F0dHJpYnV0ZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCBcImF0dHJpYnV0ZXNcIikuZ2V0O1xuICAgICAgICB2YXIgTm9kZV9nZXRfY2hpbGROb2RlcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsIFwiY2hpbGROb2Rlc1wiKS5nZXQ7XG4gICAgICAgIHZhciBkZXRlY3Rpb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIE5vZGVfZ2V0X2F0dHJpYnV0ZXMuY2FsbChlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIEVsZW1lbnRfc2V0QXR0cmlidXRlLmNhbGwoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlKSB7XG4gICAgICAgICAgICBFbGVtZW50X3JlbW92ZUF0dHJpYnV0ZS5jYWxsKGVsZW1lbnQsIGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjaGlsZE5vZGVzKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBOb2RlX2dldF9jaGlsZE5vZGVzLmNhbGwoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBlbXB0eShlbGVtZW50KSB7XG4gICAgICAgICAgICB3aGlsZSAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5sYXN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5zZXJ0QWRqYWNlbnRIVE1MKGVsZW1lbnQsIHBvc2l0aW9uLCBodG1sKSB7XG4gICAgICAgICAgICBIVE1MRWxlbWVudF9pbnNlcnRBZGphY2VudEhUTUxQcm9wZXJ0eURlc2NyaXB0b3IudmFsdWUuY2FsbChlbGVtZW50LCBwb3NpdGlvbiwgaHRtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpblVuc2FmZU1vZGUoKSB7XG4gICAgICAgICAgICB2YXIgaXNVbnNhZmUgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkZXRlY3Rpb25EaXYuaW5uZXJIVE1MID0gXCI8dGVzdC8+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICBpc1Vuc2FmZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXNVbnNhZmU7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjbGVhbnNlKGh0bWwsIHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBjbGVhbmVyID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KFwiY2xlYW5lclwiKTtcbiAgICAgICAgICAgIGVtcHR5KGNsZWFuZXIuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRBZGphY2VudEhUTUwoY2xlYW5lci5kb2N1bWVudEVsZW1lbnQsIFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgc2NyaXB0cyA9IGNsZWFuZXIuZG9jdW1lbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNjcmlwdHMsIGZ1bmN0aW9uIChzY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHNjcmlwdC50eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSBcInRleHQvaW5lcnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0L2VjbWFzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHQveC1qYXZhc2NyaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0L2pzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHQvbGl2ZXNjcmlwdFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0MS4xXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0L2phdmFzY3JpcHQxLjJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHQvamF2YXNjcmlwdDEuM1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSBcInRleHQvaW5lcnQtXCIgKyBzY3JpcHQudHlwZS5zbGljZShcInRleHQvXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9IFwiYXBwbGljYXRpb24vaW5lcnQtXCIgKyBzY3JpcHQudHlwZS5zbGljZShcImFwcGxpY2F0aW9uL1wiLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFuc2VBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgYXR0cmlidXRlcyBjb2xsZWN0aW9uIGlzIGxpdmUgaXQgaXMgc2ltcGxlciB0byBxdWV1ZSB1cCB0aGUgcmVuYW1lc1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lWzBdID09PSBcIm9cIiB8fCBuYW1lWzBdID09PSBcIk9cIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZVsxXSA9PT0gXCJuXCIgfHwgbmFtZVsxXSA9PT0gXCJOXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gZXZlbnRzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKHsgbmFtZTogYXR0cmlidXRlLm5hbWUsIHZhbHVlOiBhdHRyaWJ1dGUudmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2ZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBldmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUoZWxlbWVudCwgXCJ4LVwiICsgYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gY2hpbGROb2RlcyhlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW5zZUF0dHJpYnV0ZXMoY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFuc2VBdHRyaWJ1dGVzKGNsZWFuZXIuZG9jdW1lbnRFbGVtZW50KTtcblxuICAgICAgICAgICAgdmFyIGNsZWFuZWROb2RlcyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0RWxlbWVudC50YWdOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgICAgICAgICAgICBjbGVhbmVkTm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5hZG9wdE5vZGUoY2xlYW5lci5kb2N1bWVudEVsZW1lbnQpLmNoaWxkTm9kZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xlYW5lci5oZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFuZWROb2RlcyA9IGNsZWFuZWROb2Rlcy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuYWRvcHROb2RlKGNsZWFuZXIuaGVhZCkuY2hpbGROb2RlcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW5lci5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFuZWROb2RlcyA9IGNsZWFuZWROb2Rlcy5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuYWRvcHROb2RlKGNsZWFuZXIuYm9keSkuY2hpbGROb2RlcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNsZWFuZWROb2RlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFuc2VQcm9wZXJ0eVNldHRlcihwcm9wZXJ0eSwgc2V0dGVyKSB7XG4gICAgICAgICAgICB2YXIgcHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbFNldHRlciA9IHByb3BlcnR5RGVzY3JpcHRvci5zZXQ7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCBwcm9wZXJ0eSwge1xuICAgICAgICAgICAgICAgIGdldDogcHJvcGVydHlEZXNjcmlwdG9yLmdldCxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cuV2luSlMgJiYgd2luZG93LldpbkpTLl9leGVjVW5zYWZlICYmIGluVW5zYWZlTW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNldHRlci5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IGNsZWFuc2UodmFsdWUsIHRoYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcihwcm9wZXJ0eURlc2NyaXB0b3IsIHRoYXQsIG5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBwcm9wZXJ0eURlc2NyaXB0b3IuZW51bWVyYWJsZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHByb3BlcnR5RGVzY3JpcHRvci5jb25maWd1cmFibGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhbnNlUHJvcGVydHlTZXR0ZXIoXCJpbm5lckhUTUxcIiwgZnVuY3Rpb24gKHByb3BlcnR5RGVzY3JpcHRvciwgdGFyZ2V0LCBlbGVtZW50cykge1xuICAgICAgICAgICAgZW1wdHkodGFyZ2V0KTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChlbGVtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjbGVhbnNlUHJvcGVydHlTZXR0ZXIoXCJvdXRlckhUTUxcIiwgZnVuY3Rpb24gKHByb3BlcnR5RGVzY3JpcHRvciwgdGFyZ2V0LCBlbGVtZW50cykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyZW5kXCIsIGVsZW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldCk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG59KCkpOyIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuLy8gQHZlcnNpb24gMC43LjNcbmlmICh0eXBlb2YgV2Vha01hcCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICAgIHZhciBjb3VudGVyID0gRGF0ZS5ub3coKSAlIDFlOTtcbiAgICB2YXIgV2Vha01hcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5uYW1lID0gXCJfX3N0XCIgKyAoTWF0aC5yYW5kb20oKSAqIDFlOSA+Pj4gMCkgKyAoY291bnRlcisrICsgXCJfX1wiKTtcbiAgICB9O1xuICAgIFdlYWtNYXAucHJvdG90eXBlID0ge1xuICAgICAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICAgICAgICBpZiAoZW50cnkgJiYgZW50cnlbMF0gPT09IGtleSkgZW50cnlbMV0gPSB2YWx1ZTsgZWxzZSBkZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMubmFtZSwge1xuICAgICAgICAgIHZhbHVlOiBbIGtleSwgdmFsdWUgXSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5O1xuICAgICAgICByZXR1cm4gKGVudHJ5ID0ga2V5W3RoaXMubmFtZV0pICYmIGVudHJ5WzBdID09PSBrZXkgPyBlbnRyeVsxXSA6IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBcImRlbGV0ZVwiOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0ga2V5W3RoaXMubmFtZV07XG4gICAgICAgIGlmICghZW50cnkgfHwgZW50cnlbMF0gIT09IGtleSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBlbnRyeVswXSA9IGVudHJ5WzFdID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBoYXM6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTtcbiAgICAgICAgaWYgKCFlbnRyeSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gZW50cnlbMF0gPT09IGtleTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5XZWFrTWFwID0gV2Vha01hcDtcbiAgfSkoKTtcbn1cblxuKGZ1bmN0aW9uKGdsb2JhbCkge1xuICB2YXIgcmVnaXN0cmF0aW9uc1RhYmxlID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIHNldEltbWVkaWF0ZTtcbiAgaWYgKC9UcmlkZW50fEVkZ2UvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICBzZXRJbW1lZGlhdGUgPSBzZXRUaW1lb3V0O1xuICB9IGVsc2UgaWYgKHdpbmRvdy5zZXRJbW1lZGlhdGUpIHtcbiAgICBzZXRJbW1lZGlhdGUgPSB3aW5kb3cuc2V0SW1tZWRpYXRlO1xuICB9IGVsc2Uge1xuICAgIHZhciBzZXRJbW1lZGlhdGVRdWV1ZSA9IFtdO1xuICAgIHZhciBzZW50aW5lbCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKGUuZGF0YSA9PT0gc2VudGluZWwpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gc2V0SW1tZWRpYXRlUXVldWU7XG4gICAgICAgIHNldEltbWVkaWF0ZVF1ZXVlID0gW107XG4gICAgICAgIHF1ZXVlLmZvckVhY2goZnVuY3Rpb24oZnVuYykge1xuICAgICAgICAgIGZ1bmMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oZnVuYykge1xuICAgICAgc2V0SW1tZWRpYXRlUXVldWUucHVzaChmdW5jKTtcbiAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShzZW50aW5lbCwgXCIqXCIpO1xuICAgIH07XG4gIH1cbiAgdmFyIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gIHZhciBzY2hlZHVsZWRPYnNlcnZlcnMgPSBbXTtcbiAgZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFjayhvYnNlcnZlcikge1xuICAgIHNjaGVkdWxlZE9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgICBpZiAoIWlzU2NoZWR1bGVkKSB7XG4gICAgICBpc1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICBzZXRJbW1lZGlhdGUoZGlzcGF0Y2hDYWxsYmFja3MpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB3cmFwSWZOZWVkZWQobm9kZSkge1xuICAgIHJldHVybiB3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwgJiYgd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsLndyYXBJZk5lZWRlZChub2RlKSB8fCBub2RlO1xuICB9XG4gIGZ1bmN0aW9uIGRpc3BhdGNoQ2FsbGJhY2tzKCkge1xuICAgIGlzU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdmFyIG9ic2VydmVycyA9IHNjaGVkdWxlZE9ic2VydmVycztcbiAgICBzY2hlZHVsZWRPYnNlcnZlcnMgPSBbXTtcbiAgICBvYnNlcnZlcnMuc29ydChmdW5jdGlvbihvMSwgbzIpIHtcbiAgICAgIHJldHVybiBvMS51aWRfIC0gbzIudWlkXztcbiAgICB9KTtcbiAgICB2YXIgYW55Tm9uRW1wdHkgPSBmYWxzZTtcbiAgICBvYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbihvYnNlcnZlcikge1xuICAgICAgdmFyIHF1ZXVlID0gb2JzZXJ2ZXIudGFrZVJlY29yZHMoKTtcbiAgICAgIHJlbW92ZVRyYW5zaWVudE9ic2VydmVyc0ZvcihvYnNlcnZlcik7XG4gICAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIG9ic2VydmVyLmNhbGxiYWNrXyhxdWV1ZSwgb2JzZXJ2ZXIpO1xuICAgICAgICBhbnlOb25FbXB0eSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGFueU5vbkVtcHR5KSBkaXNwYXRjaENhbGxiYWNrcygpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZVRyYW5zaWVudE9ic2VydmVyc0ZvcihvYnNlcnZlcikge1xuICAgIG9ic2VydmVyLm5vZGVzXy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgIGlmICghcmVnaXN0cmF0aW9ucykgcmV0dXJuO1xuICAgICAgcmVnaXN0cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHJlZ2lzdHJhdGlvbikge1xuICAgICAgICBpZiAocmVnaXN0cmF0aW9uLm9ic2VydmVyID09PSBvYnNlcnZlcikgcmVnaXN0cmF0aW9uLnJlbW92ZVRyYW5zaWVudE9ic2VydmVycygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICBmb3IgKHZhciBub2RlID0gdGFyZ2V0OyBub2RlOyBub2RlID0gbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQobm9kZSk7XG4gICAgICBpZiAocmVnaXN0cmF0aW9ucykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlZ2lzdHJhdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgcmVnaXN0cmF0aW9uID0gcmVnaXN0cmF0aW9uc1tqXTtcbiAgICAgICAgICB2YXIgb3B0aW9ucyA9IHJlZ2lzdHJhdGlvbi5vcHRpb25zO1xuICAgICAgICAgIGlmIChub2RlICE9PSB0YXJnZXQgJiYgIW9wdGlvbnMuc3VidHJlZSkgY29udGludWU7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChyZWNvcmQpIHJlZ2lzdHJhdGlvbi5lbnF1ZXVlKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIHVpZENvdW50ZXIgPSAwO1xuICBmdW5jdGlvbiBKc011dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrXyA9IGNhbGxiYWNrO1xuICAgIHRoaXMubm9kZXNfID0gW107XG4gICAgdGhpcy5yZWNvcmRzXyA9IFtdO1xuICAgIHRoaXMudWlkXyA9ICsrdWlkQ291bnRlcjtcbiAgfVxuICBKc011dGF0aW9uT2JzZXJ2ZXIucHJvdG90eXBlID0ge1xuICAgIG9ic2VydmU6IGZ1bmN0aW9uKHRhcmdldCwgb3B0aW9ucykge1xuICAgICAgdGFyZ2V0ID0gd3JhcElmTmVlZGVkKHRhcmdldCk7XG4gICAgICBpZiAoIW9wdGlvbnMuY2hpbGRMaXN0ICYmICFvcHRpb25zLmF0dHJpYnV0ZXMgJiYgIW9wdGlvbnMuY2hhcmFjdGVyRGF0YSB8fCBvcHRpb25zLmF0dHJpYnV0ZU9sZFZhbHVlICYmICFvcHRpb25zLmF0dHJpYnV0ZXMgfHwgb3B0aW9ucy5hdHRyaWJ1dGVGaWx0ZXIgJiYgb3B0aW9ucy5hdHRyaWJ1dGVGaWx0ZXIubGVuZ3RoICYmICFvcHRpb25zLmF0dHJpYnV0ZXMgfHwgb3B0aW9ucy5jaGFyYWN0ZXJEYXRhT2xkVmFsdWUgJiYgIW9wdGlvbnMuY2hhcmFjdGVyRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldCh0YXJnZXQpO1xuICAgICAgaWYgKCFyZWdpc3RyYXRpb25zKSByZWdpc3RyYXRpb25zVGFibGUuc2V0KHRhcmdldCwgcmVnaXN0cmF0aW9ucyA9IFtdKTtcbiAgICAgIHZhciByZWdpc3RyYXRpb247XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZ2lzdHJhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbnNbaV0ub2JzZXJ2ZXIgPT09IHRoaXMpIHtcbiAgICAgICAgICByZWdpc3RyYXRpb24gPSByZWdpc3RyYXRpb25zW2ldO1xuICAgICAgICAgIHJlZ2lzdHJhdGlvbi5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICByZWdpc3RyYXRpb24ub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVnaXN0cmF0aW9uKSB7XG4gICAgICAgIHJlZ2lzdHJhdGlvbiA9IG5ldyBSZWdpc3RyYXRpb24odGhpcywgdGFyZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgcmVnaXN0cmF0aW9ucy5wdXNoKHJlZ2lzdHJhdGlvbik7XG4gICAgICAgIHRoaXMubm9kZXNfLnB1c2godGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHJlZ2lzdHJhdGlvbi5hZGRMaXN0ZW5lcnMoKTtcbiAgICB9LFxuICAgIGRpc2Nvbm5lY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5ub2Rlc18uZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJhdGlvbnNbaV07XG4gICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbi5vYnNlcnZlciA9PT0gdGhpcykge1xuICAgICAgICAgICAgcmVnaXN0cmF0aW9uLnJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgICAgcmVnaXN0cmF0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgICAgdGhpcy5yZWNvcmRzXyA9IFtdO1xuICAgIH0sXG4gICAgdGFrZVJlY29yZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNvcHlPZlJlY29yZHMgPSB0aGlzLnJlY29yZHNfO1xuICAgICAgdGhpcy5yZWNvcmRzXyA9IFtdO1xuICAgICAgcmV0dXJuIGNvcHlPZlJlY29yZHM7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBNdXRhdGlvblJlY29yZCh0eXBlLCB0YXJnZXQpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMuYWRkZWROb2RlcyA9IFtdO1xuICAgIHRoaXMucmVtb3ZlZE5vZGVzID0gW107XG4gICAgdGhpcy5wcmV2aW91c1NpYmxpbmcgPSBudWxsO1xuICAgIHRoaXMubmV4dFNpYmxpbmcgPSBudWxsO1xuICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IG51bGw7XG4gICAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBudWxsO1xuICAgIHRoaXMub2xkVmFsdWUgPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGNvcHlNdXRhdGlvblJlY29yZChvcmlnaW5hbCkge1xuICAgIHZhciByZWNvcmQgPSBuZXcgTXV0YXRpb25SZWNvcmQob3JpZ2luYWwudHlwZSwgb3JpZ2luYWwudGFyZ2V0KTtcbiAgICByZWNvcmQuYWRkZWROb2RlcyA9IG9yaWdpbmFsLmFkZGVkTm9kZXMuc2xpY2UoKTtcbiAgICByZWNvcmQucmVtb3ZlZE5vZGVzID0gb3JpZ2luYWwucmVtb3ZlZE5vZGVzLnNsaWNlKCk7XG4gICAgcmVjb3JkLnByZXZpb3VzU2libGluZyA9IG9yaWdpbmFsLnByZXZpb3VzU2libGluZztcbiAgICByZWNvcmQubmV4dFNpYmxpbmcgPSBvcmlnaW5hbC5uZXh0U2libGluZztcbiAgICByZWNvcmQuYXR0cmlidXRlTmFtZSA9IG9yaWdpbmFsLmF0dHJpYnV0ZU5hbWU7XG4gICAgcmVjb3JkLmF0dHJpYnV0ZU5hbWVzcGFjZSA9IG9yaWdpbmFsLmF0dHJpYnV0ZU5hbWVzcGFjZTtcbiAgICByZWNvcmQub2xkVmFsdWUgPSBvcmlnaW5hbC5vbGRWYWx1ZTtcbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG4gIHZhciBjdXJyZW50UmVjb3JkLCByZWNvcmRXaXRoT2xkVmFsdWU7XG4gIGZ1bmN0aW9uIGdldFJlY29yZCh0eXBlLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gY3VycmVudFJlY29yZCA9IG5ldyBNdXRhdGlvblJlY29yZCh0eXBlLCB0YXJnZXQpO1xuICB9XG4gIGZ1bmN0aW9uIGdldFJlY29yZFdpdGhPbGRWYWx1ZShvbGRWYWx1ZSkge1xuICAgIGlmIChyZWNvcmRXaXRoT2xkVmFsdWUpIHJldHVybiByZWNvcmRXaXRoT2xkVmFsdWU7XG4gICAgcmVjb3JkV2l0aE9sZFZhbHVlID0gY29weU11dGF0aW9uUmVjb3JkKGN1cnJlbnRSZWNvcmQpO1xuICAgIHJlY29yZFdpdGhPbGRWYWx1ZS5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICAgIHJldHVybiByZWNvcmRXaXRoT2xkVmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gY2xlYXJSZWNvcmRzKCkge1xuICAgIGN1cnJlbnRSZWNvcmQgPSByZWNvcmRXaXRoT2xkVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgZnVuY3Rpb24gcmVjb3JkUmVwcmVzZW50c0N1cnJlbnRNdXRhdGlvbihyZWNvcmQpIHtcbiAgICByZXR1cm4gcmVjb3JkID09PSByZWNvcmRXaXRoT2xkVmFsdWUgfHwgcmVjb3JkID09PSBjdXJyZW50UmVjb3JkO1xuICB9XG4gIGZ1bmN0aW9uIHNlbGVjdFJlY29yZChsYXN0UmVjb3JkLCBuZXdSZWNvcmQpIHtcbiAgICBpZiAobGFzdFJlY29yZCA9PT0gbmV3UmVjb3JkKSByZXR1cm4gbGFzdFJlY29yZDtcbiAgICBpZiAocmVjb3JkV2l0aE9sZFZhbHVlICYmIHJlY29yZFJlcHJlc2VudHNDdXJyZW50TXV0YXRpb24obGFzdFJlY29yZCkpIHJldHVybiByZWNvcmRXaXRoT2xkVmFsdWU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gUmVnaXN0cmF0aW9uKG9ic2VydmVyLCB0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXMgPSBbXTtcbiAgfVxuICBSZWdpc3RyYXRpb24ucHJvdG90eXBlID0ge1xuICAgIGVucXVldWU6IGZ1bmN0aW9uKHJlY29yZCkge1xuICAgICAgdmFyIHJlY29yZHMgPSB0aGlzLm9ic2VydmVyLnJlY29yZHNfO1xuICAgICAgdmFyIGxlbmd0aCA9IHJlY29yZHMubGVuZ3RoO1xuICAgICAgaWYgKHJlY29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgbGFzdFJlY29yZCA9IHJlY29yZHNbbGVuZ3RoIC0gMV07XG4gICAgICAgIHZhciByZWNvcmRUb1JlcGxhY2VMYXN0ID0gc2VsZWN0UmVjb3JkKGxhc3RSZWNvcmQsIHJlY29yZCk7XG4gICAgICAgIGlmIChyZWNvcmRUb1JlcGxhY2VMYXN0KSB7XG4gICAgICAgICAgcmVjb3Jkc1tsZW5ndGggLSAxXSA9IHJlY29yZFRvUmVwbGFjZUxhc3Q7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrKHRoaXMub2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgICAgcmVjb3Jkc1tsZW5ndGhdID0gcmVjb3JkO1xuICAgIH0sXG4gICAgYWRkTGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuYWRkTGlzdGVuZXJzXyh0aGlzLnRhcmdldCk7XG4gICAgfSxcbiAgICBhZGRMaXN0ZW5lcnNfOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZXMpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUF0dHJNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoYXJhY3RlckRhdGEpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoaWxkTGlzdCkgbm9kZS5hZGRFdmVudExpc3RlbmVyKFwiRE9NTm9kZUluc2VydGVkXCIsIHRoaXMsIHRydWUpO1xuICAgICAgaWYgKG9wdGlvbnMuY2hpbGRMaXN0IHx8IG9wdGlvbnMuc3VidHJlZSkgbm9kZS5hZGRFdmVudExpc3RlbmVyKFwiRE9NTm9kZVJlbW92ZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICByZW1vdmVMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnNfKHRoaXMudGFyZ2V0KTtcbiAgICB9LFxuICAgIHJlbW92ZUxpc3RlbmVyc186IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKG9wdGlvbnMuYXR0cmlidXRlcykgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQXR0ck1vZGlmaWVkXCIsIHRoaXMsIHRydWUpO1xuICAgICAgaWYgKG9wdGlvbnMuY2hhcmFjdGVyRGF0YSkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMsIHRydWUpO1xuICAgICAgaWYgKG9wdGlvbnMuY2hpbGRMaXN0KSBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01Ob2RlSW5zZXJ0ZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICBpZiAob3B0aW9ucy5jaGlsZExpc3QgfHwgb3B0aW9ucy5zdWJ0cmVlKSBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01Ob2RlUmVtb3ZlZFwiLCB0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIGFkZFRyYW5zaWVudE9ic2VydmVyOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gdGhpcy50YXJnZXQpIHJldHVybjtcbiAgICAgIHRoaXMuYWRkTGlzdGVuZXJzXyhub2RlKTtcbiAgICAgIHRoaXMudHJhbnNpZW50T2JzZXJ2ZWROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbnMgPSByZWdpc3RyYXRpb25zVGFibGUuZ2V0KG5vZGUpO1xuICAgICAgaWYgKCFyZWdpc3RyYXRpb25zKSByZWdpc3RyYXRpb25zVGFibGUuc2V0KG5vZGUsIHJlZ2lzdHJhdGlvbnMgPSBbXSk7XG4gICAgICByZWdpc3RyYXRpb25zLnB1c2godGhpcyk7XG4gICAgfSxcbiAgICByZW1vdmVUcmFuc2llbnRPYnNlcnZlcnM6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHRyYW5zaWVudE9ic2VydmVkTm9kZXMgPSB0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXM7XG4gICAgICB0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXMgPSBbXTtcbiAgICAgIHRyYW5zaWVudE9ic2VydmVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzXyhub2RlKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJhdGlvbnMgPSByZWdpc3RyYXRpb25zVGFibGUuZ2V0KG5vZGUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZ2lzdHJhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAocmVnaXN0cmF0aW9uc1tpXSA9PT0gdGhpcykge1xuICAgICAgICAgICAgcmVnaXN0cmF0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG4gICAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBzd2l0Y2ggKGUudHlwZSkge1xuICAgICAgIGNhc2UgXCJET01BdHRyTW9kaWZpZWRcIjpcbiAgICAgICAgdmFyIG5hbWUgPSBlLmF0dHJOYW1lO1xuICAgICAgICB2YXIgbmFtZXNwYWNlID0gZS5yZWxhdGVkTm9kZS5uYW1lc3BhY2VVUkk7XG4gICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIHJlY29yZCA9IG5ldyBnZXRSZWNvcmQoXCJhdHRyaWJ1dGVzXCIsIHRhcmdldCk7XG4gICAgICAgIHJlY29yZC5hdHRyaWJ1dGVOYW1lID0gbmFtZTtcbiAgICAgICAgcmVjb3JkLmF0dHJpYnV0ZU5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gZS5hdHRyQ2hhbmdlID09PSBNdXRhdGlvbkV2ZW50LkFERElUSU9OID8gbnVsbCA6IGUucHJldlZhbHVlO1xuICAgICAgICBmb3JFYWNoQW5jZXN0b3JBbmRPYnNlcnZlckVucXVldWVSZWNvcmQodGFyZ2V0LCBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKCFvcHRpb25zLmF0dHJpYnV0ZXMpIHJldHVybjtcbiAgICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGVGaWx0ZXIgJiYgb3B0aW9ucy5hdHRyaWJ1dGVGaWx0ZXIubGVuZ3RoICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmluZGV4T2YobmFtZSkgPT09IC0xICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmluZGV4T2YobmFtZXNwYWNlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wdGlvbnMuYXR0cmlidXRlT2xkVmFsdWUpIHJldHVybiBnZXRSZWNvcmRXaXRoT2xkVmFsdWUob2xkVmFsdWUpO1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgIGNhc2UgXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIjpcbiAgICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICB2YXIgcmVjb3JkID0gZ2V0UmVjb3JkKFwiY2hhcmFjdGVyRGF0YVwiLCB0YXJnZXQpO1xuICAgICAgICB2YXIgb2xkVmFsdWUgPSBlLnByZXZWYWx1ZTtcbiAgICAgICAgZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKHRhcmdldCwgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5jaGFyYWN0ZXJEYXRhKSByZXR1cm47XG4gICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcmFjdGVyRGF0YU9sZFZhbHVlKSByZXR1cm4gZ2V0UmVjb3JkV2l0aE9sZFZhbHVlKG9sZFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgICBjYXNlIFwiRE9NTm9kZVJlbW92ZWRcIjpcbiAgICAgICAgdGhpcy5hZGRUcmFuc2llbnRPYnNlcnZlcihlLnRhcmdldCk7XG5cbiAgICAgICBjYXNlIFwiRE9NTm9kZUluc2VydGVkXCI6XG4gICAgICAgIHZhciBjaGFuZ2VkTm9kZSA9IGUudGFyZ2V0O1xuICAgICAgICB2YXIgYWRkZWROb2RlcywgcmVtb3ZlZE5vZGVzO1xuICAgICAgICBpZiAoZS50eXBlID09PSBcIkRPTU5vZGVJbnNlcnRlZFwiKSB7XG4gICAgICAgICAgYWRkZWROb2RlcyA9IFsgY2hhbmdlZE5vZGUgXTtcbiAgICAgICAgICByZW1vdmVkTm9kZXMgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlZE5vZGVzID0gW107XG4gICAgICAgICAgcmVtb3ZlZE5vZGVzID0gWyBjaGFuZ2VkTm9kZSBdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSBjaGFuZ2VkTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IGNoYW5nZWROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB2YXIgcmVjb3JkID0gZ2V0UmVjb3JkKFwiY2hpbGRMaXN0XCIsIGUudGFyZ2V0LnBhcmVudE5vZGUpO1xuICAgICAgICByZWNvcmQuYWRkZWROb2RlcyA9IGFkZGVkTm9kZXM7XG4gICAgICAgIHJlY29yZC5yZW1vdmVkTm9kZXMgPSByZW1vdmVkTm9kZXM7XG4gICAgICAgIHJlY29yZC5wcmV2aW91c1NpYmxpbmcgPSBwcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIHJlY29yZC5uZXh0U2libGluZyA9IG5leHRTaWJsaW5nO1xuICAgICAgICBmb3JFYWNoQW5jZXN0b3JBbmRPYnNlcnZlckVucXVldWVSZWNvcmQoZS5yZWxhdGVkTm9kZSwgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5jaGlsZExpc3QpIHJldHVybjtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNsZWFyUmVjb3JkcygpO1xuICAgIH1cbiAgfTtcbiAgZ2xvYmFsLkpzTXV0YXRpb25PYnNlcnZlciA9IEpzTXV0YXRpb25PYnNlcnZlcjtcbiAgaWYgKCFnbG9iYWwuTXV0YXRpb25PYnNlcnZlcikgZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgPSBKc011dGF0aW9uT2JzZXJ2ZXI7XG59KSh0aGlzKTtcblxud2luZG93LkN1c3RvbUVsZW1lbnRzID0gd2luZG93LkN1c3RvbUVsZW1lbnRzIHx8IHtcbiAgZmxhZ3M6IHt9XG59O1xuXG4oZnVuY3Rpb24oc2NvcGUpIHtcbiAgdmFyIGZsYWdzID0gc2NvcGUuZmxhZ3M7XG4gIHZhciBtb2R1bGVzID0gW107XG4gIHZhciBhZGRNb2R1bGUgPSBmdW5jdGlvbihtb2R1bGUpIHtcbiAgICBtb2R1bGVzLnB1c2gobW9kdWxlKTtcbiAgfTtcbiAgdmFyIGluaXRpYWxpemVNb2R1bGVzID0gZnVuY3Rpb24oKSB7XG4gICAgbW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uKG1vZHVsZSkge1xuICAgICAgbW9kdWxlKHNjb3BlKTtcbiAgICB9KTtcbiAgfTtcbiAgc2NvcGUuYWRkTW9kdWxlID0gYWRkTW9kdWxlO1xuICBzY29wZS5pbml0aWFsaXplTW9kdWxlcyA9IGluaXRpYWxpemVNb2R1bGVzO1xuICBzY29wZS5oYXNOYXRpdmUgPSBCb29sZWFuKGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCk7XG4gIHNjb3BlLnVzZU5hdGl2ZSA9ICFmbGFncy5yZWdpc3RlciAmJiBzY29wZS5oYXNOYXRpdmUgJiYgIXdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCAmJiAoIXdpbmRvdy5IVE1MSW1wb3J0cyB8fCBIVE1MSW1wb3J0cy51c2VOYXRpdmUpO1xufSkod2luZG93LkN1c3RvbUVsZW1lbnRzKTtcblxud2luZG93LkN1c3RvbUVsZW1lbnRzLmFkZE1vZHVsZShmdW5jdGlvbihzY29wZSkge1xuICB2YXIgSU1QT1JUX0xJTktfVFlQRSA9IHdpbmRvdy5IVE1MSW1wb3J0cyA/IEhUTUxJbXBvcnRzLklNUE9SVF9MSU5LX1RZUEUgOiBcIm5vbmVcIjtcbiAgZnVuY3Rpb24gZm9yU3VidHJlZShub2RlLCBjYikge1xuICAgIGZpbmRBbGxFbGVtZW50cyhub2RlLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoY2IoZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3JSb290cyhlLCBjYik7XG4gICAgfSk7XG4gICAgZm9yUm9vdHMobm9kZSwgY2IpO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRBbGxFbGVtZW50cyhub2RlLCBmaW5kLCBkYXRhKSB7XG4gICAgdmFyIGUgPSBub2RlLmZpcnN0RWxlbWVudENoaWxkO1xuICAgIGlmICghZSkge1xuICAgICAgZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgIHdoaWxlIChlICYmIGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIGUgPSBlLm5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoZSkge1xuICAgICAgaWYgKGZpbmQoZSwgZGF0YSkgIT09IHRydWUpIHtcbiAgICAgICAgZmluZEFsbEVsZW1lbnRzKGUsIGZpbmQsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZSA9IGUubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBmb3JSb290cyhub2RlLCBjYikge1xuICAgIHZhciByb290ID0gbm9kZS5zaGFkb3dSb290O1xuICAgIHdoaWxlIChyb290KSB7XG4gICAgICBmb3JTdWJ0cmVlKHJvb3QsIGNiKTtcbiAgICAgIHJvb3QgPSByb290Lm9sZGVyU2hhZG93Um9vdDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZm9yRG9jdW1lbnRUcmVlKGRvYywgY2IpIHtcbiAgICBfZm9yRG9jdW1lbnRUcmVlKGRvYywgY2IsIFtdKTtcbiAgfVxuICBmdW5jdGlvbiBfZm9yRG9jdW1lbnRUcmVlKGRvYywgY2IsIHByb2Nlc3NpbmdEb2N1bWVudHMpIHtcbiAgICBkb2MgPSB3cmFwKGRvYyk7XG4gICAgaWYgKHByb2Nlc3NpbmdEb2N1bWVudHMuaW5kZXhPZihkb2MpID49IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzc2luZ0RvY3VtZW50cy5wdXNoKGRvYyk7XG4gICAgdmFyIGltcG9ydHMgPSBkb2MucXVlcnlTZWxlY3RvckFsbChcImxpbmtbcmVsPVwiICsgSU1QT1JUX0xJTktfVFlQRSArIFwiXVwiKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGltcG9ydHMubGVuZ3RoLCBuOyBpIDwgbCAmJiAobiA9IGltcG9ydHNbaV0pOyBpKyspIHtcbiAgICAgIGlmIChuLmltcG9ydCkge1xuICAgICAgICBfZm9yRG9jdW1lbnRUcmVlKG4uaW1wb3J0LCBjYiwgcHJvY2Vzc2luZ0RvY3VtZW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNiKGRvYyk7XG4gIH1cbiAgc2NvcGUuZm9yRG9jdW1lbnRUcmVlID0gZm9yRG9jdW1lbnRUcmVlO1xuICBzY29wZS5mb3JTdWJ0cmVlID0gZm9yU3VidHJlZTtcbn0pO1xuXG53aW5kb3cuQ3VzdG9tRWxlbWVudHMuYWRkTW9kdWxlKGZ1bmN0aW9uKHNjb3BlKSB7XG4gIHZhciBmbGFncyA9IHNjb3BlLmZsYWdzO1xuICB2YXIgZm9yU3VidHJlZSA9IHNjb3BlLmZvclN1YnRyZWU7XG4gIHZhciBmb3JEb2N1bWVudFRyZWUgPSBzY29wZS5mb3JEb2N1bWVudFRyZWU7XG4gIGZ1bmN0aW9uIGFkZGVkTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIGFkZGVkKG5vZGUpIHx8IGFkZGVkU3VidHJlZShub2RlKTtcbiAgfVxuICBmdW5jdGlvbiBhZGRlZChub2RlKSB7XG4gICAgaWYgKHNjb3BlLnVwZ3JhZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhdHRhY2hlZChub2RlKTtcbiAgfVxuICBmdW5jdGlvbiBhZGRlZFN1YnRyZWUobm9kZSkge1xuICAgIGZvclN1YnRyZWUobm9kZSwgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKGFkZGVkKGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGF0dGFjaGVkTm9kZShub2RlKSB7XG4gICAgYXR0YWNoZWQobm9kZSk7XG4gICAgaWYgKGluRG9jdW1lbnQobm9kZSkpIHtcbiAgICAgIGZvclN1YnRyZWUobm9kZSwgZnVuY3Rpb24oZSkge1xuICAgICAgICBhdHRhY2hlZChlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB2YXIgaGFzUG9seWZpbGxNdXRhdGlvbnMgPSAhd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgPT09IHdpbmRvdy5Kc011dGF0aW9uT2JzZXJ2ZXI7XG4gIHNjb3BlLmhhc1BvbHlmaWxsTXV0YXRpb25zID0gaGFzUG9seWZpbGxNdXRhdGlvbnM7XG4gIHZhciBpc1BlbmRpbmdNdXRhdGlvbnMgPSBmYWxzZTtcbiAgdmFyIHBlbmRpbmdNdXRhdGlvbnMgPSBbXTtcbiAgZnVuY3Rpb24gZGVmZXJNdXRhdGlvbihmbikge1xuICAgIHBlbmRpbmdNdXRhdGlvbnMucHVzaChmbik7XG4gICAgaWYgKCFpc1BlbmRpbmdNdXRhdGlvbnMpIHtcbiAgICAgIGlzUGVuZGluZ011dGF0aW9ucyA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KHRha2VNdXRhdGlvbnMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB0YWtlTXV0YXRpb25zKCkge1xuICAgIGlzUGVuZGluZ011dGF0aW9ucyA9IGZhbHNlO1xuICAgIHZhciAkcCA9IHBlbmRpbmdNdXRhdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSAkcC5sZW5ndGgsIHA7IGkgPCBsICYmIChwID0gJHBbaV0pOyBpKyspIHtcbiAgICAgIHAoKTtcbiAgICB9XG4gICAgcGVuZGluZ011dGF0aW9ucyA9IFtdO1xuICB9XG4gIGZ1bmN0aW9uIGF0dGFjaGVkKGVsZW1lbnQpIHtcbiAgICBpZiAoaGFzUG9seWZpbGxNdXRhdGlvbnMpIHtcbiAgICAgIGRlZmVyTXV0YXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgIF9hdHRhY2hlZChlbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfYXR0YWNoZWQoZWxlbWVudCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIF9hdHRhY2hlZChlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuX191cGdyYWRlZF9fICYmIChlbGVtZW50LmF0dGFjaGVkQ2FsbGJhY2sgfHwgZWxlbWVudC5kZXRhY2hlZENhbGxiYWNrKSkge1xuICAgICAgaWYgKCFlbGVtZW50Ll9fYXR0YWNoZWQgJiYgaW5Eb2N1bWVudChlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50Ll9fYXR0YWNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAoZWxlbWVudC5hdHRhY2hlZENhbGxiYWNrKSB7XG4gICAgICAgICAgZWxlbWVudC5hdHRhY2hlZENhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZGV0YWNoZWROb2RlKG5vZGUpIHtcbiAgICBkZXRhY2hlZChub2RlKTtcbiAgICBmb3JTdWJ0cmVlKG5vZGUsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGRldGFjaGVkKGUpO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGRldGFjaGVkKGVsZW1lbnQpIHtcbiAgICBpZiAoaGFzUG9seWZpbGxNdXRhdGlvbnMpIHtcbiAgICAgIGRlZmVyTXV0YXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgIF9kZXRhY2hlZChlbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZGV0YWNoZWQoZWxlbWVudCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIF9kZXRhY2hlZChlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuX191cGdyYWRlZF9fICYmIChlbGVtZW50LmF0dGFjaGVkQ2FsbGJhY2sgfHwgZWxlbWVudC5kZXRhY2hlZENhbGxiYWNrKSkge1xuICAgICAgaWYgKGVsZW1lbnQuX19hdHRhY2hlZCAmJiAhaW5Eb2N1bWVudChlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50Ll9fYXR0YWNoZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuZGV0YWNoZWRDYWxsYmFjaykge1xuICAgICAgICAgIGVsZW1lbnQuZGV0YWNoZWRDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGluRG9jdW1lbnQoZWxlbWVudCkge1xuICAgIHZhciBwID0gZWxlbWVudDtcbiAgICB2YXIgZG9jID0gd3JhcChkb2N1bWVudCk7XG4gICAgd2hpbGUgKHApIHtcbiAgICAgIGlmIChwID09IGRvYykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHAgPSBwLnBhcmVudE5vZGUgfHwgcC5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICYmIHAuaG9zdDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd2F0Y2hTaGFkb3cobm9kZSkge1xuICAgIGlmIChub2RlLnNoYWRvd1Jvb3QgJiYgIW5vZGUuc2hhZG93Um9vdC5fX3dhdGNoZWQpIHtcbiAgICAgIGZsYWdzLmRvbSAmJiBjb25zb2xlLmxvZyhcIndhdGNoaW5nIHNoYWRvdy1yb290IGZvcjogXCIsIG5vZGUubG9jYWxOYW1lKTtcbiAgICAgIHZhciByb290ID0gbm9kZS5zaGFkb3dSb290O1xuICAgICAgd2hpbGUgKHJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZShyb290KTtcbiAgICAgICAgcm9vdCA9IHJvb3Qub2xkZXJTaGFkb3dSb290O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVyKG11dGF0aW9ucykge1xuICAgIGlmIChmbGFncy5kb20pIHtcbiAgICAgIHZhciBteCA9IG11dGF0aW9uc1swXTtcbiAgICAgIGlmIChteCAmJiBteC50eXBlID09PSBcImNoaWxkTGlzdFwiICYmIG14LmFkZGVkTm9kZXMpIHtcbiAgICAgICAgaWYgKG14LmFkZGVkTm9kZXMpIHtcbiAgICAgICAgICB2YXIgZCA9IG14LmFkZGVkTm9kZXNbMF07XG4gICAgICAgICAgd2hpbGUgKGQgJiYgZCAhPT0gZG9jdW1lbnQgJiYgIWQuaG9zdCkge1xuICAgICAgICAgICAgZCA9IGQucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHUgPSBkICYmIChkLlVSTCB8fCBkLl9VUkwgfHwgZC5ob3N0ICYmIGQuaG9zdC5sb2NhbE5hbWUpIHx8IFwiXCI7XG4gICAgICAgICAgdSA9IHUuc3BsaXQoXCIvP1wiKS5zaGlmdCgpLnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc29sZS5ncm91cChcIm11dGF0aW9ucyAoJWQpIFslc11cIiwgbXV0YXRpb25zLmxlbmd0aCwgdSB8fCBcIlwiKTtcbiAgICB9XG4gICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24obXgpIHtcbiAgICAgIGlmIChteC50eXBlID09PSBcImNoaWxkTGlzdFwiKSB7XG4gICAgICAgIGZvckVhY2gobXguYWRkZWROb2RlcywgZnVuY3Rpb24obikge1xuICAgICAgICAgIGlmICghbi5sb2NhbE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWRkZWROb2RlKG4pO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9yRWFjaChteC5yZW1vdmVkTm9kZXMsIGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgICBpZiAoIW4ubG9jYWxOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRldGFjaGVkTm9kZShuKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZmxhZ3MuZG9tICYmIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgfVxuICBmdW5jdGlvbiB0YWtlUmVjb3Jkcyhub2RlKSB7XG4gICAgbm9kZSA9IHdyYXAobm9kZSk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBub2RlID0gd3JhcChkb2N1bWVudCk7XG4gICAgfVxuICAgIHdoaWxlIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHZhciBvYnNlcnZlciA9IG5vZGUuX19vYnNlcnZlcjtcbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIGhhbmRsZXIob2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7XG4gICAgICB0YWtlTXV0YXRpb25zKCk7XG4gICAgfVxuICB9XG4gIHZhciBmb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbC5iaW5kKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKTtcbiAgZnVuY3Rpb24gb2JzZXJ2ZShpblJvb3QpIHtcbiAgICBpZiAoaW5Sb290Ll9fb2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoaGFuZGxlcik7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShpblJvb3QsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9KTtcbiAgICBpblJvb3QuX19vYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG4gIGZ1bmN0aW9uIHVwZ3JhZGVEb2N1bWVudChkb2MpIHtcbiAgICBkb2MgPSB3cmFwKGRvYyk7XG4gICAgZmxhZ3MuZG9tICYmIGNvbnNvbGUuZ3JvdXAoXCJ1cGdyYWRlRG9jdW1lbnQ6IFwiLCBkb2MuYmFzZVVSSS5zcGxpdChcIi9cIikucG9wKCkpO1xuICAgIGFkZGVkTm9kZShkb2MpO1xuICAgIG9ic2VydmUoZG9jKTtcbiAgICBmbGFncy5kb20gJiYgY29uc29sZS5ncm91cEVuZCgpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZ3JhZGVEb2N1bWVudFRyZWUoZG9jKSB7XG4gICAgZm9yRG9jdW1lbnRUcmVlKGRvYywgdXBncmFkZURvY3VtZW50KTtcbiAgfVxuICB2YXIgb3JpZ2luYWxDcmVhdGVTaGFkb3dSb290ID0gRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdDtcbiAgaWYgKG9yaWdpbmFsQ3JlYXRlU2hhZG93Um9vdCkge1xuICAgIEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNoYWRvd1Jvb3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByb290ID0gb3JpZ2luYWxDcmVhdGVTaGFkb3dSb290LmNhbGwodGhpcyk7XG4gICAgICBDdXN0b21FbGVtZW50cy53YXRjaFNoYWRvdyh0aGlzKTtcbiAgICAgIHJldHVybiByb290O1xuICAgIH07XG4gIH1cbiAgc2NvcGUud2F0Y2hTaGFkb3cgPSB3YXRjaFNoYWRvdztcbiAgc2NvcGUudXBncmFkZURvY3VtZW50VHJlZSA9IHVwZ3JhZGVEb2N1bWVudFRyZWU7XG4gIHNjb3BlLnVwZ3JhZGVTdWJ0cmVlID0gYWRkZWRTdWJ0cmVlO1xuICBzY29wZS51cGdyYWRlQWxsID0gYWRkZWROb2RlO1xuICBzY29wZS5hdHRhY2hlZE5vZGUgPSBhdHRhY2hlZE5vZGU7XG4gIHNjb3BlLnRha2VSZWNvcmRzID0gdGFrZVJlY29yZHM7XG59KTtcblxud2luZG93LkN1c3RvbUVsZW1lbnRzLmFkZE1vZHVsZShmdW5jdGlvbihzY29wZSkge1xuICB2YXIgZmxhZ3MgPSBzY29wZS5mbGFncztcbiAgZnVuY3Rpb24gdXBncmFkZShub2RlKSB7XG4gICAgaWYgKCFub2RlLl9fdXBncmFkZWRfXyAmJiBub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGlzID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJpc1wiKTtcbiAgICAgIHZhciBkZWZpbml0aW9uID0gc2NvcGUuZ2V0UmVnaXN0ZXJlZERlZmluaXRpb24oaXMgfHwgbm9kZS5sb2NhbE5hbWUpO1xuICAgICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgICAgaWYgKGlzICYmIGRlZmluaXRpb24udGFnID09IG5vZGUubG9jYWxOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHVwZ3JhZGVXaXRoRGVmaW5pdGlvbihub2RlLCBkZWZpbml0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXMgJiYgIWRlZmluaXRpb24uZXh0ZW5kcykge1xuICAgICAgICAgIHJldHVybiB1cGdyYWRlV2l0aERlZmluaXRpb24obm9kZSwgZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBncmFkZVdpdGhEZWZpbml0aW9uKGVsZW1lbnQsIGRlZmluaXRpb24pIHtcbiAgICBmbGFncy51cGdyYWRlICYmIGNvbnNvbGUuZ3JvdXAoXCJ1cGdyYWRlOlwiLCBlbGVtZW50LmxvY2FsTmFtZSk7XG4gICAgaWYgKGRlZmluaXRpb24uaXMpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaXNcIiwgZGVmaW5pdGlvbi5pcyk7XG4gICAgfVxuICAgIGltcGxlbWVudFByb3RvdHlwZShlbGVtZW50LCBkZWZpbml0aW9uKTtcbiAgICBlbGVtZW50Ll9fdXBncmFkZWRfXyA9IHRydWU7XG4gICAgY3JlYXRlZChlbGVtZW50KTtcbiAgICBzY29wZS5hdHRhY2hlZE5vZGUoZWxlbWVudCk7XG4gICAgc2NvcGUudXBncmFkZVN1YnRyZWUoZWxlbWVudCk7XG4gICAgZmxhZ3MudXBncmFkZSAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgZnVuY3Rpb24gaW1wbGVtZW50UHJvdG90eXBlKGVsZW1lbnQsIGRlZmluaXRpb24pIHtcbiAgICBpZiAoT2JqZWN0Ll9fcHJvdG9fXykge1xuICAgICAgZWxlbWVudC5fX3Byb3RvX18gPSBkZWZpbml0aW9uLnByb3RvdHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VzdG9tTWl4aW4oZWxlbWVudCwgZGVmaW5pdGlvbi5wcm90b3R5cGUsIGRlZmluaXRpb24ubmF0aXZlKTtcbiAgICAgIGVsZW1lbnQuX19wcm90b19fID0gZGVmaW5pdGlvbi5wcm90b3R5cGU7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGN1c3RvbU1peGluKGluVGFyZ2V0LCBpblNyYywgaW5OYXRpdmUpIHtcbiAgICB2YXIgdXNlZCA9IHt9O1xuICAgIHZhciBwID0gaW5TcmM7XG4gICAgd2hpbGUgKHAgIT09IGluTmF0aXZlICYmIHAgIT09IEhUTUxFbGVtZW50LnByb3RvdHlwZSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBrOyBrID0ga2V5c1tpXTsgaSsrKSB7XG4gICAgICAgIGlmICghdXNlZFtrXSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpblRhcmdldCwgaywgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwLCBrKSk7XG4gICAgICAgICAgdXNlZFtrXSA9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHAgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZWQoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LmNyZWF0ZWRDYWxsYmFjaykge1xuICAgICAgZWxlbWVudC5jcmVhdGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbiAgc2NvcGUudXBncmFkZSA9IHVwZ3JhZGU7XG4gIHNjb3BlLnVwZ3JhZGVXaXRoRGVmaW5pdGlvbiA9IHVwZ3JhZGVXaXRoRGVmaW5pdGlvbjtcbiAgc2NvcGUuaW1wbGVtZW50UHJvdG90eXBlID0gaW1wbGVtZW50UHJvdG90eXBlO1xufSk7XG5cbndpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oc2NvcGUpIHtcbiAgdmFyIGlzSUUxMU9yT2xkZXIgPSBzY29wZS5pc0lFMTFPck9sZGVyO1xuICB2YXIgdXBncmFkZURvY3VtZW50VHJlZSA9IHNjb3BlLnVwZ3JhZGVEb2N1bWVudFRyZWU7XG4gIHZhciB1cGdyYWRlQWxsID0gc2NvcGUudXBncmFkZUFsbDtcbiAgdmFyIHVwZ3JhZGVXaXRoRGVmaW5pdGlvbiA9IHNjb3BlLnVwZ3JhZGVXaXRoRGVmaW5pdGlvbjtcbiAgdmFyIGltcGxlbWVudFByb3RvdHlwZSA9IHNjb3BlLmltcGxlbWVudFByb3RvdHlwZTtcbiAgdmFyIHVzZU5hdGl2ZSA9IHNjb3BlLnVzZU5hdGl2ZTtcbiAgZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBkZWZpbml0aW9uID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDogZmlyc3QgYXJndW1lbnQgYG5hbWVgIG11c3Qgbm90IGJlIGVtcHR5XCIpO1xuICAgIH1cbiAgICBpZiAobmFtZS5pbmRleE9mKFwiLVwiKSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDogZmlyc3QgYXJndW1lbnQgKCduYW1lJykgbXVzdCBjb250YWluIGEgZGFzaCAoJy0nKS4gQXJndW1lbnQgcHJvdmlkZWQgd2FzICdcIiArIFN0cmluZyhuYW1lKSArIFwiJy5cIik7XG4gICAgfVxuICAgIGlmIChpc1Jlc2VydmVkVGFnKG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAncmVnaXN0ZXJFbGVtZW50JyBvbiAnRG9jdW1lbnQnOiBSZWdpc3RyYXRpb24gZmFpbGVkIGZvciB0eXBlICdcIiArIFN0cmluZyhuYW1lKSArIFwiJy4gVGhlIHR5cGUgbmFtZSBpcyBpbnZhbGlkLlwiKTtcbiAgICB9XG4gICAgaWYgKGdldFJlZ2lzdGVyZWREZWZpbml0aW9uKG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEdXBsaWNhdGVEZWZpbml0aW9uRXJyb3I6IGEgdHlwZSB3aXRoIG5hbWUgJ1wiICsgU3RyaW5nKG5hbWUpICsgXCInIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFkZWZpbml0aW9uLnByb3RvdHlwZSkge1xuICAgICAgZGVmaW5pdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7XG4gICAgfVxuICAgIGRlZmluaXRpb24uX19uYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGRlZmluaXRpb24ubGlmZWN5Y2xlID0gZGVmaW5pdGlvbi5saWZlY3ljbGUgfHwge307XG4gICAgZGVmaW5pdGlvbi5hbmNlc3RyeSA9IGFuY2VzdHJ5KGRlZmluaXRpb24uZXh0ZW5kcyk7XG4gICAgcmVzb2x2ZVRhZ05hbWUoZGVmaW5pdGlvbik7XG4gICAgcmVzb2x2ZVByb3RvdHlwZUNoYWluKGRlZmluaXRpb24pO1xuICAgIG92ZXJyaWRlQXR0cmlidXRlQXBpKGRlZmluaXRpb24ucHJvdG90eXBlKTtcbiAgICByZWdpc3RlckRlZmluaXRpb24oZGVmaW5pdGlvbi5fX25hbWUsIGRlZmluaXRpb24pO1xuICAgIGRlZmluaXRpb24uY3RvciA9IGdlbmVyYXRlQ29uc3RydWN0b3IoZGVmaW5pdGlvbik7XG4gICAgZGVmaW5pdGlvbi5jdG9yLnByb3RvdHlwZSA9IGRlZmluaXRpb24ucHJvdG90eXBlO1xuICAgIGRlZmluaXRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZGVmaW5pdGlvbi5jdG9yO1xuICAgIGlmIChzY29wZS5yZWFkeSkge1xuICAgICAgdXBncmFkZURvY3VtZW50VHJlZShkb2N1bWVudCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uLmN0b3I7XG4gIH1cbiAgZnVuY3Rpb24gb3ZlcnJpZGVBdHRyaWJ1dGVBcGkocHJvdG90eXBlKSB7XG4gICAgaWYgKHByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuX3BvbHlmaWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNldEF0dHJpYnV0ZSA9IHByb3RvdHlwZS5zZXRBdHRyaWJ1dGU7XG4gICAgcHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICBjaGFuZ2VBdHRyaWJ1dGUuY2FsbCh0aGlzLCBuYW1lLCB2YWx1ZSwgc2V0QXR0cmlidXRlKTtcbiAgICB9O1xuICAgIHZhciByZW1vdmVBdHRyaWJ1dGUgPSBwcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlO1xuICAgIHByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBjaGFuZ2VBdHRyaWJ1dGUuY2FsbCh0aGlzLCBuYW1lLCBudWxsLCByZW1vdmVBdHRyaWJ1dGUpO1xuICAgIH07XG4gICAgcHJvdG90eXBlLnNldEF0dHJpYnV0ZS5fcG9seWZpbGxlZCA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gY2hhbmdlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBvcGVyYXRpb24pIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIG9wZXJhdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayAmJiBuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGlzUmVzZXJ2ZWRUYWcobmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzZXJ2ZWRUYWdMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gcmVzZXJ2ZWRUYWdMaXN0W2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgcmVzZXJ2ZWRUYWdMaXN0ID0gWyBcImFubm90YXRpb24teG1sXCIsIFwiY29sb3ItcHJvZmlsZVwiLCBcImZvbnQtZmFjZVwiLCBcImZvbnQtZmFjZS1zcmNcIiwgXCJmb250LWZhY2UtdXJpXCIsIFwiZm9udC1mYWNlLWZvcm1hdFwiLCBcImZvbnQtZmFjZS1uYW1lXCIsIFwibWlzc2luZy1nbHlwaFwiIF07XG4gIGZ1bmN0aW9uIGFuY2VzdHJ5KGV4dG5kcykge1xuICAgIHZhciBleHRlbmRlZSA9IGdldFJlZ2lzdGVyZWREZWZpbml0aW9uKGV4dG5kcyk7XG4gICAgaWYgKGV4dGVuZGVlKSB7XG4gICAgICByZXR1cm4gYW5jZXN0cnkoZXh0ZW5kZWUuZXh0ZW5kcykuY29uY2F0KFsgZXh0ZW5kZWUgXSk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuICBmdW5jdGlvbiByZXNvbHZlVGFnTmFtZShkZWZpbml0aW9uKSB7XG4gICAgdmFyIGJhc2VUYWcgPSBkZWZpbml0aW9uLmV4dGVuZHM7XG4gICAgZm9yICh2YXIgaSA9IDAsIGE7IGEgPSBkZWZpbml0aW9uLmFuY2VzdHJ5W2ldOyBpKyspIHtcbiAgICAgIGJhc2VUYWcgPSBhLmlzICYmIGEudGFnO1xuICAgIH1cbiAgICBkZWZpbml0aW9uLnRhZyA9IGJhc2VUYWcgfHwgZGVmaW5pdGlvbi5fX25hbWU7XG4gICAgaWYgKGJhc2VUYWcpIHtcbiAgICAgIGRlZmluaXRpb24uaXMgPSBkZWZpbml0aW9uLl9fbmFtZTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVzb2x2ZVByb3RvdHlwZUNoYWluKGRlZmluaXRpb24pIHtcbiAgICBpZiAoIU9iamVjdC5fX3Byb3RvX18pIHtcbiAgICAgIHZhciBuYXRpdmVQcm90b3R5cGUgPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7XG4gICAgICBpZiAoZGVmaW5pdGlvbi5pcykge1xuICAgICAgICB2YXIgaW5zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZGVmaW5pdGlvbi50YWcpO1xuICAgICAgICB2YXIgZXhwZWN0ZWRQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5zdCk7XG4gICAgICAgIGlmIChleHBlY3RlZFByb3RvdHlwZSA9PT0gZGVmaW5pdGlvbi5wcm90b3R5cGUpIHtcbiAgICAgICAgICBuYXRpdmVQcm90b3R5cGUgPSBleHBlY3RlZFByb3RvdHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZGVmaW5pdGlvbi5wcm90b3R5cGUsIGFuY2VzdG9yO1xuICAgICAgd2hpbGUgKHByb3RvICYmIHByb3RvICE9PSBuYXRpdmVQcm90b3R5cGUpIHtcbiAgICAgICAgYW5jZXN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBwcm90by5fX3Byb3RvX18gPSBhbmNlc3RvcjtcbiAgICAgICAgcHJvdG8gPSBhbmNlc3RvcjtcbiAgICAgIH1cbiAgICAgIGRlZmluaXRpb24ubmF0aXZlID0gbmF0aXZlUHJvdG90eXBlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpbnN0YW50aWF0ZShkZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuIHVwZ3JhZGVXaXRoRGVmaW5pdGlvbihkb21DcmVhdGVFbGVtZW50KGRlZmluaXRpb24udGFnKSwgZGVmaW5pdGlvbik7XG4gIH1cbiAgdmFyIHJlZ2lzdHJ5ID0ge307XG4gIGZ1bmN0aW9uIGdldFJlZ2lzdGVyZWREZWZpbml0aW9uKG5hbWUpIHtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuIHJlZ2lzdHJ5W25hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyRGVmaW5pdGlvbihuYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgcmVnaXN0cnlbbmFtZV0gPSBkZWZpbml0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlQ29uc3RydWN0b3IoZGVmaW5pdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpbnN0YW50aWF0ZShkZWZpbml0aW9uKTtcbiAgICB9O1xuICB9XG4gIHZhciBIVE1MX05BTUVTUEFDRSA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCB0YWcsIHR5cGVFeHRlbnNpb24pIHtcbiAgICBpZiAobmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodGFnLCB0eXBlRXh0ZW5zaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRvbUNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIHRhZyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnLCB0eXBlRXh0ZW5zaW9uKSB7XG4gICAgaWYgKHRhZykge1xuICAgICAgdGFnID0gdGFnLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmICh0eXBlRXh0ZW5zaW9uKSB7XG4gICAgICB0eXBlRXh0ZW5zaW9uID0gdHlwZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICB2YXIgZGVmaW5pdGlvbiA9IGdldFJlZ2lzdGVyZWREZWZpbml0aW9uKHR5cGVFeHRlbnNpb24gfHwgdGFnKTtcbiAgICBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgaWYgKHRhZyA9PSBkZWZpbml0aW9uLnRhZyAmJiB0eXBlRXh0ZW5zaW9uID09IGRlZmluaXRpb24uaXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBkZWZpbml0aW9uLmN0b3IoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdHlwZUV4dGVuc2lvbiAmJiAhZGVmaW5pdGlvbi5pcykge1xuICAgICAgICByZXR1cm4gbmV3IGRlZmluaXRpb24uY3RvcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZWxlbWVudDtcbiAgICBpZiAodHlwZUV4dGVuc2lvbikge1xuICAgICAgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaXNcIiwgdHlwZUV4dGVuc2lvbik7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgZWxlbWVudCA9IGRvbUNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAodGFnLmluZGV4T2YoXCItXCIpID49IDApIHtcbiAgICAgIGltcGxlbWVudFByb3RvdHlwZShlbGVtZW50LCBIVE1MRWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIHZhciBkb21DcmVhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudC5iaW5kKGRvY3VtZW50KTtcbiAgdmFyIGRvbUNyZWF0ZUVsZW1lbnROUyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUy5iaW5kKGRvY3VtZW50KTtcbiAgdmFyIGlzSW5zdGFuY2U7XG4gIGlmICghT2JqZWN0Ll9fcHJvdG9fXyAmJiAhdXNlTmF0aXZlKSB7XG4gICAgaXNJbnN0YW5jZSA9IGZ1bmN0aW9uKG9iaiwgY3Rvcikge1xuICAgICAgdmFyIHAgPSBvYmo7XG4gICAgICB3aGlsZSAocCkge1xuICAgICAgICBpZiAocCA9PT0gY3Rvci5wcm90b3R5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBwID0gcC5fX3Byb3RvX187XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBpc0luc3RhbmNlID0gZnVuY3Rpb24ob2JqLCBiYXNlKSB7XG4gICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgYmFzZTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHdyYXBEb21NZXRob2RUb0ZvcmNlVXBncmFkZShvYmosIG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgb3JpZyA9IG9ialttZXRob2ROYW1lXTtcbiAgICBvYmpbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBuID0gb3JpZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdXBncmFkZUFsbChuKTtcbiAgICAgIHJldHVybiBuO1xuICAgIH07XG4gIH1cbiAgd3JhcERvbU1ldGhvZFRvRm9yY2VVcGdyYWRlKE5vZGUucHJvdG90eXBlLCBcImNsb25lTm9kZVwiKTtcbiAgd3JhcERvbU1ldGhvZFRvRm9yY2VVcGdyYWRlKGRvY3VtZW50LCBcImltcG9ydE5vZGVcIik7XG4gIGlmIChpc0lFMTFPck9sZGVyKSB7XG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGltcG9ydE5vZGUgPSBkb2N1bWVudC5pbXBvcnROb2RlO1xuICAgICAgZG9jdW1lbnQuaW1wb3J0Tm9kZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbiA9IGltcG9ydE5vZGUuYXBwbHkoZG9jdW1lbnQsIGFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChuLm5vZGVUeXBlID09IG4uRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkge1xuICAgICAgICAgIHZhciBmID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgIGYuYXBwZW5kQ2hpbGQobik7XG4gICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKTtcbiAgfVxuICBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQgPSByZWdpc3RlcjtcbiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQ7XG4gIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyA9IGNyZWF0ZUVsZW1lbnROUztcbiAgc2NvcGUucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgc2NvcGUuaW5zdGFuY2VvZiA9IGlzSW5zdGFuY2U7XG4gIHNjb3BlLnJlc2VydmVkVGFnTGlzdCA9IHJlc2VydmVkVGFnTGlzdDtcbiAgc2NvcGUuZ2V0UmVnaXN0ZXJlZERlZmluaXRpb24gPSBnZXRSZWdpc3RlcmVkRGVmaW5pdGlvbjtcbiAgZG9jdW1lbnQucmVnaXN0ZXIgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQ7XG59KTtcblxuKGZ1bmN0aW9uKHNjb3BlKSB7XG4gIHZhciB1c2VOYXRpdmUgPSBzY29wZS51c2VOYXRpdmU7XG4gIHZhciBpbml0aWFsaXplTW9kdWxlcyA9IHNjb3BlLmluaXRpYWxpemVNb2R1bGVzO1xuICB2YXIgaXNJRTExT3JPbGRlciA9IC9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICBpZiAodXNlTmF0aXZlKSB7XG4gICAgdmFyIG5vcCA9IGZ1bmN0aW9uKCkge307XG4gICAgc2NvcGUud2F0Y2hTaGFkb3cgPSBub3A7XG4gICAgc2NvcGUudXBncmFkZSA9IG5vcDtcbiAgICBzY29wZS51cGdyYWRlQWxsID0gbm9wO1xuICAgIHNjb3BlLnVwZ3JhZGVEb2N1bWVudFRyZWUgPSBub3A7XG4gICAgc2NvcGUudXBncmFkZVN1YnRyZWUgPSBub3A7XG4gICAgc2NvcGUudGFrZVJlY29yZHMgPSBub3A7XG4gICAgc2NvcGUuaW5zdGFuY2VvZiA9IGZ1bmN0aW9uKG9iaiwgYmFzZSkge1xuICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIGJhc2U7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBpbml0aWFsaXplTW9kdWxlcygpO1xuICB9XG4gIHZhciB1cGdyYWRlRG9jdW1lbnRUcmVlID0gc2NvcGUudXBncmFkZURvY3VtZW50VHJlZTtcbiAgaWYgKCF3aW5kb3cud3JhcCkge1xuICAgIGlmICh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpIHtcbiAgICAgIHdpbmRvdy53cmFwID0gU2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkO1xuICAgICAgd2luZG93LnVud3JhcCA9IFNoYWRvd0RPTVBvbHlmaWxsLnVud3JhcElmTmVlZGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cud3JhcCA9IHdpbmRvdy51bndyYXAgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICAgIHVwZ3JhZGVEb2N1bWVudFRyZWUod3JhcChkb2N1bWVudCkpO1xuICAgIGlmICh3aW5kb3cuSFRNTEltcG9ydHMpIHtcbiAgICAgIEhUTUxJbXBvcnRzLl9faW1wb3J0c1BhcnNpbmdIb29rID0gZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIHVwZ3JhZGVEb2N1bWVudFRyZWUod3JhcChlbHQuaW1wb3J0KSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBDdXN0b21FbGVtZW50cy5yZWFkeSA9IHRydWU7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIEN1c3RvbUVsZW1lbnRzLnJlYWR5VGltZSA9IERhdGUubm93KCk7XG4gICAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7XG4gICAgICAgIEN1c3RvbUVsZW1lbnRzLmVsYXBzZWQgPSBDdXN0b21FbGVtZW50cy5yZWFkeVRpbWUgLSBIVE1MSW1wb3J0cy5yZWFkeVRpbWU7XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcIldlYkNvbXBvbmVudHNSZWFkeVwiLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoaXNJRTExT3JPbGRlciAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbihpblR5cGUsIHBhcmFtcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpO1xuICAgICAgZS5pbml0Q3VzdG9tRXZlbnQoaW5UeXBlLCBCb29sZWFuKHBhcmFtcy5idWJibGVzKSwgQm9vbGVhbihwYXJhbXMuY2FuY2VsYWJsZSksIHBhcmFtcy5kZXRhaWwpO1xuICAgICAgcmV0dXJuIGU7XG4gICAgfTtcbiAgICB3aW5kb3cuQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcbiAgfVxuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8IHNjb3BlLmZsYWdzLmVhZ2VyKSB7XG4gICAgYm9vdHN0cmFwKCk7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJpbnRlcmFjdGl2ZVwiICYmICF3aW5kb3cuYXR0YWNoRXZlbnQgJiYgKCF3aW5kb3cuSFRNTEltcG9ydHMgfHwgd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5KSkge1xuICAgIGJvb3RzdHJhcCgpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsb2FkRXZlbnQgPSB3aW5kb3cuSFRNTEltcG9ydHMgJiYgIUhUTUxJbXBvcnRzLnJlYWR5ID8gXCJIVE1MSW1wb3J0c0xvYWRlZFwiIDogXCJET01Db250ZW50TG9hZGVkXCI7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIobG9hZEV2ZW50LCBib290c3RyYXApO1xuICB9XG4gIHNjb3BlLmlzSUUxMU9yT2xkZXIgPSBpc0lFMTFPck9sZGVyO1xufSkod2luZG93LkN1c3RvbUVsZW1lbnRzKTtcbiIsImlmICghd2luZG93LkN1c3RvbUV2ZW50KSB7XG4gIChmdW5jdGlvbigpIHtcbiAgICB2YXIgQ3VzdG9tRXZlbnQ7XG5cbiAgICBDdXN0b21FdmVudCA9IGZ1bmN0aW9uKGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHZhciBldnQ7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge1xuICAgICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGRldGFpbDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICByZXR1cm4gZXZ0O1xuICAgIH07XG5cbiAgICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuXG4gICAgd2luZG93LkN1c3RvbUV2ZW50ID0gQ3VzdG9tRXZlbnQ7XG4gIH0pKCk7XG59XG4iLCIvKiBTaW1wbGUgSmF2YVNjcmlwdCBJbmhlcml0YW5jZVxuICogQnkgSm9obiBSZXNpZyBodHRwOi8vZWpvaG4ub3JnL1xuICogTUlUIExpY2Vuc2VkLlxuICovXG4vLyBJbnNwaXJlZCBieSBiYXNlMiBhbmQgUHJvdG90eXBlXG4oZnVuY3Rpb24oKXtcbiAgdmFyIGluaXRpYWxpemluZyA9IGZhbHNlLCBmblRlc3QgPSAveHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6O30pID8gL1xcYl9zdXBlclxcYi8gOiAvLiovO1xuIFxuICAvLyBUaGUgYmFzZSBDbGFzcyBpbXBsZW1lbnRhdGlvbiAoZG9lcyBub3RoaW5nKVxuICB0aGlzLkNsYXNzID0gZnVuY3Rpb24oKXt9O1xuIFxuICAvLyBDcmVhdGUgYSBuZXcgQ2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIHRoaXMgY2xhc3NcbiAgQ2xhc3MuZXh0ZW5kID0gZnVuY3Rpb24ocHJvcCkge1xuICAgIHZhciBfc3VwZXIgPSB0aGlzLnByb3RvdHlwZTtcbiAgIFxuICAgIC8vIEluc3RhbnRpYXRlIGEgYmFzZSBjbGFzcyAoYnV0IG9ubHkgY3JlYXRlIHRoZSBpbnN0YW5jZSxcbiAgICAvLyBkb24ndCBydW4gdGhlIGluaXQgY29uc3RydWN0b3IpXG4gICAgaW5pdGlhbGl6aW5nID0gdHJ1ZTtcbiAgICB2YXIgcHJvdG90eXBlID0gbmV3IHRoaXMoKTtcbiAgICBpbml0aWFsaXppbmcgPSBmYWxzZTtcbiAgIFxuICAgIC8vIENvcHkgdGhlIHByb3BlcnRpZXMgb3ZlciBvbnRvIHRoZSBuZXcgcHJvdG90eXBlXG4gICAgZm9yICh2YXIgbmFtZSBpbiBwcm9wKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmdW5jdGlvblxuICAgICAgcHJvdG90eXBlW25hbWVdID0gdHlwZW9mIHByb3BbbmFtZV0gPT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIHR5cGVvZiBfc3VwZXJbbmFtZV0gPT0gXCJmdW5jdGlvblwiICYmIGZuVGVzdC50ZXN0KHByb3BbbmFtZV0pID9cbiAgICAgICAgKGZ1bmN0aW9uKG5hbWUsIGZuKXtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gdGhpcy5fc3VwZXI7XG4gICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGEgbmV3IC5fc3VwZXIoKSBtZXRob2QgdGhhdCBpcyB0aGUgc2FtZSBtZXRob2RcbiAgICAgICAgICAgIC8vIGJ1dCBvbiB0aGUgc3VwZXItY2xhc3NcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyID0gX3N1cGVyW25hbWVdO1xuICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFRoZSBtZXRob2Qgb25seSBuZWVkIHRvIGJlIGJvdW5kIHRlbXBvcmFyaWx5LCBzbyB3ZVxuICAgICAgICAgICAgLy8gcmVtb3ZlIGl0IHdoZW4gd2UncmUgZG9uZSBleGVjdXRpbmdcbiAgICAgICAgICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAgICAgICAgXG4gICAgICAgICAgICB0aGlzLl9zdXBlciA9IHRtcDtcbiAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgIH07XG4gICAgICAgIH0pKG5hbWUsIHByb3BbbmFtZV0pIDpcbiAgICAgICAgcHJvcFtuYW1lXTtcbiAgICB9XG4gICBcbiAgICAvLyBUaGUgZHVtbXkgY2xhc3MgY29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBDbGFzcygpIHtcbiAgICAgIC8vIEFsbCBjb25zdHJ1Y3Rpb24gaXMgYWN0dWFsbHkgZG9uZSBpbiB0aGUgaW5pdCBtZXRob2RcbiAgICAgIGlmICggIWluaXRpYWxpemluZyAmJiB0aGlzLmluaXQgKVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICBcbiAgICAvLyBQb3B1bGF0ZSBvdXIgY29uc3RydWN0ZWQgcHJvdG90eXBlIG9iamVjdFxuICAgIENsYXNzLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgIFxuICAgIC8vIEVuZm9yY2UgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIHdoYXQgd2UgZXhwZWN0XG4gICAgQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3M7XG4gXG4gICAgLy8gQW5kIG1ha2UgdGhpcyBjbGFzcyBleHRlbmRhYmxlXG4gICAgQ2xhc3MuZXh0ZW5kID0gYXJndW1lbnRzLmNhbGxlZTtcbiAgIFxuICAgIHJldHVybiBDbGFzcztcbiAgfTtcbn0pKCk7IiwiOyhmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHQvKipcblx0ICogQHByZXNlcnZlIEZhc3RDbGljazogcG9seWZpbGwgdG8gcmVtb3ZlIGNsaWNrIGRlbGF5cyBvbiBicm93c2VycyB3aXRoIHRvdWNoIFVJcy5cblx0ICpcblx0ICogQGNvZGluZ3N0YW5kYXJkIGZ0bGFicy1qc3YyXG5cdCAqIEBjb3B5cmlnaHQgVGhlIEZpbmFuY2lhbCBUaW1lcyBMaW1pdGVkIFtBbGwgUmlnaHRzIFJlc2VydmVkXVxuXHQgKiBAbGljZW5zZSBNSVQgTGljZW5zZSAoc2VlIExJQ0VOU0UudHh0KVxuXHQgKi9cblxuXHQvKmpzbGludCBicm93c2VyOnRydWUsIG5vZGU6dHJ1ZSovXG5cdC8qZ2xvYmFsIGRlZmluZSwgRXZlbnQsIE5vZGUqL1xuXG5cblx0LyoqXG5cdCAqIEluc3RhbnRpYXRlIGZhc3QtY2xpY2tpbmcgbGlzdGVuZXJzIG9uIHRoZSBzcGVjaWZpZWQgbGF5ZXIuXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IGxheWVyIFRoZSBsYXllciB0byBsaXN0ZW4gb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHNcblx0ICovXG5cdGZ1bmN0aW9uIEZhc3RDbGljayhsYXllciwgb3B0aW9ucykge1xuXHRcdHZhciBvbGRPbkNsaWNrO1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHQvKipcblx0XHQgKiBXaGV0aGVyIGEgY2xpY2sgaXMgY3VycmVudGx5IGJlaW5nIHRyYWNrZWQuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBib29sZWFuXG5cdFx0ICovXG5cdFx0dGhpcy50cmFja2luZ0NsaWNrID0gZmFsc2U7XG5cblxuXHRcdC8qKlxuXHRcdCAqIFRpbWVzdGFtcCBmb3Igd2hlbiBjbGljayB0cmFja2luZyBzdGFydGVkLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgbnVtYmVyXG5cdFx0ICovXG5cdFx0dGhpcy50cmFja2luZ0NsaWNrU3RhcnQgPSAwO1xuXG5cblx0XHQvKipcblx0XHQgKiBUaGUgZWxlbWVudCBiZWluZyB0cmFja2VkIGZvciBhIGNsaWNrLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgRXZlbnRUYXJnZXRcblx0XHQgKi9cblx0XHR0aGlzLnRhcmdldEVsZW1lbnQgPSBudWxsO1xuXG5cblx0XHQvKipcblx0XHQgKiBYLWNvb3JkaW5hdGUgb2YgdG91Y2ggc3RhcnQgZXZlbnQuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBudW1iZXJcblx0XHQgKi9cblx0XHR0aGlzLnRvdWNoU3RhcnRYID0gMDtcblxuXG5cdFx0LyoqXG5cdFx0ICogWS1jb29yZGluYXRlIG9mIHRvdWNoIHN0YXJ0IGV2ZW50LlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgbnVtYmVyXG5cdFx0ICovXG5cdFx0dGhpcy50b3VjaFN0YXJ0WSA9IDA7XG5cblxuXHRcdC8qKlxuXHRcdCAqIElEIG9mIHRoZSBsYXN0IHRvdWNoLCByZXRyaWV2ZWQgZnJvbSBUb3VjaC5pZGVudGlmaWVyLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUgbnVtYmVyXG5cdFx0ICovXG5cdFx0dGhpcy5sYXN0VG91Y2hJZGVudGlmaWVyID0gMDtcblxuXG5cdFx0LyoqXG5cdFx0ICogVG91Y2htb3ZlIGJvdW5kYXJ5LCBiZXlvbmQgd2hpY2ggYSBjbGljayB3aWxsIGJlIGNhbmNlbGxlZC5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMudG91Y2hCb3VuZGFyeSA9IG9wdGlvbnMudG91Y2hCb3VuZGFyeSB8fCAxMDtcblxuXG5cdFx0LyoqXG5cdFx0ICogVGhlIEZhc3RDbGljayBsYXllci5cblx0XHQgKlxuXHRcdCAqIEB0eXBlIEVsZW1lbnRcblx0XHQgKi9cblx0XHR0aGlzLmxheWVyID0gbGF5ZXI7XG5cblx0XHQvKipcblx0XHQgKiBUaGUgbWluaW11bSB0aW1lIGJldHdlZW4gdGFwKHRvdWNoc3RhcnQgYW5kIHRvdWNoZW5kKSBldmVudHNcblx0XHQgKlxuXHRcdCAqIEB0eXBlIG51bWJlclxuXHRcdCAqL1xuXHRcdHRoaXMudGFwRGVsYXkgPSBvcHRpb25zLnRhcERlbGF5IHx8IDIwMDtcblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBtYXhpbXVtIHRpbWUgZm9yIGEgdGFwXG5cdFx0ICpcblx0XHQgKiBAdHlwZSBudW1iZXJcblx0XHQgKi9cblx0XHR0aGlzLnRhcFRpbWVvdXQgPSBvcHRpb25zLnRhcFRpbWVvdXQgfHwgNzAwO1xuXG5cdFx0aWYgKEZhc3RDbGljay5ub3ROZWVkZWQobGF5ZXIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gU29tZSBvbGQgdmVyc2lvbnMgb2YgQW5kcm9pZCBkb24ndCBoYXZlIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG5cdFx0ZnVuY3Rpb24gYmluZChtZXRob2QsIGNvbnRleHQpIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ldGhvZC5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpOyB9O1xuXHRcdH1cblxuXG5cdFx0dmFyIG1ldGhvZHMgPSBbJ29uTW91c2UnLCAnb25DbGljaycsICdvblRvdWNoU3RhcnQnLCAnb25Ub3VjaE1vdmUnLCAnb25Ub3VjaEVuZCcsICdvblRvdWNoQ2FuY2VsJ107XG5cdFx0dmFyIGNvbnRleHQgPSB0aGlzO1xuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdGNvbnRleHRbbWV0aG9kc1tpXV0gPSBiaW5kKGNvbnRleHRbbWV0aG9kc1tpXV0sIGNvbnRleHQpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB1cCBldmVudCBoYW5kbGVycyBhcyByZXF1aXJlZFxuXHRcdGlmIChkZXZpY2VJc0FuZHJvaWQpIHtcblx0XHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMub25Nb3VzZSwgdHJ1ZSk7XG5cdFx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2UsIHRydWUpO1xuXHRcdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0bGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2ssIHRydWUpO1xuXHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uVG91Y2hTdGFydCwgZmFsc2UpO1xuXHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmUsIGZhbHNlKTtcblx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZCwgZmFsc2UpO1xuXHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5vblRvdWNoQ2FuY2VsLCBmYWxzZSk7XG5cblx0XHQvLyBIYWNrIGlzIHJlcXVpcmVkIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgRXZlbnQjc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIChlLmcuIEFuZHJvaWQgMilcblx0XHQvLyB3aGljaCBpcyBob3cgRmFzdENsaWNrIG5vcm1hbGx5IHN0b3BzIGNsaWNrIGV2ZW50cyBidWJibGluZyB0byBjYWxsYmFja3MgcmVnaXN0ZXJlZCBvbiB0aGUgRmFzdENsaWNrXG5cdFx0Ly8gbGF5ZXIgd2hlbiB0aGV5IGFyZSBjYW5jZWxsZWQuXG5cdFx0aWYgKCFFdmVudC5wcm90b3R5cGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSB7XG5cdFx0XHRsYXllci5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgY2FsbGJhY2ssIGNhcHR1cmUpIHtcblx0XHRcdFx0dmFyIHJtdiA9IE5vZGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI7XG5cdFx0XHRcdGlmICh0eXBlID09PSAnY2xpY2snKSB7XG5cdFx0XHRcdFx0cm12LmNhbGwobGF5ZXIsIHR5cGUsIGNhbGxiYWNrLmhpamFja2VkIHx8IGNhbGxiYWNrLCBjYXB0dXJlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRybXYuY2FsbChsYXllciwgdHlwZSwgY2FsbGJhY2ssIGNhcHR1cmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRsYXllci5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgY2FsbGJhY2ssIGNhcHR1cmUpIHtcblx0XHRcdFx0dmFyIGFkdiA9IE5vZGUucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI7XG5cdFx0XHRcdGlmICh0eXBlID09PSAnY2xpY2snKSB7XG5cdFx0XHRcdFx0YWR2LmNhbGwobGF5ZXIsIHR5cGUsIGNhbGxiYWNrLmhpamFja2VkIHx8IChjYWxsYmFjay5oaWphY2tlZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHRpZiAoIWV2ZW50LnByb3BhZ2F0aW9uU3RvcHBlZCkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayhldmVudCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksIGNhcHR1cmUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFkdi5jYWxsKGxheWVyLCB0eXBlLCBjYWxsYmFjaywgY2FwdHVyZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gSWYgYSBoYW5kbGVyIGlzIGFscmVhZHkgZGVjbGFyZWQgaW4gdGhlIGVsZW1lbnQncyBvbmNsaWNrIGF0dHJpYnV0ZSwgaXQgd2lsbCBiZSBmaXJlZCBiZWZvcmVcblx0XHQvLyBGYXN0Q2xpY2sncyBvbkNsaWNrIGhhbmRsZXIuIEZpeCB0aGlzIGJ5IHB1bGxpbmcgb3V0IHRoZSB1c2VyLWRlZmluZWQgaGFuZGxlciBmdW5jdGlvbiBhbmRcblx0XHQvLyBhZGRpbmcgaXQgYXMgbGlzdGVuZXIuXG5cdFx0aWYgKHR5cGVvZiBsYXllci5vbmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG5cblx0XHRcdC8vIEFuZHJvaWQgYnJvd3NlciBvbiBhdCBsZWFzdCAzLjIgcmVxdWlyZXMgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBpbiBsYXllci5vbmNsaWNrXG5cdFx0XHQvLyAtIHRoZSBvbGQgb25lIHdvbid0IHdvcmsgaWYgcGFzc2VkIHRvIGFkZEV2ZW50TGlzdGVuZXIgZGlyZWN0bHkuXG5cdFx0XHRvbGRPbkNsaWNrID0gbGF5ZXIub25jbGljaztcblx0XHRcdGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0b2xkT25DbGljayhldmVudCk7XG5cdFx0XHR9LCBmYWxzZSk7XG5cdFx0XHRsYXllci5vbmNsaWNrID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBXaW5kb3dzIFBob25lIDguMSBmYWtlcyB1c2VyIGFnZW50IHN0cmluZyB0byBsb29rIGxpa2UgQW5kcm9pZCBhbmQgaVBob25lLlxuXHQqXG5cdCogQHR5cGUgYm9vbGVhblxuXHQqL1xuXHR2YXIgZGV2aWNlSXNXaW5kb3dzUGhvbmUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJXaW5kb3dzIFBob25lXCIpID49IDA7XG5cblx0LyoqXG5cdCAqIEFuZHJvaWQgcmVxdWlyZXMgZXhjZXB0aW9ucy5cblx0ICpcblx0ICogQHR5cGUgYm9vbGVhblxuXHQgKi9cblx0dmFyIGRldmljZUlzQW5kcm9pZCA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQW5kcm9pZCcpID4gMCAmJiAhZGV2aWNlSXNXaW5kb3dzUGhvbmU7XG5cblxuXHQvKipcblx0ICogaU9TIHJlcXVpcmVzIGV4Y2VwdGlvbnMuXG5cdCAqXG5cdCAqIEB0eXBlIGJvb2xlYW5cblx0ICovXG5cdHZhciBkZXZpY2VJc0lPUyA9IC9pUChhZHxob25lfG9kKS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhZGV2aWNlSXNXaW5kb3dzUGhvbmU7XG5cblxuXHQvKipcblx0ICogaU9TIDQgcmVxdWlyZXMgYW4gZXhjZXB0aW9uIGZvciBzZWxlY3QgZWxlbWVudHMuXG5cdCAqXG5cdCAqIEB0eXBlIGJvb2xlYW5cblx0ICovXG5cdHZhciBkZXZpY2VJc0lPUzQgPSBkZXZpY2VJc0lPUyAmJiAoL09TIDRfXFxkKF9cXGQpPy8pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cblxuXHQvKipcblx0ICogaU9TIDYuMC03LiogcmVxdWlyZXMgdGhlIHRhcmdldCBlbGVtZW50IHRvIGJlIG1hbnVhbGx5IGRlcml2ZWRcblx0ICpcblx0ICogQHR5cGUgYm9vbGVhblxuXHQgKi9cblx0dmFyIGRldmljZUlzSU9TV2l0aEJhZFRhcmdldCA9IGRldmljZUlzSU9TICYmICgvT1MgWzYtN11fXFxkLykudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuXHQvKipcblx0ICogQmxhY2tCZXJyeSByZXF1aXJlcyBleGNlcHRpb25zLlxuXHQgKlxuXHQgKiBAdHlwZSBib29sZWFuXG5cdCAqL1xuXHR2YXIgZGV2aWNlSXNCbGFja0JlcnJ5MTAgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0JCMTAnKSA+IDA7XG5cblx0LyoqXG5cdCAqIERldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gZWxlbWVudCByZXF1aXJlcyBhIG5hdGl2ZSBjbGljay5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldHxFbGVtZW50fSB0YXJnZXQgVGFyZ2V0IERPTSBlbGVtZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgbmVlZHMgYSBuYXRpdmUgY2xpY2tcblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUubmVlZHNDbGljayA9IGZ1bmN0aW9uKHRhcmdldCkge1xuXHRcdHN3aXRjaCAodGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcblxuXHRcdC8vIERvbid0IHNlbmQgYSBzeW50aGV0aWMgY2xpY2sgdG8gZGlzYWJsZWQgaW5wdXRzIChpc3N1ZSAjNjIpXG5cdFx0Y2FzZSAnYnV0dG9uJzpcblx0XHRjYXNlICdzZWxlY3QnOlxuXHRcdGNhc2UgJ3RleHRhcmVhJzpcblx0XHRcdGlmICh0YXJnZXQuZGlzYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2lucHV0JzpcblxuXHRcdFx0Ly8gRmlsZSBpbnB1dHMgbmVlZCByZWFsIGNsaWNrcyBvbiBpT1MgNiBkdWUgdG8gYSBicm93c2VyIGJ1ZyAoaXNzdWUgIzY4KVxuXHRcdFx0aWYgKChkZXZpY2VJc0lPUyAmJiB0YXJnZXQudHlwZSA9PT0gJ2ZpbGUnKSB8fCB0YXJnZXQuZGlzYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2xhYmVsJzpcblx0XHRjYXNlICdpZnJhbWUnOiAvLyBpT1M4IGhvbWVzY3JlZW4gYXBwcyBjYW4gcHJldmVudCBldmVudHMgYnViYmxpbmcgaW50byBmcmFtZXNcblx0XHRjYXNlICd2aWRlbyc6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKC9cXGJuZWVkc2NsaWNrXFxiLykudGVzdCh0YXJnZXQuY2xhc3NOYW1lKTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIGVsZW1lbnQgcmVxdWlyZXMgYSBjYWxsIHRvIGZvY3VzIHRvIHNpbXVsYXRlIGNsaWNrIGludG8gZWxlbWVudC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldHxFbGVtZW50fSB0YXJnZXQgVGFyZ2V0IERPTSBlbGVtZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgYSBjYWxsIHRvIGZvY3VzIHRvIHNpbXVsYXRlIG5hdGl2ZSBjbGljay5cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUubmVlZHNGb2N1cyA9IGZ1bmN0aW9uKHRhcmdldCkge1xuXHRcdHN3aXRjaCAodGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcblx0XHRjYXNlICd0ZXh0YXJlYSc6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRjYXNlICdzZWxlY3QnOlxuXHRcdFx0cmV0dXJuICFkZXZpY2VJc0FuZHJvaWQ7XG5cdFx0Y2FzZSAnaW5wdXQnOlxuXHRcdFx0c3dpdGNoICh0YXJnZXQudHlwZSkge1xuXHRcdFx0Y2FzZSAnYnV0dG9uJzpcblx0XHRcdGNhc2UgJ2NoZWNrYm94Jzpcblx0XHRcdGNhc2UgJ2ZpbGUnOlxuXHRcdFx0Y2FzZSAnaW1hZ2UnOlxuXHRcdFx0Y2FzZSAncmFkaW8nOlxuXHRcdFx0Y2FzZSAnc3VibWl0Jzpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBObyBwb2ludCBpbiBhdHRlbXB0aW5nIHRvIGZvY3VzIGRpc2FibGVkIGlucHV0c1xuXHRcdFx0cmV0dXJuICF0YXJnZXQuZGlzYWJsZWQgJiYgIXRhcmdldC5yZWFkT25seTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuICgvXFxibmVlZHNmb2N1c1xcYi8pLnRlc3QodGFyZ2V0LmNsYXNzTmFtZSk7XG5cdFx0fVxuXHR9O1xuXG5cblx0LyoqXG5cdCAqIFNlbmQgYSBjbGljayBldmVudCB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RWxlbWVudH0gdGFyZ2V0RWxlbWVudFxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5zZW5kQ2xpY2sgPSBmdW5jdGlvbih0YXJnZXRFbGVtZW50LCBldmVudCkge1xuXHRcdHZhciBjbGlja0V2ZW50LCB0b3VjaDtcblxuXHRcdC8vIE9uIHNvbWUgQW5kcm9pZCBkZXZpY2VzIGFjdGl2ZUVsZW1lbnQgbmVlZHMgdG8gYmUgYmx1cnJlZCBvdGhlcndpc2UgdGhlIHN5bnRoZXRpYyBjbGljayB3aWxsIGhhdmUgbm8gZWZmZWN0ICgjMjQpXG5cdFx0aWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGFyZ2V0RWxlbWVudCkge1xuXHRcdFx0ZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7XG5cdFx0fVxuXG5cdFx0dG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcblxuXHRcdC8vIFN5bnRoZXNpemUgYSBjbGljayBldmVudCwgd2l0aCBhbiBleHRyYSBhdHRyaWJ1dGUgc28gaXQgY2FuIGJlIHRyYWNrZWRcblx0XHRjbGlja0V2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7XG5cdFx0Y2xpY2tFdmVudC5pbml0TW91c2VFdmVudCh0aGlzLmRldGVybWluZUV2ZW50VHlwZSh0YXJnZXRFbGVtZW50KSwgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAxLCB0b3VjaC5zY3JlZW5YLCB0b3VjaC5zY3JlZW5ZLCB0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgbnVsbCk7XG5cdFx0Y2xpY2tFdmVudC5mb3J3YXJkZWRUb3VjaEV2ZW50ID0gdHJ1ZTtcblx0XHR0YXJnZXRFbGVtZW50LmRpc3BhdGNoRXZlbnQoY2xpY2tFdmVudCk7XG5cdH07XG5cblx0RmFzdENsaWNrLnByb3RvdHlwZS5kZXRlcm1pbmVFdmVudFR5cGUgPSBmdW5jdGlvbih0YXJnZXRFbGVtZW50KSB7XG5cblx0XHQvL0lzc3VlICMxNTk6IEFuZHJvaWQgQ2hyb21lIFNlbGVjdCBCb3ggZG9lcyBub3Qgb3BlbiB3aXRoIGEgc3ludGhldGljIGNsaWNrIGV2ZW50XG5cdFx0aWYgKGRldmljZUlzQW5kcm9pZCAmJiB0YXJnZXRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3NlbGVjdCcpIHtcblx0XHRcdHJldHVybiAnbW91c2Vkb3duJztcblx0XHR9XG5cblx0XHRyZXR1cm4gJ2NsaWNrJztcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEVsZW1lbnR9IHRhcmdldEVsZW1lbnRcblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUuZm9jdXMgPSBmdW5jdGlvbih0YXJnZXRFbGVtZW50KSB7XG5cdFx0dmFyIGxlbmd0aDtcblxuXHRcdC8vIElzc3VlICMxNjA6IG9uIGlPUyA3LCBzb21lIGlucHV0IGVsZW1lbnRzIChlLmcuIGRhdGUgZGF0ZXRpbWUgbW9udGgpIHRocm93IGEgdmFndWUgVHlwZUVycm9yIG9uIHNldFNlbGVjdGlvblJhbmdlLiBUaGVzZSBlbGVtZW50cyBkb24ndCBoYXZlIGFuIGludGVnZXIgdmFsdWUgZm9yIHRoZSBzZWxlY3Rpb25TdGFydCBhbmQgc2VsZWN0aW9uRW5kIHByb3BlcnRpZXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoYXQgY2FuJ3QgYmUgdXNlZCBmb3IgZGV0ZWN0aW9uIGJlY2F1c2UgYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGFsc28gdGhyb3dzIGEgVHlwZUVycm9yLiBKdXN0IGNoZWNrIHRoZSB0eXBlIGluc3RlYWQuIEZpbGVkIGFzIEFwcGxlIGJ1ZyAjMTUxMjI3MjQuXG5cdFx0aWYgKGRldmljZUlzSU9TICYmIHRhcmdldEVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UgJiYgdGFyZ2V0RWxlbWVudC50eXBlLmluZGV4T2YoJ2RhdGUnKSAhPT0gMCAmJiB0YXJnZXRFbGVtZW50LnR5cGUgIT09ICd0aW1lJyAmJiB0YXJnZXRFbGVtZW50LnR5cGUgIT09ICdtb250aCcpIHtcblx0XHRcdGxlbmd0aCA9IHRhcmdldEVsZW1lbnQudmFsdWUubGVuZ3RoO1xuXHRcdFx0dGFyZ2V0RWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShsZW5ndGgsIGxlbmd0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldEVsZW1lbnQuZm9jdXMoKTtcblx0XHR9XG5cdH07XG5cblxuXHQvKipcblx0ICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdGFyZ2V0IGVsZW1lbnQgaXMgYSBjaGlsZCBvZiBhIHNjcm9sbGFibGUgbGF5ZXIgYW5kIGlmIHNvLCBzZXQgYSBmbGFnIG9uIGl0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEVsZW1lbnR9IHRhcmdldEVsZW1lbnRcblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUudXBkYXRlU2Nyb2xsUGFyZW50ID0gZnVuY3Rpb24odGFyZ2V0RWxlbWVudCkge1xuXHRcdHZhciBzY3JvbGxQYXJlbnQsIHBhcmVudEVsZW1lbnQ7XG5cblx0XHRzY3JvbGxQYXJlbnQgPSB0YXJnZXRFbGVtZW50LmZhc3RDbGlja1Njcm9sbFBhcmVudDtcblxuXHRcdC8vIEF0dGVtcHQgdG8gZGlzY292ZXIgd2hldGhlciB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgY29udGFpbmVkIHdpdGhpbiBhIHNjcm9sbGFibGUgbGF5ZXIuIFJlLWNoZWNrIGlmIHRoZVxuXHRcdC8vIHRhcmdldCBlbGVtZW50IHdhcyBtb3ZlZCB0byBhbm90aGVyIHBhcmVudC5cblx0XHRpZiAoIXNjcm9sbFBhcmVudCB8fCAhc2Nyb2xsUGFyZW50LmNvbnRhaW5zKHRhcmdldEVsZW1lbnQpKSB7XG5cdFx0XHRwYXJlbnRFbGVtZW50ID0gdGFyZ2V0RWxlbWVudDtcblx0XHRcdGRvIHtcblx0XHRcdFx0aWYgKHBhcmVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gcGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcblx0XHRcdFx0XHRzY3JvbGxQYXJlbnQgPSBwYXJlbnRFbGVtZW50O1xuXHRcdFx0XHRcdHRhcmdldEVsZW1lbnQuZmFzdENsaWNrU2Nyb2xsUGFyZW50ID0gcGFyZW50RWxlbWVudDtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0XHR9IHdoaWxlIChwYXJlbnRFbGVtZW50KTtcblx0XHR9XG5cblx0XHQvLyBBbHdheXMgdXBkYXRlIHRoZSBzY3JvbGwgdG9wIHRyYWNrZXIgaWYgcG9zc2libGUuXG5cdFx0aWYgKHNjcm9sbFBhcmVudCkge1xuXHRcdFx0c2Nyb2xsUGFyZW50LmZhc3RDbGlja0xhc3RTY3JvbGxUb3AgPSBzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wO1xuXHRcdH1cblx0fTtcblxuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRFbGVtZW50XG5cdCAqIEByZXR1cm5zIHtFbGVtZW50fEV2ZW50VGFyZ2V0fVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5nZXRUYXJnZXRFbGVtZW50RnJvbUV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24oZXZlbnRUYXJnZXQpIHtcblxuXHRcdC8vIE9uIHNvbWUgb2xkZXIgYnJvd3NlcnMgKG5vdGFibHkgU2FmYXJpIG9uIGlPUyA0LjEgLSBzZWUgaXNzdWUgIzU2KSB0aGUgZXZlbnQgdGFyZ2V0IG1heSBiZSBhIHRleHQgbm9kZS5cblx0XHRpZiAoZXZlbnRUYXJnZXQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnRUYXJnZXQucGFyZW50Tm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnRUYXJnZXQ7XG5cdH07XG5cblxuXHQvKipcblx0ICogT24gdG91Y2ggc3RhcnQsIHJlY29yZCB0aGUgcG9zaXRpb24gYW5kIHNjcm9sbCBvZmZzZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5vblRvdWNoU3RhcnQgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciB0YXJnZXRFbGVtZW50LCB0b3VjaCwgc2VsZWN0aW9uO1xuXG5cdFx0Ly8gSWdub3JlIG11bHRpcGxlIHRvdWNoZXMsIG90aGVyd2lzZSBwaW5jaC10by16b29tIGlzIHByZXZlbnRlZCBpZiBib3RoIGZpbmdlcnMgYXJlIG9uIHRoZSBGYXN0Q2xpY2sgZWxlbWVudCAoaXNzdWUgIzExMSkuXG5cdFx0aWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dGFyZ2V0RWxlbWVudCA9IHRoaXMuZ2V0VGFyZ2V0RWxlbWVudEZyb21FdmVudFRhcmdldChldmVudC50YXJnZXQpO1xuXHRcdHRvdWNoID0gZXZlbnQudGFyZ2V0VG91Y2hlc1swXTtcblxuXHRcdGlmIChkZXZpY2VJc0lPUykge1xuXG5cdFx0XHQvLyBPbmx5IHRydXN0ZWQgZXZlbnRzIHdpbGwgZGVzZWxlY3QgdGV4dCBvbiBpT1MgKGlzc3VlICM0OSlcblx0XHRcdHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblx0XHRcdGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCAmJiAhc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWRldmljZUlzSU9TNCkge1xuXG5cdFx0XHRcdC8vIFdlaXJkIHRoaW5ncyBoYXBwZW4gb24gaU9TIHdoZW4gYW4gYWxlcnQgb3IgY29uZmlybSBkaWFsb2cgaXMgb3BlbmVkIGZyb20gYSBjbGljayBldmVudCBjYWxsYmFjayAoaXNzdWUgIzIzKTpcblx0XHRcdFx0Ly8gd2hlbiB0aGUgdXNlciBuZXh0IHRhcHMgYW55d2hlcmUgZWxzZSBvbiB0aGUgcGFnZSwgbmV3IHRvdWNoc3RhcnQgYW5kIHRvdWNoZW5kIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZFxuXHRcdFx0XHQvLyB3aXRoIHRoZSBzYW1lIGlkZW50aWZpZXIgYXMgdGhlIHRvdWNoIGV2ZW50IHRoYXQgcHJldmlvdXNseSB0cmlnZ2VyZWQgdGhlIGNsaWNrIHRoYXQgdHJpZ2dlcmVkIHRoZSBhbGVydC5cblx0XHRcdFx0Ly8gU2FkbHksIHRoZXJlIGlzIGFuIGlzc3VlIG9uIGlPUyA0IHRoYXQgY2F1c2VzIHNvbWUgbm9ybWFsIHRvdWNoIGV2ZW50cyB0byBoYXZlIHRoZSBzYW1lIGlkZW50aWZpZXIgYXMgYW5cblx0XHRcdFx0Ly8gaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRvdWNoIGV2ZW50IChpc3N1ZSAjNTIpLCBzbyB0aGlzIGZpeCBpcyB1bmF2YWlsYWJsZSBvbiB0aGF0IHBsYXRmb3JtLlxuXHRcdFx0XHQvLyBJc3N1ZSAxMjA6IHRvdWNoLmlkZW50aWZpZXIgaXMgMCB3aGVuIENocm9tZSBkZXYgdG9vbHMgJ0VtdWxhdGUgdG91Y2ggZXZlbnRzJyBpcyBzZXQgd2l0aCBhbiBpT1MgZGV2aWNlIFVBIHN0cmluZyxcblx0XHRcdFx0Ly8gd2hpY2ggY2F1c2VzIGFsbCB0b3VjaCBldmVudHMgdG8gYmUgaWdub3JlZC4gQXMgdGhpcyBibG9jayBvbmx5IGFwcGxpZXMgdG8gaU9TLCBhbmQgaU9TIGlkZW50aWZpZXJzIGFyZSBhbHdheXMgbG9uZyxcblx0XHRcdFx0Ly8gcmFuZG9tIGludGVnZXJzLCBpdCdzIHNhZmUgdG8gdG8gY29udGludWUgaWYgdGhlIGlkZW50aWZpZXIgaXMgMCBoZXJlLlxuXHRcdFx0XHRpZiAodG91Y2guaWRlbnRpZmllciAmJiB0b3VjaC5pZGVudGlmaWVyID09PSB0aGlzLmxhc3RUb3VjaElkZW50aWZpZXIpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMubGFzdFRvdWNoSWRlbnRpZmllciA9IHRvdWNoLmlkZW50aWZpZXI7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgY2hpbGQgb2YgYSBzY3JvbGxhYmxlIGxheWVyICh1c2luZyAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2gpIGFuZDpcblx0XHRcdFx0Ly8gMSkgdGhlIHVzZXIgZG9lcyBhIGZsaW5nIHNjcm9sbCBvbiB0aGUgc2Nyb2xsYWJsZSBsYXllclxuXHRcdFx0XHQvLyAyKSB0aGUgdXNlciBzdG9wcyB0aGUgZmxpbmcgc2Nyb2xsIHdpdGggYW5vdGhlciB0YXBcblx0XHRcdFx0Ly8gdGhlbiB0aGUgZXZlbnQudGFyZ2V0IG9mIHRoZSBsYXN0ICd0b3VjaGVuZCcgZXZlbnQgd2lsbCBiZSB0aGUgZWxlbWVudCB0aGF0IHdhcyB1bmRlciB0aGUgdXNlcidzIGZpbmdlclxuXHRcdFx0XHQvLyB3aGVuIHRoZSBmbGluZyBzY3JvbGwgd2FzIHN0YXJ0ZWQsIGNhdXNpbmcgRmFzdENsaWNrIHRvIHNlbmQgYSBjbGljayBldmVudCB0byB0aGF0IGxheWVyIC0gdW5sZXNzIGEgY2hlY2tcblx0XHRcdFx0Ly8gaXMgbWFkZSB0byBlbnN1cmUgdGhhdCBhIHBhcmVudCBsYXllciB3YXMgbm90IHNjcm9sbGVkIGJlZm9yZSBzZW5kaW5nIGEgc3ludGhldGljIGNsaWNrIChpc3N1ZSAjNDIpLlxuXHRcdFx0XHR0aGlzLnVwZGF0ZVNjcm9sbFBhcmVudCh0YXJnZXRFbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnRyYWNraW5nQ2xpY2sgPSB0cnVlO1xuXHRcdHRoaXMudHJhY2tpbmdDbGlja1N0YXJ0ID0gZXZlbnQudGltZVN0YW1wO1xuXHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IHRhcmdldEVsZW1lbnQ7XG5cblx0XHR0aGlzLnRvdWNoU3RhcnRYID0gdG91Y2gucGFnZVg7XG5cdFx0dGhpcy50b3VjaFN0YXJ0WSA9IHRvdWNoLnBhZ2VZO1xuXG5cdFx0Ly8gUHJldmVudCBwaGFudG9tIGNsaWNrcyBvbiBmYXN0IGRvdWJsZS10YXAgKGlzc3VlICMzNilcblx0XHRpZiAoKGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMubGFzdENsaWNrVGltZSkgPCB0aGlzLnRhcERlbGF5KSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEJhc2VkIG9uIGEgdG91Y2htb3ZlIGV2ZW50IG9iamVjdCwgY2hlY2sgd2hldGhlciB0aGUgdG91Y2ggaGFzIG1vdmVkIHBhc3QgYSBib3VuZGFyeSBzaW5jZSBpdCBzdGFydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUudG91Y2hIYXNNb3ZlZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0sIGJvdW5kYXJ5ID0gdGhpcy50b3VjaEJvdW5kYXJ5O1xuXG5cdFx0aWYgKE1hdGguYWJzKHRvdWNoLnBhZ2VYIC0gdGhpcy50b3VjaFN0YXJ0WCkgPiBib3VuZGFyeSB8fCBNYXRoLmFicyh0b3VjaC5wYWdlWSAtIHRoaXMudG91Y2hTdGFydFkpID4gYm91bmRhcnkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIGxhc3QgcG9zaXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5vblRvdWNoTW92ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0aWYgKCF0aGlzLnRyYWNraW5nQ2xpY2spIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSB0b3VjaCBoYXMgbW92ZWQsIGNhbmNlbCB0aGUgY2xpY2sgdHJhY2tpbmdcblx0XHRpZiAodGhpcy50YXJnZXRFbGVtZW50ICE9PSB0aGlzLmdldFRhcmdldEVsZW1lbnRGcm9tRXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KSB8fCB0aGlzLnRvdWNoSGFzTW92ZWQoZXZlbnQpKSB7XG5cdFx0XHR0aGlzLnRyYWNraW5nQ2xpY2sgPSBmYWxzZTtcblx0XHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cblxuXHQvKipcblx0ICogQXR0ZW1wdCB0byBmaW5kIHRoZSBsYWJlbGxlZCBjb250cm9sIGZvciB0aGUgZ2l2ZW4gbGFiZWwgZWxlbWVudC5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudFRhcmdldHxIVE1MTGFiZWxFbGVtZW50fSBsYWJlbEVsZW1lbnRcblx0ICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cblx0ICovXG5cdEZhc3RDbGljay5wcm90b3R5cGUuZmluZENvbnRyb2wgPSBmdW5jdGlvbihsYWJlbEVsZW1lbnQpIHtcblxuXHRcdC8vIEZhc3QgcGF0aCBmb3IgbmV3ZXIgYnJvd3NlcnMgc3VwcG9ydGluZyB0aGUgSFRNTDUgY29udHJvbCBhdHRyaWJ1dGVcblx0XHRpZiAobGFiZWxFbGVtZW50LmNvbnRyb2wgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGxhYmVsRWxlbWVudC5jb250cm9sO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBicm93c2VycyB1bmRlciB0ZXN0IHRoYXQgc3VwcG9ydCB0b3VjaCBldmVudHMgYWxzbyBzdXBwb3J0IHRoZSBIVE1MNSBodG1sRm9yIGF0dHJpYnV0ZVxuXHRcdGlmIChsYWJlbEVsZW1lbnQuaHRtbEZvcikge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRWxlbWVudC5odG1sRm9yKTtcblx0XHR9XG5cblx0XHQvLyBJZiBubyBmb3IgYXR0cmlidXRlIGV4aXN0cywgYXR0ZW1wdCB0byByZXRyaWV2ZSB0aGUgZmlyc3QgbGFiZWxsYWJsZSBkZXNjZW5kYW50IGVsZW1lbnRcblx0XHQvLyB0aGUgbGlzdCBvZiB3aGljaCBpcyBkZWZpbmVkIGhlcmU6IGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGFiZWxcblx0XHRyZXR1cm4gbGFiZWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiwgaW5wdXQ6bm90KFt0eXBlPWhpZGRlbl0pLCBrZXlnZW4sIG1ldGVyLCBvdXRwdXQsIHByb2dyZXNzLCBzZWxlY3QsIHRleHRhcmVhJyk7XG5cdH07XG5cblxuXHQvKipcblx0ICogT24gdG91Y2ggZW5kLCBkZXRlcm1pbmUgd2hldGhlciB0byBzZW5kIGEgY2xpY2sgZXZlbnQgYXQgb25jZS5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLm9uVG91Y2hFbmQgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciBmb3JFbGVtZW50LCB0cmFja2luZ0NsaWNrU3RhcnQsIHRhcmdldFRhZ05hbWUsIHNjcm9sbFBhcmVudCwgdG91Y2gsIHRhcmdldEVsZW1lbnQgPSB0aGlzLnRhcmdldEVsZW1lbnQ7XG5cblx0XHRpZiAoIXRoaXMudHJhY2tpbmdDbGljaykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gUHJldmVudCBwaGFudG9tIGNsaWNrcyBvbiBmYXN0IGRvdWJsZS10YXAgKGlzc3VlICMzNilcblx0XHRpZiAoKGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMubGFzdENsaWNrVGltZSkgPCB0aGlzLnRhcERlbGF5KSB7XG5cdFx0XHR0aGlzLmNhbmNlbE5leHRDbGljayA9IHRydWU7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoKGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMudHJhY2tpbmdDbGlja1N0YXJ0KSA+IHRoaXMudGFwVGltZW91dCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgdG8gcHJldmVudCB3cm9uZyBjbGljayBjYW5jZWwgb24gaW5wdXQgKGlzc3VlICMxNTYpLlxuXHRcdHRoaXMuY2FuY2VsTmV4dENsaWNrID0gZmFsc2U7XG5cblx0XHR0aGlzLmxhc3RDbGlja1RpbWUgPSBldmVudC50aW1lU3RhbXA7XG5cblx0XHR0cmFja2luZ0NsaWNrU3RhcnQgPSB0aGlzLnRyYWNraW5nQ2xpY2tTdGFydDtcblx0XHR0aGlzLnRyYWNraW5nQ2xpY2sgPSBmYWxzZTtcblx0XHR0aGlzLnRyYWNraW5nQ2xpY2tTdGFydCA9IDA7XG5cblx0XHQvLyBPbiBzb21lIGlPUyBkZXZpY2VzLCB0aGUgdGFyZ2V0RWxlbWVudCBzdXBwbGllZCB3aXRoIHRoZSBldmVudCBpcyBpbnZhbGlkIGlmIHRoZSBsYXllclxuXHRcdC8vIGlzIHBlcmZvcm1pbmcgYSB0cmFuc2l0aW9uIG9yIHNjcm9sbCwgYW5kIGhhcyB0byBiZSByZS1kZXRlY3RlZCBtYW51YWxseS4gTm90ZSB0aGF0XG5cdFx0Ly8gZm9yIHRoaXMgdG8gZnVuY3Rpb24gY29ycmVjdGx5LCBpdCBtdXN0IGJlIGNhbGxlZCAqYWZ0ZXIqIHRoZSBldmVudCB0YXJnZXQgaXMgY2hlY2tlZCFcblx0XHQvLyBTZWUgaXNzdWUgIzU3OyBhbHNvIGZpbGVkIGFzIHJkYXI6Ly8xMzA0ODU4OSAuXG5cdFx0aWYgKGRldmljZUlzSU9TV2l0aEJhZFRhcmdldCkge1xuXHRcdFx0dG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcblxuXHRcdFx0Ly8gSW4gY2VydGFpbiBjYXNlcyBhcmd1bWVudHMgb2YgZWxlbWVudEZyb21Qb2ludCBjYW4gYmUgbmVnYXRpdmUsIHNvIHByZXZlbnQgc2V0dGluZyB0YXJnZXRFbGVtZW50IHRvIG51bGxcblx0XHRcdHRhcmdldEVsZW1lbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoLnBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0LCB0b3VjaC5wYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldCkgfHwgdGFyZ2V0RWxlbWVudDtcblx0XHRcdHRhcmdldEVsZW1lbnQuZmFzdENsaWNrU2Nyb2xsUGFyZW50ID0gdGhpcy50YXJnZXRFbGVtZW50LmZhc3RDbGlja1Njcm9sbFBhcmVudDtcblx0XHR9XG5cblx0XHR0YXJnZXRUYWdOYW1lID0gdGFyZ2V0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKHRhcmdldFRhZ05hbWUgPT09ICdsYWJlbCcpIHtcblx0XHRcdGZvckVsZW1lbnQgPSB0aGlzLmZpbmRDb250cm9sKHRhcmdldEVsZW1lbnQpO1xuXHRcdFx0aWYgKGZvckVsZW1lbnQpIHtcblx0XHRcdFx0dGhpcy5mb2N1cyh0YXJnZXRFbGVtZW50KTtcblx0XHRcdFx0aWYgKGRldmljZUlzQW5kcm9pZCkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhcmdldEVsZW1lbnQgPSBmb3JFbGVtZW50O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGhpcy5uZWVkc0ZvY3VzKHRhcmdldEVsZW1lbnQpKSB7XG5cblx0XHRcdC8vIENhc2UgMTogSWYgdGhlIHRvdWNoIHN0YXJ0ZWQgYSB3aGlsZSBhZ28gKGJlc3QgZ3Vlc3MgaXMgMTAwbXMgYmFzZWQgb24gdGVzdHMgZm9yIGlzc3VlICMzNikgdGhlbiBmb2N1cyB3aWxsIGJlIHRyaWdnZXJlZCBhbnl3YXkuIFJldHVybiBlYXJseSBhbmQgdW5zZXQgdGhlIHRhcmdldCBlbGVtZW50IHJlZmVyZW5jZSBzbyB0aGF0IHRoZSBzdWJzZXF1ZW50IGNsaWNrIHdpbGwgYmUgYWxsb3dlZCB0aHJvdWdoLlxuXHRcdFx0Ly8gQ2FzZSAyOiBXaXRob3V0IHRoaXMgZXhjZXB0aW9uIGZvciBpbnB1dCBlbGVtZW50cyB0YXBwZWQgd2hlbiB0aGUgZG9jdW1lbnQgaXMgY29udGFpbmVkIGluIGFuIGlmcmFtZSwgdGhlbiBhbnkgaW5wdXR0ZWQgdGV4dCB3b24ndCBiZSB2aXNpYmxlIGV2ZW4gdGhvdWdoIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgdXBkYXRlZCBhcyB0aGUgdXNlciB0eXBlcyAoaXNzdWUgIzM3KS5cblx0XHRcdGlmICgoZXZlbnQudGltZVN0YW1wIC0gdHJhY2tpbmdDbGlja1N0YXJ0KSA+IDEwMCB8fCAoZGV2aWNlSXNJT1MgJiYgd2luZG93LnRvcCAhPT0gd2luZG93ICYmIHRhcmdldFRhZ05hbWUgPT09ICdpbnB1dCcpKSB7XG5cdFx0XHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IG51bGw7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5mb2N1cyh0YXJnZXRFbGVtZW50KTtcblx0XHRcdHRoaXMuc2VuZENsaWNrKHRhcmdldEVsZW1lbnQsIGV2ZW50KTtcblxuXHRcdFx0Ly8gU2VsZWN0IGVsZW1lbnRzIG5lZWQgdGhlIGV2ZW50IHRvIGdvIHRocm91Z2ggb24gaU9TIDQsIG90aGVyd2lzZSB0aGUgc2VsZWN0b3IgbWVudSB3b24ndCBvcGVuLlxuXHRcdFx0Ly8gQWxzbyB0aGlzIGJyZWFrcyBvcGVuaW5nIHNlbGVjdHMgd2hlbiBWb2ljZU92ZXIgaXMgYWN0aXZlIG9uIGlPUzYsIGlPUzcgKGFuZCBwb3NzaWJseSBvdGhlcnMpXG5cdFx0XHRpZiAoIWRldmljZUlzSU9TIHx8IHRhcmdldFRhZ05hbWUgIT09ICdzZWxlY3QnKSB7XG5cdFx0XHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IG51bGw7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoZGV2aWNlSXNJT1MgJiYgIWRldmljZUlzSU9TNCkge1xuXG5cdFx0XHQvLyBEb24ndCBzZW5kIGEgc3ludGhldGljIGNsaWNrIGV2ZW50IGlmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBjb250YWluZWQgd2l0aGluIGEgcGFyZW50IGxheWVyIHRoYXQgd2FzIHNjcm9sbGVkXG5cdFx0XHQvLyBhbmQgdGhpcyB0YXAgaXMgYmVpbmcgdXNlZCB0byBzdG9wIHRoZSBzY3JvbGxpbmcgKHVzdWFsbHkgaW5pdGlhdGVkIGJ5IGEgZmxpbmcgLSBpc3N1ZSAjNDIpLlxuXHRcdFx0c2Nyb2xsUGFyZW50ID0gdGFyZ2V0RWxlbWVudC5mYXN0Q2xpY2tTY3JvbGxQYXJlbnQ7XG5cdFx0XHRpZiAoc2Nyb2xsUGFyZW50ICYmIHNjcm9sbFBhcmVudC5mYXN0Q2xpY2tMYXN0U2Nyb2xsVG9wICE9PSBzY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXZlbnQgdGhlIGFjdHVhbCBjbGljayBmcm9tIGdvaW5nIHRob3VnaCAtIHVubGVzcyB0aGUgdGFyZ2V0IG5vZGUgaXMgbWFya2VkIGFzIHJlcXVpcmluZ1xuXHRcdC8vIHJlYWwgY2xpY2tzIG9yIGlmIGl0IGlzIGluIHRoZSB3aGl0ZWxpc3QgaW4gd2hpY2ggY2FzZSBvbmx5IG5vbi1wcm9ncmFtbWF0aWMgY2xpY2tzIGFyZSBwZXJtaXR0ZWQuXG5cdFx0aWYgKCF0aGlzLm5lZWRzQ2xpY2sodGFyZ2V0RWxlbWVudCkpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR0aGlzLnNlbmRDbGljayh0YXJnZXRFbGVtZW50LCBldmVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cblx0LyoqXG5cdCAqIE9uIHRvdWNoIGNhbmNlbCwgc3RvcCB0cmFja2luZyB0aGUgY2xpY2suXG5cdCAqXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmFja2luZ0NsaWNrID0gZmFsc2U7XG5cdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gbnVsbDtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmUgbW91c2UgZXZlbnRzIHdoaWNoIHNob3VsZCBiZSBwZXJtaXR0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5vbk1vdXNlID0gZnVuY3Rpb24oZXZlbnQpIHtcblxuXHRcdC8vIElmIGEgdGFyZ2V0IGVsZW1lbnQgd2FzIG5ldmVyIHNldCAoYmVjYXVzZSBhIHRvdWNoIGV2ZW50IHdhcyBuZXZlciBmaXJlZCkgYWxsb3cgdGhlIGV2ZW50XG5cdFx0aWYgKCF0aGlzLnRhcmdldEVsZW1lbnQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChldmVudC5mb3J3YXJkZWRUb3VjaEV2ZW50KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBQcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCBldmVudHMgdGFyZ2V0aW5nIGEgc3BlY2lmaWMgZWxlbWVudCBzaG91bGQgYmUgcGVybWl0dGVkXG5cdFx0aWYgKCFldmVudC5jYW5jZWxhYmxlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBEZXJpdmUgYW5kIGNoZWNrIHRoZSB0YXJnZXQgZWxlbWVudCB0byBzZWUgd2hldGhlciB0aGUgbW91c2UgZXZlbnQgbmVlZHMgdG8gYmUgcGVybWl0dGVkO1xuXHRcdC8vIHVubGVzcyBleHBsaWNpdGx5IGVuYWJsZWQsIHByZXZlbnQgbm9uLXRvdWNoIGNsaWNrIGV2ZW50cyBmcm9tIHRyaWdnZXJpbmcgYWN0aW9ucyxcblx0XHQvLyB0byBwcmV2ZW50IGdob3N0L2RvdWJsZWNsaWNrcy5cblx0XHRpZiAoIXRoaXMubmVlZHNDbGljayh0aGlzLnRhcmdldEVsZW1lbnQpIHx8IHRoaXMuY2FuY2VsTmV4dENsaWNrKSB7XG5cblx0XHRcdC8vIFByZXZlbnQgYW55IHVzZXItYWRkZWQgbGlzdGVuZXJzIGRlY2xhcmVkIG9uIEZhc3RDbGljayBlbGVtZW50IGZyb20gYmVpbmcgZmlyZWQuXG5cdFx0XHRpZiAoZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSB7XG5cdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBQYXJ0IG9mIHRoZSBoYWNrIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgRXZlbnQjc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIChlLmcuIEFuZHJvaWQgMilcblx0XHRcdFx0ZXZlbnQucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FuY2VsIHRoZSBldmVudFxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIG1vdXNlIGV2ZW50IGlzIHBlcm1pdHRlZCwgcmV0dXJuIHRydWUgZm9yIHRoZSBhY3Rpb24gdG8gZ28gdGhyb3VnaC5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBPbiBhY3R1YWwgY2xpY2tzLCBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgdG91Y2gtZ2VuZXJhdGVkIGNsaWNrLCBhIGNsaWNrIGFjdGlvbiBvY2N1cnJpbmdcblx0ICogbmF0dXJhbGx5IGFmdGVyIGEgZGVsYXkgYWZ0ZXIgYSB0b3VjaCAod2hpY2ggbmVlZHMgdG8gYmUgY2FuY2VsbGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uKSwgb3Jcblx0ICogYW4gYWN0dWFsIGNsaWNrIHdoaWNoIHNob3VsZCBiZSBwZXJtaXR0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0RmFzdENsaWNrLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgcGVybWl0dGVkO1xuXG5cdFx0Ly8gSXQncyBwb3NzaWJsZSBmb3IgYW5vdGhlciBGYXN0Q2xpY2stbGlrZSBsaWJyYXJ5IGRlbGl2ZXJlZCB3aXRoIHRoaXJkLXBhcnR5IGNvZGUgdG8gZmlyZSBhIGNsaWNrIGV2ZW50IGJlZm9yZSBGYXN0Q2xpY2sgZG9lcyAoaXNzdWUgIzQ0KS4gSW4gdGhhdCBjYXNlLCBzZXQgdGhlIGNsaWNrLXRyYWNraW5nIGZsYWcgYmFjayB0byBmYWxzZSBhbmQgcmV0dXJuIGVhcmx5LiBUaGlzIHdpbGwgY2F1c2Ugb25Ub3VjaEVuZCB0byByZXR1cm4gZWFybHkuXG5cdFx0aWYgKHRoaXMudHJhY2tpbmdDbGljaykge1xuXHRcdFx0dGhpcy50YXJnZXRFbGVtZW50ID0gbnVsbDtcblx0XHRcdHRoaXMudHJhY2tpbmdDbGljayA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gVmVyeSBvZGQgYmVoYXZpb3Igb24gaU9TIChpc3N1ZSAjMTgpOiBpZiBhIHN1Ym1pdCBlbGVtZW50IGlzIHByZXNlbnQgaW5zaWRlIGEgZm9ybSBhbmQgdGhlIHVzZXIgaGl0cyBlbnRlciBpbiB0aGUgaU9TIHNpbXVsYXRvciBvciBjbGlja3MgdGhlIEdvIGJ1dHRvbiBvbiB0aGUgcG9wLXVwIE9TIGtleWJvYXJkIHRoZSBhIGtpbmQgb2YgJ2Zha2UnIGNsaWNrIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggdGhlIHN1Ym1pdC10eXBlIGlucHV0IGVsZW1lbnQgYXMgdGhlIHRhcmdldC5cblx0XHRpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICdzdWJtaXQnICYmIGV2ZW50LmRldGFpbCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cGVybWl0dGVkID0gdGhpcy5vbk1vdXNlKGV2ZW50KTtcblxuXHRcdC8vIE9ubHkgdW5zZXQgdGFyZ2V0RWxlbWVudCBpZiB0aGUgY2xpY2sgaXMgbm90IHBlcm1pdHRlZC4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBjaGVjayBmb3IgIXRhcmdldEVsZW1lbnQgaW4gb25Nb3VzZSBmYWlscyBhbmQgdGhlIGJyb3dzZXIncyBjbGljayBkb2Vzbid0IGdvIHRocm91Z2guXG5cdFx0aWYgKCFwZXJtaXR0ZWQpIHtcblx0XHRcdHRoaXMudGFyZ2V0RWxlbWVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgY2xpY2tzIGFyZSBwZXJtaXR0ZWQsIHJldHVybiB0cnVlIGZvciB0aGUgYWN0aW9uIHRvIGdvIHRocm91Z2guXG5cdFx0cmV0dXJuIHBlcm1pdHRlZDtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIEZhc3RDbGljaydzIGV2ZW50IGxpc3RlbmVycy5cblx0ICpcblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqL1xuXHRGYXN0Q2xpY2sucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgbGF5ZXIgPSB0aGlzLmxheWVyO1xuXG5cdFx0aWYgKGRldmljZUlzQW5kcm9pZCkge1xuXHRcdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5vbk1vdXNlLCB0cnVlKTtcblx0XHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZSwgdHJ1ZSk7XG5cdFx0XHRsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlLCB0cnVlKTtcblx0XHR9XG5cblx0XHRsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGljaywgdHJ1ZSk7XG5cdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG5cdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZSwgZmFsc2UpO1xuXHRcdGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vblRvdWNoRW5kLCBmYWxzZSk7XG5cdFx0bGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uVG91Y2hDYW5jZWwsIGZhbHNlKTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBDaGVjayB3aGV0aGVyIEZhc3RDbGljayBpcyBuZWVkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gbGF5ZXIgVGhlIGxheWVyIHRvIGxpc3RlbiBvblxuXHQgKi9cblx0RmFzdENsaWNrLm5vdE5lZWRlZCA9IGZ1bmN0aW9uKGxheWVyKSB7XG5cdFx0dmFyIG1ldGFWaWV3cG9ydDtcblx0XHR2YXIgY2hyb21lVmVyc2lvbjtcblx0XHR2YXIgYmxhY2tiZXJyeVZlcnNpb247XG5cdFx0dmFyIGZpcmVmb3hWZXJzaW9uO1xuXG5cdFx0Ly8gRGV2aWNlcyB0aGF0IGRvbid0IHN1cHBvcnQgdG91Y2ggZG9uJ3QgbmVlZCBGYXN0Q2xpY2tcblx0XHRpZiAodHlwZW9mIHdpbmRvdy5vbnRvdWNoc3RhcnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBDaHJvbWUgdmVyc2lvbiAtIHplcm8gZm9yIG90aGVyIGJyb3dzZXJzXG5cdFx0Y2hyb21lVmVyc2lvbiA9ICsoL0Nocm9tZVxcLyhbMC05XSspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFssMF0pWzFdO1xuXG5cdFx0aWYgKGNocm9tZVZlcnNpb24pIHtcblxuXHRcdFx0aWYgKGRldmljZUlzQW5kcm9pZCkge1xuXHRcdFx0XHRtZXRhVmlld3BvcnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJyk7XG5cblx0XHRcdFx0aWYgKG1ldGFWaWV3cG9ydCkge1xuXHRcdFx0XHRcdC8vIENocm9tZSBvbiBBbmRyb2lkIHdpdGggdXNlci1zY2FsYWJsZT1cIm5vXCIgZG9lc24ndCBuZWVkIEZhc3RDbGljayAoaXNzdWUgIzg5KVxuXHRcdFx0XHRcdGlmIChtZXRhVmlld3BvcnQuY29udGVudC5pbmRleE9mKCd1c2VyLXNjYWxhYmxlPW5vJykgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2hyb21lIDMyIGFuZCBhYm92ZSB3aXRoIHdpZHRoPWRldmljZS13aWR0aCBvciBsZXNzIGRvbid0IG5lZWQgRmFzdENsaWNrXG5cdFx0XHRcdFx0aWYgKGNocm9tZVZlcnNpb24gPiAzMSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGggPD0gd2luZG93Lm91dGVyV2lkdGgpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBDaHJvbWUgZGVza3RvcCBkb2Vzbid0IG5lZWQgRmFzdENsaWNrIChpc3N1ZSAjMTUpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZGV2aWNlSXNCbGFja0JlcnJ5MTApIHtcblx0XHRcdGJsYWNrYmVycnlWZXJzaW9uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVmVyc2lvblxcLyhbMC05XSopXFwuKFswLTldKikvKTtcblxuXHRcdFx0Ly8gQmxhY2tCZXJyeSAxMC4zKyBkb2VzIG5vdCByZXF1aXJlIEZhc3RjbGljayBsaWJyYXJ5LlxuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2Z0bGFicy9mYXN0Y2xpY2svaXNzdWVzLzI1MVxuXHRcdFx0aWYgKGJsYWNrYmVycnlWZXJzaW9uWzFdID49IDEwICYmIGJsYWNrYmVycnlWZXJzaW9uWzJdID49IDMpIHtcblx0XHRcdFx0bWV0YVZpZXdwb3J0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPXZpZXdwb3J0XScpO1xuXG5cdFx0XHRcdGlmIChtZXRhVmlld3BvcnQpIHtcblx0XHRcdFx0XHQvLyB1c2VyLXNjYWxhYmxlPW5vIGVsaW1pbmF0ZXMgY2xpY2sgZGVsYXkuXG5cdFx0XHRcdFx0aWYgKG1ldGFWaWV3cG9ydC5jb250ZW50LmluZGV4T2YoJ3VzZXItc2NhbGFibGU9bm8nKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyB3aWR0aD1kZXZpY2Utd2lkdGggKG9yIGxlc3MgdGhhbiBkZXZpY2Utd2lkdGgpIGVsaW1pbmF0ZXMgY2xpY2sgZGVsYXkuXG5cdFx0XHRcdFx0aWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxXaWR0aCA8PSB3aW5kb3cub3V0ZXJXaWR0aCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSUUxMCB3aXRoIC1tcy10b3VjaC1hY3Rpb246IG5vbmUgb3IgbWFuaXB1bGF0aW9uLCB3aGljaCBkaXNhYmxlcyBkb3VibGUtdGFwLXRvLXpvb20gKGlzc3VlICM5Nylcblx0XHRpZiAobGF5ZXIuc3R5bGUubXNUb3VjaEFjdGlvbiA9PT0gJ25vbmUnIHx8IGxheWVyLnN0eWxlLnRvdWNoQWN0aW9uID09PSAnbWFuaXB1bGF0aW9uJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZWZveCB2ZXJzaW9uIC0gemVybyBmb3Igb3RoZXIgYnJvd3NlcnNcblx0XHRmaXJlZm94VmVyc2lvbiA9ICsoL0ZpcmVmb3hcXC8oWzAtOV0rKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBbLDBdKVsxXTtcblxuXHRcdGlmIChmaXJlZm94VmVyc2lvbiA+PSAyNykge1xuXHRcdFx0Ly8gRmlyZWZveCAyNysgZG9lcyBub3QgaGF2ZSB0YXAgZGVsYXkgaWYgdGhlIGNvbnRlbnQgaXMgbm90IHpvb21hYmxlIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTIyODk2XG5cblx0XHRcdG1ldGFWaWV3cG9ydCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT12aWV3cG9ydF0nKTtcblx0XHRcdGlmIChtZXRhVmlld3BvcnQgJiYgKG1ldGFWaWV3cG9ydC5jb250ZW50LmluZGV4T2YoJ3VzZXItc2NhbGFibGU9bm8nKSAhPT0gLTEgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoIDw9IHdpbmRvdy5vdXRlcldpZHRoKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJRTExOiBwcmVmaXhlZCAtbXMtdG91Y2gtYWN0aW9uIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIGl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIG5vbi1wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0Ly8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvYXBwcy9IaDc2NzMxMy5hc3B4XG5cdFx0aWYgKGxheWVyLnN0eWxlLnRvdWNoQWN0aW9uID09PSAnbm9uZScgfHwgbGF5ZXIuc3R5bGUudG91Y2hBY3Rpb24gPT09ICdtYW5pcHVsYXRpb24nKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblxuXHQvKipcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgRmFzdENsaWNrIG9iamVjdFxuXHQgKlxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IGxheWVyIFRoZSBsYXllciB0byBsaXN0ZW4gb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHNcblx0ICovXG5cdEZhc3RDbGljay5hdHRhY2ggPSBmdW5jdGlvbihsYXllciwgb3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgRmFzdENsaWNrKGxheWVyLCBvcHRpb25zKTtcblx0fTtcblxuXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG5cblx0XHQvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG5cdFx0ZGVmaW5lKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIEZhc3RDbGljaztcblx0XHR9KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gRmFzdENsaWNrLmF0dGFjaDtcblx0XHRtb2R1bGUuZXhwb3J0cy5GYXN0Q2xpY2sgPSBGYXN0Q2xpY2s7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LkZhc3RDbGljayA9IEZhc3RDbGljaztcblx0fVxufSgpKTtcbiIsIi8qKlxuICogTWljcm9FdmVudCAtIHRvIG1ha2UgYW55IGpzIG9iamVjdCBhbiBldmVudCBlbWl0dGVyIChzZXJ2ZXIgb3IgYnJvd3NlcilcbiAqIFxuICogLSBwdXJlIGphdmFzY3JpcHQgLSBzZXJ2ZXIgY29tcGF0aWJsZSwgYnJvd3NlciBjb21wYXRpYmxlXG4gKiAtIGRvbnQgcmVseSBvbiB0aGUgYnJvd3NlciBkb21zXG4gKiAtIHN1cGVyIHNpbXBsZSAtIHlvdSBnZXQgaXQgaW1tZWRpYXRlbHksIG5vIG15c3RlcnksIG5vIG1hZ2ljIGludm9sdmVkXG4gKlxuICogLSBjcmVhdGUgYSBNaWNyb0V2ZW50RGVidWcgd2l0aCBnb29kaWVzIHRvIGRlYnVnXG4gKiAgIC0gbWFrZSBpdCBzYWZlciB0byB1c2VcbiovXG5cbi8qKiBOT1RFOiBUaGlzIGxpYnJhcnkgaXMgY3VzdG9taXplZCBmb3IgT25zZW4gVUkuICovXG5cbnZhciBNaWNyb0V2ZW50ICA9IGZ1bmN0aW9uKCl7fTtcbk1pY3JvRXZlbnQucHJvdG90eXBlICA9IHtcbiAgb24gIDogZnVuY3Rpb24oZXZlbnQsIGZjdCl7XG4gICAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICAgIHRoaXMuX2V2ZW50c1tldmVudF0gPSB0aGlzLl9ldmVudHNbZXZlbnRdIHx8IFtdO1xuICAgIHRoaXMuX2V2ZW50c1tldmVudF0ucHVzaChmY3QpO1xuICB9LFxuICBvbmNlIDogZnVuY3Rpb24oZXZlbnQsIGZjdCl7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB3cmFwcGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9mZihldmVudCwgd3JhcHBlcik7XG4gICAgICByZXR1cm4gZmN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyKTtcbiAgfSxcbiAgb2ZmICA6IGZ1bmN0aW9uKGV2ZW50LCBmY3Qpe1xuICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICBpZiggZXZlbnQgaW4gdGhpcy5fZXZlbnRzID09PSBmYWxzZSAgKSAgcmV0dXJuO1xuICAgIHRoaXMuX2V2ZW50c1tldmVudF0uc3BsaWNlKHRoaXMuX2V2ZW50c1tldmVudF0uaW5kZXhPZihmY3QpLCAxKTtcbiAgfSxcbiAgZW1pdCA6IGZ1bmN0aW9uKGV2ZW50IC8qICwgYXJncy4uLiAqLyl7XG4gICAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICAgIGlmKCBldmVudCBpbiB0aGlzLl9ldmVudHMgPT09IGZhbHNlICApICByZXR1cm47XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2V2ZW50c1tldmVudF0ubGVuZ3RoOyBpKyspe1xuICAgICAgdGhpcy5fZXZlbnRzW2V2ZW50XVtpXS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogbWl4aW4gd2lsbCBkZWxlZ2F0ZSBhbGwgTWljcm9FdmVudC5qcyBmdW5jdGlvbiBpbiB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG4gKlxuICogLSByZXF1aXJlKCdNaWNyb0V2ZW50JykubWl4aW4oRm9vYmFyKSB3aWxsIG1ha2UgRm9vYmFyIGFibGUgdG8gdXNlIE1pY3JvRXZlbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGhlIG9iamVjdCB3aGljaCB3aWxsIHN1cHBvcnQgTWljcm9FdmVudFxuKi9cbk1pY3JvRXZlbnQubWl4aW4gID0gZnVuY3Rpb24oZGVzdE9iamVjdCl7XG4gIHZhciBwcm9wcyA9IFsnb24nLCAnb25jZScsICdvZmYnLCAnZW1pdCddO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpICsrKXtcbiAgICBpZiggdHlwZW9mIGRlc3RPYmplY3QgPT09ICdmdW5jdGlvbicgKXtcbiAgICAgIGRlc3RPYmplY3QucHJvdG90eXBlW3Byb3BzW2ldXSAgPSBNaWNyb0V2ZW50LnByb3RvdHlwZVtwcm9wc1tpXV07XG4gICAgfWVsc2V7XG4gICAgICBkZXN0T2JqZWN0W3Byb3BzW2ldXSA9IE1pY3JvRXZlbnQucHJvdG90eXBlW3Byb3BzW2ldXTtcbiAgICB9XG4gIH1cbn1cblxuLy8gZXhwb3J0IGluIGNvbW1vbiBqc1xuaWYoIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgKCdleHBvcnRzJyBpbiBtb2R1bGUpKXtcbiAgbW9kdWxlLmV4cG9ydHMgID0gTWljcm9FdmVudDtcbn1cbiIsIi8qIE1vZGVybml6ciAyLjYuMiAoQ3VzdG9tIEJ1aWxkKSB8IE1JVCAmIEJTRFxuICogQnVpbGQ6IGh0dHA6Ly9tb2Rlcm5penIuY29tL2Rvd25sb2FkLyMtYm9yZGVycmFkaXVzLWJveHNoYWRvdy1jc3NhbmltYXRpb25zLWNzc3RyYW5zZm9ybXMtY3NzdHJhbnNmb3JtczNkLWNzc3RyYW5zaXRpb25zLWNhbnZhcy1zdmctc2hpdi1jc3NjbGFzc2VzLXRlc3RzdHlsZXMtdGVzdHByb3AtdGVzdGFsbHByb3BzLXByZWZpeGVzLWRvbXByZWZpeGVzLWxvYWRcbiAqL1xuO1xuXG5cblxud2luZG93Lk1vZGVybml6ciA9IChmdW5jdGlvbiggd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkICkge1xuXG4gICAgdmFyIHZlcnNpb24gPSAnMi42LjInLFxuXG4gICAgTW9kZXJuaXpyID0ge30sXG5cbiAgICBlbmFibGVDbGFzc2VzID0gdHJ1ZSxcblxuICAgIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG5cbiAgICBtb2QgPSAnbW9kZXJuaXpyJyxcbiAgICBtb2RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChtb2QpLFxuICAgIG1TdHlsZSA9IG1vZEVsZW0uc3R5bGUsXG5cbiAgICBpbnB1dEVsZW0gICxcblxuXG4gICAgdG9TdHJpbmcgPSB7fS50b1N0cmluZyxcblxuICAgIHByZWZpeGVzID0gJyAtd2Via2l0LSAtbW96LSAtby0gLW1zLSAnLnNwbGl0KCcgJyksXG5cblxuXG4gICAgb21QcmVmaXhlcyA9ICdXZWJraXQgTW96IE8gbXMnLFxuXG4gICAgY3Nzb21QcmVmaXhlcyA9IG9tUHJlZml4ZXMuc3BsaXQoJyAnKSxcblxuICAgIGRvbVByZWZpeGVzID0gb21QcmVmaXhlcy50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJyksXG5cbiAgICBucyA9IHsnc3ZnJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ30sXG5cbiAgICB0ZXN0cyA9IHt9LFxuICAgIGlucHV0cyA9IHt9LFxuICAgIGF0dHJzID0ge30sXG5cbiAgICBjbGFzc2VzID0gW10sXG5cbiAgICBzbGljZSA9IGNsYXNzZXMuc2xpY2UsXG5cbiAgICBmZWF0dXJlTmFtZSwgXG5cblxuICAgIGluamVjdEVsZW1lbnRXaXRoU3R5bGVzID0gZnVuY3Rpb24oIHJ1bGUsIGNhbGxiYWNrLCBub2RlcywgdGVzdG5hbWVzICkge1xuXG4gICAgICB2YXIgc3R5bGUsIHJldCwgbm9kZSwgZG9jT3ZlcmZsb3csXG4gICAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgICAgICAgICAgICAgYm9keSA9IGRvY3VtZW50LmJvZHksXG4gICAgICAgICAgICAgICAgZmFrZUJvZHkgPSBib2R5IHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTtcblxuICAgICAgaWYgKCBwYXJzZUludChub2RlcywgMTApICkge1xuICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggbm9kZXMtLSApIHtcbiAgICAgICAgICAgICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICBub2RlLmlkID0gdGVzdG5hbWVzID8gdGVzdG5hbWVzW25vZGVzXSA6IG1vZCArIChub2RlcyArIDEpO1xuICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3R5bGUgPSBbJyYjMTczOycsJzxzdHlsZSBpZD1cInMnLCBtb2QsICdcIj4nLCBydWxlLCAnPC9zdHlsZT4nXS5qb2luKCcnKTtcbiAgICAgIGRpdi5pZCA9IG1vZDtcbiAgICAgICAgICAoYm9keSA/IGRpdiA6IGZha2VCb2R5KS5pbm5lckhUTUwgKz0gc3R5bGU7XG4gICAgICBmYWtlQm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgaWYgKCAhYm9keSApIHtcbiAgICAgICAgICAgICAgICBmYWtlQm9keS5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7XG4gICAgICAgICAgICAgICAgZmFrZUJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgICBkb2NPdmVyZmxvdyA9IGRvY0VsZW1lbnQuc3R5bGUub3ZlcmZsb3c7XG4gICAgICAgICAgZG9jRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICAgIGRvY0VsZW1lbnQuYXBwZW5kQ2hpbGQoZmFrZUJvZHkpO1xuICAgICAgfVxuXG4gICAgICByZXQgPSBjYWxsYmFjayhkaXYsIHJ1bGUpO1xuICAgICAgICBpZiAoICFib2R5ICkge1xuICAgICAgICAgIGZha2VCb2R5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZmFrZUJvZHkpO1xuICAgICAgICAgIGRvY0VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBkb2NPdmVyZmxvdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICEhcmV0O1xuXG4gICAgfSxcbiAgICBfaGFzT3duUHJvcGVydHkgPSAoe30pLmhhc093blByb3BlcnR5LCBoYXNPd25Qcm9wO1xuXG4gICAgaWYgKCAhaXMoX2hhc093blByb3BlcnR5LCAndW5kZWZpbmVkJykgJiYgIWlzKF9oYXNPd25Qcm9wZXJ0eS5jYWxsLCAndW5kZWZpbmVkJykgKSB7XG4gICAgICBoYXNPd25Qcm9wID0gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoYXNPd25Qcm9wID0gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHkpIHsgXG4gICAgICAgIHJldHVybiAoKHByb3BlcnR5IGluIG9iamVjdCkgJiYgaXMob2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZVtwcm9wZXJ0eV0sICd1bmRlZmluZWQnKSk7XG4gICAgICB9O1xuICAgIH1cblxuXG4gICAgaWYgKCFGdW5jdGlvbi5wcm90b3R5cGUuYmluZCkge1xuICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcblxuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcztcblxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuICAgICAgICAgICAgYm91bmQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcblxuICAgICAgICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgICAgRi5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICAgICAgICB2YXIgc2VsZiA9IG5ldyBGKCk7XG5cbiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldENzcyggc3RyICkge1xuICAgICAgICBtU3R5bGUuY3NzVGV4dCA9IHN0cjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRDc3NBbGwoIHN0cjEsIHN0cjIgKSB7XG4gICAgICAgIHJldHVybiBzZXRDc3MocHJlZml4ZXMuam9pbihzdHIxICsgJzsnKSArICggc3RyMiB8fCAnJyApKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpcyggb2JqLCB0eXBlICkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gdHlwZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb250YWlucyggc3RyLCBzdWJzdHIgKSB7XG4gICAgICAgIHJldHVybiAhIX4oJycgKyBzdHIpLmluZGV4T2Yoc3Vic3RyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHJvcHMoIHByb3BzLCBwcmVmaXhlZCApIHtcbiAgICAgICAgZm9yICggdmFyIGkgaW4gcHJvcHMgKSB7XG4gICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgICAgICAgaWYgKCAhY29udGFpbnMocHJvcCwgXCItXCIpICYmIG1TdHlsZVtwcm9wXSAhPT0gdW5kZWZpbmVkICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXhlZCA9PSAncGZ4JyA/IHByb3AgOiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXN0RE9NUHJvcHMoIHByb3BzLCBvYmosIGVsZW0gKSB7XG4gICAgICAgIGZvciAoIHZhciBpIGluIHByb3BzICkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBvYmpbcHJvcHNbaV1dO1xuICAgICAgICAgICAgaWYgKCBpdGVtICE9PSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtID09PSBmYWxzZSkgcmV0dXJuIHByb3BzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzKGl0ZW0sICdmdW5jdGlvbicpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYmluZChlbGVtIHx8IG9iaik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlc3RQcm9wc0FsbCggcHJvcCwgcHJlZml4ZWQsIGVsZW0gKSB7XG5cbiAgICAgICAgdmFyIHVjUHJvcCAgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKSxcbiAgICAgICAgICAgIHByb3BzICAgPSAocHJvcCArICcgJyArIGNzc29tUHJlZml4ZXMuam9pbih1Y1Byb3AgKyAnICcpICsgdWNQcm9wKS5zcGxpdCgnICcpO1xuXG4gICAgICAgICAgICBpZihpcyhwcmVmaXhlZCwgXCJzdHJpbmdcIikgfHwgaXMocHJlZml4ZWQsIFwidW5kZWZpbmVkXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIHRlc3RQcm9wcyhwcm9wcywgcHJlZml4ZWQpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzID0gKHByb3AgKyAnICcgKyAoZG9tUHJlZml4ZXMpLmpvaW4odWNQcm9wICsgJyAnKSArIHVjUHJvcCkuc3BsaXQoJyAnKTtcbiAgICAgICAgICByZXR1cm4gdGVzdERPTVByb3BzKHByb3BzLCBwcmVmaXhlZCwgZWxlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgdGVzdHNbJ2NhbnZhcyddID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHJldHVybiAhIShlbGVtLmdldENvbnRleHQgJiYgZWxlbS5nZXRDb250ZXh0KCcyZCcpKTtcbiAgICB9O1xuICAgIHRlc3RzWydib3JkZXJyYWRpdXMnXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGVzdFByb3BzQWxsKCdib3JkZXJSYWRpdXMnKTtcbiAgICB9O1xuXG4gICAgdGVzdHNbJ2JveHNoYWRvdyddID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0ZXN0UHJvcHNBbGwoJ2JveFNoYWRvdycpO1xuICAgIH07XG4gICAgdGVzdHNbJ2Nzc2FuaW1hdGlvbnMnXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGVzdFByb3BzQWxsKCdhbmltYXRpb25OYW1lJyk7XG4gICAgfTtcblxuXG5cbiAgICB0ZXN0c1snY3NzdHJhbnNmb3JtcyddID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAhIXRlc3RQcm9wc0FsbCgndHJhbnNmb3JtJyk7XG4gICAgfTtcblxuXG4gICAgdGVzdHNbJ2Nzc3RyYW5zZm9ybXMzZCddID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIHJldCA9ICEhdGVzdFByb3BzQWxsKCdwZXJzcGVjdGl2ZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJldCAmJiAnd2Via2l0UGVyc3BlY3RpdmUnIGluIGRvY0VsZW1lbnQuc3R5bGUgKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpbmplY3RFbGVtZW50V2l0aFN0eWxlcygnQG1lZGlhICh0cmFuc2Zvcm0tM2QpLCgtd2Via2l0LXRyYW5zZm9ybS0zZCl7I21vZGVybml6cntsZWZ0OjlweDtwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6M3B4O319JywgZnVuY3Rpb24oIG5vZGUsIHJ1bGUgKSB7XG4gICAgICAgICAgICByZXQgPSBub2RlLm9mZnNldExlZnQgPT09IDkgJiYgbm9kZS5vZmZzZXRIZWlnaHQgPT09IDM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG5cbiAgICB0ZXN0c1snY3NzdHJhbnNpdGlvbnMnXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGVzdFByb3BzQWxsKCd0cmFuc2l0aW9uJyk7XG4gICAgfTtcblxuXG5cbiAgICB0ZXN0c1snc3ZnJ10gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TICYmICEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5zLnN2ZywgJ3N2ZycpLmNyZWF0ZVNWR1JlY3Q7XG4gICAgfTtcbiAgICBmb3IgKCB2YXIgZmVhdHVyZSBpbiB0ZXN0cyApIHtcbiAgICAgICAgaWYgKCBoYXNPd25Qcm9wKHRlc3RzLCBmZWF0dXJlKSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVOYW1lICA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIE1vZGVybml6cltmZWF0dXJlTmFtZV0gPSB0ZXN0c1tmZWF0dXJlXSgpO1xuXG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goKE1vZGVybml6cltmZWF0dXJlTmFtZV0gPyAnJyA6ICduby0nKSArIGZlYXR1cmVOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAgTW9kZXJuaXpyLmFkZFRlc3QgPSBmdW5jdGlvbiAoIGZlYXR1cmUsIHRlc3QgKSB7XG4gICAgICAgaWYgKCB0eXBlb2YgZmVhdHVyZSA9PSAnb2JqZWN0JyApIHtcbiAgICAgICAgIGZvciAoIHZhciBrZXkgaW4gZmVhdHVyZSApIHtcbiAgICAgICAgICAgaWYgKCBoYXNPd25Qcm9wKCBmZWF0dXJlLCBrZXkgKSApIHtcbiAgICAgICAgICAgICBNb2Rlcm5penIuYWRkVGVzdCgga2V5LCBmZWF0dXJlWyBrZXkgXSApO1xuICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgZmVhdHVyZSA9IGZlYXR1cmUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgaWYgKCBNb2Rlcm5penJbZmVhdHVyZV0gIT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kZXJuaXpyO1xuICAgICAgICAgfVxuXG4gICAgICAgICB0ZXN0ID0gdHlwZW9mIHRlc3QgPT0gJ2Z1bmN0aW9uJyA/IHRlc3QoKSA6IHRlc3Q7XG5cbiAgICAgICAgIGlmICh0eXBlb2YgZW5hYmxlQ2xhc3NlcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbmFibGVDbGFzc2VzKSB7XG4gICAgICAgICAgIGRvY0VsZW1lbnQuY2xhc3NOYW1lICs9ICcgJyArICh0ZXN0ID8gJycgOiAnbm8tJykgKyBmZWF0dXJlO1xuICAgICAgICAgfVxuICAgICAgICAgTW9kZXJuaXpyW2ZlYXR1cmVdID0gdGVzdDtcblxuICAgICAgIH1cblxuICAgICAgIHJldHVybiBNb2Rlcm5penI7IFxuICAgICB9O1xuXG5cbiAgICBzZXRDc3MoJycpO1xuICAgIG1vZEVsZW0gPSBpbnB1dEVsZW0gPSBudWxsO1xuXG4gICAgOyhmdW5jdGlvbih3aW5kb3csIGRvY3VtZW50KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gd2luZG93Lmh0bWw1IHx8IHt9O1xuXG4gICAgICAgIHZhciByZVNraXAgPSAvXjx8Xig/OmJ1dHRvbnxtYXB8c2VsZWN0fHRleHRhcmVhfG9iamVjdHxpZnJhbWV8b3B0aW9ufG9wdGdyb3VwKSQvaTtcblxuICAgICAgICB2YXIgc2F2ZUNsb25lcyA9IC9eKD86YXxifGNvZGV8ZGl2fGZpZWxkc2V0fGgxfGgyfGgzfGg0fGg1fGg2fGl8bGFiZWx8bGl8b2x8cHxxfHNwYW58c3Ryb25nfHN0eWxlfHRhYmxlfHRib2R5fHRkfHRofHRyfHVsKSQvaTtcblxuICAgICAgICB2YXIgc3VwcG9ydHNIdG1sNVN0eWxlcztcblxuICAgICAgICB2YXIgZXhwYW5kbyA9ICdfaHRtbDVzaGl2JztcblxuICAgICAgICB2YXIgZXhwYW5JRCA9IDA7XG5cbiAgICAgICAgdmFyIGV4cGFuZG9EYXRhID0ge307XG5cbiAgICAgICAgdmFyIHN1cHBvcnRzVW5rbm93bkVsZW1lbnRzO1xuXG4gICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJzx4eXo+PC94eXo+JztcbiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNIdG1sNVN0eWxlcyA9ICgnaGlkZGVuJyBpbiBhKTtcblxuICAgICAgICAgICAgc3VwcG9ydHNVbmtub3duRWxlbWVudHMgPSBhLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgfHwgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpKCdhJyk7XG4gICAgICAgICAgICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBmcmFnLmNsb25lTm9kZSA9PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBmcmFnLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZnJhZy5jcmVhdGVFbGVtZW50ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICBzdXBwb3J0c0h0bWw1U3R5bGVzID0gdHJ1ZTtcbiAgICAgICAgICBzdXBwb3J0c1Vua25vd25FbGVtZW50cyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgfSgpKTsgICAgICAgIGZ1bmN0aW9uIGFkZFN0eWxlU2hlZXQob3duZXJEb2N1bWVudCwgY3NzVGV4dCkge1xuICAgICAgICB2YXIgcCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpLFxuICAgICAgICAgICAgcGFyZW50ID0gb3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IG93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIHAuaW5uZXJIVE1MID0gJ3g8c3R5bGU+JyArIGNzc1RleHQgKyAnPC9zdHlsZT4nO1xuICAgICAgICByZXR1cm4gcGFyZW50Lmluc2VydEJlZm9yZShwLmxhc3RDaGlsZCwgcGFyZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldEVsZW1lbnRzKCkge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSBodG1sNS5lbGVtZW50cztcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlbGVtZW50cyA9PSAnc3RyaW5nJyA/IGVsZW1lbnRzLnNwbGl0KCcgJykgOiBlbGVtZW50cztcbiAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIGdldEV4cGFuZG9EYXRhKG93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBleHBhbmRvRGF0YVtvd25lckRvY3VtZW50W2V4cGFuZG9dXTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0ge307XG4gICAgICAgICAgICBleHBhbklEKys7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50W2V4cGFuZG9dID0gZXhwYW5JRDtcbiAgICAgICAgICAgIGV4cGFuZG9EYXRhW2V4cGFuSURdID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KG5vZGVOYW1lLCBvd25lckRvY3VtZW50LCBkYXRhKXtcbiAgICAgICAgaWYgKCFvd25lckRvY3VtZW50KSB7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYoc3VwcG9ydHNVbmtub3duRWxlbWVudHMpe1xuICAgICAgICAgICAgcmV0dXJuIG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICBkYXRhID0gZ2V0RXhwYW5kb0RhdGEob3duZXJEb2N1bWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGU7XG5cbiAgICAgICAgaWYgKGRhdGEuY2FjaGVbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICBub2RlID0gZGF0YS5jYWNoZVtub2RlTmFtZV0uY2xvbmVOb2RlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2F2ZUNsb25lcy50ZXN0KG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgbm9kZSA9IChkYXRhLmNhY2hlW25vZGVOYW1lXSA9IGRhdGEuY3JlYXRlRWxlbShub2RlTmFtZSkpLmNsb25lTm9kZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZSA9IGRhdGEuY3JlYXRlRWxlbShub2RlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuY2FuSGF2ZUNoaWxkcmVuICYmICFyZVNraXAudGVzdChub2RlTmFtZSkgPyBkYXRhLmZyYWcuYXBwZW5kQ2hpbGQobm9kZSkgOiBub2RlO1xuICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQob3duZXJEb2N1bWVudCwgZGF0YSl7XG4gICAgICAgIGlmICghb3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudCA9IGRvY3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmKHN1cHBvcnRzVW5rbm93bkVsZW1lbnRzKXtcbiAgICAgICAgICAgIHJldHVybiBvd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gZGF0YSB8fCBnZXRFeHBhbmRvRGF0YShvd25lckRvY3VtZW50KTtcbiAgICAgICAgdmFyIGNsb25lID0gZGF0YS5mcmFnLmNsb25lTm9kZSgpLFxuICAgICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgICBlbGVtcyA9IGdldEVsZW1lbnRzKCksXG4gICAgICAgICAgICBsID0gZWxlbXMubGVuZ3RoO1xuICAgICAgICBmb3IoO2k8bDtpKyspe1xuICAgICAgICAgICAgY2xvbmUuY3JlYXRlRWxlbWVudChlbGVtc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNoaXZNZXRob2RzKG93bmVyRG9jdW1lbnQsIGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhLmNhY2hlKSB7XG4gICAgICAgICAgICBkYXRhLmNhY2hlID0ge307XG4gICAgICAgICAgICBkYXRhLmNyZWF0ZUVsZW0gPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ7XG4gICAgICAgICAgICBkYXRhLmNyZWF0ZUZyYWcgPSBvd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgICAgICBkYXRhLmZyYWcgPSBkYXRhLmNyZWF0ZUZyYWcoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24obm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWh0bWw1LnNoaXZNZXRob2RzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkYXRhLmNyZWF0ZUVsZW0obm9kZU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChub2RlTmFtZSwgb3duZXJEb2N1bWVudCwgZGF0YSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gRnVuY3Rpb24oJ2gsZicsICdyZXR1cm4gZnVuY3Rpb24oKXsnICtcbiAgICAgICAgICAndmFyIG49Zi5jbG9uZU5vZGUoKSxjPW4uY3JlYXRlRWxlbWVudDsnICtcbiAgICAgICAgICAnaC5zaGl2TWV0aG9kcyYmKCcgK1xuICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50cygpLmpvaW4oKS5yZXBsYWNlKC9cXHcrL2csIGZ1bmN0aW9uKG5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgIGRhdGEuY3JlYXRlRWxlbShub2RlTmFtZSk7XG4gICAgICAgICAgICAgIGRhdGEuZnJhZy5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgcmV0dXJuICdjKFwiJyArIG5vZGVOYW1lICsgJ1wiKSc7XG4gICAgICAgICAgICB9KSArXG4gICAgICAgICAgJyk7cmV0dXJuIG59J1xuICAgICAgICApKGh0bWw1LCBkYXRhLmZyYWcpO1xuICAgICAgfSAgICAgICAgZnVuY3Rpb24gc2hpdkRvY3VtZW50KG93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgaWYgKCFvd25lckRvY3VtZW50KSB7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBnZXRFeHBhbmRvRGF0YShvd25lckRvY3VtZW50KTtcblxuICAgICAgICBpZiAoaHRtbDUuc2hpdkNTUyAmJiAhc3VwcG9ydHNIdG1sNVN0eWxlcyAmJiAhZGF0YS5oYXNDU1MpIHtcbiAgICAgICAgICBkYXRhLmhhc0NTUyA9ICEhYWRkU3R5bGVTaGVldChvd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICAnYXJ0aWNsZSxhc2lkZSxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfScgK1xuICAgICAgICAgICAgICAgICAgICAnbWFya3tiYWNrZ3JvdW5kOiNGRjA7Y29sb3I6IzAwMH0nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1cHBvcnRzVW5rbm93bkVsZW1lbnRzKSB7XG4gICAgICAgICAgc2hpdk1ldGhvZHMob3duZXJEb2N1bWVudCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG93bmVyRG9jdW1lbnQ7XG4gICAgICB9ICAgICAgICB2YXIgaHRtbDUgPSB7XG5cbiAgICAgICAgICAgICdlbGVtZW50cyc6IG9wdGlvbnMuZWxlbWVudHMgfHwgJ2FiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBiZGkgY2FudmFzIGRhdGEgZGF0YWxpc3QgZGV0YWlscyBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgaGVhZGVyIGhncm91cCBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcHJvZ3Jlc3Mgc2VjdGlvbiBzdW1tYXJ5IHRpbWUgdmlkZW8nLFxuXG4gICAgICAgICAgICAnc2hpdkNTUyc6IChvcHRpb25zLnNoaXZDU1MgIT09IGZhbHNlKSxcblxuICAgICAgICAgICAgJ3N1cHBvcnRzVW5rbm93bkVsZW1lbnRzJzogc3VwcG9ydHNVbmtub3duRWxlbWVudHMsXG5cbiAgICAgICAgICAgICdzaGl2TWV0aG9kcyc6IChvcHRpb25zLnNoaXZNZXRob2RzICE9PSBmYWxzZSksXG5cbiAgICAgICAgICAgICd0eXBlJzogJ2RlZmF1bHQnLFxuXG4gICAgICAgICAgICAnc2hpdkRvY3VtZW50Jzogc2hpdkRvY3VtZW50LFxuXG4gICAgICAgICAgICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuXG4gICAgICAgICAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50OiBjcmVhdGVEb2N1bWVudEZyYWdtZW50XG4gICAgICB9OyAgICAgICAgd2luZG93Lmh0bWw1ID0gaHRtbDU7XG5cbiAgICAgICAgc2hpdkRvY3VtZW50KGRvY3VtZW50KTtcblxuICAgIH0odGhpcywgZG9jdW1lbnQpKTtcblxuICAgIE1vZGVybml6ci5fdmVyc2lvbiAgICAgID0gdmVyc2lvbjtcblxuICAgIE1vZGVybml6ci5fcHJlZml4ZXMgICAgID0gcHJlZml4ZXM7XG4gICAgTW9kZXJuaXpyLl9kb21QcmVmaXhlcyAgPSBkb21QcmVmaXhlcztcbiAgICBNb2Rlcm5penIuX2Nzc29tUHJlZml4ZXMgID0gY3Nzb21QcmVmaXhlcztcblxuXG5cbiAgICBNb2Rlcm5penIudGVzdFByb3AgICAgICA9IGZ1bmN0aW9uKHByb3Ape1xuICAgICAgICByZXR1cm4gdGVzdFByb3BzKFtwcm9wXSk7XG4gICAgfTtcblxuICAgIE1vZGVybml6ci50ZXN0QWxsUHJvcHMgID0gdGVzdFByb3BzQWxsO1xuXG5cbiAgICBNb2Rlcm5penIudGVzdFN0eWxlcyAgICA9IGluamVjdEVsZW1lbnRXaXRoU3R5bGVzOyAgICBkb2NFbGVtZW50LmNsYXNzTmFtZSA9IGRvY0VsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoLyhefFxccyluby1qcyhcXHN8JCkvLCAnJDEkMicpICtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmFibGVDbGFzc2VzID8gJyBqcyAnICsgY2xhc3Nlcy5qb2luKCcgJykgOiAnJyk7XG5cbiAgICByZXR1cm4gTW9kZXJuaXpyO1xuXG59KSh0aGlzLCB0aGlzLmRvY3VtZW50KTtcbi8qeWVwbm9wZTEuNS40fFdURlBMKi9cbihmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm5cIltvYmplY3QgRnVuY3Rpb25dXCI9PW8uY2FsbChhKX1mdW5jdGlvbiBlKGEpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhfWZ1bmN0aW9uIGYoKXt9ZnVuY3Rpb24gZyhhKXtyZXR1cm4hYXx8XCJsb2FkZWRcIj09YXx8XCJjb21wbGV0ZVwiPT1hfHxcInVuaW5pdGlhbGl6ZWRcIj09YX1mdW5jdGlvbiBoKCl7dmFyIGE9cC5zaGlmdCgpO3E9MSxhP2EudD9tKGZ1bmN0aW9uKCl7KFwiY1wiPT1hLnQ/Qi5pbmplY3RDc3M6Qi5pbmplY3RKcykoYS5zLDAsYS5hLGEueCxhLmUsMSl9LDApOihhKCksaCgpKTpxPTB9ZnVuY3Rpb24gaShhLGMsZCxlLGYsaSxqKXtmdW5jdGlvbiBrKGIpe2lmKCFvJiZnKGwucmVhZHlTdGF0ZSkmJih1LnI9bz0xLCFxJiZoKCksbC5vbmxvYWQ9bC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiKSl7XCJpbWdcIiE9YSYmbShmdW5jdGlvbigpe3QucmVtb3ZlQ2hpbGQobCl9LDUwKTtmb3IodmFyIGQgaW4geVtjXSl5W2NdLmhhc093blByb3BlcnR5KGQpJiZ5W2NdW2RdLm9ubG9hZCgpfX12YXIgaj1qfHxCLmVycm9yVGltZW91dCxsPWIuY3JlYXRlRWxlbWVudChhKSxvPTAscj0wLHU9e3Q6ZCxzOmMsZTpmLGE6aSx4Omp9OzE9PT15W2NdJiYocj0xLHlbY109W10pLFwib2JqZWN0XCI9PWE/bC5kYXRhPWM6KGwuc3JjPWMsbC50eXBlPWEpLGwud2lkdGg9bC5oZWlnaHQ9XCIwXCIsbC5vbmVycm9yPWwub25sb2FkPWwub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ay5jYWxsKHRoaXMscil9LHAuc3BsaWNlKGUsMCx1KSxcImltZ1wiIT1hJiYocnx8Mj09PXlbY10/KHQuaW5zZXJ0QmVmb3JlKGwscz9udWxsOm4pLG0oayxqKSk6eVtjXS5wdXNoKGwpKX1mdW5jdGlvbiBqKGEsYixjLGQsZil7cmV0dXJuIHE9MCxiPWJ8fFwialwiLGUoYSk/aShcImNcIj09Yj92OnUsYSxiLHRoaXMuaSsrLGMsZCxmKToocC5zcGxpY2UodGhpcy5pKyssMCxhKSwxPT1wLmxlbmd0aCYmaCgpKSx0aGlzfWZ1bmN0aW9uIGsoKXt2YXIgYT1CO3JldHVybiBhLmxvYWRlcj17bG9hZDpqLGk6MH0sYX12YXIgbD1iLmRvY3VtZW50RWxlbWVudCxtPWEuc2V0VGltZW91dCxuPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIilbMF0sbz17fS50b1N0cmluZyxwPVtdLHE9MCxyPVwiTW96QXBwZWFyYW5jZVwiaW4gbC5zdHlsZSxzPXImJiEhYi5jcmVhdGVSYW5nZSgpLmNvbXBhcmVOb2RlLHQ9cz9sOm4ucGFyZW50Tm9kZSxsPWEub3BlcmEmJlwiW29iamVjdCBPcGVyYV1cIj09by5jYWxsKGEub3BlcmEpLGw9ISFiLmF0dGFjaEV2ZW50JiYhbCx1PXI/XCJvYmplY3RcIjpsP1wic2NyaXB0XCI6XCJpbWdcIix2PWw/XCJzY3JpcHRcIjp1LHc9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuXCJbb2JqZWN0IEFycmF5XVwiPT1vLmNhbGwoYSl9LHg9W10seT17fSx6PXt0aW1lb3V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIubGVuZ3RoJiYoYS50aW1lb3V0PWJbMF0pLGF9fSxBLEI7Qj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBhPWEuc3BsaXQoXCIhXCIpLGI9eC5sZW5ndGgsYz1hLnBvcCgpLGQ9YS5sZW5ndGgsYz17dXJsOmMsb3JpZ1VybDpjLHByZWZpeGVzOmF9LGUsZixnO2ZvcihmPTA7ZjxkO2YrKylnPWFbZl0uc3BsaXQoXCI9XCIpLChlPXpbZy5zaGlmdCgpXSkmJihjPWUoYyxnKSk7Zm9yKGY9MDtmPGI7ZisrKWM9eFtmXShjKTtyZXR1cm4gY31mdW5jdGlvbiBnKGEsZSxmLGcsaCl7dmFyIGk9YihhKSxqPWkuYXV0b0NhbGxiYWNrO2kudXJsLnNwbGl0KFwiLlwiKS5wb3AoKS5zcGxpdChcIj9cIikuc2hpZnQoKSxpLmJ5cGFzc3x8KGUmJihlPWQoZSk/ZTplW2FdfHxlW2ddfHxlW2Euc3BsaXQoXCIvXCIpLnBvcCgpLnNwbGl0KFwiP1wiKVswXV0pLGkuaW5zdGVhZD9pLmluc3RlYWQoYSxlLGYsZyxoKTooeVtpLnVybF0/aS5ub2V4ZWM9ITA6eVtpLnVybF09MSxmLmxvYWQoaS51cmwsaS5mb3JjZUNTU3x8IWkuZm9yY2VKUyYmXCJjc3NcIj09aS51cmwuc3BsaXQoXCIuXCIpLnBvcCgpLnNwbGl0KFwiP1wiKS5zaGlmdCgpP1wiY1wiOmMsaS5ub2V4ZWMsaS5hdHRycyxpLnRpbWVvdXQpLChkKGUpfHxkKGopKSYmZi5sb2FkKGZ1bmN0aW9uKCl7aygpLGUmJmUoaS5vcmlnVXJsLGgsZyksaiYmaihpLm9yaWdVcmwsaCxnKSx5W2kudXJsXT0yfSkpKX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gYyhhLGMpe2lmKGEpe2lmKGUoYSkpY3x8KGo9ZnVuY3Rpb24oKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ay5hcHBseSh0aGlzLGEpLGwoKX0pLGcoYSxqLGIsMCxoKTtlbHNlIGlmKE9iamVjdChhKT09PWEpZm9yKG4gaW4gbT1mdW5jdGlvbigpe3ZhciBiPTAsYztmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJmIrKztyZXR1cm4gYn0oKSxhKWEuaGFzT3duUHJvcGVydHkobikmJighYyYmIS0tbSYmKGQoaik/aj1mdW5jdGlvbigpe3ZhciBhPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtrLmFwcGx5KHRoaXMsYSksbCgpfTpqW25dPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBiPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTthJiZhLmFwcGx5KHRoaXMsYiksbCgpfX0oa1tuXSkpLGcoYVtuXSxqLGIsbixoKSl9ZWxzZSFjJiZsKCl9dmFyIGg9ISFhLnRlc3QsaT1hLmxvYWR8fGEuYm90aCxqPWEuY2FsbGJhY2t8fGYsaz1qLGw9YS5jb21wbGV0ZXx8ZixtLG47YyhoP2EueWVwOmEubm9wZSwhIWkpLGkmJmMoaSl9dmFyIGksaixsPXRoaXMueWVwbm9wZS5sb2FkZXI7aWYoZShhKSlnKGEsMCxsLDApO2Vsc2UgaWYodyhhKSlmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWo9YVtpXSxlKGopP2coaiwwLGwsMCk6dyhqKT9CKGopOk9iamVjdChqKT09PWomJmgoaixsKTtlbHNlIE9iamVjdChhKT09PWEmJmgoYSxsKX0sQi5hZGRQcmVmaXg9ZnVuY3Rpb24oYSxiKXt6W2FdPWJ9LEIuYWRkRmlsdGVyPWZ1bmN0aW9uKGEpe3gucHVzaChhKX0sQi5lcnJvclRpbWVvdXQ9MWU0LG51bGw9PWIucmVhZHlTdGF0ZSYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5yZWFkeVN0YXRlPVwibG9hZGluZ1wiLGIuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixBPWZ1bmN0aW9uKCl7Yi5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLEEsMCksYi5yZWFkeVN0YXRlPVwiY29tcGxldGVcIn0sMCkpLGEueWVwbm9wZT1rKCksYS55ZXBub3BlLmV4ZWN1dGVTdGFjaz1oLGEueWVwbm9wZS5pbmplY3RKcz1mdW5jdGlvbihhLGMsZCxlLGksail7dmFyIGs9Yi5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpLGwsbyxlPWV8fEIuZXJyb3JUaW1lb3V0O2suc3JjPWE7Zm9yKG8gaW4gZClrLnNldEF0dHJpYnV0ZShvLGRbb10pO2M9aj9oOmN8fGYsay5vbnJlYWR5c3RhdGVjaGFuZ2U9ay5vbmxvYWQ9ZnVuY3Rpb24oKXshbCYmZyhrLnJlYWR5U3RhdGUpJiYobD0xLGMoKSxrLm9ubG9hZD1rLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsKX0sbShmdW5jdGlvbigpe2x8fChsPTEsYygxKSl9LGUpLGk/ay5vbmxvYWQoKTpuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssbil9LGEueWVwbm9wZS5pbmplY3RDc3M9ZnVuY3Rpb24oYSxjLGQsZSxnLGkpe3ZhciBlPWIuY3JlYXRlRWxlbWVudChcImxpbmtcIiksaixjPWk/aDpjfHxmO2UuaHJlZj1hLGUucmVsPVwic3R5bGVzaGVldFwiLGUudHlwZT1cInRleHQvY3NzXCI7Zm9yKGogaW4gZCllLnNldEF0dHJpYnV0ZShqLGRbal0pO2d8fChuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsbiksbShjLDApKX19KSh0aGlzLGRvY3VtZW50KTtcbk1vZGVybml6ci5sb2FkPWZ1bmN0aW9uKCl7eWVwbm9wZS5hcHBseSh3aW5kb3csW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpO307XG47IiwiKGZ1bmN0aW9uIGUodCwgbiwgcikge1xuICBmdW5jdGlvbiBzKG8sIHUpIHtcbiAgICBpZiAoIW5bb10pIHtcbiAgICAgIGlmICghdFtvXSkge1xuICAgICAgICB2YXIgYSA9IHR5cGVvZiByZXF1aXJlID09IFwiZnVuY3Rpb25cIiAmJiByZXF1aXJlO1xuICAgICAgICBpZiAoIXUgJiYgYSkgcmV0dXJuIGEobywgITApO1xuICAgICAgICBpZiAoaSkgcmV0dXJuIGkobywgITApO1xuICAgICAgICB2YXIgZiA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBvICsgXCInXCIpO1xuICAgICAgICB0aHJvdyBmLmNvZGUgPSBcIk1PRFVMRV9OT1RfRk9VTkRcIiwgZjtcbiAgICAgIH1cbiAgICAgIHZhciBsID0gbltvXSA9IHtcbiAgICAgICAgZXhwb3J0czoge31cbiAgICAgIH07XG4gICAgICB0W29dWzBdLmNhbGwobC5leHBvcnRzLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciBuID0gdFtvXVsxXVtlXTtcbiAgICAgICAgcmV0dXJuIHMobiA/IG4gOiBlKTtcbiAgICAgIH0sIGwsIGwuZXhwb3J0cywgZSwgdCwgbiwgcik7XG4gICAgfVxuICAgIHJldHVybiBuW29dLmV4cG9ydHM7XG4gIH1cbiAgdmFyIGkgPSB0eXBlb2YgcmVxdWlyZSA9PSBcImZ1bmN0aW9uXCIgJiYgcmVxdWlyZTtcbiAgZm9yICh2YXIgbyA9IDA7IG8gPCByLmxlbmd0aDsgbysrKSBzKHJbb10pO1xuICByZXR1cm4gcztcbn0pKHtcbiAgMTogWyBmdW5jdGlvbihyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpIHtcbiAgICB2YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG4gICAgcHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNhblNldEltbWVkaWF0ZSA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnNldEltbWVkaWF0ZTtcbiAgICAgIHZhciBjYW5Qb3N0ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cucG9zdE1lc3NhZ2UgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXI7XG4gICAgICBpZiAoY2FuU2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihmKSB7XG4gICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRJbW1lZGlhdGUoZik7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY2FuUG9zdCkge1xuICAgICAgICB2YXIgcXVldWUgPSBbXTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IGV2LnNvdXJjZTtcbiAgICAgICAgICBpZiAoKHNvdXJjZSA9PT0gd2luZG93IHx8IHNvdXJjZSA9PT0gbnVsbCkgJiYgZXYuZGF0YSA9PT0gXCJwcm9jZXNzLXRpY2tcIikge1xuICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB2YXIgZm4gPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICBmbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShcInByb2Nlc3MtdGlja1wiLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgc2V0VGltZW91dChmbiwgMCk7XG4gICAgICB9O1xuICAgIH0oKTtcbiAgICBwcm9jZXNzLnRpdGxlID0gXCJicm93c2VyXCI7XG4gICAgcHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbiAgICBwcm9jZXNzLmVudiA9IHt9O1xuICAgIHByb2Nlc3MuYXJndiA9IFtdO1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7fVxuICAgIHByb2Nlc3Mub24gPSBub29wO1xuICAgIHByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xuICAgIHByb2Nlc3Mub25jZSA9IG5vb3A7XG4gICAgcHJvY2Vzcy5vZmYgPSBub29wO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuICAgIHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbiAgICBwcm9jZXNzLmVtaXQgPSBub29wO1xuICAgIHByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIH07XG4gICAgcHJvY2Vzcy5jd2QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBcIi9cIjtcbiAgICB9O1xuICAgIHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbihkaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9O1xuICB9LCB7fSBdLFxuICAyOiBbIGZ1bmN0aW9uKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cykge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciBhc2FwID0gcmVxdWlyZShcImFzYXBcIik7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuICAgIGZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcyAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ld1wiKTtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgdmFyIHN0YXRlID0gbnVsbDtcbiAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG4gICAgICB2YXIgZGVmZXJyZWRzID0gW107XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnRoZW4gPSBmdW5jdGlvbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gbmV3IHNlbGYuY29uc3RydWN0b3IoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaGFuZGxlKG5ldyBIYW5kbGVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCByZXNvbHZlLCByZWplY3QpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGRlZmVycmVkKSB7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlZmVycmVkcy5wdXNoKGRlZmVycmVkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXNhcChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgY2IgPSBzdGF0ZSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICAgICAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgICAgICAgIChzdGF0ZSA/IGRlZmVycmVkLnJlc29sdmUgOiBkZWZlcnJlZC5yZWplY3QpKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHJldDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0ID0gY2IodmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmUobmV3VmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHNlbGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLlwiKTtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgJiYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbmV3VmFsdWUgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICAgIHZhciB0aGVuID0gbmV3VmFsdWUudGhlbjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIGRvUmVzb2x2ZSh0aGVuLmJpbmQobmV3VmFsdWUpLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgIGZpbmFsZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiByZWplY3QobmV3VmFsdWUpIHtcbiAgICAgICAgc3RhdGUgPSBmYWxzZTtcbiAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgZmluYWxlKCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBmaW5hbGUoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkZWZlcnJlZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIGhhbmRsZShkZWZlcnJlZHNbaV0pO1xuICAgICAgICBkZWZlcnJlZHMgPSBudWxsO1xuICAgICAgfVxuICAgICAgZG9SZXNvbHZlKGZuLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBIYW5kbGVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHRoaXMub25GdWxmaWxsZWQgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT09IFwiZnVuY3Rpb25cIiA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgICAgIHRoaXMub25SZWplY3RlZCA9IHR5cGVvZiBvblJlamVjdGVkID09PSBcImZ1bmN0aW9uXCIgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZG9SZXNvbHZlKGZuLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICBvbkZ1bGZpbGxlZCh2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgb25SZWplY3RlZChyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICBvblJlamVjdGVkKGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBhc2FwOiA0XG4gIH0gXSxcbiAgMzogWyBmdW5jdGlvbihyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICB2YXIgUHJvbWlzZSA9IHJlcXVpcmUoXCIuL2NvcmUuanNcIik7XG4gICAgdmFyIGFzYXAgPSByZXF1aXJlKFwiYXNhcFwiKTtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG4gICAgZnVuY3Rpb24gVmFsdWVQcm9taXNlKHZhbHVlKSB7XG4gICAgICB0aGlzLnRoZW4gPSBmdW5jdGlvbihvbkZ1bGZpbGxlZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9uRnVsZmlsbGVkICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgYXNhcChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc29sdmUob25GdWxmaWxsZWQodmFsdWUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgVmFsdWVQcm9taXNlLnByb3RvdHlwZSA9IFByb21pc2UucHJvdG90eXBlO1xuICAgIHZhciBUUlVFID0gbmV3IFZhbHVlUHJvbWlzZSh0cnVlKTtcbiAgICB2YXIgRkFMU0UgPSBuZXcgVmFsdWVQcm9taXNlKGZhbHNlKTtcbiAgICB2YXIgTlVMTCA9IG5ldyBWYWx1ZVByb21pc2UobnVsbCk7XG4gICAgdmFyIFVOREVGSU5FRCA9IG5ldyBWYWx1ZVByb21pc2UodW5kZWZpbmVkKTtcbiAgICB2YXIgWkVSTyA9IG5ldyBWYWx1ZVByb21pc2UoMCk7XG4gICAgdmFyIEVNUFRZU1RSSU5HID0gbmV3IFZhbHVlUHJvbWlzZShcIlwiKTtcbiAgICBQcm9taXNlLnJlc29sdmUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHZhbHVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gTlVMTDtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gVU5ERUZJTkVEO1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gVFJVRTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBGQUxTRTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIFpFUk87XG4gICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHJldHVybiBFTVBUWVNUUklORztcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgdGhlbiA9IHZhbHVlLnRoZW47XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSh0aGVuLmJpbmQodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVqZWN0KGV4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBWYWx1ZVByb21pc2UodmFsdWUpO1xuICAgIH07XG4gICAgUHJvbWlzZS5hbGwgPSBmdW5jdGlvbihhcnIpIHtcbiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgZnVuY3Rpb24gcmVzKGksIHZhbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgdmFyIHRoZW4gPSB2YWwudGhlbjtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB0aGVuLmNhbGwodmFsLCBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgIHJlcyhpLCB2YWwpO1xuICAgICAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcmdzW2ldID0gdmFsO1xuICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJlamVjdChleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlcyhpLCBhcmdzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBQcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFByb21pc2UucmFjZSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgUHJvbWlzZS5wcm90b3R5cGVbXCJjYXRjaFwiXSA9IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG4gICAgfTtcbiAgfSwge1xuICAgIFwiLi9jb3JlLmpzXCI6IDIsXG4gICAgYXNhcDogNFxuICB9IF0sXG4gIDQ6IFsgZnVuY3Rpb24ocmVxdWlyZSwgbW9kdWxlLCBleHBvcnRzKSB7XG4gICAgKGZ1bmN0aW9uKHByb2Nlc3MpIHtcbiAgICAgIHZhciBoZWFkID0ge1xuICAgICAgICB0YXNrOiB2b2lkIDAsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2YXIgdGFpbCA9IGhlYWQ7XG4gICAgICB2YXIgZmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIHZhciByZXF1ZXN0Rmx1c2ggPSB2b2lkIDA7XG4gICAgICB2YXIgaXNOb2RlSlMgPSBmYWxzZTtcbiAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICB3aGlsZSAoaGVhZC5uZXh0KSB7XG4gICAgICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgICAgICB2YXIgdGFzayA9IGhlYWQudGFzaztcbiAgICAgICAgICBoZWFkLnRhc2sgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIGRvbWFpbiA9IGhlYWQuZG9tYWluO1xuICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgIGhlYWQuZG9tYWluID0gdm9pZCAwO1xuICAgICAgICAgICAgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGlzTm9kZUpTKSB7XG4gICAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoZmx1c2gsIDApO1xuICAgICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5uZXh0VGljaykge1xuICAgICAgICBpc05vZGVKUyA9IHRydWU7XG4gICAgICAgIHJlcXVlc3RGbHVzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICByZXF1ZXN0Rmx1c2ggPSBzZXRJbW1lZGlhdGUuYmluZCh3aW5kb3csIGZsdXNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXF1ZXN0Rmx1c2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbHVzaCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmbHVzaDtcbiAgICAgICAgcmVxdWVzdEZsdXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RGbHVzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZmx1c2gsIDApO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgICAgIHRhaWwgPSB0YWlsLm5leHQgPSB7XG4gICAgICAgICAgdGFzazogdGFzayxcbiAgICAgICAgICBkb21haW46IGlzTm9kZUpTICYmIHByb2Nlc3MuZG9tYWluLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFmbHVzaGluZykge1xuICAgICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgICByZXF1ZXN0Rmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhc2FwO1xuICAgIH0pLmNhbGwodGhpcywgcmVxdWlyZShcIl9wcm9jZXNzXCIpKTtcbiAgfSwge1xuICAgIF9wcm9jZXNzOiAxXG4gIH0gXSxcbiAgNTogWyBmdW5jdGlvbihyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpIHtcbiAgICBpZiAodHlwZW9mIFByb21pc2UucHJvdG90eXBlLmRvbmUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgUHJvbWlzZS5wcm90b3R5cGUuZG9uZSA9IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHZhciBzZWxmID0gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMudGhlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdGhpcztcbiAgICAgICAgc2VsZi50aGVuKG51bGwsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHt9IF0sXG4gIDY6IFsgZnVuY3Rpb24ocmVxdWlyZSwgbW9kdWxlLCBleHBvcnRzKSB7XG4gICAgdmFyIGFzYXAgPSByZXF1aXJlKFwiYXNhcFwiKTtcbiAgICBpZiAodHlwZW9mIFByb21pc2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFByb21pc2UgPSByZXF1aXJlKFwiLi9saWIvY29yZS5qc1wiKTtcbiAgICAgIHJlcXVpcmUoXCIuL2xpYi9lczYtZXh0ZW5zaW9ucy5qc1wiKTtcbiAgICB9XG4gICAgcmVxdWlyZShcIi4vcG9seWZpbGwtZG9uZS5qc1wiKTtcbiAgfSwge1xuICAgIFwiLi9saWIvY29yZS5qc1wiOiAyLFxuICAgIFwiLi9saWIvZXM2LWV4dGVuc2lvbnMuanNcIjogMyxcbiAgICBcIi4vcG9seWZpbGwtZG9uZS5qc1wiOiA1LFxuICAgIGFzYXA6IDRcbiAgfSBdXG59LCB7fSwgWyA2IF0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9L3BvbHlmaWxscy9wcm9taXNlLTYuMS4wLmpzLm1hcCIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTIgQmFybmVzYW5kbm9ibGUuY29tLCBsbGMsIERvbmF2b24gV2VzdCwgYW5kIERvbWVuaWMgRGVuaWNvbGFcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG5hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcblwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xud2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvXG5wZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cbnRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbmluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG5XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHNldEltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIGFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJncykge1xuICAgICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gcGFydGlhbGx5QXBwbGllZC5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgc2V0SW1tZWRpYXRlLCBidXRcbiAgICAvLyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZXF1aXJlcyBubyBhcmd1bWVudHMuXG4gICAgZnVuY3Rpb24gcGFydGlhbGx5QXBwbGllZChoYW5kbGVyKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgKG5ldyBGdW5jdGlvbihcIlwiICsgaGFuZGxlcikpKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChwYXJ0aWFsbHlBcHBsaWVkKHJ1bklmUHJlc2VudCwgaGFuZGxlKSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2socGFydGlhbGx5QXBwbGllZChydW5JZlByZXNlbnQsIGhhbmRsZSkpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHBhcnRpYWxseUFwcGxpZWQocnVuSWZQcmVzZW50LCBoYW5kbGUpLCAwKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufShuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpKSk7XG4iLCIoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gVmlld3BvcnQoKSB7XG5cbiAgICAgICAgdGhpcy5QUkVfSU9TN19WSUVXUE9SVCA9IFwiaW5pdGlhbC1zY2FsZT0xLCBtYXhpbXVtLXNjYWxlPTEsIHVzZXItc2NhbGFibGU9bm9cIjtcbiAgICAgICAgdGhpcy5JT1M3X1ZJRVdQT1JUID0gXCJpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MSwgdXNlci1zY2FsYWJsZT1ub1wiO1xuICAgICAgICB0aGlzLkRFRkFVTFRfVklFV1BPUlQgPSBcImluaXRpYWwtc2NhbGU9MSwgbWF4aW11bS1zY2FsZT0xLCB1c2VyLXNjYWxhYmxlPW5vXCI7XG5cbiAgICAgICAgdGhpcy5lbnN1cmVWaWV3cG9ydEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IHt9O1xuICAgICAgICB0aGlzLnBsYXRmb3JtLm5hbWUgPSB0aGlzLmdldFBsYXRmb3JtTmFtZSgpO1xuICAgICAgICB0aGlzLnBsYXRmb3JtLnZlcnNpb24gPSB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBWaWV3cG9ydC5wcm90b3R5cGUuZW5zdXJlVmlld3BvcnRFbGVtZW50ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy52aWV3cG9ydEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJyk7XG4gICAgICAgIGlmKCF0aGlzLnZpZXdwb3J0RWxlbWVudCl7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21ldGEnKTtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50Lm5hbWUgPSBcInZpZXdwb3J0XCI7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMudmlld3BvcnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBWaWV3cG9ydC5wcm90b3R5cGUuc2V0dXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmlld3BvcnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uby1hZGp1c3QnKSA9PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0ubmFtZSA9PSAnaW9zJykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0udmVyc2lvbiA+PSA3ICYmIGlzV2ViVmlldygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250ZW50JywgdGhpcy5JT1M3X1ZJRVdQT1JUKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3cG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250ZW50JywgdGhpcy5QUkVfSU9TN19WSUVXUE9SVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCB0aGlzLkRFRkFVTFRfVklFV1BPUlQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNXZWJWaWV3KCkge1xuICAgICAgICAgICAgcmV0dXJuICEhKHdpbmRvdy5jb3Jkb3ZhIHx8IHdpbmRvdy5waG9uZWdhcCB8fCB3aW5kb3cuUGhvbmVHYXApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFZpZXdwb3J0LnByb3RvdHlwZS5nZXRQbGF0Zm9ybU5hbWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcImFuZHJvaWRcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJpb3NcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVua25vd25cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgVmlld3BvcnQucHJvdG90eXBlLmdldFBsYXRmb3JtVmVyc2lvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdPUyAnKTtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5OdW1iZXIod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuc3Vic3RyKHN0YXJ0ICsgMywgMykucmVwbGFjZSgnXycsICcuJykpO1xuICAgIH07XG5cbiAgICB3aW5kb3cuVmlld3BvcnQgPSBWaWV3cG9ydDtcbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5cbndpbmRvdy5Eb29yTG9jayA9ICgoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBnZW5lcmF0ZUlkID0gKGZ1bmN0aW9uKCkge1xuICAgIGxldCBpID0gMDtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaSsrO1xuICAgIH07XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIERvb3IgbG9ja2luZyBzeXN0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMubG9nXVxuICAgKi9cbiAgY2xhc3MgRG9vckxvY2sge1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB0aGlzLl9sb2NrTGlzdCA9IFtdO1xuICAgICAgdGhpcy5fd2FpdExpc3QgPSBbXTtcbiAgICAgIHRoaXMuX2xvZyA9IG9wdGlvbnMubG9nIHx8IGZ1bmN0aW9uKCkge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBsb2NrLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RnVuY3Rpb259IENhbGxiYWNrIGZvciB1bmxvY2tpbmcuXG4gICAgICovXG4gICAgbG9jaygpIHtcbiAgICAgIGNvbnN0IHVubG9jayA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fdW5sb2NrKHVubG9jayk7XG4gICAgICB9O1xuICAgICAgdW5sb2NrLmlkID0gZ2VuZXJhdGVJZCgpO1xuICAgICAgdGhpcy5fbG9ja0xpc3QucHVzaCh1bmxvY2spO1xuICAgICAgdGhpcy5fbG9nKCdsb2NrOiAnICsgKHVubG9jay5pZCkpO1xuXG4gICAgICByZXR1cm4gdW5sb2NrO1xuICAgIH1cblxuICAgIF91bmxvY2soZm4pIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbG9ja0xpc3QuaW5kZXhPZihmbik7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgbG9jayBsaXN0LicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9sb2NrTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5fbG9nKCd1bmxvY2s6ICcgKyBmbi5pZCk7XG5cbiAgICAgIHRoaXMuX3RyeVRvRnJlZVdhaXRMaXN0KCk7XG4gICAgfVxuXG4gICAgX3RyeVRvRnJlZVdhaXRMaXN0KCkge1xuICAgICAgd2hpbGUgKCF0aGlzLmlzTG9ja2VkKCkgJiYgdGhpcy5fd2FpdExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl93YWl0TGlzdC5zaGlmdCgpKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3Igd2FpdGluZyB1bmxvY2tlZCBkb29yLlxuICAgICAqXG4gICAgICogQHBhcmFtcyB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIG9uIHVubG9ja2luZyB0aGUgZG9vciBjb21wbGV0ZWx5LlxuICAgICAqL1xuICAgIHdhaXRVbmxvY2soY2FsbGJhY2spIHtcbiAgICAgIGlmICghKGNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNhbGxiYWNrIHBhcmFtIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNMb2NrZWQoKSkge1xuICAgICAgICB0aGlzLl93YWl0TGlzdC5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0xvY2tlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2NrTGlzdC5sZW5ndGggPiAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEb29yTG9jaztcbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cblxuICBjb25zdCB1dGlsID0ge1xuICAgIF9yZWFkeTogZmFsc2UsXG5cbiAgICBfZG9tQ29udGVudExvYWRlZDogZmFsc2UsXG5cbiAgICBfb25ET01Db250ZW50TG9hZGVkOiAoKSA9PiB7XG4gICAgICB1dGlsLl9kb21Db250ZW50TG9hZGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKG9ucy5pc1dlYlZpZXcoKSkge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCAoKSA9PiB7XG4gICAgICAgICAgdXRpbC5fcmVhZHkgPSB0cnVlO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1dGlsLl9yZWFkeSA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFkZEJhY2tCdXR0b25MaXN0ZW5lcjogZnVuY3Rpb24oZm4pIHtcbiAgICAgIGlmICghdGhpcy5fZG9tQ29udGVudExvYWRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIGlzIGF2YWlsYWJsZSBhZnRlciBET01Db250ZW50TG9hZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9yZWFkeSkge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmFja2J1dHRvbicsIGZuLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmFja2J1dHRvbicsIGZuLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICByZW1vdmVCYWNrQnV0dG9uTGlzdGVuZXI6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICBpZiAoIXRoaXMuX2RvbUNvbnRlbnRMb2FkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgYWZ0ZXIgRE9NQ29udGVudExvYWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcmVhZHkpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gdXRpbC5fb25ET01Db250ZW50TG9hZGVkKCksIGZhbHNlKTtcblxuICBjb25zdCBIYW5kbGVyUmVwb3NpdG9yeSA9IHtcbiAgICBfc3RvcmU6IHt9LFxuXG4gICAgX2dlbklkOiAoKCkgPT4ge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcmV0dXJuICgpID0+IGkrKztcbiAgICB9KSgpLFxuXG4gICAgc2V0OiBmdW5jdGlvbihlbGVtZW50LCBoYW5kbGVyKSB7XG4gICAgICBpZiAoZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkID0gSGFuZGxlclJlcG9zaXRvcnkuX2dlbklkKCk7XG4gICAgICB0aGlzLl9zdG9yZVtpZF0gPSBoYW5kbGVyO1xuICAgIH0sXG5cbiAgICByZW1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIGlmIChlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RvcmVbZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWRdO1xuICAgICAgICBkZWxldGUgZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQ7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZDtcblxuICAgICAgaWYgKCF0aGlzLl9zdG9yZVtpZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9zdG9yZVtpZF07XG4gICAgfSxcblxuICAgIGhhczogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZDtcblxuICAgICAgcmV0dXJuICEhdGhpcy5fc3RvcmVbaWRdO1xuICAgIH1cbiAgfTtcblxuICBjbGFzcyBEZXZpY2ViYWNrQnV0dG9uRGlzcGF0Y2hlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2JvdW5kQ2FsbGJhY2sgPSB0aGlzLl9jYWxsYmFjay5iaW5kKHRoaXMpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIHRvIGhhbmRsZSAnYmFja2J1dHRvbicgZXZlbnRzLlxuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICAgIHV0aWwuYWRkQmFja0J1dHRvbkxpc3RlbmVyKHRoaXMuX2JvdW5kQ2FsbGJhY2spO1xuICAgICAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgdG8gaGFuZGxlICdiYWNrYnV0dG9uJyBldmVudHMuXG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgIGlmICh0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgICAgdXRpbC5yZW1vdmVCYWNrQnV0dG9uTGlzdGVuZXIodGhpcy5fYm91bmRDYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmUgYSAnYmFja2J1dHRvbicgZXZlbnQgbWFudWFsbHkuXG4gICAgICovXG4gICAgZmlyZURldmljZUJhY2tCdXR0b25FdmVudCgpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICBldmVudC5pbml0RXZlbnQoJ2JhY2tidXR0b24nLCB0cnVlLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIF9jYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2Rpc3BhdGNoRGV2aWNlQmFja0J1dHRvbkV2ZW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgY3JlYXRlSGFuZGxlcihlbGVtZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShjYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRnVuY3Rpb24nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFuZGxlciA9IHtcbiAgICAgICAgX2NhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgX2VsZW1lbnQ6IGVsZW1lbnQsXG5cbiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgSGFuZGxlclJlcG9zaXRvcnkucmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldExpc3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5hYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBIYW5kbGVyUmVwb3NpdG9yeS5zZXQoZWxlbWVudCwgdGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gSGFuZGxlclJlcG9zaXRvcnkuZ2V0KGVsZW1lbnQpID09PSB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIEhhbmRsZXJSZXBvc2l0b3J5LnJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgICB0aGlzLl9jYWxsYmFjayA9IHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGVyLmVuYWJsZSgpO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBfZGlzcGF0Y2hEZXZpY2VCYWNrQnV0dG9uRXZlbnQoKSB7XG4gICAgICBjb25zdCB0cmVlID0gdGhpcy5fY2FwdHVyZVRyZWUoKTtcbiAgICAgIC8vdGhpcy5fZHVtcFRyZWUodHJlZSk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9maW5kSGFuZGxlckxlYWZFbGVtZW50KHRyZWUpO1xuICAgICAgLy90aGlzLl9kdW1wUGFyZW50cyhlbGVtZW50KTtcblxuICAgICAgbGV0IGhhbmRsZXIgPSBIYW5kbGVyUmVwb3NpdG9yeS5nZXQoZWxlbWVudCk7XG4gICAgICBoYW5kbGVyLl9jYWxsYmFjayhjcmVhdGVFdmVudChlbGVtZW50KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICBjYWxsUGFyZW50SGFuZGxlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyUmVwb3NpdG9yeS5nZXQocGFyZW50KTtcbiAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5fY2FsbGJhY2soY3JlYXRlRXZlbnQocGFyZW50KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIF9kdW1wUGFyZW50cyhlbGVtZW50KSB7XG4gICAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKyAnLicgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKSk7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIF9jYXB0dXJlVHJlZSgpIHtcbiAgICAgIHJldHVybiBjcmVhdGVUcmVlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICBmdW5jdGlvbiBjcmVhdGVUcmVlKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgIGNoaWxkcmVuOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnJheU9mKGVsZW1lbnQuY2hpbGRyZW4pLm1hcChmdW5jdGlvbihjaGlsZEVsZW1lbnQpIHtcblxuICAgICAgICAgICAgaWYgKGNoaWxkRWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhSGFuZGxlclJlcG9zaXRvcnkuaGFzKGNoaWxkRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVUcmVlKGNoaWxkRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFIYW5kbGVyUmVwb3NpdG9yeS5oYXMocmVzdWx0LmVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtyZXN1bHRdO1xuICAgICAgICAgIH0pKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhcnJheU9mKHRhcmdldCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh0YXJnZXRbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2R1bXBUcmVlKG5vZGUpIHtcbiAgICAgIF9kdW1wKG5vZGUsIDApO1xuXG4gICAgICBmdW5jdGlvbiBfZHVtcChub2RlLCBsZXZlbCkge1xuICAgICAgICBjb25zdCBwYWQgPSBuZXcgQXJyYXkobGV2ZWwgKyAxKS5qb2luKCcgICcpO1xuICAgICAgICBjb25zb2xlLmxvZyhwYWQgKyBub2RlLmVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgX2R1bXAobm9kZSwgbGV2ZWwgKyAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyZWVcbiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAgICAgKi9cbiAgICBfZmluZEhhbmRsZXJMZWFmRWxlbWVudCh0cmVlKSB7XG4gICAgICByZXR1cm4gZmluZCh0cmVlKTtcblxuICAgICAgZnVuY3Rpb24gZmluZChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBub2RlLmVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gZmluZChub2RlLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcChmdW5jdGlvbihjaGlsZE5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGROb2RlLmVsZW1lbnQ7XG4gICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgICAgIGlmICghbGVmdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJpZ2h0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxlZnRaID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUobGVmdCwgJycpLnpJbmRleCwgMTApO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0WiA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHJpZ2h0LCAnJykuekluZGV4LCAxMCk7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKGxlZnRaKSAmJiAhaXNOYU4ocmlnaHRaKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxlZnRaID4gcmlnaHRaID8gbGVmdCA6IHJpZ2h0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwdHVyaW5nIGJhY2tidXR0b24taGFuZGxlciBpcyBmYWlsdXJlLicpO1xuICAgICAgICB9LCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyID0gbmV3IERldmljZWJhY2tCdXR0b25EaXNwYXRjaGVyKCk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmVuYWJsZSgpO1xuICB9KTtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIG9ucy5fcmVhZHlMb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gIG9ucy5fY29uZmlnID0ge1xuICAgIGF1dG9TdGF0dXNCYXJGaWxsOiB0cnVlLFxuICAgIGFuaW1hdGlvbnNEaXNhYmxlZDogZmFsc2VcbiAgfTtcblxuICB3YWl0RGV2aWNlUmVhZHkoKTtcblxuICAvKipcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIG9ucy5pc1JlYWR5ID0gKCkgPT4ge1xuICAgIHJldHVybiAhb25zLl9yZWFkeUxvY2suaXNMb2NrZWQoKTtcbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIG9ucy5pc1dlYlZpZXcgPSAoKSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09ICd1bmluaXRpYWxpemVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpc1dlYlZpZXcoKSBtZXRob2QgaXMgYXZhaWxhYmxlIGFmdGVyIGRvbSBjb250ZW50cyBsb2FkZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKHdpbmRvdy5jb3Jkb3ZhIHx8IHdpbmRvdy5waG9uZWdhcCB8fCB3aW5kb3cuUGhvbmVHYXApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25zLnJlYWR5ID0gY2FsbGJhY2sgPT4ge1xuICAgIGlmIChvbnMuaXNSZWFkeSgpKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbnMuX3JlYWR5TG9jay53YWl0VW5sb2NrKGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqL1xuICBvbnMuc2V0RGVmYXVsdERldmljZUJhY2tCdXR0b25MaXN0ZW5lciA9IGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgb25zLl9kZWZhdWx0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuc2V0TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoaXMgZnJhbWV3b3JrIHRvIGhhbmRsZSBjb3Jkb3ZhIFwiYmFja2J1dHRvblwiIGV2ZW50LlxuICAgKi9cbiAgb25zLmRpc2FibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgIG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuZGlzYWJsZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhpcyBmcmFtZXdvcmsgdG8gaGFuZGxlIGNvcmRvdmEgXCJiYWNrYnV0dG9uXCIgZXZlbnQuXG4gICAqL1xuICBvbnMuZW5hYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmVuYWJsZSgpO1xuICB9O1xuXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzdGF0dXMgYmFyIGZpbGwgZmVhdHVyZSBvbiBpT1M3IGFuZCBhYm92ZS5cbiAgICovXG4gIG9ucy5lbmFibGVBdXRvU3RhdHVzQmFyRmlsbCA9ICgpID0+IHtcbiAgICBpZiAob25zLmlzUmVhZHkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgb25zLmlzUmVhZHkoKSBpcyB0cnVlLicpO1xuICAgIH1cbiAgICBvbnMuX2NvbmZpZy5hdXRvU3RhdHVzQmFyRmlsbCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc3RhdHVzIGJhciBmaWxsIGZlYXR1cmUgb24gaU9TNyBhbmQgYWJvdmUuXG4gICAqL1xuICBvbnMuZGlzYWJsZUF1dG9TdGF0dXNCYXJGaWxsID0gKCkgPT4ge1xuICAgIGlmIChvbnMuaXNSZWFkeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBvbnMuaXNSZWFkeSgpIGlzIHRydWUuJyk7XG4gICAgfVxuICAgIG9ucy5fY29uZmlnLmF1dG9TdGF0dXNCYXJGaWxsID0gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYWxsIGFuaW1hdGlvbnMuIENvdWxkIGJlIGhhbmR5IGZvciB0ZXN0aW5nIGFuZCBvbGRlciBkZXZpY2VzLlxuICAgKi9cbiAgb25zLmRpc2FibGVBbmltYXRpb25zID0gKCkgPT4ge1xuICAgIG9ucy5fY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhbmltYXRpb25zIChkZWZhdWx0KS5cbiAgICovXG4gIG9ucy5lbmFibGVBbmltYXRpb25zID0gKCkgPT4ge1xuICAgIG9ucy5fY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA9IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmxpbmtdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBvbnMuX2NyZWF0ZVBvcG92ZXJPcmlnaW5hbCA9IGZ1bmN0aW9uKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmICghcGFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYWdlIHVybCBtdXN0IGJlIGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKGh0bWwgPT4ge1xuICAgICAgY29uc3QgZGl2ID0gb25zLl91dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXY+JyArIGh0bWwgKyAnPC9kaXY+Jyk7XG5cbiAgICAgIGNvbnN0IHBvcG92ZXIgPSBkaXYucXVlcnlTZWxlY3Rvcignb25zLXBvcG92ZXInKTtcbiAgICAgIGlmICghcG9wb3Zlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYDxvbnMtcG9wb3Zlcj4gZWxlbWVudCBpcyBub3QgcHJvdmlkZWQgb24gXCIke3BhZ2V9XCIgcGFnZS5gKTtcbiAgICAgIH1cbiAgICAgIEN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUocG9wb3Zlcik7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBvcG92ZXIpO1xuXG4gICAgICBpZiAob3B0aW9ucy5saW5rIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgb3B0aW9ucy5saW5rKHBvcG92ZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcG9wb3ZlcjtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgb25zLmNyZWF0ZVBvcG92ZXIgPSBvbnMuX2NyZWF0ZVBvcG92ZXJPcmlnaW5hbDtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5saW5rXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgb25zLl9jcmVhdGVEaWFsb2dPcmlnaW5hbCA9IGZ1bmN0aW9uKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmICghcGFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYWdlIHVybCBtdXN0IGJlIGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKGh0bWwgPT4ge1xuICAgICAgaHRtbCA9IGh0bWwubWF0Y2goLzxvbnMtZGlhbG9nL2dpKSA/IGA8ZGl2PiR7aHRtbH08L2Rpdj5gIDogYDxvbnMtZGlhbG9nPiR7aHRtbH08L29ucy1kaWFsb2c+YDtcbiAgICAgIGNvbnN0IGRpdiA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2PicgKyBodG1sICsgJzwvZGl2PicpO1xuXG4gICAgICBjb25zdCBkaWFsb2cgPSBkaXYucXVlcnlTZWxlY3Rvcignb25zLWRpYWxvZycpO1xuICAgICAgaWYgKCFkaWFsb2cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8b25zLWRpYWxvZz4gZWxlbWVudCBpcyBub3QgcHJvdmlkZWQgb24gXCIke3BhZ2V9XCIgcGFnZS5gKTtcbiAgICAgIH1cbiAgICAgIEN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUoZGlhbG9nKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nKTtcblxuICAgICAgaWYgKG9wdGlvbnMubGluayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIG9wdGlvbnMubGluayhkaWFsb2cpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlhbG9nO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBvbnMuY3JlYXRlRGlhbG9nID0gb25zLl9jcmVhdGVEaWFsb2dPcmlnaW5hbDtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5saW5rXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgb25zLl9jcmVhdGVBbGVydERpYWxvZ09yaWdpbmFsID0gZnVuY3Rpb24ocGFnZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKCFwYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhZ2UgdXJsIG11c3QgYmUgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb25zLl9pbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jKHBhZ2UpLnRoZW4oaHRtbCA9PiB7XG4gICAgICBodG1sID0gaHRtbC5tYXRjaCgvPG9ucy1hbGVydC1kaWFsb2cvZ2kpID8gYDxkaXY+JHtodG1sfTwvZGl2PmAgOiBgPG9ucy1hbGVydC1kaWFsb2c+JHtodG1sfTwvb25zLWFsZXJ0LWRpYWxvZz5gO1xuICAgICAgY29uc3QgZGl2ID0gb25zLl91dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXY+JyArIGh0bWwgKyAnPC9kaXY+Jyk7XG5cbiAgICAgIGNvbnN0IGFsZXJ0RGlhbG9nID0gZGl2LnF1ZXJ5U2VsZWN0b3IoJ29ucy1hbGVydC1kaWFsb2cnKTtcbiAgICAgIGlmICghYWxlcnREaWFsb2cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGA8b25zLWFsZXJ0LWRpYWxvZz4gZWxlbWVudCBpcyBub3QgcHJvdmlkZWQgb24gXCIke3BhZ2V9XCIgcGFnZS5gKTtcbiAgICAgIH1cbiAgICAgIEN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUoYWxlcnREaWFsb2cpO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhbGVydERpYWxvZyk7XG5cbiAgICAgIGlmIChvcHRpb25zLmxpbmsgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICBvcHRpb25zLmxpbmsoYWxlcnREaWFsb2cpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxlcnREaWFsb2c7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMubGlua11cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5jcmVhdGVBbGVydERpYWxvZ09yaWdpbmFsID0gb25zLl9jcmVhdGVBbGVydERpYWxvZ09yaWdpbmFsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaW5rXG4gICAqL1xuICBvbnMuX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXJPcmlnaW5hbCA9IGZ1bmN0aW9uKHBhZ2UsIGxpbmspIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IG9ucy5fdXRpbC5hcnJheUZyb20od2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbnMtbG9hZGluZy1wbGFjZWhvbGRlcl0nKSk7XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgZWxlbWVudHNcbiAgICAgICAgLmZpbHRlcihlbGVtZW50ID0+ICFlbGVtZW50LmdldEF0dHJpYnV0ZSgncGFnZScpKVxuICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnb25zLWxvYWRpbmctcGxhY2Vob2xkZXInLCBwYWdlKTtcbiAgICAgICAgICBvbnMuX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIoZWxlbWVudCwgcGFnZSwgbGluayk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG9ucy1sb2FkaW5nLXBsYWNlaG9sZGVyIGV4aXN0cy4nKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqL1xuICBvbnMucmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlciA9IG9ucy5fcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlck9yaWdpbmFsO1xuXG4gIG9ucy5fc2V0dXBMb2FkaW5nUGxhY2VIb2xkZXJzID0gZnVuY3Rpb24oKSB7XG4gICAgb25zLnJlYWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gb25zLl91dGlsLmFycmF5RnJvbSh3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ucy1sb2FkaW5nLXBsYWNlaG9sZGVyXScpKTtcblxuICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgcGFnZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdvbnMtbG9hZGluZy1wbGFjZWhvbGRlcicpO1xuICAgICAgICBpZiAodHlwZW9mIHBhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgb25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyKGVsZW1lbnQsIHBhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBvbnMuX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIgPSBmdW5jdGlvbihlbGVtZW50LCBwYWdlLCBsaW5rKSB7XG4gICAgbGluayA9IGxpbmsgfHwgZnVuY3Rpb24oZWxlbWVudCwgZG9uZSkgeyBkb25lKCk7IH07XG4gICAgb25zLl9pbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jKHBhZ2UpLnRoZW4oaHRtbCA9PiB7XG5cbiAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2PicgKyBodG1sICsgJzwvZGl2PicpO1xuICAgICAgY29udGVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50RWxlbWVudCk7XG5cbiAgICAgIGxpbmsoY29udGVudEVsZW1lbnQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjb250ZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9KTtcblxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlZCB0byByZXNvbHZlIHBsYWNlaG9sZGVyOiAnICsgZXJyb3IpO1xuICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHdhaXREZXZpY2VSZWFkeSgpIHtcbiAgICBjb25zdCB1bmxvY2tEZXZpY2VSZWFkeSA9IG9ucy5fcmVhZHlMb2NrLmxvY2soKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgIGlmIChvbnMuaXNXZWJWaWV3KCkpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgdW5sb2NrRGV2aWNlUmVhZHksIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVubG9ja0RldmljZVJlYWR5KCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCB1dGlsID0gb25zLl91dGlsID0gb25zLl91dGlsIHx8IHt9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IGRvdCBjbGFzcyBuYW1lIG9yIG5vZGUgbmFtZS5cbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnQvbnVsbH1cbiAgICovXG4gIHV0aWwuZmluZENoaWxkID0gKGVsZW1lbnQsIHF1ZXJ5KSA9PiB7XG4gICAgY29uc3QgbWF0Y2ggPSBxdWVyeS5zdWJzdHIoMCwgMSkgPT09ICcuJyA/XG4gICAgICAobm9kZSkgPT4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMocXVlcnkuc3Vic3RyKDEpKSA6XG4gICAgICAobm9kZSkgPT4gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBxdWVyeTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5baV07XG4gICAgICBpZiAobWF0Y2gobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHF1ZXJ5IGRvdCBjbGFzcyBuYW1lIG9yIG5vZGUgbmFtZS5cbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnQvbnVsbH1cbiAgICovXG4gIHV0aWwuZmluZFBhcmVudCA9IChlbGVtZW50LCBxdWVyeSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoID0gcXVlcnkuc3Vic3RyKDAsIDEpID09PSAnLicgP1xuICAgICAgKG5vZGUpID0+IG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKHF1ZXJ5LnN1YnN0cigxKSkgOlxuICAgICAgKG5vZGUpID0+IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcXVlcnk7XG5cbiAgICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG1hdGNoKHBhcmVudCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICovXG4gIHV0aWwuY3JlYXRlRWxlbWVudCA9IChodG1sKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBwZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGlmICh3cmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJodG1sXCIgbXVzdCBiZSBvbmUgd3JhcHBlciBlbGVtZW50LicpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwcGVyLmNoaWxkcmVuWzBdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICovXG4gIHV0aWwucmVtb3ZlRWxlbWVudCA9IChlbGVtZW50KSA9PiB7XG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICAvKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZHN0IERlc3RpbmF0aW9uIG9iamVjdC5cbiAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNyYyBTb3VyY2Ugb2JqZWN0KHMpLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZWZlcmVuY2UgdG8gYGRzdGAuXG4gICAqL1xuICB1dGlsLmV4dGVuZCA9IChkc3QsIC4uLmFyZ3MpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcmdzW2ldKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcmdzW2ldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICBkc3Rba2V5XSA9IGFyZ3NbaV1ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhcnJheUxpa2VcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICB1dGlsLmFycmF5RnJvbSA9IChhcnJheUxpa2UpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlrZS5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2goYXJyYXlMaWtlW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIE1vZGFsQW5pbWF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kdXJhdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgdGhpcy5kZWxheSA9IDA7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gMC4yO1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIHRoaXMudGltaW5nID0gb3B0aW9ucy50aW1pbmcgfHwgdGhpcy50aW1pbmc7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kdXJhdGlvbiA6IHRoaXMuZHVyYXRpb247XG4gICAgICB0aGlzLmRlbGF5ID0gb3B0aW9ucy5kZWxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZWxheSA6IHRoaXMuZGVsYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNob3cobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1vZGFsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBoaWRlKG1vZGFsLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuTW9kYWxBbmltYXRvciA9IE1vZGFsQW5pbWF0b3I7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kdXJhdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9ucy5fdXRpbC5leHRlbmQoe1xuICAgICAgICB0aW1pbmc6ICdsaW5lYXInLFxuICAgICAgICBkdXJhdGlvbjogJzAuNCcsXG4gICAgICAgIGRlbGF5OiAnMCdcbiAgICAgIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gICAgICB0aGlzLnRpbWluZyA9IG9wdGlvbnMudGltaW5nO1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb247XG4gICAgICB0aGlzLmRlbGF5ID0gb3B0aW9ucy5kZWxheTtcbiAgICB9XG5cbiAgICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBwb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLk5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIFBvcG92ZXJBbmltYXRvciB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnRpbWluZ1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmR1cmF0aW9uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb25zLl91dGlsLmV4dGVuZCh7XG4gICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC40LCAxKScsXG4gICAgICAgIGR1cmF0aW9uOiAwLjIsXG4gICAgICAgIGRlbGF5OiAwXG4gICAgICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICAgICAgdGhpcy50aW1pbmcgPSBvcHRpb25zLnRpbWluZztcbiAgICAgIHRoaXMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uO1xuICAgICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXk7XG4gICAgfVxuXG4gICAgc2hvdyhwb3BvdmVyLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBoaWRlKHBvcG92ZXIsIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLlBvcG92ZXJBbmltYXRvciA9IFBvcG92ZXJBbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEFsZXJ0RGlhbG9nQW5pbWF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdsaW5lYXInLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yfSA9IHt9KSB7XG4gICAgICB0aGlzLnRpbWluZyA9IHRpbWluZztcbiAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcbiAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAgICovXG4gICAgc2hvdyhkaWFsb2csIGRvbmUpIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAgICovXG4gICAgaGlkZShkaWFsb2csIGRvbmUpIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQW5kcm9pZCBzdHlsZSBhbmltYXRvciBmb3IgYWxlcnQgZGlhbG9nLlxuICAgKi9cbiAgY2xhc3MgQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBBbGVydERpYWxvZ0FuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZHVyYXRpb24gPSAwLjIsIGRlbGF5ID0gMH0gPSB7fSkge1xuICAgICAgc3VwZXIoe2R1cmF0aW9uLCB0aW1pbmcsIGRlbGF5fSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMC45LCAwLjksIDEuMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMS4wLCAxLjAsIDEuMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBoaWRlKGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgxLjAsIDEuMCwgMS4wKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgwLjksIDAuOSwgMS4wKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDAuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBpT1Mgc3R5bGUgYW5pbWF0b3IgZm9yIGFsZXJ0IGRpYWxvZy5cbiAgICovXG4gIGNsYXNzIElPU0FsZXJ0RGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBBbGVydERpYWxvZ0FuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZHVyYXRpb24gPSAwLjIsIGRlbGF5ID0gMH0gPSB7fSkge1xuICAgICAgc3VwZXIoe2R1cmF0aW9uLCB0aW1pbmcsIGRlbGF5fSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgxLjMsIDEuMywgMS4wKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDAuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgxLjAsIDEuMCwgMS4wKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIG9wYWNpdHk6IDAuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuQWxlcnREaWFsb2dBbmltYXRvciA9IEFsZXJ0RGlhbG9nQW5pbWF0b3I7XG4gIG9ucy5faW50ZXJuYWwuQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3IgPSBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvcjtcbiAgb25zLl9pbnRlcm5hbC5JT1NBbGVydERpYWxvZ0FuaW1hdG9yID0gSU9TQWxlcnREaWFsb2dBbmltYXRvcjtcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEFuaW1hdG9yRmFjdG9yeSB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzLmFuaW1hdG9ycyBUaGUgZGljdGlvbmFyeSBmb3IgYW5pbWF0b3IgY2xhc3Nlc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdHMuYmFzZUNsYXNzIFRoZSBiYXNlIGNsYXNzIG9mIGFuaW1hdG9yc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRzLmJhc2VDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIGJhc2UgY2xhc3Mgb2YgYW5pbWF0b3JzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9wdHMuZGVmYXVsdEFuaW1hdGlvbiBUaGUgZGVmYXVsdCBhbmltYXRpb24gbmFtZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzLmRlZmF1bHRBbmltYXRpb25PcHRpb25zIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgdGhpcy5fYW5pbWF0b3JzID0gb3B0cy5hbmltYXRvcnM7XG4gICAgICB0aGlzLl9iYXNlQ2xhc3MgPSBvcHRzLmJhc2VDbGFzcztcbiAgICAgIHRoaXMuX2Jhc2VDbGFzc05hbWUgPSBvcHRzLmJhc2VDbGFzc05hbWUgfHwgb3B0cy5iYXNlQ2xhc3MubmFtZTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbiA9IG9wdHMuZGVmYXVsdEFuaW1hdGlvbiB8fCAnZGVmYXVsdCc7XG4gICAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zID0gb3B0cy5kZWZhdWx0QW5pbWF0aW9uT3B0aW9ucyB8fCB7fTtcblxuICAgICAgaWYgKCF0aGlzLl9hbmltYXRvcnNbdGhpcy5fYW5pbWF0aW9uXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1Y2ggYW5pbWF0aW9uOiAnICsgdGhpcy5fYW5pbWF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ganNvblN0cmluZ1xuICAgICAqIEByZXR1cm4ge09iamVjdC9udWxsfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZUpTT05TYWZlbHkoanNvblN0cmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICovXG4gICAgc2V0QW5pbWF0aW9uT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIFRoZSBhbmltYXRpb24gbmFtZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXSBUaGUgYW5pbWF0aW9uIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdEFuaW1hdG9yIFRoZSBkZWZhdWx0IGFuaW1hdG9yIGluc3RhbmNlXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBhbmltYXRvciBpbnN0YW5jZVxuICAgICAqL1xuICAgIG5ld0FuaW1hdG9yKG9wdGlvbnMsIGRlZmF1bHRBbmltYXRvcikge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGxldCBhbmltYXRvciA9IG51bGw7XG5cbiAgICAgIGlmIChvcHRpb25zLmFuaW1hdGlvbiBpbnN0YW5jZW9mIHRoaXMuX2Jhc2VDbGFzcykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5hbmltYXRpb247XG4gICAgICB9XG5cbiAgICAgIGxldCBBbmltYXRvciA9IG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbmltYXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIEFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JzW29wdGlvbnMuYW5pbWF0aW9uXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFBbmltYXRvciAmJiBkZWZhdWx0QW5pbWF0b3IpIHtcbiAgICAgICAgYW5pbWF0b3IgPSBkZWZhdWx0QW5pbWF0b3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBbmltYXRvciA9IEFuaW1hdG9yIHx8IHRoaXMuX2FuaW1hdG9yc1t0aGlzLl9hbmltYXRpb25dO1xuXG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbk9wdHMgPSBvbnMuX3V0aWwuZXh0ZW5kKFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbk9wdGlvbnMsXG4gICAgICAgICAgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zIHx8IHt9LFxuICAgICAgICAgIG9ucy5fY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA/IHtkdXJhdGlvbjogMCwgZGVsYXk6IDB9IDoge31cbiAgICAgICAgKTtcblxuICAgICAgICBhbmltYXRvciA9IG5ldyBBbmltYXRvcihhbmltYXRpb25PcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoYW5pbWF0b3IgaW5zdGFuY2VvZiB0aGlzLl9iYXNlQ2xhc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJhbmltYXRvclwiIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiAnICsgdGhpcy5fYmFzZUNsYXNzTmFtZSArICcuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbmltYXRvcjtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3RvcnkgPSBBbmltYXRvckZhY3Rvcnk7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBBc3luY0hvb2sge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja3MgPSBbXTtcbiAgICAgIHRoaXMuX2Zyb3plbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gcmVjZWl2ZSBhIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZSByZXN1bHQgb2JqZWN0IGFuZCB0YXJnZXQgb2JqZWN0IG9wdGluYWxseVxuICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBwYXNzLXRocm91Z2ggY2FsbGJhY2sgcGFyYW1ldGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIGFzeW5jSG9vay5hZGQoKG5leHQsIHRhcmdldCkgPT4gbmV4dCh0YXJnZXQgKyB0YXJnZXQpKTtcbiAgICAgKiAgIGFzeW5jSG9vay5ydW4ocmVzdWx0ID0+IGNvbnNvbGUubG9nKHJlc3VsdCksIDIpOyAvLyBwcmludCA0XG4gICAgICovXG4gICAgYWRkKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5fZnJvemVuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBob29rIGlzIGZyb3plbi4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGZ1bmN0aW9uIHJlY2VpdmUgYSBmdW5jdGlvbiB0aGF0IHJlY2VpdmUgcmVzdWx0IG9iamVjdCBhbmQgdGFyZ2V0IG9iamVjdCBvcHRpbmFsbHlcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIHJlbW92ZShjYWxsYmFjaykge1xuICAgICAgaWYgKHRoaXMuX2Zyb3plbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaG9vayBpcyBmcm96ZW4uJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZyZWV6ZSB0aGlzIGhvb2suIEFzeW5jSG9vayBkZW55IGFkZCgpIGFuZCByZW1vdmUoKSBvcGVyYXRpb24gYWZ0ZXIgdGhpcyBtZXRob2QgaXMgaW52b2tlZC5cbiAgICAgKi9cbiAgICBmcmVlemUoKSB7XG4gICAgICB0aGlzLl9mcm96ZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgZnVuY3Rpb24gcmVjZWl2ZSB0YXJnZXQgb2JqZWN0IG9wdGlvbmFsbHkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdXG4gICAgICovXG4gICAgcnVuKGNhbGxiYWNrLCB0YXJnZXQpIHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGNvbnN0IGYgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpIDwgdGhpcy5fY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tpXSgobmV3VGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICB0YXJnZXQgPSBuZXdUYXJnZXQ7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBmKCk7XG4gICAgICAgICAgfSwgdGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZigpO1xuICAgIH1cbiAgfVxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLkFzeW5jSG9vayA9IEFzeW5jSG9vaztcblxufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIERpYWxvZ0FuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgICAgdGhpcy50aW1pbmcgPSB0aW1pbmc7XG4gICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgICAqL1xuICAgIHNob3coZGlhbG9nLCBkb25lKSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgICAqL1xuICAgIGhpZGUoZGlhbG9nLCBkb25lKSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFuZHJvaWQgc3R5bGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAgICovXG4gIGNsYXNzIEFuZHJvaWREaWFsb2dBbmltYXRvciBleHRlbmRzIERpYWxvZ0FuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnZWFzZS1pbi1vdXQnLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zfSA9IHt9KSB7XG4gICAgICBzdXBlcih7dGltaW5nLCBkZWxheSwgZHVyYXRpb259KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTYwJSwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAwLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNjAlLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDAuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgZGlhbG9nLlxuICAgKi9cbiAgY2xhc3MgSU9TRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBEaWFsb2dBbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2Vhc2UtaW4tb3V0JywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuM30gPSB7fSkge1xuICAgICAgc3VwZXIoe3RpbWluZywgZGVsYXksIGR1cmF0aW9ufSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIDMwMCUsIDApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgMzAwJSwgMCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2xpZGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAgICovXG4gIGNsYXNzIFNsaWRlRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBEaWFsb2dBbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2N1YmljLWJlemllciguMSwgLjcsIC40LCAxKScsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtNTAlLCAtMzUwJSwgMCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTUwJSwgLTUwJSwgMCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtNTAlLCAtNTAlLCAwKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKC01MCUsIC0zNTAlLCAwKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5EaWFsb2dBbmltYXRvciA9IERpYWxvZ0FuaW1hdG9yO1xuICBvbnMuX2ludGVybmFsLkFuZHJvaWREaWFsb2dBbmltYXRvciA9IEFuZHJvaWREaWFsb2dBbmltYXRvcjtcbiAgb25zLl9pbnRlcm5hbC5JT1NEaWFsb2dBbmltYXRvciA9IElPU0RpYWxvZ0FuaW1hdG9yO1xuICBvbnMuX2ludGVybmFsLlNsaWRlRGlhbG9nQW5pbWF0b3IgPSBTbGlkZURpYWxvZ0FuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCJcbi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBNb2RhbEFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5Nb2RhbEFuaW1hdG9yO1xuXG4gIC8qKlxuICAgKiBpT1Mgc3R5bGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAgICovXG4gIGNsYXNzIEZhZGVNb2RhbEFuaW1hdG9yIGV4dGVuZHMgTW9kYWxBbmltYXRvciB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICBvcHRpb25zLnRpbWluZyA9IG9wdGlvbnMudGltaW5nIHx8ICdsaW5lYXInO1xuICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gfHwgJzAuMyc7XG4gICAgICBvcHRpb25zLmRlbGF5ID0gb3B0aW9ucy5kZWxheSB8fCAwO1xuXG4gICAgICBzdXBlcihvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2hvdyhtb2RhbCwgY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIGFuaW1pdChtb2RhbClcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH0pXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgIH0pXG4gICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5wbGF5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIGhpZGUobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgICBhbmltaXQobW9kYWwpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICB9KVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgfSlcbiAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnBsYXkoKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5GYWRlTW9kYWxBbmltYXRvciA9IEZhZGVNb2RhbEFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3I7XG5cbiAgLyoqXG4gICAqIEZhZGUtaW4gc2NyZWVuIHRyYW5zaXRpb24uXG4gICAqL1xuICBjbGFzcyBGYWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvbnMuX3V0aWwuZXh0ZW5kKHtcbiAgICAgICAgdGltaW5nOiAnbGluZWFyJyxcbiAgICAgICAgZHVyYXRpb246ICcwLjQnLFxuICAgICAgICBkZWxheTogJzAnXG4gICAgICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoW2VudGVyUGFnZS5lbGVtZW50Ll9nZXRDb250ZW50RWxlbWVudCgpLCBlbnRlclBhZ2UuZWxlbWVudC5fZ2V0QmFja2dyb3VuZEVsZW1lbnQoKV0pXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChlbnRlclBhZ2UuZWxlbWVudC5fZ2V0VG9vbGJhckVsZW1lbnQoKSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICApO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAgICovXG4gICAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoW2xlYXZlUGFnZS5lbGVtZW50Ll9nZXRDb250ZW50RWxlbWVudCgpLCBsZWF2ZVBhZ2UuZWxlbWVudC5fZ2V0QmFja2dyb3VuZEVsZW1lbnQoKV0pXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZS5lbGVtZW50Ll9nZXRUb29sYmFyRWxlbWVudCgpKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLkZhZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgPSBGYWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgUG9wb3ZlckFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5Qb3BvdmVyQW5pbWF0b3I7XG5cbiAgY2xhc3MgRmFkZVBvcG92ZXJBbmltYXRvciBleHRlbmRzIFBvcG92ZXJBbmltYXRvciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcG9wb3ZlclxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAqL1xuICAgIHNob3cocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICAgIGNvbnN0IHBvcCA9IHBvcG92ZXIucXVlcnlTZWxlY3RvcignLnBvcG92ZXInKTtcbiAgICAgIGNvbnN0IG1hc2sgPSBwb3BvdmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLW1hc2snKTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgICAgYW5pbWl0KG1hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChwb3ApXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMS4zLCAxLjMsIDEuMCknLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUzZCgxLjAsIDEuMCwgIDEuMCknLFxuICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcG9wb3ZlclxuICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAqL1xuICAgIGhpZGUocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICAgIGNvbnN0IHBvcCA9IHBvcG92ZXIucXVlcnlTZWxlY3RvcignLnBvcG92ZXInKTtcbiAgICAgIGNvbnN0IG1hc2sgPSBwb3BvdmVyLnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLW1hc2snKTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgICAgYW5pbWl0KG1hc2spXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChwb3ApXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLkZhZGVQb3BvdmVyQW5pbWF0b3IgPSBGYWRlUG9wb3ZlckFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3I7XG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG5cbiAgLyoqXG4gICAqIFNsaWRlIGFuaW1hdG9yIGZvciBuYXZpZ2F0b3IgdHJhbnNpdGlvbiBsaWtlIGlPUydzIHNjcmVlbiBzbGlkZSB0cmFuc2l0aW9uLlxuICAgKi9cbiAgY2xhc3MgSU9TU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgZXh0ZW5kcyBOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9ucy5fdXRpbC5leHRlbmQoe1xuICAgICAgICBkdXJhdGlvbjogMC40LFxuICAgICAgICB0aW1pbmc6ICdjdWJpYy1iZXppZXIoLjEsIC43LCAuMSwgMSknLFxuICAgICAgICBkZWxheTogMFxuICAgICAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gb25zLl91dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBvcGFjaXR5OiAwO1wiPjwvZGl2PlxuICAgICAgYCk7XG4gICAgfVxuXG4gICAgX2RlY29tcG9zZShwYWdlKSB7XG4gICAgICBDdXN0b21FbGVtZW50cy51cGdyYWRlKHBhZ2UuZWxlbWVudCk7XG4gICAgICBjb25zdCB0b29sYmFyID0gcGFnZS5lbGVtZW50Ll9nZXRUb29sYmFyRWxlbWVudCgpO1xuICAgICAgQ3VzdG9tRWxlbWVudHMudXBncmFkZSh0b29sYmFyKTtcbiAgICAgIGNvbnN0IGxlZnQgPSB0b29sYmFyLl9nZXRUb29sYmFyTGVmdEl0ZW1zRWxlbWVudCgpO1xuICAgICAgY29uc3QgcmlnaHQgPSB0b29sYmFyLl9nZXRUb29sYmFyUmlnaHRJdGVtc0VsZW1lbnQoKTtcblxuICAgICAgY29uc3QgZXhjbHVkZUJhY2tCdXR0b25MYWJlbCA9IGZ1bmN0aW9uKGVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZWxlbWVudHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1iYWNrLWJ1dHRvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGljb25FbGVtZW50ID0gZWxlbWVudHNbaV0ucXVlcnlTZWxlY3RvcignLm9ucy1iYWNrLWJ1dHRvbl9faWNvbicpO1xuICAgICAgICAgICAgaWYgKGljb25FbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGljb25FbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudHNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdGhlciA9IFtdXG4gICAgICAgIC5jb25jYXQobGVmdC5jaGlsZHJlbi5sZW5ndGggPT09IDAgPyBsZWZ0IDogZXhjbHVkZUJhY2tCdXR0b25MYWJlbChsZWZ0LmNoaWxkcmVuKSlcbiAgICAgICAgLmNvbmNhdChyaWdodC5jaGlsZHJlbi5sZW5ndGggPT09IDAgPyByaWdodCA6IGV4Y2x1ZGVCYWNrQnV0dG9uTGFiZWwocmlnaHQuY2hpbGRyZW4pKTtcblxuICAgICAgY29uc3QgcGFnZUxhYmVscyA9IFtcbiAgICAgICAgdG9vbGJhci5fZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCgpLFxuICAgICAgICB0b29sYmFyLl9nZXRUb29sYmFyQmFja0J1dHRvbkxhYmVsRWxlbWVudCgpXG4gICAgICBdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYWdlTGFiZWxzOiBwYWdlTGFiZWxzLFxuICAgICAgICBvdGhlcjogb3RoZXIsXG4gICAgICAgIGNvbnRlbnQ6IHBhZ2UuZWxlbWVudC5fZ2V0Q29udGVudEVsZW1lbnQoKSxcbiAgICAgICAgYmFja2dyb3VuZDogcGFnZS5lbGVtZW50Ll9nZXRCYWNrZ3JvdW5kRWxlbWVudCgpLFxuICAgICAgICB0b29sYmFyOiB0b29sYmFyLFxuICAgICAgICBib3R0b21Ub29sYmFyOiBwYWdlLmVsZW1lbnQuX2dldEJvdHRvbVRvb2xiYXJFbGVtZW50KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgX3Nob3VsZEFuaW1hdGVUb29sYmFyKGVudGVyUGFnZSwgbGVhdmVQYWdlKSB7XG4gICAgICBjb25zdCBib3RoUGFnZUhhc1Rvb2xiYXIgPVxuICAgICAgICBlbnRlclBhZ2UuZWxlbWVudC5fY2FuQW5pbWF0ZVRvb2xiYXIoKSAmJiBsZWF2ZVBhZ2UuZWxlbWVudC5fY2FuQW5pbWF0ZVRvb2xiYXIoKTtcblxuICAgICAgdmFyIG5vQW5kcm9pZExpa2VUb29sYmFyID1cbiAgICAgICAgIWVudGVyUGFnZS5lbGVtZW50Ll9nZXRUb29sYmFyRWxlbWVudCgpLmNsYXNzTGlzdC5jb250YWlucygnbmF2aWdhdGlvbi1iYXItLWFuZHJvaWQnKSAmJlxuICAgICAgICAhbGVhdmVQYWdlLmVsZW1lbnQuX2dldFRvb2xiYXJFbGVtZW50KCkuY2xhc3NMaXN0LmNvbnRhaW5zKCduYXZpZ2F0aW9uLWJhci0tYW5kcm9pZCcpO1xuXG4gICAgICByZXR1cm4gYm90aFBhZ2VIYXNUb29sYmFyICYmIG5vQW5kcm9pZExpa2VUb29sYmFyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgICAgdXRpbC5yZW1vdmVFbGVtZW50KHRoaXMuYmFja2dyb3VuZE1hc2spO1xuICAgICAgbGVhdmVQYWdlLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlLmVsZW1lbnQubmV4dFNpYmxpbmcpO1xuXG4gICAgICBjb25zdCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGVudGVyUGFnZSk7XG4gICAgICBjb25zdCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGxlYXZlUGFnZSk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGxlYXZlUGFnZS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgoKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpIC8gMikgKiAwLjYpO1xuICAgICAgfSkoKTtcblxuICAgICAgY29uc3QgbWFza0NsZWFyID0gYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2spXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSdcbiAgICAgICAgfSlcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjFcbiAgICAgICAgfSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAucXVldWUoKGRvbmUpID0+IHtcbiAgICAgICAgICB1dGlsLnJlbW92ZUVsZW1lbnQodGhpcy5iYWNrZ3JvdW5kTWFzayk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgc2hvdWxkQW5pbWF0ZVRvb2xiYXIgPSB0aGlzLl9zaG91bGRBbmltYXRlVG9vbGJhcihlbnRlclBhZ2UsIGxlYXZlUGFnZSk7XG5cbiAgICAgIGlmIChzaG91bGRBbmltYXRlVG9vbGJhcikge1xuICAgICAgICBlbnRlclBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XG4gICAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcblxuICAgICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgICAgbWFza0NsZWFyLFxuXG4gICAgICAgICAgYW5pbWl0KFtlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmNvbnRlbnQsIGVudGVyUGFnZURlY29tcG9zaXRpb24uYm90dG9tVG9vbGJhciwgZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5iYWNrZ3JvdW5kXSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDEwMCUsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDBweCwgMHB4LCAwcHgpJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24udG9vbGJhcilcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICdub25lJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSArIDAuMylcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDAuMSxcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbjpcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvciAwLjFzIGxpbmVhciwgJyArXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvciAwLjFzIGxpbmVhcidcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ucGFnZUxhYmVscylcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyBkZWx0YSArICdweCwgMCwgMCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKCksXG5cbiAgICAgICAgICBhbmltaXQoZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5vdGhlcilcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge29wYWNpdHk6IDB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtvcGFjaXR5OiAxfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgICAgYW5pbWl0KFtsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmNvbnRlbnQsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYm90dG9tVG9vbGJhciwgbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5iYWNrZ3JvdW5kXSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTI1JSwgMHB4LCAwcHgpJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgICBlbnRlclBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnJztcbiAgICAgICAgICAgICAgbGVhdmVQYWdlLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24ucGFnZUxhYmVscylcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLScgKyBkZWx0YSArICdweCwgMCwgMCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLm90aGVyKVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7b3BhY2l0eTogMX0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge29wYWNpdHk6IDB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKClcblxuICAgICAgICApO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGVudGVyUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcbiAgICAgICAgbGVhdmVQYWdlLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xuXG4gICAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgICBtYXNrQ2xlYXIsXG5cbiAgICAgICAgICBhbmltaXQoZW50ZXJQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwcHgsIDBweCknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UuZWxlbWVudClcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtMjUlLCAwcHgsIDBweCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgICAgZW50ZXJQYWdlLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgICAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAgICovXG4gICAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBkb25lKSB7XG4gICAgICB1dGlsLnJlbW92ZUVsZW1lbnQodGhpcy5iYWNrZ3JvdW5kTWFzayk7XG4gICAgICBlbnRlclBhZ2UuZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmJhY2tncm91bmRNYXNrLCBlbnRlclBhZ2UuZWxlbWVudC5uZXh0U2libGluZyk7XG5cbiAgICAgIGNvbnN0IGVudGVyUGFnZURlY29tcG9zaXRpb24gPSB0aGlzLl9kZWNvbXBvc2UoZW50ZXJQYWdlKTtcbiAgICAgIGNvbnN0IGxlYXZlUGFnZURlY29tcG9zaXRpb24gPSB0aGlzLl9kZWNvbXBvc2UobGVhdmVQYWdlKTtcblxuICAgICAgY29uc3QgZGVsdGEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBsZWF2ZVBhZ2UuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDIpICogMC42KTtcbiAgICAgIH0pKCk7XG5cbiAgICAgIGNvbnN0IG1hc2tDbGVhciA9IGFuaW1pdCh0aGlzLmJhY2tncm91bmRNYXNrKVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIG9wYWNpdHk6IDAuMSxcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSdcbiAgICAgICAgfSlcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgLnF1ZXVlKChkb25lKSA9PiB7XG4gICAgICAgICAgdXRpbC5yZW1vdmVFbGVtZW50KHRoaXMuYmFja2dyb3VuZE1hc2spO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNob3VsZEFuaW1hdGVUb29sYmFyID0gdGhpcy5fc2hvdWxkQW5pbWF0ZVRvb2xiYXIoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UpO1xuXG4gICAgICBpZiAoc2hvdWxkQW5pbWF0ZVRvb2xiYXIpIHtcblxuICAgICAgICBlbnRlclBhZ2UuZWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XG4gICAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcblxuICAgICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgICAgbWFza0NsZWFyLFxuXG4gICAgICAgICAgYW5pbWl0KFtlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmNvbnRlbnQsIGVudGVyUGFnZURlY29tcG9zaXRpb24uYm90dG9tVG9vbGJhciwgZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5iYWNrZ3JvdW5kXSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKC0yNSUsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC45XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDBweCwgMHB4LCAwcHgpJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ucGFnZUxhYmVscylcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0nICsgZGVsdGEgKyAncHgsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24udG9vbGJhcilcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXNldFN0eWxlKCksXG5cbiAgICAgICAgICBhbmltaXQoZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5vdGhlcilcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge29wYWNpdHk6IDB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtvcGFjaXR5OiAxfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgICAgYW5pbWl0KFtsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmNvbnRlbnQsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYm90dG9tVG9vbGJhciwgbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5iYWNrZ3JvdW5kXSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDBweCwgMHB4LCAwcHgpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwcHgsIDBweCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQoMClcbiAgICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihmaW5pc2gpIHtcbiAgICAgICAgICAgICAgZW50ZXJQYWdlLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgICAgICAgIGxlYXZlUGFnZS5lbGVtZW50LnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICBhbmltaXQobGVhdmVQYWdlRGVjb21wb3NpdGlvbi5vdGhlcilcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICBhbmltaXQobGVhdmVQYWdlRGVjb21wb3NpdGlvbi50b29sYmFyKVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ25vbmUnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknLFxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAncmdiYSgwLCAwLCAwLCAwKSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24ucGFnZUxhYmVscylcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyArIGRlbHRhICsgJ3B4LCAwLCAwKScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgICBtYXNrQ2xlYXIsXG5cbiAgICAgICAgICBhbmltaXQoZW50ZXJQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtMjUlLCAwcHgsIDBweCknLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuOVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UuZWxlbWVudClcbiAgICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDBweCwgMHB4LCAwcHgpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwcHgsIDBweCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGZpbmlzaCkge1xuICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5JT1NTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IElPU1NsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcblxuICBjbGFzcyBMYXp5UmVwZWF0RGVsZWdhdGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmUgQSBmdW5jdGlvbiB0aGF0IHRha2UgaXRlbSBvYmplY3QgYXMgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIHByZXBhcmVJdGVtKGluZGV4LCBkb25lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgYW4gYWJzdHJhY3QgbWV0aG9kLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBjb3VudEl0ZW1zKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gaXRlbS5lbGVtZW50XG4gICAgICovXG4gICAgdXBkYXRlSXRlbShpbmRleCwgaXRlbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgY2FsY3VsYXRlSXRlbUhlaWdodChpbmRleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbVxuICAgICAqL1xuICAgIGRlc3Ryb3lJdGVtKGluZGV4LCBpdGVtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgYW4gYWJzdHJhY3QgbWV0aG9kLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgY2xhc3MgcHJvdmlkZSBjb3JlIGZ1bmN0aW9ucyBmb3Igb25zLWxhenktcmVwZWF0LlxuICAgKi9cbiAgY2xhc3MgTGF6eVJlcGVhdFByb3ZpZGVyIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gd3JhcHBlckVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRlbXBsYXRlRWxlbWVudFxuICAgICAqIEBwYXJhbSB7TGF6eVJlcGVhdERlbGVnYXRlfSBkZWxlZ2F0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHdyYXBwZXJFbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQsIGRlbGVnYXRlKSB7XG4gICAgICBpZiAoIShkZWxlZ2F0ZSBpbnN0YW5jZW9mIExhenlSZXBlYXREZWxlZ2F0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcImRlbGVnYXRlXCIgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Ygb25zLl9pbnRlcm5hbC5MYXp5UmVwZWF0RGVsZWdhdGUuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghKHRlbXBsYXRlRWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJ0ZW1wbGF0ZUVsZW1lbnRcIiBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFbGVtZW50LicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoISh3cmFwcGVyRWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJ3cmFwcGVyRWxlbWVudFwiIHBhcmFtZXRlciBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEVsZW1lbnQuJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RlbXBsYXRlRWxlbWVudCA9IHRlbXBsYXRlRWxlbWVudDtcbiAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50ID0gd3JhcHBlckVsZW1lbnQ7XG4gICAgICB0aGlzLl9kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuXG4gICAgICB0aGlzLl9wYWdlQ29udGVudCA9IHV0aWwuZmluZFBhcmVudCh3cmFwcGVyRWxlbWVudCwgJy5wYWdlX19jb250ZW50Jyk7XG5cbiAgICAgIGlmICghdGhpcy5fcGFnZUNvbnRlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbnMtbGF6eS1yZXBlYXQgbXVzdCBiZSBhIGRlc2NlbmRhbnQgb2YgYW4gPG9ucy1wYWdlPiBlbGVtZW50LicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pdGVtSGVpZ2h0U3VtID0gW107XG4gICAgICB0aGlzLl9tYXhJbmRleCA9IDA7XG4gICAgICB0aGlzLl9yZW5kZXJlZEl0ZW1zID0ge307XG5cbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgIHRoaXMuX29uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgX2NvdW50SXRlbXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY291bnRJdGVtcygpO1xuICAgIH1cblxuICAgIF9nZXRJdGVtSGVpZ2h0KGkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jYWxjdWxhdGVJdGVtSGVpZ2h0KGkpO1xuICAgIH1cblxuICAgIF9nZXRUb3BPZmZzZXQoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX3dyYXBwZXJFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLl93cmFwcGVyRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX29uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgX3JlbmRlcigpIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNJblZpZXcoKTtcbiAgICAgIGNvbnN0IGtlZXAgPSB7fTtcblxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IF9pdGVtID0gaXRlbXNbaV07XG4gICAgICAgIHRoaXMuX3JlbmRlckVsZW1lbnQoX2l0ZW0pO1xuICAgICAgICBrZWVwW19pdGVtLmluZGV4XSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLl9yZW5kZXJlZEl0ZW1zKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZEl0ZW1zLmhhc093blByb3BlcnR5KGtleSkgJiYgIWtlZXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUVsZW1lbnQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl93cmFwcGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLl9jYWxjdWxhdGVMaXN0SGVpZ2h0KCkgKyAncHgnO1xuICAgIH1cblxuICAgIF9jYWxjdWxhdGVMaXN0SGVpZ2h0KCkge1xuICAgICAgbGV0IGluZGljZXMgPSBPYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKS5tYXAoKG4pID0+IHBhcnNlSW50KG4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVtSGVpZ2h0U3VtW2luZGljZXMucG9wKCldIHx8IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBfaXNSZW5kZXJlZChpbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVkSXRlbXMuaGFzT3duUHJvcGVydHkoaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGl0ZW0uaW5kZXhcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaXRlbS50b3BcbiAgICAgKi9cbiAgICBfcmVuZGVyRWxlbWVudCh7aW5kZXg6IGluZGV4LCB0b3A6IHRvcH0pIHtcbiAgICAgIGlmICh0aGlzLl9pc1JlbmRlcmVkKGluZGV4KSkge1xuICAgICAgICAvLyBVcGRhdGUgY29udGVudCBldmVuIGlmIGl0J3MgYWxyZWFkeSBhZGRlZCB0byBET01cbiAgICAgICAgLy8gdG8gYWNjb3VudCBmb3IgY2hhbmdlcyB3aXRoaW4gdGhlIGxpc3QuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF07XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlLnVwZGF0ZUl0ZW0oaW5kZXgsIGN1cnJlbnRJdGVtKTtcblxuICAgICAgICAvLyBGaXggcG9zaXRpb24uXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF0uZWxlbWVudDtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSB0b3AgKyAncHgnO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZGVsZWdhdGUucHJlcGFyZUl0ZW0oaW5kZXgsIChpdGVtKSA9PiB7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGl0ZW0uZWxlbWVudDtcblxuICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSB0b3AgKyAncHgnO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICcwcHgnO1xuXG4gICAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgICAqL1xuICAgIF9yZW1vdmVFbGVtZW50KGluZGV4KSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVuZGVyZWQoaW5kZXgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9yZW5kZXJlZEl0ZW1zW2luZGV4XTtcblxuICAgICAgdGhpcy5fZGVsZWdhdGUuZGVzdHJveUl0ZW0oaW5kZXgsIGl0ZW0pO1xuXG4gICAgICBpZiAoaXRlbS5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgaXRlbS5lbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaXRlbS5lbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGl0ZW0gPSBudWxsO1xuXG4gICAgICBkZWxldGUgdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF07XG4gICAgfVxuXG4gICAgX3JlbW92ZUFsbEVsZW1lbnRzKCkge1xuICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuX3JlbmRlcmVkSXRlbXMpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkSXRlbXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUVsZW1lbnQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGVTdGFydEluZGV4KGN1cnJlbnQpIHtcbiAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICBsZXQgZW5kID0gdGhpcy5fbWF4SW5kZXg7XG5cbiAgICAgIC8vIEJpbmFyeSBzZWFyY2ggZm9yIGluZGV4IGF0IHRvcCBvZiBzY3JlZW4gc29cbiAgICAgIC8vIHdlIGNhbiBzcGVlZCB1cCByZW5kZXJpbmcuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IG1pZGRsZSA9IE1hdGguZmxvb3IoKHN0YXJ0ICsgZW5kKSAvIDIpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGN1cnJlbnQgKyB0aGlzLl9pdGVtSGVpZ2h0U3VtW21pZGRsZV07XG5cbiAgICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSAtIHRoaXMuX2dldEl0ZW1IZWlnaHQobWlkZGxlKSA8IDApIHtcbiAgICAgICAgICByZXR1cm4gbWlkZGxlO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA+PSAwKSB7XG4gICAgICAgICAgZW5kID0gbWlkZGxlIC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFydCA9IG1pZGRsZSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVjYWxjdWxhdGVJdGVtSGVpZ2h0U3VtKCkge1xuICAgICAgbGV0IHN1bXMgPSB0aGlzLl9pdGVtSGVpZ2h0U3VtO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIHN1bSA9IDA7IGkgPCBNYXRoLm1pbihzdW1zLmxlbmd0aCwgdGhpcy5fY291bnRJdGVtcygpKTsgaSsrKSB7XG4gICAgICAgIHN1bSArPSB0aGlzLl9nZXRJdGVtSGVpZ2h0KGkpO1xuICAgICAgICBzdW1zW2ldID0gc3VtO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRJdGVtc0luVmlldygpIHtcbiAgICAgIGNvbnN0IHRvcE9mZnNldCA9IHRoaXMuX2dldFRvcE9mZnNldCgpO1xuICAgICAgbGV0IHRvcFBvc2l0aW9uID0gdG9wT2Zmc2V0O1xuICAgICAgY29uc3QgY250ID0gdGhpcy5fY291bnRJdGVtcygpO1xuXG4gICAgICBpZiAoY250ICE9PSB0aGlzLl9pdGVtQ291bnQpe1xuICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUl0ZW1IZWlnaHRTdW0oKTtcbiAgICAgICAgdGhpcy5fbWF4SW5kZXggPSBjbnQgLSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5faXRlbUNvdW50ID0gY250O1xuXG4gICAgICBsZXQgc3RhcnRJbmRleCA9IHRoaXMuX2NhbGN1bGF0ZVN0YXJ0SW5kZXgodG9wUG9zaXRpb24pO1xuICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWF4KHN0YXJ0SW5kZXggLSAzMCwgMCk7XG5cbiAgICAgIGlmIChzdGFydEluZGV4ID4gMCkge1xuICAgICAgICB0b3BQb3NpdGlvbiArPSB0aGlzLl9pdGVtSGVpZ2h0U3VtW3N0YXJ0SW5kZXggLSAxXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgY250ICYmIHRvcFBvc2l0aW9uIDwgNCAqIHdpbmRvdy5pbm5lckhlaWdodDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGggPSB0aGlzLl9nZXRJdGVtSGVpZ2h0KGkpO1xuXG4gICAgICAgIGlmIChpID49IHRoaXMuX2l0ZW1IZWlnaHRTdW0ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5faXRlbUhlaWdodFN1bSA9IHRoaXMuX2l0ZW1IZWlnaHRTdW0uY29uY2F0KG5ldyBBcnJheSgxMDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIHRoaXMuX2l0ZW1IZWlnaHRTdW1baV0gPSB0aGlzLl9pdGVtSGVpZ2h0U3VtW2kgLSAxXSArIGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faXRlbUhlaWdodFN1bVtpXSA9IGg7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tYXhJbmRleCA9IE1hdGgubWF4KGksIHRoaXMuX21heEluZGV4KTtcblxuICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0b3A6IHRvcFBvc2l0aW9uIC0gdG9wT2Zmc2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRvcFBvc2l0aW9uICs9IGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB0aGlzLl9ib3VuZE9uQ2hhbmdlID0gdGhpcy5fb25DaGFuZ2UuYmluZCh0aGlzKTtcblxuICAgICAgdGhpcy5fcGFnZUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgdGhpcy5fcGFnZUNvbnRlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIHRoaXMuX2RlbGVnYXRlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX3BhcmVudEVsZW1lbnQgPSB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSB0aGlzLl9kZWxlZ2F0ZSA9IHRoaXMuX3JlbmRlcmVkSXRlbXMgPSBudWxsO1xuICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5MYXp5UmVwZWF0UHJvdmlkZXIgPSBMYXp5UmVwZWF0UHJvdmlkZXI7XG4gIG9ucy5faW50ZXJuYWwuTGF6eVJlcGVhdERlbGVnYXRlID0gTGF6eVJlcGVhdERlbGVnYXRlO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3I7XG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG5cbiAgLyoqXG4gICAqIExpZnQgc2NyZWVuIHRyYW5zaXRpb24uXG4gICAqL1xuICBjbGFzcyBMaWZ0TmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvbnMuX3V0aWwuZXh0ZW5kKHtcbiAgICAgICAgZHVyYXRpb246IDAuNCxcbiAgICAgICAgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJyxcbiAgICAgICAgZGVsYXk6IDBcbiAgICAgIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gICAgICBzdXBlcihvcHRpb25zKTtcblxuICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzayA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcIj48L2Rpdj5cbiAgICAgIGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgICAgdXRpbC5yZW1vdmVFbGVtZW50KHRoaXMuYmFja2dyb3VuZE1hc2spO1xuICAgICAgbGVhdmVQYWdlLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlLmVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBtYXNrQ2xlYXIgPSBhbmltaXQodGhpcy5iYWtja2dyb3VuZE1hc2spXG4gICAgICAgIC53YWl0KDAuNilcbiAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICBtYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgbWFza0NsZWFyLFxuXG4gICAgICAgIGFuaW1pdChlbnRlclBhZ2UuZWxlbWVudClcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDEwMCUsIDApJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KDAuMilcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZS5lbGVtZW50KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIC0xMCUsIDApJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMC45XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgICAgdXRpbC5yZW1vdmVFbGVtZW50KHRoaXMuYmFja2dyb3VuZE1hc2spO1xuICAgICAgZW50ZXJQYWdlLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgZW50ZXJQYWdlLmVsZW1lbnQpO1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmJhY2tncm91bmRNYXNrKVxuICAgICAgICAgIC53YWl0KDAuNClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgbWFzay5yZW1vdmUoKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAtMTAlLCAwKScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDAuOVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAud2FpdCgwLjQpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZS5lbGVtZW50KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAxMDAlLCAwKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuICBvbnMuX2ludGVybmFsLkxpZnROYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgPSBMaWZ0TmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuXG4gIGNsYXNzIE1vZGlmaWVyVXRpbCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxhc3RcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY3VycmVudFxuICAgICAqL1xuICAgIHN0YXRpYyBkaWZmKGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGxhc3QgPSBtYWtlRGljdCgoJycgKyBsYXN0KS50cmltKCkpO1xuICAgICAgY3VycmVudCA9IG1ha2VEaWN0KCgnJyArIGN1cnJlbnQpLnRyaW0oKSk7XG5cbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBPYmplY3Qua2V5cyhsYXN0KS5yZWR1Y2UoKHJlc3VsdCwgdG9rZW4pID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50W3Rva2VuXSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSwgW10pO1xuXG4gICAgICBjb25zdCBhZGRlZCA9IE9iamVjdC5rZXlzKGN1cnJlbnQpLnJlZHVjZSgocmVzdWx0LCB0b2tlbikgPT4ge1xuICAgICAgICBpZiAoIWxhc3RbdG9rZW5dKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIHJldHVybiB7YWRkZWQsIHJlbW92ZWR9O1xuXG4gICAgICBmdW5jdGlvbiBtYWtlRGljdChtb2RpZmllcikge1xuICAgICAgICBjb25zdCBkaWN0ID0ge307XG4gICAgICAgIE1vZGlmaWVyVXRpbC5zcGxpdChtb2RpZmllcikuZm9yRWFjaCh0b2tlbiA9PiBkaWN0W3Rva2VuXSA9IHRva2VuKTtcbiAgICAgICAgcmV0dXJuIGRpY3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRpZmZcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2xhc3NMaXN0XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gICAgICovXG4gICAgc3RhdGljIGFwcGx5RGlmZlRvQ2xhc3NMaXN0KGRpZmYsIGNsYXNzTGlzdCwgdGVtcGxhdGUpIHtcbiAgICAgIGRpZmYuYWRkZWRcbiAgICAgICAgLm1hcChtb2RpZmllciA9PiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXCovZywgbW9kaWZpZXIpKVxuICAgICAgICAuZm9yRWFjaChrbGFzcyA9PiBjbGFzc0xpc3QuYWRkKGtsYXNzKSk7XG5cbiAgICAgIGRpZmYucmVtb3ZlZFxuICAgICAgICAubWFwKG1vZGlmaWVyID0+IHRlbXBsYXRlLnJlcGxhY2UoL1xcKi9nLCBtb2RpZmllcikpXG4gICAgICAgIC5mb3JFYWNoKGtsYXNzID0+IGNsYXNzTGlzdC5yZW1vdmUoa2xhc3MpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGlmZlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1lXG4gICAgICovXG4gICAgc3RhdGljIGFwcGx5RGlmZlRvRWxlbWVudChkaWZmLCBlbGVtZW50LCBzY2hlbWUpIHtcbiAgICAgIGZvciAobGV0IHNlbGVjdG9yIGluIHNjaGVtZSkge1xuICAgICAgICBpZiAoc2NoZW1lLmhhc093blByb3BlcnR5KHNlbGVjdG9yKSkge1xuICAgICAgICAgIGxldCB0YXJnZXRFbGVtZW50cyA9IHNlbGVjdG9yID09PSAnJyA/IFtlbGVtZW50XSA6IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvQ2xhc3NMaXN0KGRpZmYsIHRhcmdldEVsZW1lbnRzW2ldLmNsYXNzTGlzdCwgc2NoZW1lW3NlbGVjdG9yXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGxhc3RcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY3VycmVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1lXG4gICAgICovXG4gICAgc3RhdGljIG9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIGVsZW1lbnQsIHNjaGVtZSkge1xuICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5hcHBseURpZmZUb0VsZW1lbnQoTW9kaWZpZXJVdGlsLmRpZmYobGFzdCwgY3VycmVudCksIGVsZW1lbnQsIHNjaGVtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWVcbiAgICAgKi9cbiAgICBzdGF0aWMgaW5pdE1vZGlmaWVyKGVsZW1lbnQsIHNjaGVtZSkge1xuICAgICAgY29uc3QgbW9kaWZpZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKTtcbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvRWxlbWVudCh7XG4gICAgICAgIHJlbW92ZWQ6IFtdLFxuICAgICAgICBhZGRlZDogTW9kaWZpZXJVdGlsLnNwbGl0KG1vZGlmaWVyKVxuICAgICAgfSwgZWxlbWVudCwgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3BsaXQobW9kaWZpZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vZGlmaWVyLnRyaW0oKS5zcGxpdCgvICsvKS5maWx0ZXIodG9rZW4gPT4gdG9rZW4gIT09ICcnKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWwgPSBNb2RpZmllclV0aWw7XG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcblxuICBjbGFzcyBOYXZpZ2F0b3JQYWdlIHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLnBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLmVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLm9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLm5hdmlnYXRvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgdGhpcy5wYWdlID0gcGFyYW1zLnBhZ2U7XG4gICAgICB0aGlzLm5hbWUgPSBwYXJhbXMucGFnZTtcbiAgICAgIHRoaXMuZWxlbWVudCA9IHBhcmFtcy5lbGVtZW50O1xuICAgICAgdGhpcy5vcHRpb25zID0gcGFyYW1zLm9wdGlvbnM7XG4gICAgICB0aGlzLm5hdmlnYXRvciA9IHBhcmFtcy5uYXZpZ2F0b3I7XG5cbiAgICAgIC8vIEJsb2NrIGV2ZW50cyB3aGlsZSBwYWdlIGlzIGJlaW5nIGFuaW1hdGVkIHRvIHN0b3Agc2Nyb2xsaW5nLCBwcmVzc2luZyBidXR0b25zLCBldGMuXG4gICAgICB0aGlzLl9ibG9ja0V2ZW50cyA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0b3IuX2lzUG9wcGluZyB8fCB0aGlzLm5hdmlnYXRvci5faXNQdXNoaW5nKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5fcG9pbnRlckV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCB0aGlzLl9ibG9ja0V2ZW50cyksIGZhbHNlKTtcbiAgICB9XG5cbiAgICBnZXQgX3BvaW50ZXJFdmVudHMoKSB7XG4gICAgICByZXR1cm4gWyd0b3VjaHN0YXJ0JywgJ3RvdWNoZW5kJywgJ3RvdWNobW92ZScsICdjbGljayddO1xuICAgIH1cblxuICAgIGdldERldmljZUJhY2tCdXR0b25IYW5kbGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RldmljZUJhY2tCdXR0b25IYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1BhZ2VWaWV3fVxuICAgICAqL1xuICAgIGdldFBhZ2VWaWV3KCkge1xuICAgICAgaWYgKCF0aGlzLl9wYWdlKSB7XG4gICAgICAgIHRoaXMuX3BhZ2UgPSB1dGlsLmZpbmRQYXJlbnQoJ29ucy1wYWdlJyk7XG4gICAgICAgIGlmICghdGhpcy5fcGFnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbCB0byBmZXRjaCBvbnMtcGFnZSBlbGVtZW50LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgdGhpcy5fcG9pbnRlckV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCB0aGlzLl9ibG9ja0V2ZW50cyksIGZhbHNlKTtcbiAgICAgIHV0aWwucmVtb3ZlRWxlbWVudCh0aGlzLmVsZW1lbnQpO1xuXG5cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5uYXZpZ2F0b3IuX3BhZ2VzLmluZGV4T2YodGhpcyk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yLl9wYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLl9wYWdlID0gdGhpcy5vcHRpb25zID0gdGhpcy5uYXZpZ2F0b3IgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5vbnMuX2ludGVybmFsLk5hdmlnYXRvclBhZ2UgPSBOYXZpZ2F0b3JQYWdlO1xufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIG9ucy5faW50ZXJuYWwgPSBvbnMuX2ludGVybmFsIHx8IHt9O1xuXG4gIG9ucy5faW50ZXJuYWwubnVsbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAvKipcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIG9ucy5faW50ZXJuYWwuaXNFbmFibGVkQXV0b1N0YXR1c0JhckZpbGwgPSAoKSA9PiB7XG4gICAgcmV0dXJuICEhb25zLl9jb25maWcuYXV0b1N0YXR1c0JhckZpbGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICovXG4gIG9ucy5faW50ZXJuYWwubm9ybWFsaXplUGFnZUhUTUwgPSAoaHRtbCkgPT4ge1xuICAgIGh0bWwgPSAoJycgKyBodG1sKS50cmltKCk7XG5cbiAgICBpZiAoIWh0bWwubWF0Y2goL148KG9ucy1wYWdlfG9ucy1uYXZpZ2F0b3J8b25zLXRhYmJhcnxvbnMtc2xpZGluZy1tZW51fG9ucy1zcGxpdC12aWV3KS8pKSB7XG4gICAgICBodG1sID0gJzxvbnMtcGFnZT4nICsgaHRtbCArICc8L29ucy1wYWdlPic7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWw7XG4gIH07XG5cbiAgb25zLl9pbnRlcm5hbC53YWl0RE9NQ29udGVudExvYWRlZCA9IChjYWxsYmFjaykgPT4ge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgb25zLl9pbnRlcm5hbC5zaG91bGRGaWxsU3RhdHVzQmFyID0gKGVsZW1lbnQpID0+IHtcbiAgICBpZiAob25zLl9pbnRlcm5hbC5pc0VuYWJsZWRBdXRvU3RhdHVzQmFyRmlsbCgpICYmIG9ucy5wbGF0Zm9ybS5pc1dlYlZpZXcoKSAmJiBvbnMucGxhdGZvcm0uaXNJT1M3YWJvdmUoKSkge1xuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudCcpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbm8tc3RhdHVzLWJhci1maWxsJykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIG9ucy5faW50ZXJuYWwudGVtcGxhdGVTdG9yZSA9IHtcbiAgICBfc3RvcmFnZToge30sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICogQHJldHVybiB7U3RyaW5nL251bGx9IHRlbXBsYXRlXG4gICAgICovXG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIG9ucy5faW50ZXJuYWwudGVtcGxhdGVTdG9yZS5fc3RvcmFnZVtrZXldIHx8IG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVcbiAgICAgKi9cbiAgICBzZXQoa2V5LCB0ZW1wbGF0ZSkge1xuICAgICAgb25zLl9pbnRlcm5hbC50ZW1wbGF0ZVN0b3JlLl9zdG9yYWdlW2tleV0gPSB0ZW1wbGF0ZTtcbiAgICB9XG4gIH07XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignX3RlbXBsYXRlbG9hZGVkJywgZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRlbXBsYXRlJykge1xuICAgICAgb25zLl9pbnRlcm5hbC50ZW1wbGF0ZVN0b3JlLnNldChlLnRlbXBsYXRlSWQsIGUudGVtcGxhdGUpO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICByZWdpc3Rlcignc2NyaXB0W3R5cGU9XCJ0ZXh0L29ucy10ZW1wbGF0ZVwiXScpO1xuICAgIHJlZ2lzdGVyKCdzY3JpcHRbdHlwZT1cInRleHQvdGVtcGxhdGVcIl0nKTtcbiAgICByZWdpc3Rlcignc2NyaXB0W3R5cGU9XCJ0ZXh0L25nLXRlbXBsYXRlXCJdJyk7XG5cbiAgICBmdW5jdGlvbiByZWdpc3RlcihxdWVyeSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvbnMuX2ludGVybmFsLnRlbXBsYXRlU3RvcmUuc2V0KHRlbXBsYXRlc1tpXS5nZXRBdHRyaWJ1dGUoJ2lkJyksIHRlbXBsYXRlc1tpXS50ZXh0Q29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBvbnMuX2ludGVybmFsLmdldFRlbXBsYXRlSFRNTEFzeW5jID0gZnVuY3Rpb24ocGFnZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG9ucy5faW50ZXJuYWwudGVtcGxhdGVTdG9yZS5nZXQocGFnZSk7XG5cbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IHR5cGVvZiBjYWNoZSA9PT0gJ3N0cmluZycgPyBjYWNoZSA6IGNhY2hlWzFdO1xuICAgICAgICAgIHJlc29sdmUoaHRtbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHBhZ2UsIHRydWUpO1xuICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IHhoci5yZXNwb25zZVRleHQ7XG4gICAgICAgICAgICByZXNvbHZlKGh0bWwpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBhZ2UgaXMgbm90IGZvdW5kOiAke3BhZ2V9YCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB4aHIuc2VuZChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBvbnMuX2ludGVybmFsLmdldFBhZ2VIVE1MQXN5bmMgPSBmdW5jdGlvbihwYWdlKSB7XG4gICAgcmV0dXJuIG9ucy5faW50ZXJuYWwuZ2V0VGVtcGxhdGVIVE1MQXN5bmMocGFnZSkudGhlbihodG1sID0+IG5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpKTtcblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpIHtcbiAgICAgIGh0bWwgPSAoJycgKyBodG1sKS50cmltKCk7XG5cbiAgICAgIGlmICghaHRtbC5tYXRjaCgvXjwob25zLXBhZ2V8b25zLW5hdmlnYXRvcnxvbnMtdGFiYmFyfG9ucy1zbGlkaW5nLW1lbnV8b25zLXNwbGl0LXZpZXcpLykpIHtcbiAgICAgICAgaHRtbCA9ICc8b25zLXBhZ2U+JyArIGh0bWwgKyAnPC9vbnMtcGFnZT4nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gIH07XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuXG4gIG9ucy5ub3RpZmljYXRpb24gPSB7fTtcblxuICBvbnMubm90aWZpY2F0aW9uLl9jcmVhdGVBbGVydERpYWxvZyA9IGZ1bmN0aW9uKHRpdGxlLCBtZXNzYWdlLFxuICAgIGJ1dHRvbkxhYmVscywgcHJpbWFyeUJ1dHRvbkluZGV4LCBtb2RpZmllciwgYW5pbWF0aW9uLCBjYWxsYmFjayxcbiAgICBtZXNzYWdlSXNIVE1MLCBjYW5jZWxhYmxlLCBwcm9tcHREaWFsb2csIGF1dG9mb2N1cywgcGxhY2Vob2xkZXIsXG4gICAgc3VibWl0T25FbnRlciwgY29tcGlsZSkge1xuXG4gICAgY29tcGlsZSA9IGNvbXBpbGUgfHwgKChvYmplY3QpID0+IG9iamVjdCk7XG5cbiAgICBsZXQgZGlhbG9nRWxlbWVudCA9IHV0aWwuY3JlYXRlRWxlbWVudCgnPG9ucy1hbGVydC1kaWFsb2c+PC9vbnMtYWxlcnQtZGlhbG9nPicpO1xuICAgIGxldCB0aXRsZUVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctdGl0bGVcIj48L2Rpdj4nKTtcbiAgICBsZXQgbWVzc2FnZUVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctY29udGVudFwiPjwvZGl2PicpO1xuICAgIGxldCBmb290ZXJFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KCc8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWZvb3RlclwiPjwvZGl2PicpO1xuICAgIGxldCBpbnB1dEVsZW1lbnQ7XG5cbiAgICBpZiAobW9kaWZpZXIpIHtcbiAgICAgIGRpYWxvZ0VsZW1lbnQuc2V0QXR0cmlidXRlKCdtb2RpZmllcicsIG1vZGlmaWVyKTtcbiAgICB9XG5cbiAgICBkaWFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJywgYW5pbWF0aW9uKTtcblxuICAgIGlmIChtZXNzYWdlSXNIVE1MKSB7XG4gICAgICBtZXNzYWdlRWxlbWVudC5pbm5lckhUTUwgPSBtZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZGlhbG9nRWxlbWVudC5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xuICAgIGRpYWxvZ0VsZW1lbnQuYXBwZW5kQ2hpbGQobWVzc2FnZUVsZW1lbnQpO1xuXG4gICAgaWYgKHByb21wdERpYWxvZykge1xuICAgICAgaW5wdXRFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KCc8aW5wdXQgY2xhc3M9XCJ0ZXh0LWlucHV0XCIgdHlwZT1cInRleHRcIj48L2lucHV0PicpO1xuICAgICAgaW5wdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCBwbGFjZWhvbGRlcik7XG4gICAgICBpbnB1dEVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBpbnB1dEVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJzEwcHgnO1xuXG4gICAgICBtZXNzYWdlRWxlbWVudC5hcHBlbmRDaGlsZChpbnB1dEVsZW1lbnQpO1xuXG4gICAgICBpZiAoc3VibWl0T25FbnRlcikge1xuICAgICAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5oaWRlKHtcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpYWxvZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZm9vdGVyRWxlbWVudCk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xuXG4gICAgY29tcGlsZShkaWFsb2dFbGVtZW50KTtcblxuICAgIGlmIChidXR0b25MYWJlbHMubGVuZ3RoIDw9IDIpIHtcbiAgICAgIGZvb3RlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nLWZvb3Rlci0tb25lJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24oaSkge1xuICAgICAgbGV0IGJ1dHRvbkVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxidXR0b24gY2xhc3M9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCI+PC9idXR0b24+Jyk7XG4gICAgICBidXR0b25FbGVtZW50LnRleHRDb250ZW50ID0gYnV0dG9uTGFiZWxzW2ldO1xuXG4gICAgICBpZiAoaSA9PSBwcmltYXJ5QnV0dG9uSW5kZXgpIHtcbiAgICAgICAgYnV0dG9uRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhbGVydC1kaWFsb2ctYnV0dG9uLS1wcmltYWwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1dHRvbkxhYmVscy5sZW5ndGggPD0gMikge1xuICAgICAgICBidXR0b25FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FsZXJ0LWRpYWxvZy1idXR0b24tLW9uZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbkNsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGJ1dHRvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCBmYWxzZSk7XG5cbiAgICAgICAgZGlhbG9nRWxlbWVudC5oaWRlKHtcbiAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAocHJvbXB0RGlhbG9nKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjYWxsYmFjayhpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGlhbG9nRWxlbWVudCA9IGlucHV0RWxlbWVudCA9IGJ1dHRvbkVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBidXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgZmFsc2UpO1xuICAgICAgZm9vdGVyRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b25FbGVtZW50KTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNyZWF0ZUJ1dHRvbihpKTtcbiAgICB9XG5cbiAgICBpZiAoY2FuY2VsYWJsZSkge1xuICAgICAgZGlhbG9nRWxlbWVudC5zZXRDYW5jZWxhYmxlKGNhbmNlbGFibGUpO1xuICAgICAgZGlhbG9nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjYW5jZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHByb21wdERpYWxvZykge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKC0xKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIGRpYWxvZ0VsZW1lbnQgPSBudWxsO1xuICAgICAgICAgIGlucHV0RWxlbWVudCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGRpYWxvZ0VsZW1lbnQuc2hvdyh7XG4gICAgICBjYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChpbnB1dEVsZW1lbnQgJiYgcHJvbXB0RGlhbG9nICYmIGF1dG9mb2N1cykge1xuICAgICAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aXRsZUVsZW1lbnQgPSBtZXNzYWdlRWxlbWVudCA9IGZvb3RlckVsZW1lbnQgPSBudWxsO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkaWFsb2dFbGVtZW50KTtcbiAgfTtcblxuICBvbnMubm90aWZpY2F0aW9uLl9hbGVydE9yaWdpbmFsID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGJ1dHRvbkxhYmVsOiAnT0snLFxuICAgICAgYW5pbWF0aW9uOiAnZGVmYXVsdCcsXG4gICAgICB0aXRsZTogJ0FsZXJ0JyxcbiAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHt9XG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy5tZXNzYWdlICYmICFvcHRpb25zLm1lc3NhZ2VIVE1MKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsZXJ0IGRpYWxvZyBtdXN0IGNvbnRhaW4gYSBtZXNzYWdlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBvbnMubm90aWZpY2F0aW9uLl9jcmVhdGVBbGVydERpYWxvZyhcbiAgICAgIG9wdGlvbnMudGl0bGUsXG4gICAgICBvcHRpb25zLm1lc3NhZ2UgfHwgb3B0aW9ucy5tZXNzYWdlSFRNTCxcbiAgICAgIFtvcHRpb25zLmJ1dHRvbkxhYmVsXSxcbiAgICAgIDAsXG4gICAgICBvcHRpb25zLm1vZGlmaWVyLFxuICAgICAgb3B0aW9ucy5hbmltYXRpb24sXG4gICAgICBvcHRpb25zLmNhbGxiYWNrLFxuICAgICAgIW9wdGlvbnMubWVzc2FnZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsXG4gICAgICBvcHRpb25zLmNvbXBpbGVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VIVE1MXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYnV0dG9uTGFiZWxdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1vZGlmaWVyXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY29tcGlsZV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5ub3RpZmljYXRpb24uYWxlcnQgPSBvbnMubm90aWZpY2F0aW9uLl9hbGVydE9yaWdpbmFsO1xuXG4gIG9ucy5ub3RpZmljYXRpb24uX2NvbmZpcm1PcmlnaW5hbCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBidXR0b25MYWJlbHM6IFsnQ2FuY2VsJywgJ09LJ10sXG4gICAgICBwcmltYXJ5QnV0dG9uSW5kZXg6IDEsXG4gICAgICBhbmltYXRpb246ICdkZWZhdWx0JyxcbiAgICAgIHRpdGxlOiAnQ29uZmlybScsXG4gICAgICBjYWxsYmFjazogZnVuY3Rpb24oKSB7fSxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFvcHRpb25zLm1lc3NhZ2UgJiYgIW9wdGlvbnMubWVzc2FnZUhUTUwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlybSBkaWFsb2cgbXVzdCBjb250YWluIGEgbWVzc2FnZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb25zLm5vdGlmaWNhdGlvbi5fY3JlYXRlQWxlcnREaWFsb2coXG4gICAgICBvcHRpb25zLnRpdGxlLFxuICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IG9wdGlvbnMubWVzc2FnZUhUTUwsXG4gICAgICBvcHRpb25zLmJ1dHRvbkxhYmVscyxcbiAgICAgIG9wdGlvbnMucHJpbWFyeUJ1dHRvbkluZGV4LFxuICAgICAgb3B0aW9ucy5tb2RpZmllcixcbiAgICAgIG9wdGlvbnMuYW5pbWF0aW9uLFxuICAgICAgb3B0aW9ucy5jYWxsYmFjayxcbiAgICAgICFvcHRpb25zLm1lc3NhZ2UgPyB0cnVlIDogZmFsc2UsXG4gICAgICBvcHRpb25zLmNhbmNlbGFibGUsXG4gICAgICBmYWxzZSwgZmFsc2UsXG4gICAgICBvcHRpb25zLmNvbXBpbGVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VIVE1MXVxuICAgKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5idXR0b25MYWJlbHNdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXhdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2FuY2VsYWJsZV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jb21waWxlXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgb25zLm5vdGlmaWNhdGlvbi5jb25maXJtID0gb25zLm5vdGlmaWNhdGlvbi5fY29uZmlybU9yaWdpbmFsO1xuXG4gIG9ucy5ub3RpZmljYXRpb24uX3Byb21wdE9yaWdpbmFsID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgIGJ1dHRvbkxhYmVsOiAnT0snLFxuICAgICAgYW5pbWF0aW9uOiAnZGVmYXVsdCcsXG4gICAgICB0aXRsZTogJ0FsZXJ0JyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHt9LFxuICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgICBzdWJtaXRPbkVudGVyOiB0cnVlXG4gICAgfTtcblxuICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy5tZXNzYWdlICYmICFvcHRpb25zLm1lc3NhZ2VIVE1MKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb21wdCBkaWFsb2cgbXVzdCBjb250YWluIGEgbWVzc2FnZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb25zLm5vdGlmaWNhdGlvbi5fY3JlYXRlQWxlcnREaWFsb2coXG4gICAgICBvcHRpb25zLnRpdGxlLFxuICAgICAgb3B0aW9ucy5tZXNzYWdlIHx8IG9wdGlvbnMubWVzc2FnZUhUTUwsXG4gICAgICBbb3B0aW9ucy5idXR0b25MYWJlbF0sXG4gICAgICAwLFxuICAgICAgb3B0aW9ucy5tb2RpZmllcixcbiAgICAgIG9wdGlvbnMuYW5pbWF0aW9uLFxuICAgICAgb3B0aW9ucy5jYWxsYmFjayxcbiAgICAgICFvcHRpb25zLm1lc3NhZ2UgPyB0cnVlIDogZmFsc2UsXG4gICAgICBvcHRpb25zLmNhbmNlbGFibGUsXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5hdXRvZm9jdXMsXG4gICAgICBvcHRpb25zLnBsYWNlaG9sZGVyLFxuICAgICAgb3B0aW9ucy5zdWJtaXRPbkVudGVyLFxuICAgICAgb3B0aW9ucy5jb21waWxlXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlSFRNTF1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJ1dHRvbkxhYmVsXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNhbmNlbGFibGVdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wbGFjZWhvbGRlcl1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9mb2N1c11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY29tcGlsZV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIG9ucy5ub3RpZmljYXRpb24ucHJvbXB0ID0gb25zLm5vdGlmaWNhdGlvbi5fcHJvbXB0T3JpZ2luYWw7XG5cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gIGNvbnN0IGNyZWF0ZSA9ICgpID0+IHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICAvLyBhY3R1YWwgaW1wbGVtZW50YXRpb24gdG8gZGV0ZWN0IGlmIHdoZXRoZXIgY3VycmVudCBzY3JlZW4gaXMgcG9ydHJhaXQgb3Igbm90XG4gICAgICBfaXNQb3J0cmFpdDogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgICAqL1xuICAgICAgaXNQb3J0cmFpdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BvcnRyYWl0KCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICAgKi9cbiAgICAgIGlzTGFuZHNjYXBlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzUG9ydHJhaXQoKTtcbiAgICAgIH0sXG5cbiAgICAgIF9pbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHRoaXMuX29uRE9NQ29udGVudExvYWRlZC5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCdvcmllbnRhdGlvbicgaW4gd2luZG93KSB7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZS5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uUmVzaXplLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lzUG9ydHJhaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0ID4gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBfb25ET01Db250ZW50TG9hZGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5faW5zdGFsbElzUG9ydHJhaXRJbXBsZW1lbnRhdGlvbigpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIHtpc1BvcnRyYWl0OiB0aGlzLmlzUG9ydHJhaXQoKX0pO1xuICAgICAgfSxcblxuICAgICAgX2luc3RhbGxJc1BvcnRyYWl0SW1wbGVtZW50YXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBpc1BvcnRyYWl0ID0gd2luZG93LmlubmVyV2lkdGggPCB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgICAgaWYgKCEoJ29yaWVudGF0aW9uJyBpbiB3aW5kb3cpKSB7XG4gICAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93Lm9yaWVudGF0aW9uICUgMTgwID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5vcmllbnRhdGlvbiAlIDE4MCkgPT09IDAgPyBpc1BvcnRyYWl0IDogIWlzUG9ydHJhaXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9pc1BvcnRyYWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMod2luZG93Lm9yaWVudGF0aW9uICUgMTgwKSA9PT0gOTAgPyBpc1BvcnRyYWl0IDogIWlzUG9ydHJhaXQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgX29uT3JpZW50YXRpb25DaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBpc1BvcnRyYWl0ID0gdGhpcy5faXNQb3J0cmFpdCgpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBkaW1lbnNpb25zIHRvIGNoYW5nZSBiZWNhdXNlXG4gICAgICAgIC8vIG9mIEFuZHJvaWQgaW5jb25zaXN0ZW5jeS5cbiAgICAgICAgbGV0IG5JdGVyID0gMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgbkl0ZXIrKztcblxuICAgICAgICAgIGNvbnN0IHcgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgICBjb25zdCBoID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgICAgICAgaWYgKChpc1BvcnRyYWl0ICYmIHcgPD0gaCkgfHxcbiAgICAgICAgICAgICAoIWlzUG9ydHJhaXQgJiYgdyA+PSBoKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCB7aXNQb3J0cmFpdDogaXNQb3J0cmFpdH0pO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChuSXRlciA9PT0gNTApIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IGlzUG9ydHJhaXR9KTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMjApO1xuICAgICAgfSxcblxuICAgICAgLy8gUnVuIG9uIG5vdCBtb2JpbGUgYnJvd3Nlci5cbiAgICAgIF9vblJlc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IHRoaXMuaXNQb3J0cmFpdCgpfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIE1pY3JvRXZlbnQubWl4aW4ob2JqKTtcblxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgb25zLm9yaWVudGF0aW9uID0gY3JlYXRlKCkuX2luaXQoKTtcbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigob25zKSA9PiB7XG4gIG9ucy5wYWdlQXR0cmlidXRlRXhwcmVzc2lvbiA9IHtcbiAgICBfdmFyaWFibGVzOiB7fSxcbiAgICBkZWZpbmVWYXJpYWJsZTogZnVuY3Rpb24obmFtZSwgdmFsdWUsIG92ZXJ3cml0ZT1mYWxzZSkge1xuICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhcmlhYmxlIG5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFyaWFibGUgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLicpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodGhpcy5fdmFyaWFibGVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIG92ZXJ3cml0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiJHtuYW1lfVwiIGlzIGFscmVhZHkgZGVmaW5lZC5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZhcmlhYmxlc1tuYW1lXSA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0VmFyaWFibGU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIGlmICghdGhpcy5fdmFyaWFibGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fdmFyaWFibGVzW25hbWVdO1xuICAgIH0sXG4gICAgcmVtb3ZlVmFyaWFibGU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl92YXJpYWJsZXNbbmFtZV07XG4gICAgfSxcbiAgICBnZXRBbGxWYXJpYWJsZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhcmlhYmxlcztcbiAgICB9LFxuICAgIGV2YWx1YXRlOiBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgfVxuICB9O1xufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIG9ucy5wbGF0Zm9ybSA9IHtcblxuICAgIC8qKlxuICAgICAqIEFsbCBlbGVtZW50cyB3aWxsIGJlIHJlbmRlcmVkIGFzIGlmIHRoZSBhcHAgd2FzIHJ1bm5pbmcgb24gdGhpcyBwbGF0Zm9ybS5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqL1xuICAgIF9yZW5kZXJQbGF0Zm9ybTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBsYXRmb3JtIHVzZWQgdG8gcmVuZGVyIHRoZSBlbGVtZW50cy4gUG9zc2libGUgdmFsdWVzIGFyZTogXCJvcGVyYVwiLCBcImZpcmVmb3hcIiwgXCJzYWZhcmlcIiwgXCJjaHJvbWVcIiwgXCJpZVwiLCBcImFuZHJvaWRcIiwgXCJibGFja2JlcnJ5XCIsIFwiaW9zXCIgb3IgXCJ3cFwiLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gcGxhdGZvcm0gTmFtZSBvZiB0aGUgcGxhdGZvcm0uXG4gICAgICovXG4gICAgc2VsZWN0OiBmdW5jdGlvbihwbGF0Zm9ybSkge1xuICAgICAgb25zLnBsYXRmb3JtLl9yZW5kZXJQbGF0Zm9ybSA9IHBsYXRmb3JtLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzV2ViVmlldzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gb25zLmlzV2ViVmlldygpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzSU9TOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnaW9zJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNBbmRyb2lkOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnYW5kcm9pZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gL0FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQW5kcm9pZFBob25lOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAvQW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL01vYmlsZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNBbmRyb2lkVGFibGV0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAvQW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIS9Nb2JpbGUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzV1A6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG9ucy5wbGF0Zm9ybS5fcmVuZGVyUGxhdGZvcm0pIHtcbiAgICAgICAgcmV0dXJuIG9ucy5wbGF0Zm9ybS5fcmVuZGVyUGxhdGZvcm0gPT09ICd3cCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gL1dpbmRvd3MgUGhvbmV8SUVNb2JpbGV8V1BEZXNrdG9wL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0lQaG9uZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gL2lQaG9uZS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNJUGFkOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAvaVBhZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNCbGFja0JlcnJ5OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnYmxhY2tiZXJyeSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gL0JsYWNrQmVycnl8UklNIFRhYmxldCBPU3xCQjEwL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc09wZXJhOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnb3BlcmEnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICghIXdpbmRvdy5vcGVyYSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBPUFIvJykgPj0gMCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNGaXJlZm94OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnZmlyZWZveCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzU2FmYXJpOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnc2FmYXJpJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5IVE1MRWxlbWVudCkuaW5kZXhPZignQ29uc3RydWN0b3InKSA+IDApO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQ2hyb21lOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnY2hyb21lJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoISF3aW5kb3cuY2hyb21lICYmICEoISF3aW5kb3cub3BlcmEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgT1BSLycpID49IDApKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0lFOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtKSB7XG4gICAgICAgIHJldHVybiBvbnMucGxhdGZvcm0uX3JlbmRlclBsYXRmb3JtID09PSAnaWUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlIHx8ICEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzSU9TN2Fib3ZlOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmKC9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICBjb25zdCB2ZXIgPSAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvXFxiWzAtOV0rX1swLTldKyg/Ol9bMC05XSspP1xcYi8pIHx8IFsnJ10pWzBdLnJlcGxhY2UoL18vZywgJy4nKTtcbiAgICAgICAgcmV0dXJuIChwYXJzZUludCh2ZXIuc3BsaXQoJy4nKVswXSkgPj0gNyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKChvbnMpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIG9ucy5zb2Z0d2FyZUtleWJvYXJkID0gbmV3IE1pY3JvRXZlbnQoKTtcbiAgb25zLnNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSBmYWxzZTtcblxuICBjb25zdCBvblNob3cgPSAoKSA9PiB7XG4gICAgb25zLnNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSB0cnVlO1xuICAgIG9ucy5zb2Z0d2FyZUtleWJvYXJkLmVtaXQoJ3Nob3cnKTtcbiAgfTtcblxuICBjb25zdCBvbkhpZGUgPSAoKSA9PiB7XG4gICAgb25zLnNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSBmYWxzZTtcbiAgICBvbnMuc29mdHdhcmVLZXlib2FyZC5lbWl0KCdoaWRlJyk7XG4gIH07XG5cbiAgY29uc3QgYmluZEV2ZW50cyA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIEtleWJvYXJkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcnRpbm1vc2UvY29yZG92YS1rZXlib2FyZC9ibG9iLzk1ZjNkYTNhMzhkOGY4ZTFmYTQxZmJmNDAxNDUzNTJjMTM1MzVhMDAvUkVBRE1FLm1kXG4gICAgICBLZXlib2FyZC5vbnNob3cgPSBvblNob3c7XG4gICAgICBLZXlib2FyZC5vbmhpZGUgPSBvbkhpZGU7XG4gICAgICBvbnMuc29mdHdhcmVLZXlib2FyZC5lbWl0KCdpbml0Jywge3Zpc2libGU6IEtleWJvYXJkLmlzVmlzaWJsZX0pO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb3Jkb3ZhLnBsdWdpbnMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb3Jkb3ZhLnBsdWdpbnMuS2V5Ym9hcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZHJpZnR5Y28vaW9uaWMtcGx1Z2lucy1rZXlib2FyZC9ibG9iL2NhMjdlY2YvUkVBRE1FLm1kXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbmF0aXZlLmtleWJvYXJkc2hvdycsIG9uU2hvdyk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbmF0aXZlLmtleWJvYXJkaGlkZScsIG9uSGlkZSk7XG4gICAgICBvbnMuc29mdHdhcmVLZXlib2FyZC5lbWl0KCdpbml0Jywge3Zpc2libGU6IGNvcmRvdmEucGx1Z2lucy5LZXlib2FyZC5pc1Zpc2libGV9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IG5vUGx1Z2luRXJyb3IgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKCdvbnMta2V5Ym9hcmQ6IENvcmRvdmEgS2V5Ym9hcmQgcGx1Z2luIGlzIG5vdCBwcmVzZW50LicpO1xuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xuICAgIGlmICghYmluZEV2ZW50cygpKSB7XG4gICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW29ucy1rZXlib2FyZC1hY3RpdmVdJykgfHxcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW29ucy1rZXlib2FyZC1pbmFjdGl2ZV0nKSkge1xuICAgICAgICBub1BsdWdpbkVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIG9ucy5zb2Z0d2FyZUtleWJvYXJkLm9uID0gbm9QbHVnaW5FcnJvcjtcbiAgICB9XG4gIH0pO1xufSkod2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge30pO1xuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3I7XG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG5cbiAgLyoqXG4gICAqIFNsaWRlIGFuaW1hdG9yIGZvciBuYXZpZ2F0b3IgdHJhbnNpdGlvbi5cbiAgICovXG4gIGNsYXNzIFNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvbnMuX3V0aWwuZXh0ZW5kKHtcbiAgICAgICAgZHVyYXRpb246IDAuMyxcbiAgICAgICAgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJyxcbiAgICAgICAgZGVsYXk6IDBcbiAgICAgIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gICAgICBzdXBlcihvcHRpb25zKTtcblxuICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzayA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgb3BhY2l0eTogMDtcIj48L2Rpdj5cbiAgICAgIGApO1xuICAgICAgdGhpcy5ibGFja01hc2tPcGFjaXR5ID0gMC40O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgICAgdXRpbC5yZW1vdmVFbGVtZW50KHRoaXMuYmFja2dyb3VuZE1hc2spO1xuICAgICAgbGVhdmVQYWdlLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlLmVsZW1lbnQubmV4dFNpYmxpbmcpO1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmJhY2tncm91bmRNYXNrKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiB0aGlzLmJsYWNrTWFza09wYWNpdHlcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXNldFN0eWxlKClcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgbWFzay5yZW1vdmUoKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwLCAwKScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpLFxuXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UuZWxlbWVudClcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTQ1JSwgMHB4LCAwcHgpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC53YWl0KDAuMilcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICAgKi9cbiAgICBwb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGRvbmUpIHtcbiAgICAgIHV0aWwucmVtb3ZlRWxlbWVudCh0aGlzLmJhY2tncm91bmRNYXNrKTtcbiAgICAgIGVudGVyUGFnZS5lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGVudGVyUGFnZS5lbGVtZW50Lm5leHRTaWJsaW5nKTtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQodGhpcy5iYWNrZ3JvdW5kTWFzaylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogdGhpcy5ibGFja01hc2tPcGFjaXR5LFxuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzZXRTdHlsZSgpXG4gICAgICAgICAgLnF1ZXVlKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICAgIG1hc2sucmVtb3ZlKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZS5lbGVtZW50KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoLTQ1JSwgMHB4LCAwcHgpJyxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMC45XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KScsXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDEuMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKSxcblxuICAgICAgICBhbmltaXQobGVhdmVQYWdlLmVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIGNzczoge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwcHgsIDBweCwgMHB4KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDEwMCUsIDBweCwgMHB4KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC53YWl0KDAuMilcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZmluaXNoKSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbnMuX2ludGVybmFsID0gb25zLl9pbnRlcm5hbCB8fCB7fTtcbiAgb25zLl9pbnRlcm5hbC5TaW1wbGVTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IFNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKG9ucykgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY2xhc3MgVGFiYmFyQW5pbWF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5kdXJhdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIHRoaXMudGltaW5nID0gb3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcic7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kdXJhdGlvbiA6ICcwLjQnO1xuICAgICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXkgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVsYXkgOiAnMCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbnRlclBhZ2Ugb25zLXBhZ2UgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbGVhdmVQYWdlIG9ucy1wYWdlIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZW50ZXJQYWdlSW5kZXhcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbGVhdmVQYWdlSW5kZXhcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAgICovXG4gICAgYXBwbHkoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGVudGVyUGFnZUluZGV4LCBsZWF2ZVBhZ2VJbmRleCwgZG9uZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgfVxuXG5cbiAgY2xhc3MgVGFiYmFyTm9uZUFuaW1hdG9yIGV4dGVuZHMgVGFiYmFyQW5pbWF0b3Ige1xuICAgIGFwcGx5KGVudGVyUGFnZSwgbGVhdmVQYWdlLCBlbnRlckluZGV4LCBsZWF2ZUluZGV4LCBkb25lKSB7XG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9XG5cbiAgY2xhc3MgVGFiYmFyRmFkZUFuaW1hdG9yIGV4dGVuZHMgVGFiYmFyQW5pbWF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucy50aW1pbmcgPSBvcHRpb25zLnRpbWluZyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy50aW1pbmcgOiAnbGluZWFyJztcbiAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmR1cmF0aW9uIDogJzAuNCc7XG4gICAgICBvcHRpb25zLmRlbGF5ID0gb3B0aW9ucy5kZWxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZWxheSA6ICcwJztcblxuICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgYXBwbHkoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGVudGVyUGFnZUluZGV4LCBsZWF2ZVBhZ2VJbmRleCwgZG9uZSkge1xuICAgICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQobGVhdmVQYWdlKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsXG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6IHRoaXMudGltaW5nXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cblxuICBjbGFzcyBUYWJiYXJTbGlkZUFuaW1hdG9yIGV4dGVuZHMgVGFiYmFyQW5pbWF0b3Ige1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgb3B0aW9ucy50aW1pbmcgPSBvcHRpb25zLnRpbWluZyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy50aW1pbmcgOiAnZWFzZS1pbic7XG4gICAgICBvcHRpb25zLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kdXJhdGlvbiA6ICcwLjE1JztcbiAgICAgIG9wdGlvbnMuZGVsYXkgPSBvcHRpb25zLmRlbGF5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlbGF5IDogJzAnO1xuXG4gICAgICBzdXBlcihvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2pxTGl0ZX0gZW50ZXJQYWdlXG4gICAgICogQHBhcmFtIHtqcUxpdGV9IGxlYXZlUGFnZVxuICAgICAqL1xuICAgIGFwcGx5KGVudGVyUGFnZSwgbGVhdmVQYWdlLCBlbnRlckluZGV4LCBsZWF2ZUluZGV4LCBkb25lKSB7XG4gICAgICBjb25zdCBzZ24gPSBlbnRlckluZGV4ID4gbGVhdmVJbmRleDtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoJyArIChzZ24gPyAnJyA6ICctJykgKyAnMTAwJSwgMCwgMCknLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc2V0U3R5bGUoKVxuICAgICAgICAgIC5xdWV1ZShmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoJyArIChzZ24gPyAnLScgOiAnJykgKyAnMTAwJSwgMCwgMCknLFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiB0aGlzLnRpbWluZ1xuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG5cbiAgb25zLl9pbnRlcm5hbCA9IG9ucy5faW50ZXJuYWwgfHwge307XG4gIG9ucy5faW50ZXJuYWwuVGFiYmFyQW5pbWF0b3IgPSBUYWJiYXJBbmltYXRvcjtcbiAgb25zLl9pbnRlcm5hbC5UYWJiYXJGYWRlQW5pbWF0b3IgPSBUYWJiYXJGYWRlQW5pbWF0b3I7XG4gIG9ucy5faW50ZXJuYWwuVGFiYmFyTm9uZUFuaW1hdG9yID0gVGFiYmFyTm9uZUFuaW1hdG9yO1xuICBvbnMuX2ludGVybmFsLlRhYmJhclNsaWRlQW5pbWF0b3IgPSBUYWJiYXJTbGlkZUFuaW1hdG9yO1xuXG59KSh3aW5kb3cub25zID0gd2luZG93Lm9ucyB8fCB7fSk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5cbi8qKlxuICogTWluaW1hbCBhbmltYXRpb24gbGlicmFyeSBmb3IgbWFuYWdpbmcgY3NzIHRyYW5zaXRpb24gb24gbW9iaWxlIGJyb3dzZXJzLlxuICovXG53aW5kb3cuYW5pbWl0ID0gKGZ1bmN0aW9uKCl7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKi9cbiAgdmFyIEFuaW1pdCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQW5pbWl0KSkge1xuICAgICAgcmV0dXJuIG5ldyBBbmltaXQoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgdGhpcy5lbGVtZW50cyA9IFtlbGVtZW50XTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbGVtZW50KSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSBvciBhbiBpbnN0YW5jZSBvZiBIVE1MRWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zaXRpb25RdWV1ZSA9IFtdO1xuICAgIHRoaXMubGFzdFN0eWxlQXR0cmlidXRlRGljdCA9IFtdO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1hbmltaXQtb3JpZy1zdHlsZScpKSB7XG4gICAgICAgIHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWl0LW9yaWctc3R5bGUnLCBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdIHx8ICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1hbmltaXQtb3JpZy1zdHlsZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIEFuaW1pdC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge0FycmF5fVxuICAgICAqL1xuICAgIHRyYW5zaXRpb25RdWV1ZTogdW5kZWZpbmVkLFxuXG4gICAgLyoqXG4gICAgICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH1cbiAgICAgKi9cbiAgICBlbGVtZW50OiB1bmRlZmluZWQsXG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBhbmltYXRpb24gc2VxdWVuY2Ugd2l0aCBwYXNzZWQgYW5pbWF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgcGxheTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBRdWV1ZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMgb3Igb3RoZXIgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBlLmcuIGFuaW1pdChlbHQpLnF1ZXVlKHtjb2xvcjogJ3JlZCd9KVxuICAgICAqIGUuZy4gYW5pbWl0KGVsdCkucXVldWUoe2NvbG9yOiAncmVkJ30sIHtkdXJhdGlvbjogMC40fSlcbiAgICAgKiBlLmcuIGFuaW1pdChlbHQpLnF1ZXVlKHtjc3M6IHtjb2xvcjogJ3JlZCd9LCBkdXJhdGlvbjogMC4yfSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fEFuaW1pdC5UcmFuc2l0aW9ufEZ1bmN0aW9ufSB0cmFuc2l0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqL1xuICAgIHF1ZXVlOiBmdW5jdGlvbih0cmFuc2l0aW9uLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcXVldWUgPSB0aGlzLnRyYW5zaXRpb25RdWV1ZTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24gJiYgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zLmNzcyA9IHRyYW5zaXRpb247XG4gICAgICAgIHRyYW5zaXRpb24gPSBuZXcgQW5pbWl0LlRyYW5zaXRpb24ob3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0cmFuc2l0aW9uIGluc3RhbmNlb2YgQW5pbWl0LlRyYW5zaXRpb24pKSB7XG4gICAgICAgIGlmICh0cmFuc2l0aW9uLmNzcykge1xuICAgICAgICAgIHRyYW5zaXRpb24gPSBuZXcgQW5pbWl0LlRyYW5zaXRpb24odHJhbnNpdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBBbmltaXQuVHJhbnNpdGlvbih7XG4gICAgICAgICAgICBjc3M6IHRyYW5zaXRpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHJhbnNpdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgIHF1ZXVlLnB1c2godHJhbnNpdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBBbmltaXQuVHJhbnNpdGlvbikge1xuICAgICAgICBxdWV1ZS5wdXNoKHRyYW5zaXRpb24uYnVpbGQoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBRdWV1ZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Zsb2F0fSBzZWNvbmRzXG4gICAgICovXG4gICAgd2FpdDogZnVuY3Rpb24oc2Vjb25kcykge1xuICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZG9uZSwgMTAwMCAqIHNlY29uZHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBlbGVtZW50J3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtGbG9hdH0gW29wdGlvbnMuZHVyYXRpb25dXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpbWluZ11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudHJhbnNpdGlvbl1cbiAgICAgKi9cbiAgICByZXNldFN0eWxlOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbiAmJiAhb3B0aW9ucy5kdXJhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wib3B0aW9ucy5kdXJhdGlvblwiIGlzIHJlcXVpcmVkIHdoZW4gXCJvcHRpb25zLnRyYW5zaXRpb25cIiBpcyBlbmFibGVkLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uIHx8IChvcHRpb25zLmR1cmF0aW9uICYmIG9wdGlvbnMuZHVyYXRpb24gPiAwKSkge1xuICAgICAgICB2YXIgdHJhbnNpdGlvblZhbHVlID0gb3B0aW9ucy50cmFuc2l0aW9uIHx8ICgnYWxsICcgKyBvcHRpb25zLmR1cmF0aW9uICsgJ3MgJyArIChvcHRpb25zLnRpbWluZyB8fCAnbGluZWFyJykpO1xuICAgICAgICB2YXIgdHJhbnNpdGlvblN0eWxlID0gJ3RyYW5zaXRpb246ICcgKyB0cmFuc2l0aW9uVmFsdWUgKyAnOyAtJyArIEFuaW1pdC5wcmVmaXggKyAnLXRyYW5zaXRpb246ICcgKyB0cmFuc2l0aW9uVmFsdWUgKyAnOyc7XG5cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcblxuICAgICAgICAgIC8vIHRyYW5zaXRpb24gYW5kIHN0eWxlIHNldHRpbmdzXG4gICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtBbmltaXQucHJlZml4ICsgJ1RyYW5zaXRpb24nXSA9IHRyYW5zaXRpb25WYWx1ZTtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25WYWx1ZTtcblxuICAgICAgICAgICAgdmFyIHN0eWxlVmFsdWUgPSAoc2VsZi5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XSA/IHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0gKyAnOyAnIDogJycpICsgdHJhbnNpdGlvblN0eWxlO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGVWYWx1ZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBhZGQgXCJ0cmFuc2l0aW9uZW5kXCIgZXZlbnQgaGFuZGxlclxuICAgICAgICAgIHZhciByZW1vdmVMaXN0ZW5lcnMgPSB1dGlsLmFkZE9uVHJhbnNpdGlvbkVuZChlbGVtZW50c1swXSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBmb3IgZmFpbCBzYWZlLlxuICAgICAgICAgIHZhciB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0sIG9wdGlvbnMuZHVyYXRpb24gKiAxMDAwICogMS40KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25RdWV1ZS5wdXNoKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgLy8gQ2xlYXIgdHJhbnNpdGlvbiBhbmltYXRpb24gc2V0dGluZ3MuXG4gICAgICAgIHNlbGYuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVbQW5pbWl0LnByZWZpeCArICdUcmFuc2l0aW9uJ10gPSAnbm9uZSc7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAgICAgaWYgKHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJyk7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBhbmltYXRpb24gc2VxdWVuY2UuXG4gICAgICovXG4gICAgc3RhcnRBbmltYXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fZGVxdWV1ZVRyYW5zaXRpb24oKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kZXF1ZXVlVHJhbnNpdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IHRoaXMudHJhbnNpdGlvblF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAodGhpcy5fY3VycmVudFRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXJyZW50IHRyYW5zaXRpb24gZXhpc3RzLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudFRyYW5zaXRpb24gPSB0cmFuc2l0aW9uO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuXG4gICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgc2VsZi5fY3VycmVudFRyYW5zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgc2VsZi5fZGVxdWV1ZVRyYW5zaXRpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGU6IFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHR3aWNlLicpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICB0cmFuc2l0aW9uLmNhbGwodGhpcywgZG9uZSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH07XG5cbiAgQW5pbWl0LmNzc1Byb3BlcnR5RGljdCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnJyk7XG4gICAgdmFyIGRpY3QgPSB7fTtcbiAgICB2YXIgYSA9ICdBJy5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB6ID0gJ3onLmNoYXJDb2RlQXQoMCk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKGEgPD0ga2V5LmNoYXJDb2RlQXQoMCkgJiYgeiA+PSBrZXkuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICAgIGlmIChrZXkgIT09ICdjc3NUZXh0JyAmJiBrZXkgIT09ICdwYXJlbnRUZXh0JyAmJiBrZXkgIT09ICdsZW5ndGgnKSB7XG4gICAgICAgICAgICBkaWN0W2tleV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkaWN0O1xuICB9KSgpO1xuXG4gIEFuaW1pdC5oYXNDc3NQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gISFBbmltaXQuY3NzUHJvcGVydHlEaWN0W25hbWVdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWZW5kb3IgcHJlZml4IGZvciBjc3MgcHJvcGVydHkuXG4gICAqL1xuICBBbmltaXQucHJlZml4ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICcnKSxcbiAgICAgIHByZSA9IChBcnJheS5wcm90b3R5cGUuc2xpY2VcbiAgICAgICAgLmNhbGwoc3R5bGVzKVxuICAgICAgICAuam9pbignJykgXG4gICAgICAgIC5tYXRjaCgvLShtb3p8d2Via2l0fG1zKS0vKSB8fCAoc3R5bGVzLk9MaW5rID09PSAnJyAmJiBbJycsICdvJ10pXG4gICAgICApWzFdO1xuICAgIHJldHVybiBwcmU7XG4gIH0pKCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QW5pbWl0fSBhcmd1bWVudHNcbiAgICovXG4gIEFuaW1pdC5ydW5BbGwgPSBmdW5jdGlvbigvKiBhcmd1bWVudHMuLi4gKi8pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJndW1lbnRzW2ldLnBsYXkoKTtcbiAgICB9XG4gIH07XG5cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtGbG9hdH0gW29wdGlvbnMuZHVyYXRpb25dXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wcm9wZXJ0eV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpbWluZ11cbiAgICovXG4gIEFuaW1pdC5UcmFuc2l0aW9uID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5vcHRpb25zLmR1cmF0aW9uID0gdGhpcy5vcHRpb25zLmR1cmF0aW9uIHx8IDA7XG4gICAgdGhpcy5vcHRpb25zLnRpbWluZyA9IHRoaXMub3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcic7XG4gICAgdGhpcy5vcHRpb25zLmNzcyA9IHRoaXMub3B0aW9ucy5jc3MgfHwge307XG4gICAgdGhpcy5vcHRpb25zLnByb3BlcnR5ID0gdGhpcy5vcHRpb25zLnByb3BlcnR5IHx8ICdhbGwnO1xuICB9O1xuXG4gIEFuaW1pdC5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAgICAgKi9cbiAgICBidWlsZDogZnVuY3Rpb24oKSB7XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuY3NzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLmNzcyBpcyByZXF1aXJlZC4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNzcyA9IGNyZWF0ZUFjdHVhbENzc1Byb3BzKHRoaXMub3B0aW9ucy5jc3MpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmR1cmF0aW9uID4gMCkge1xuICAgICAgICB2YXIgdHJhbnNpdGlvblZhbHVlID0gdXRpbC5idWlsZFRyYW5zaXRpb25WYWx1ZSh0aGlzLm9wdGlvbnMpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICAgICAgICB2YXIgdGltZW91dCA9IHNlbGYub3B0aW9ucy5kdXJhdGlvbiAqIDEwMDAgKiAxLjQ7XG5cbiAgICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gdXRpbC5hZGRPblRyYW5zaXRpb25FbmQoZWxlbWVudHNbMF0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbQW5pbWl0LnByZWZpeCArICdUcmFuc2l0aW9uJ10gPSB0cmFuc2l0aW9uVmFsdWU7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uVmFsdWU7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZV0gPSBjc3NbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmR1cmF0aW9uIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcblxuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtBbmltaXQucHJlZml4ICsgJ1RyYW5zaXRpb24nXSA9ICdub25lJztcbiAgICAgICAgICAgIGVsZW1lbnQudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtuYW1lXSA9IGNzc1tuYW1lXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudHNbMF0ub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gMzApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3JlYXRlQWN0dWFsQ3NzUHJvcHMoY3NzKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyhjc3MpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGNzc1tuYW1lXTtcbiAgICAgICAgICBuYW1lID0gdXRpbC5ub3JtYWxpemVTdHlsZU5hbWUobmFtZSk7XG4gICAgICAgICAgdmFyIHByZWZpeGVkID0gQW5pbWl0LnByZWZpeCArIHV0aWwuY2FwaXRhbGl6ZShuYW1lKTtcblxuICAgICAgICAgIGlmIChBbmltaXQuY3NzUHJvcGVydHlEaWN0W25hbWVdKSB7XG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKEFuaW1pdC5jc3NQcm9wZXJ0eURpY3RbcHJlZml4ZWRdKSB7XG4gICAgICAgICAgICByZXN1bHRbcHJlZml4ZWRdID0gdmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcmVmaXhlZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgIH1cbiAgfTtcblxuICB2YXIgdXRpbCA9IHtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgc3R5bGUgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICBub3JtYWxpemVTdHlsZU5hbWU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLy1bYS16QS1aXS9nLCBmdW5jdGlvbihhbGwpIHtcbiAgICAgICAgcmV0dXJuIGFsbC5zbGljZSgxKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICB9LFxuXG4gICAgLy8gY2FwaXRhbGl6ZSBzdHJpbmdcbiAgICBjYXBpdGFsaXplIDogZnVuY3Rpb24oc3RyKSB7XG4gICAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5wcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB7RmxvYXR9IHBhcmFtcy5kdXJhdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudGltaW5nXG4gICAgICovXG4gICAgYnVpbGRUcmFuc2l0aW9uVmFsdWU6IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgICAgcGFyYW1zLnByb3BlcnR5ID0gcGFyYW1zLnByb3BlcnR5IHx8ICdhbGwnO1xuICAgICAgcGFyYW1zLmR1cmF0aW9uID0gcGFyYW1zLmR1cmF0aW9uIHx8IDAuNDtcbiAgICAgIHBhcmFtcy50aW1pbmcgPSBwYXJhbXMudGltaW5nIHx8ICdsaW5lYXInO1xuXG4gICAgICB2YXIgcHJvcHMgPSBwYXJhbXMucHJvcGVydHkuc3BsaXQoLyArLyk7XG5cbiAgICAgIHJldHVybiBwcm9wcy5tYXAoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gcHJvcCArICcgJyArIHBhcmFtcy5kdXJhdGlvbiArICdzICcgKyBwYXJhbXMudGltaW5nO1xuICAgICAgfSkuam9pbignLCAnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGFuIGV2ZW50IGhhbmRsZXIgb24gXCJ0cmFuc2l0aW9uZW5kXCIgZXZlbnQuXG4gICAgICovXG4gICAgYWRkT25UcmFuc2l0aW9uRW5kOiBmdW5jdGlvbihlbGVtZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHt9O1xuICAgICAgfVxuXG4gICAgICB2YXIgZm4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PSBldmVudC50YXJnZXQpIHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcblxuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdXRpbC5fdHJhbnNpdGlvbkVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB1dGlsLl90cmFuc2l0aW9uRW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuLCBmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlbW92ZUxpc3RlbmVycztcbiAgICB9LFxuXG4gICAgX3RyYW5zaXRpb25FbmRFdmVudHM6IChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChBbmltaXQucHJlZml4ID09PSAnd2Via2l0JyB8fCBBbmltaXQucHJlZml4ID09PSAnbycgfHwgQW5pbWl0LnByZWZpeCA9PT0gJ21veicgfHwgQW5pbWl0LnByZWZpeCA9PT0gJ21zJykge1xuICAgICAgICByZXR1cm4gW0FuaW1pdC5wcmVmaXggKyAnVHJhbnNpdGlvbkVuZCcsICd0cmFuc2l0aW9uZW5kJ107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbJ3RyYW5zaXRpb25lbmQnXTtcbiAgICB9KSgpXG5cbiAgfTtcblxuICByZXR1cm4gQW5pbWl0O1xufSkoKTtcbiIsIi8qXG4gKiBHZXN0dXJlIGRldGVjdG9yIGxpYnJhcnkgdGhhdCBmb3JrZWQgZnJvbSBnaXRodWIuY29tL0VpZ2h0TWVkaWEvaGFtbWVyLmpzLlxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAqIEByZXR1cm4ge0dlc3R1cmVEZXRlY3Rvci5JbnN0YW5jZX1cbiAqL1xudmFyIEdlc3R1cmVEZXRlY3RvciA9IGZ1bmN0aW9uIEdlc3R1cmVEZXRlY3RvcihlbGVtZW50LCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgR2VzdHVyZURldGVjdG9yLkluc3RhbmNlKGVsZW1lbnQsIG9wdGlvbnMgfHwge30pO1xufTtcblxuLyoqXG4gKiBkZWZhdWx0IHNldHRpbmdzLlxuICogbW9yZSBzZXR0aW5ncyBhcmUgZGVmaW5lZCBwZXIgZ2VzdHVyZSBhdCBgL2dlc3R1cmVzYC4gRWFjaCBnZXN0dXJlIGNhbiBiZSBkaXNhYmxlZC9lbmFibGVkXG4gKiBieSBzZXR0aW5nIGl0J3MgbmFtZSAobGlrZSBgc3dpcGVgKSB0byBmYWxzZS5cbiAqIFlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0cyBmb3IgYWxsIGluc3RhbmNlcyBieSBjaGFuZ2luZyB0aGlzIG9iamVjdCBiZWZvcmUgY3JlYXRpbmcgYW4gaW5zdGFuY2UuXG4gKiBAZXhhbXBsZVxuICogYGBgYFxuICogIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5kcmFnID0gZmFsc2U7XG4gKiAgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzLmJlaGF2aW9yLnRvdWNoQWN0aW9uID0gJ3Bhbi15JztcbiAqICBkZWxldGUgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzLmJlaGF2aW9yLnVzZXJTZWxlY3Q7XG4gKiBgYGBgXG4gKiBAcHJvcGVydHkgZGVmYXVsdHNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cyA9IHtcbiAgYmVoYXZpb3I6IHtcbiAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgdG91Y2hBY3Rpb246ICdwYW4teScsXG4gICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG4gICAgY29udGVudFpvb21pbmc6ICdub25lJyxcbiAgICB1c2VyRHJhZzogJ25vbmUnLFxuICAgIHRhcEhpZ2hsaWdodENvbG9yOiAncmdiYSgwLDAsMCwwKSdcbiAgfVxufTtcblxuLyoqXG4gKiBHZXN0dXJlRGV0ZWN0b3IgZG9jdW1lbnQgd2hlcmUgdGhlIGJhc2UgZXZlbnRzIGFyZSBhZGRlZCBhdFxuICogQHByb3BlcnR5IERPQ1VNRU5UXG4gKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gKiBAZGVmYXVsdCB3aW5kb3cuZG9jdW1lbnRcbiAqL1xuR2VzdHVyZURldGVjdG9yLkRPQ1VNRU5UID0gZG9jdW1lbnQ7XG5cbi8qKlxuICogZGV0ZWN0IHN1cHBvcnQgZm9yIHBvaW50ZXIgZXZlbnRzXG4gKiBAcHJvcGVydHkgSEFTX1BPSU5URVJFVkVOVFNcbiAqIEB0eXBlIHtCb29sZWFufVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFMgPSBuYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQgfHwgbmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7XG5cbi8qKlxuICogZGV0ZWN0IHN1cHBvcnQgZm9yIHRvdWNoIGV2ZW50c1xuICogQHByb3BlcnR5IEhBU19UT1VDSEVWRU5UU1xuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5IQVNfVE9VQ0hFVkVOVFMgPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcblxuLyoqXG4gKiBkZXRlY3QgbW9iaWxlIGJyb3dzZXJzXG4gKiBAcHJvcGVydHkgSVNfTU9CSUxFXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuR2VzdHVyZURldGVjdG9yLklTX01PQklMRSA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWR8c2lsay9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogZGV0ZWN0IGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBtb3VzZWV2ZW50cyBhdCBhbGxcbiAqIEBwcm9wZXJ0eSBOT19NT1VTRUVWRU5UU1xuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5OT19NT1VTRUVWRU5UUyA9IChHZXN0dXJlRGV0ZWN0b3IuSEFTX1RPVUNIRVZFTlRTICYmIEdlc3R1cmVEZXRlY3Rvci5JU19NT0JJTEUpIHx8IEdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUztcblxuLyoqXG4gKiBpbnRlcnZhbCBpbiB3aGljaCBHZXN0dXJlRGV0ZWN0b3IgcmVjYWxjdWxhdGVzIGN1cnJlbnQgdmVsb2NpdHkvZGlyZWN0aW9uL2FuZ2xlIGluIG1zXG4gKiBAcHJvcGVydHkgQ0FMQ1VMQVRFX0lOVEVSVkFMXG4gKiBAdHlwZSB7TnVtYmVyfVxuICogQGRlZmF1bHQgMjVcbiAqL1xuR2VzdHVyZURldGVjdG9yLkNBTENVTEFURV9JTlRFUlZBTCA9IDI1O1xuXG4vKipcbiAqIGV2ZW50dHlwZXMgcGVyIHRvdWNoZXZlbnQgKHN0YXJ0LCBtb3ZlLCBlbmQpIGFyZSBmaWxsZWQgYnkgYEV2ZW50LmRldGVybWluZUV2ZW50VHlwZXNgIG9uIGBzZXR1cGBcbiAqIHRoZSBvYmplY3QgY29udGFpbnMgdGhlIERPTSBldmVudCBuYW1lcyBwZXIgdHlwZSAoYEVWRU5UX1NUQVJUYCwgYEVWRU5UX01PVkVgLCBgRVZFTlRfRU5EYClcbiAqIEBwcm9wZXJ0eSBFVkVOVF9UWVBFU1xuICogQHByaXZhdGVcbiAqIEB3cml0ZU9uY2VcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciBFVkVOVF9UWVBFUyA9IHt9O1xuXG4vKipcbiAqIGRpcmVjdGlvbiBzdHJpbmdzLCBmb3Igc2FmZSBjb21wYXJpc29uc1xuICogQHByb3BlcnR5IERJUkVDVElPTl9ET1dOfExFRlR8VVB8UklHSFRcbiAqIEBmaW5hbFxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZWZhdWx0ICdkb3duJyAnbGVmdCcgJ3VwJyAncmlnaHQnXG4gKi9cbnZhciBESVJFQ1RJT05fRE9XTiA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fRE9XTiA9ICdkb3duJztcbnZhciBESVJFQ1RJT05fTEVGVCA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fTEVGVCA9ICdsZWZ0JztcbnZhciBESVJFQ1RJT05fVVAgPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX1VQID0gJ3VwJztcbnZhciBESVJFQ1RJT05fUklHSFQgPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX1JJR0hUID0gJ3JpZ2h0JztcblxuLyoqXG4gKiBwb2ludGVydHlwZSBzdHJpbmdzLCBmb3Igc2FmZSBjb21wYXJpc29uc1xuICogQHByb3BlcnR5IFBPSU5URVJfTU9VU0V8VE9VQ0h8UEVOXG4gKiBAZmluYWxcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVmYXVsdCAnbW91c2UnICd0b3VjaCcgJ3BlbidcbiAqL1xudmFyIFBPSU5URVJfTU9VU0UgPSBHZXN0dXJlRGV0ZWN0b3IuUE9JTlRFUl9NT1VTRSA9ICdtb3VzZSc7XG52YXIgUE9JTlRFUl9UT1VDSCA9IEdlc3R1cmVEZXRlY3Rvci5QT0lOVEVSX1RPVUNIID0gJ3RvdWNoJztcbnZhciBQT0lOVEVSX1BFTiA9IEdlc3R1cmVEZXRlY3Rvci5QT0lOVEVSX1BFTiA9ICdwZW4nO1xuXG4vKipcbiAqIGV2ZW50dHlwZXNcbiAqIEBwcm9wZXJ0eSBFVkVOVF9TVEFSVHxNT1ZFfEVORHxSRUxFQVNFfFRPVUNIXG4gKiBAZmluYWxcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVmYXVsdCAnc3RhcnQnICdjaGFuZ2UnICdtb3ZlJyAnZW5kJyAncmVsZWFzZScgJ3RvdWNoJ1xuICovXG52YXIgRVZFTlRfU1RBUlQgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfU1RBUlQgPSAnc3RhcnQnO1xudmFyIEVWRU5UX01PVkUgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfTU9WRSA9ICdtb3ZlJztcbnZhciBFVkVOVF9FTkQgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfRU5EID0gJ2VuZCc7XG52YXIgRVZFTlRfUkVMRUFTRSA9IEdlc3R1cmVEZXRlY3Rvci5FVkVOVF9SRUxFQVNFID0gJ3JlbGVhc2UnO1xudmFyIEVWRU5UX1RPVUNIID0gR2VzdHVyZURldGVjdG9yLkVWRU5UX1RPVUNIID0gJ3RvdWNoJztcblxuLyoqXG4gKiBpZiB0aGUgd2luZG93IGV2ZW50cyBhcmUgc2V0Li4uXG4gKiBAcHJvcGVydHkgUkVBRFlcbiAqIEB3cml0ZU9uY2VcbiAqIEB0eXBlIHtCb29sZWFufVxuICogQGRlZmF1bHQgZmFsc2VcbiAqL1xuR2VzdHVyZURldGVjdG9yLlJFQURZID0gZmFsc2U7XG5cbi8qKlxuICogcGx1Z2lucyBuYW1lc3BhY2VcbiAqIEBwcm9wZXJ0eSBwbHVnaW5zXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5HZXN0dXJlRGV0ZWN0b3IucGx1Z2lucyA9IEdlc3R1cmVEZXRlY3Rvci5wbHVnaW5zIHx8IHt9O1xuXG4vKipcbiAqIGdlc3R1cmVzIG5hbWVzcGFjZVxuICogc2VlIGAvZ2VzdHVyZXNgIGZvciB0aGUgZGVmaW5pdGlvbnNcbiAqIEBwcm9wZXJ0eSBnZXN0dXJlc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xuR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzID0gR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzIHx8IHt9O1xuXG4vKipcbiAqIHNldHVwIGV2ZW50cyB0byBkZXRlY3QgZ2VzdHVyZXMgb24gdGhlIGRvY3VtZW50XG4gKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGNyZWF0aW5nIGFuIG5ldyBpbnN0YW5jZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIGlmKEdlc3R1cmVEZXRlY3Rvci5SRUFEWSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGZpbmQgd2hhdCBldmVudHR5cGVzIHdlIGFkZCBsaXN0ZW5lcnMgdG9cbiAgRXZlbnQuZGV0ZXJtaW5lRXZlbnRUeXBlcygpO1xuXG4gIC8vIFJlZ2lzdGVyIGFsbCBnZXN0dXJlcyBpbnNpZGUgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzXG4gIFV0aWxzLmVhY2goR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLCBmdW5jdGlvbihnZXN0dXJlKSB7XG4gICAgRGV0ZWN0aW9uLnJlZ2lzdGVyKGdlc3R1cmUpO1xuICB9KTtcblxuICAvLyBBZGQgdG91Y2ggZXZlbnRzIG9uIHRoZSBkb2N1bWVudFxuICBFdmVudC5vblRvdWNoKEdlc3R1cmVEZXRlY3Rvci5ET0NVTUVOVCwgRVZFTlRfTU9WRSwgRGV0ZWN0aW9uLmRldGVjdCk7XG4gIEV2ZW50Lm9uVG91Y2goR2VzdHVyZURldGVjdG9yLkRPQ1VNRU5ULCBFVkVOVF9FTkQsIERldGVjdGlvbi5kZXRlY3QpO1xuXG4gIC8vIEdlc3R1cmVEZXRlY3RvciBpcyByZWFkeS4uLiFcbiAgR2VzdHVyZURldGVjdG9yLlJFQURZID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICpcbiAqIEBjbGFzcyBVdGlsc1xuICogQHN0YXRpY1xuICovXG52YXIgVXRpbHMgPSBHZXN0dXJlRGV0ZWN0b3IudXRpbHMgPSB7XG4gIC8qKlxuICAgKiBleHRlbmQgbWV0aG9kLCBjb3VsZCBhbHNvIGJlIHVzZWQgZm9yIGNsb25pbmcgd2hlbiBgZGVzdGAgaXMgYW4gZW1wdHkgb2JqZWN0LlxuICAgKiBjaGFuZ2VzIHRoZSBkZXN0IG9iamVjdFxuICAgKiBAbWV0aG9kIGV4dGVuZFxuICAgKiBAcGFyYW0ge09iamVjdH0gZGVzdFxuICAgKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21lcmdlPWZhbHNlXSAgZG8gYSBtZXJnZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGRlc3RcbiAgICovXG4gIGV4dGVuZDogZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYywgbWVyZ2UpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkgJiYgKGRlc3Rba2V5XSA9PT0gdW5kZWZpbmVkIHx8ICFtZXJnZSkpIHtcbiAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgYWRkRXZlbnRMaXN0ZW5lciB3cmFwcGVyXG4gICAqIEBtZXRob2Qgb25cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqL1xuICBvbjogZnVuY3Rpb24gb24oZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNpbXBsZSByZW1vdmVFdmVudExpc3RlbmVyIHdyYXBwZXJcbiAgICogQG1ldGhvZCBvZmZcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uIG9mZihlbGVtZW50LCB0eXBlLCBoYW5kbGVyKSB7XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgfSxcblxuICAvKipcbiAgICogZm9yRWFjaCBvdmVyIGFycmF5cyBhbmQgb2JqZWN0c1xuICAgKiBAbWV0aG9kIGVhY2hcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9ialxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRvclxuICAgKiBAcGFyYW0ge2FueX0gaXRlcmF0b3IuaXRlbVxuICAgKiBAcGFyYW0ge051bWJlcn0gaXRlcmF0b3IuaW5kZXhcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGl0ZXJhdG9yLm9iaiB0aGUgc291cmNlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgIGluIHRoZSBpdGVyYXRvclxuICAgKi9cbiAgZWFjaDogZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGksIGxlbjtcblxuICAgIC8vIG5hdGl2ZSBmb3JFYWNoIG9uIGFycmF5c1xuICAgIGlmKCdmb3JFYWNoJyBpbiBvYmopIHtcbiAgICAgIG9iai5mb3JFYWNoKGl0ZXJhdG9yLCBjb250ZXh0KTtcbiAgICAgIC8vIGFycmF5c1xuICAgIH0gZWxzZSBpZihvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvcihpID0gMCwgbGVuID0gb2JqLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb2JqZWN0c1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IoaSBpbiBvYmopIHtcbiAgICAgICAgaWYob2JqLmhhc093blByb3BlcnR5KGkpICYmXG4gICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbaV0sIGksIG9iaikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBmaW5kIGlmIGEgc3RyaW5nIGNvbnRhaW5zIHRoZSBzdHJpbmcgdXNpbmcgaW5kZXhPZlxuICAgKiBAbWV0aG9kIGluU3RyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAgICovXG4gIGluU3RyOiBmdW5jdGlvbiBpblN0cihzcmMsIGZpbmQpIHtcbiAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCkgPiAtMTtcbiAgfSxcblxuICAvKipcbiAgICogZmluZCBpZiBhIGFycmF5IGNvbnRhaW5zIHRoZSBvYmplY3QgdXNpbmcgaW5kZXhPZiBvciBhIHNpbXBsZSBwb2x5ZmlsbFxuICAgKiBAbWV0aG9kIGluQXJyYXlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNyY1xuICAgKiBAcGFyYW0ge1N0cmluZ30gZmluZFxuICAgKiBAcmV0dXJuIHtCb29sZWFufE51bWJlcn0gZmFsc2Ugd2hlbiBub3QgZm91bmQsIG9yIHRoZSBpbmRleFxuICAgKi9cbiAgaW5BcnJheTogZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQpIHtcbiAgICBpZihzcmMuaW5kZXhPZikge1xuICAgICAgdmFyIGluZGV4ID0gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgICByZXR1cm4gKGluZGV4ID09PSAtMSkgPyBmYWxzZSA6IGluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IodmFyIGkgPSAwLCBsZW4gPSBzcmMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYoc3JjW2ldID09PSBmaW5kKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgYW4gYXJyYXktbGlrZSBvYmplY3QgKGBhcmd1bWVudHNgLCBgdG91Y2hsaXN0YCkgdG8gYW4gYXJyYXlcbiAgICogQG1ldGhvZCB0b0FycmF5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmosIDApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaW5kIGlmIGEgbm9kZSBpcyBpbiB0aGUgZ2l2ZW4gcGFyZW50XG4gICAqIEBtZXRob2QgaGFzUGFyZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGZvdW5kXG4gICAqL1xuICBoYXNQYXJlbnQ6IGZ1bmN0aW9uIGhhc1BhcmVudChub2RlLCBwYXJlbnQpIHtcbiAgICB3aGlsZShub2RlKSB7XG4gICAgICBpZihub2RlID09IHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogZ2V0IHRoZSBjZW50ZXIgb2YgYWxsIHRoZSB0b3VjaGVzXG4gICAqIEBtZXRob2QgZ2V0Q2VudGVyXG4gICAqIEBwYXJhbSB7QXJyYXl9IHRvdWNoZXNcbiAgICogQHJldHVybiB7T2JqZWN0fSBjZW50ZXIgY29udGFpbnMgYHBhZ2VYYCwgYHBhZ2VZYCwgYGNsaWVudFhgIGFuZCBgY2xpZW50WWAgcHJvcGVydGllc1xuICAgKi9cbiAgZ2V0Q2VudGVyOiBmdW5jdGlvbiBnZXRDZW50ZXIodG91Y2hlcykge1xuICAgIHZhciBwYWdlWCA9IFtdLFxuICAgICAgICBwYWdlWSA9IFtdLFxuICAgICAgICBjbGllbnRYID0gW10sXG4gICAgICAgIGNsaWVudFkgPSBbXSxcbiAgICAgICAgbWluID0gTWF0aC5taW4sXG4gICAgICAgIG1heCA9IE1hdGgubWF4O1xuXG4gICAgLy8gbm8gbmVlZCB0byBsb29wIHdoZW4gb25seSBvbmUgdG91Y2hcbiAgICBpZih0b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVg6IHRvdWNoZXNbMF0ucGFnZVgsXG4gICAgICAgIHBhZ2VZOiB0b3VjaGVzWzBdLnBhZ2VZLFxuICAgICAgICBjbGllbnRYOiB0b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoZXNbMF0uY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBVdGlscy5lYWNoKHRvdWNoZXMsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICBwYWdlWC5wdXNoKHRvdWNoLnBhZ2VYKTtcbiAgICAgIHBhZ2VZLnB1c2godG91Y2gucGFnZVkpO1xuICAgICAgY2xpZW50WC5wdXNoKHRvdWNoLmNsaWVudFgpO1xuICAgICAgY2xpZW50WS5wdXNoKHRvdWNoLmNsaWVudFkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VYOiAobWluLmFwcGx5KE1hdGgsIHBhZ2VYKSArIG1heC5hcHBseShNYXRoLCBwYWdlWCkpIC8gMixcbiAgICAgIHBhZ2VZOiAobWluLmFwcGx5KE1hdGgsIHBhZ2VZKSArIG1heC5hcHBseShNYXRoLCBwYWdlWSkpIC8gMixcbiAgICAgIGNsaWVudFg6IChtaW4uYXBwbHkoTWF0aCwgY2xpZW50WCkgKyBtYXguYXBwbHkoTWF0aCwgY2xpZW50WCkpIC8gMixcbiAgICAgIGNsaWVudFk6IChtaW4uYXBwbHkoTWF0aCwgY2xpZW50WSkgKyBtYXguYXBwbHkoTWF0aCwgY2xpZW50WSkpIC8gMlxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYmV0d2VlbiB0d28gcG9pbnRzLiB1bml0IGlzIGluIHB4IHBlciBtcy5cbiAgICogQG1ldGhvZCBnZXRWZWxvY2l0eVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFUaW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVhcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhWVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHZlbG9jaXR5IGB4YCBhbmQgYHlgXG4gICAqL1xuICBnZXRWZWxvY2l0eTogZnVuY3Rpb24gZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBNYXRoLmFicyhkZWx0YVggLyBkZWx0YVRpbWUpIHx8IDAsXG4gICAgICB5OiBNYXRoLmFicyhkZWx0YVkgLyBkZWx0YVRpbWUpIHx8IDBcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIGNvb3JkaW5hdGVzXG4gICAqIEBtZXRob2QgZ2V0QW5nbGVcbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gxXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAqL1xuICBnZXRBbmdsZTogZnVuY3Rpb24gZ2V0QW5nbGUodG91Y2gxLCB0b3VjaDIpIHtcbiAgICB2YXIgeCA9IHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFgsXG4gICAgICAgIHkgPSB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZO1xuXG4gICAgcmV0dXJuIE1hdGguYXRhbjIoeSwgeCkgKiAxODAgLyBNYXRoLlBJO1xuICB9LFxuXG4gIC8qKlxuICAgKiBkbyBhIHNtYWxsIGNvbXBhcmlzb24gdG8gZ2V0IHRoZSBkaXJlY3Rpb24gYmV0d2VlbiB0d28gdG91Y2hlcy5cbiAgICogQG1ldGhvZCBnZXREaXJlY3Rpb25cbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gxXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IGRpcmVjdGlvbiBtYXRjaGVzIGBESVJFQ1RJT05fTEVGVHxSSUdIVHxVUHxET1dOYFxuICAgKi9cbiAgZ2V0RGlyZWN0aW9uOiBmdW5jdGlvbiBnZXREaXJlY3Rpb24odG91Y2gxLCB0b3VjaDIpIHtcbiAgICB2YXIgeCA9IE1hdGguYWJzKHRvdWNoMS5jbGllbnRYIC0gdG91Y2gyLmNsaWVudFgpLFxuICAgICAgICB5ID0gTWF0aC5hYnModG91Y2gxLmNsaWVudFkgLSB0b3VjaDIuY2xpZW50WSk7XG5cbiAgICBpZih4ID49IHkpIHtcbiAgICAgIHJldHVybiB0b3VjaDEuY2xpZW50WCAtIHRvdWNoMi5jbGllbnRYID4gMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4gdG91Y2gxLmNsaWVudFkgLSB0b3VjaDIuY2xpZW50WSA+IDAgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byB0b3VjaGVzXG4gICAqIEBtZXRob2QgZ2V0RGlzdGFuY2VcbiAgICogQHBhcmFtIHtUb3VjaH10b3VjaDFcbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gyXG4gICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICovXG4gIGdldERpc3RhbmNlOiBmdW5jdGlvbiBnZXREaXN0YW5jZSh0b3VjaDEsIHRvdWNoMikge1xuICAgIHZhciB4ID0gdG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCxcbiAgICAgICAgeSA9IHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFk7XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KCh4ICogeCkgKyAoeSAqIHkpKTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0d28gdG91Y2hMaXN0c1xuICAgKiBubyBzY2FsZSBpcyAxLCBhbmQgZ29lcyBkb3duIHRvIDAgd2hlbiBwaW5jaGVkIHRvZ2V0aGVyLCBhbmQgYmlnZ2VyIHdoZW4gcGluY2hlZCBvdXRcbiAgICogQG1ldGhvZCBnZXRTY2FsZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiB0b3VjaGVzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiB0b3VjaGVzXG4gICAqIEByZXR1cm4ge051bWJlcn0gc2NhbGVcbiAgICovXG4gIGdldFNjYWxlOiBmdW5jdGlvbiBnZXRTY2FsZShzdGFydCwgZW5kKSB7XG4gICAgLy8gbmVlZCB0d28gZmluZ2Vycy4uLlxuICAgIGlmKHN0YXJ0Lmxlbmd0aCA+PSAyICYmIGVuZC5sZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlzdGFuY2UoZW5kWzBdLCBlbmRbMV0pIC8gdGhpcy5nZXREaXN0YW5jZShzdGFydFswXSwgc3RhcnRbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHRvdWNoTGlzdHNcbiAgICogQG1ldGhvZCBnZXRSb3RhdGlvblxuICAgKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiB0b3VjaGVzXG4gICAqIEBwYXJhbSB7QXJyYXl9IGVuZCBhcnJheSBvZiB0b3VjaGVzXG4gICAqIEByZXR1cm4ge051bWJlcn0gcm90YXRpb25cbiAgICovXG4gIGdldFJvdGF0aW9uOiBmdW5jdGlvbiBnZXRSb3RhdGlvbihzdGFydCwgZW5kKSB7XG4gICAgLy8gbmVlZCB0d28gZmluZ2Vyc1xuICAgIGlmKHN0YXJ0Lmxlbmd0aCA+PSAyICYmIGVuZC5sZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5nbGUoZW5kWzFdLCBlbmRbMF0pIC0gdGhpcy5nZXRBbmdsZShzdGFydFsxXSwgc3RhcnRbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSxcblxuICAvKipcbiAgICogZmluZCBvdXQgaWYgdGhlIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbCAgICpcbiAgICogQG1ldGhvZCBpc1ZlcnRpY2FsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3Rpb24gbWF0Y2hlcyBgRElSRUNUSU9OX1VQfERPV05gXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGlzX3ZlcnRpY2FsXG4gICAqL1xuICBpc1ZlcnRpY2FsOiBmdW5jdGlvbiBpc1ZlcnRpY2FsKGRpcmVjdGlvbikge1xuICAgIHJldHVybiBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX1VQIHx8IGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fRE9XTjtcbiAgfSxcblxuICAvKipcbiAgICogc2V0IGNzcyBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgcHJlZml4ZXNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbdG9nZ2xlPXRydWVdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBzZXRQcmVmaXhlZENzczogZnVuY3Rpb24gc2V0UHJlZml4ZWRDc3MoZWxlbWVudCwgcHJvcCwgdmFsdWUsIHRvZ2dsZSkge1xuICAgIHZhciBwcmVmaXhlcyA9IFsnJywgJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddO1xuICAgIHByb3AgPSBVdGlscy50b0NhbWVsQ2FzZShwcm9wKTtcblxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBwcm9wO1xuICAgICAgLy8gcHJlZml4ZXNcbiAgICAgIGlmKHByZWZpeGVzW2ldKSB7XG4gICAgICAgIHAgPSBwcmVmaXhlc1tpXSArIHAuc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKSArIHAuc2xpY2UoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHRlc3QgdGhlIHN0eWxlXG4gICAgICBpZihwIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtwXSA9ICh0b2dnbGUgPT09IG51bGwgfHwgdG9nZ2xlKSAmJiB2YWx1ZSB8fCAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiB0b2dnbGUgYnJvd3NlciBkZWZhdWx0IGJlaGF2aW9yIGJ5IHNldHRpbmcgY3NzIHByb3BlcnRpZXMuXG4gICAqIGB1c2VyU2VsZWN0PSdub25lJ2AgYWxzbyBzZXRzIGBlbGVtZW50Lm9uc2VsZWN0c3RhcnRgIHRvIGZhbHNlXG4gICAqIGB1c2VyRHJhZz0nbm9uZSdgIGFsc28gc2V0cyBgZWxlbWVudC5vbmRyYWdzdGFydGAgdG8gZmFsc2VcbiAgICpcbiAgICogQG1ldGhvZCB0b2dnbGVCZWhhdmlvclxuICAgKiBAcGFyYW0ge0h0bWxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt0b2dnbGU9dHJ1ZV1cbiAgICovXG4gIHRvZ2dsZUJlaGF2aW9yOiBmdW5jdGlvbiB0b2dnbGVCZWhhdmlvcihlbGVtZW50LCBwcm9wcywgdG9nZ2xlKSB7XG4gICAgaWYoIXByb3BzIHx8ICFlbGVtZW50IHx8ICFlbGVtZW50LnN0eWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0IHRoZSBjc3MgcHJvcGVydGllc1xuICAgIFV0aWxzLmVhY2gocHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICBVdGlscy5zZXRQcmVmaXhlZENzcyhlbGVtZW50LCBwcm9wLCB2YWx1ZSwgdG9nZ2xlKTtcbiAgICB9KTtcblxuICAgIHZhciBmYWxzZUZuID0gdG9nZ2xlICYmIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBhbHNvIHRoZSBkaXNhYmxlIG9uc2VsZWN0c3RhcnRcbiAgICBpZihwcm9wcy51c2VyU2VsZWN0ID09ICdub25lJykge1xuICAgICAgZWxlbWVudC5vbnNlbGVjdHN0YXJ0ID0gZmFsc2VGbjtcbiAgICB9XG4gICAgLy8gYW5kIGRpc2FibGUgb25kcmFnc3RhcnRcbiAgICBpZihwcm9wcy51c2VyRHJhZyA9PSAnbm9uZScpIHtcbiAgICAgIGVsZW1lbnQub25kcmFnc3RhcnQgPSBmYWxzZUZuO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogY29udmVydCBhIHN0cmluZyB3aXRoIHVuZGVyc2NvcmVzIHRvIGNhbWVsQ2FzZVxuICAgKiBzbyBwcmV2ZW50X2RlZmF1bHQgYmVjb21lcyBwcmV2ZW50RGVmYXVsdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gY2FtZWxDYXNlU3RyXG4gICAqL1xuICB0b0NhbWVsQ2FzZTogZnVuY3Rpb24gdG9DYW1lbENhc2Uoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXy1dKFthLXpdKS9nLCBmdW5jdGlvbihzKSB7XG4gICAgICByZXR1cm4gc1sxXS50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqL1xuLyoqXG4gKiBAY2xhc3MgRXZlbnRcbiAqIEBzdGF0aWNcbiAqL1xudmFyIEV2ZW50ID0gR2VzdHVyZURldGVjdG9yLmV2ZW50ID0ge1xuICAvKipcbiAgICogd2hlbiB0b3VjaCBldmVudHMgaGF2ZSBiZWVuIGZpcmVkLCB0aGlzIGlzIHRydWVcbiAgICogdGhpcyBpcyB1c2VkIHRvIHN0b3AgbW91c2UgZXZlbnRzXG4gICAqIEBwcm9wZXJ0eSBwcmV2ZW50X21vdXNlZXZlbnRzXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgcHJldmVudE1vdXNlRXZlbnRzOiBmYWxzZSxcblxuICAvKipcbiAgICogaWYgRVZFTlRfU1RBUlQgaGFzIGJlZW4gZmlyZWRcbiAgICogQHByb3BlcnR5IHN0YXJ0ZWRcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBzdGFydGVkOiBmYWxzZSxcblxuICAvKipcbiAgICogd2hlbiB0aGUgbW91c2UgaXMgaG9sZCBkb3duLCB0aGlzIGlzIHRydWVcbiAgICogQHByb3BlcnR5IHNob3VsZF9kZXRlY3RcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBzaG91bGREZXRlY3Q6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgZXZlbnQgYmluZGVyIHdpdGggYSBob29rIGFuZCBzdXBwb3J0IGZvciBtdWx0aXBsZSB0eXBlc1xuICAgKiBAbWV0aG9kIG9uXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaG9va11cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvb2sudHlwZVxuICAgKi9cbiAgb246IGZ1bmN0aW9uIG9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIGhvb2spIHtcbiAgICB2YXIgdHlwZXMgPSB0eXBlLnNwbGl0KCcgJyk7XG4gICAgVXRpbHMuZWFjaCh0eXBlcywgZnVuY3Rpb24odHlwZSkge1xuICAgICAgVXRpbHMub24oZWxlbWVudCwgdHlwZSwgaGFuZGxlcik7XG4gICAgICBob29rICYmIGhvb2sodHlwZSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNpbXBsZSBldmVudCB1bmJpbmRlciB3aXRoIGEgaG9vayBhbmQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdHlwZXNcbiAgICogQG1ldGhvZCBvZmZcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtob29rXVxuICAgKiBAcGFyYW0ge09iamVjdH0gaG9vay50eXBlXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uIG9mZihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBob29rKSB7XG4gICAgdmFyIHR5cGVzID0gdHlwZS5zcGxpdCgnICcpO1xuICAgIFV0aWxzLmVhY2godHlwZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIFV0aWxzLm9mZihlbGVtZW50LCB0eXBlLCBoYW5kbGVyKTtcbiAgICAgIGhvb2sgJiYgaG9vayh0eXBlKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogdGhlIGNvcmUgdG91Y2ggZXZlbnQgaGFuZGxlci5cbiAgICogdGhpcyBmaW5kcyBvdXQgaWYgd2Ugc2hvdWxkIHRvIGRldGVjdCBnZXN0dXJlc1xuICAgKiBAbWV0aG9kIG9uVG91Y2hcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEByZXR1cm4gb25Ub3VjaEhhbmRsZXIge0Z1bmN0aW9ufSB0aGUgY29yZSBldmVudCBoYW5kbGVyXG4gICAqL1xuICBvblRvdWNoOiBmdW5jdGlvbiBvblRvdWNoKGVsZW1lbnQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBvblRvdWNoSGFuZGxlciA9IGZ1bmN0aW9uIG9uVG91Y2hIYW5kbGVyKGV2KSB7XG4gICAgICB2YXIgc3JjVHlwZSA9IGV2LnR5cGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICBpc1BvaW50ZXIgPSBHZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFMsXG4gICAgICAgICAgaXNNb3VzZSA9IFV0aWxzLmluU3RyKHNyY1R5cGUsICdtb3VzZScpLFxuICAgICAgICAgIHRyaWdnZXJUeXBlO1xuXG4gICAgICAvLyBpZiB3ZSBhcmUgaW4gYSBtb3VzZWV2ZW50LCBidXQgdGhlcmUgaGFzIGJlZW4gYSB0b3VjaGV2ZW50IHRyaWdnZXJlZCBpbiB0aGlzIHNlc3Npb25cbiAgICAgIC8vIHdlIHdhbnQgdG8gZG8gbm90aGluZy4gc2ltcGx5IGJyZWFrIG91dCBvZiB0aGUgZXZlbnQuXG4gICAgICBpZihpc01vdXNlICYmIHNlbGYucHJldmVudE1vdXNlRXZlbnRzKSB7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBtb3VzZWJ1dHRvbiBtdXN0IGJlIGRvd25cbiAgICAgIH0gZWxzZSBpZihpc01vdXNlICYmIGV2ZW50VHlwZSA9PSBFVkVOVF9TVEFSVCAmJiBldi5idXR0b24gPT09IDApIHtcbiAgICAgICAgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmKGlzUG9pbnRlciAmJiBldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSAoZXYuYnV0dG9ucyA9PT0gMSB8fCBQb2ludGVyRXZlbnQubWF0Y2hUeXBlKFBPSU5URVJfVE9VQ0gsIGV2KSk7XG4gICAgICAgIC8vIGp1c3QgYSB2YWxpZCBzdGFydCBldmVudCwgYnV0IG5vIG1vdXNlXG4gICAgICB9IGVsc2UgaWYoIWlzTW91c2UgJiYgZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICAgIHNlbGYucHJldmVudE1vdXNlRXZlbnRzID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB1cGRhdGUgdGhlIHBvaW50ZXIgZXZlbnQgYmVmb3JlIGVudGVyaW5nIHRoZSBkZXRlY3Rpb25cbiAgICAgIGlmKGlzUG9pbnRlciAmJiBldmVudFR5cGUgIT0gRVZFTlRfRU5EKSB7XG4gICAgICAgIFBvaW50ZXJFdmVudC51cGRhdGVQb2ludGVyKGV2ZW50VHlwZSwgZXYpO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSBhcmUgaW4gYSB0b3VjaC9kb3duIHN0YXRlLCBzbyBhbGxvd2VkIGRldGVjdGlvbiBvZiBnZXN0dXJlc1xuICAgICAgaWYoc2VsZi5zaG91bGREZXRlY3QpIHtcbiAgICAgICAgdHJpZ2dlclR5cGUgPSBzZWxmLmRvRGV0ZWN0LmNhbGwoc2VsZiwgZXYsIGV2ZW50VHlwZSwgZWxlbWVudCwgaGFuZGxlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIC4uLmFuZCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBkZXRlY3Rpb25cbiAgICAgIC8vIHNvIHJlc2V0IGV2ZXJ5dGhpbmcgdG8gc3RhcnQgZWFjaCBkZXRlY3Rpb24gdG90YWxseSBmcmVzaFxuICAgICAgaWYodHJpZ2dlclR5cGUgPT0gRVZFTlRfRU5EKSB7XG4gICAgICAgIHNlbGYucHJldmVudE1vdXNlRXZlbnRzID0gZmFsc2U7XG4gICAgICAgIHNlbGYuc2hvdWxkRGV0ZWN0ID0gZmFsc2U7XG4gICAgICAgIFBvaW50ZXJFdmVudC5yZXNldCgpO1xuICAgICAgICAvLyB1cGRhdGUgdGhlIHBvaW50ZXJldmVudCBvYmplY3QgYWZ0ZXIgdGhlIGRldGVjdGlvblxuICAgICAgfVxuXG4gICAgICBpZihpc1BvaW50ZXIgJiYgZXZlbnRUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgICBQb2ludGVyRXZlbnQudXBkYXRlUG9pbnRlcihldmVudFR5cGUsIGV2KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbihlbGVtZW50LCBFVkVOVF9UWVBFU1tldmVudFR5cGVdLCBvblRvdWNoSGFuZGxlcik7XG4gICAgcmV0dXJuIG9uVG91Y2hIYW5kbGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiB0aGUgY29yZSBkZXRlY3Rpb24gbWV0aG9kXG4gICAqIHRoaXMgZmluZHMgb3V0IHdoYXQgR2VzdHVyZURldGVjdG9yLXRvdWNoLWV2ZW50cyB0byB0cmlnZ2VyXG4gICAqIEBtZXRob2QgZG9EZXRlY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRyaWdnZXJUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKi9cbiAgZG9EZXRlY3Q6IGZ1bmN0aW9uIGRvRGV0ZWN0KGV2LCBldmVudFR5cGUsIGVsZW1lbnQsIGhhbmRsZXIpIHtcbiAgICB2YXIgdG91Y2hMaXN0ID0gdGhpcy5nZXRUb3VjaExpc3QoZXYsIGV2ZW50VHlwZSk7XG4gICAgdmFyIHRvdWNoTGlzdExlbmd0aCA9IHRvdWNoTGlzdC5sZW5ndGg7XG4gICAgdmFyIHRyaWdnZXJUeXBlID0gZXZlbnRUeXBlO1xuICAgIHZhciB0cmlnZ2VyQ2hhbmdlID0gdG91Y2hMaXN0LnRyaWdnZXI7IC8vIHVzZWQgYnkgZmFrZU11bHRpdG91Y2ggcGx1Z2luXG4gICAgdmFyIGNoYW5nZWRMZW5ndGggPSB0b3VjaExpc3RMZW5ndGg7XG5cbiAgICAvLyBhdCBlYWNoIHRvdWNoc3RhcnQtbGlrZSBldmVudCB3ZSB3YW50IGFsc28gd2FudCB0byB0cmlnZ2VyIGEgVE9VQ0ggZXZlbnQuLi5cbiAgICBpZihldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgIHRyaWdnZXJDaGFuZ2UgPSBFVkVOVF9UT1VDSDtcbiAgICAgIC8vIC4uLnRoZSBzYW1lIGZvciBhIHRvdWNoZW5kLWxpa2UgZXZlbnRcbiAgICB9IGVsc2UgaWYoZXZlbnRUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgdHJpZ2dlckNoYW5nZSA9IEVWRU5UX1JFTEVBU0U7XG5cbiAgICAgIC8vIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgdG91Y2hlcyBoYXZlIGJlZW4gcmVtb3ZlZFxuICAgICAgY2hhbmdlZExlbmd0aCA9IHRvdWNoTGlzdC5sZW5ndGggLSAoKGV2LmNoYW5nZWRUb3VjaGVzKSA/IGV2LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA6IDEpO1xuICAgIH1cblxuICAgIC8vIGFmdGVyIHRoZXJlIGFyZSBzdGlsbCB0b3VjaGVzIG9uIHRoZSBzY3JlZW4sXG4gICAgLy8gd2UganVzdCB3YW50IHRvIHRyaWdnZXIgYSBNT1ZFIGV2ZW50LiBzbyBjaGFuZ2UgdGhlIFNUQVJUIG9yIEVORCB0byBhIE1PVkVcbiAgICAvLyBidXQgb25seSBhZnRlciBkZXRlY3Rpb24gaGFzIGJlZW4gc3RhcnRlZCwgdGhlIGZpcnN0IHRpbWUgd2UgYWN0dWFsbHkgd2FudCBhIFNUQVJUXG4gICAgaWYoY2hhbmdlZExlbmd0aCA+IDAgJiYgdGhpcy5zdGFydGVkKSB7XG4gICAgICB0cmlnZ2VyVHlwZSA9IEVWRU5UX01PVkU7XG4gICAgfVxuXG4gICAgLy8gZGV0ZWN0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQsIHdlIGtlZXAgdHJhY2sgb2YgdGhpcywgc2VlIGFib3ZlXG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcblxuICAgIC8vIGdlbmVyYXRlIHNvbWUgZXZlbnQgZGF0YSwgc29tZSBiYXNpYyBpbmZvcm1hdGlvblxuICAgIHZhciBldkRhdGEgPSB0aGlzLmNvbGxlY3RFdmVudERhdGEoZWxlbWVudCwgdHJpZ2dlclR5cGUsIHRvdWNoTGlzdCwgZXYpO1xuXG4gICAgLy8gdHJpZ2dlciB0aGUgdHJpZ2dlclR5cGUgZXZlbnQgYmVmb3JlIHRoZSBjaGFuZ2UgKFRPVUNILCBSRUxFQVNFKSBldmVudHNcbiAgICAvLyBidXQgdGhlIEVORCBldmVudCBzaG91bGQgYmUgYXQgbGFzdFxuICAgIGlmKGV2ZW50VHlwZSAhPSBFVkVOVF9FTkQpIHtcbiAgICAgIGhhbmRsZXIuY2FsbChEZXRlY3Rpb24sIGV2RGF0YSk7XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciBhIGNoYW5nZSAoVE9VQ0gsIFJFTEVBU0UpIGV2ZW50LCB0aGlzIG1lYW5zIHRoZSBsZW5ndGggb2YgdGhlIHRvdWNoZXMgY2hhbmdlZFxuICAgIGlmKHRyaWdnZXJDaGFuZ2UpIHtcbiAgICAgIGV2RGF0YS5jaGFuZ2VkTGVuZ3RoID0gY2hhbmdlZExlbmd0aDtcbiAgICAgIGV2RGF0YS5ldmVudFR5cGUgPSB0cmlnZ2VyQ2hhbmdlO1xuXG4gICAgICBoYW5kbGVyLmNhbGwoRGV0ZWN0aW9uLCBldkRhdGEpO1xuXG4gICAgICBldkRhdGEuZXZlbnRUeXBlID0gdHJpZ2dlclR5cGU7XG4gICAgICBkZWxldGUgZXZEYXRhLmNoYW5nZWRMZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciB0aGUgRU5EIGV2ZW50XG4gICAgaWYodHJpZ2dlclR5cGUgPT0gRVZFTlRfRU5EKSB7XG4gICAgICBoYW5kbGVyLmNhbGwoRGV0ZWN0aW9uLCBldkRhdGEpO1xuXG4gICAgICAvLyAuLi5hbmQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgZGV0ZWN0aW9uXG4gICAgICAvLyBzbyByZXNldCBldmVyeXRoaW5nIHRvIHN0YXJ0IGVhY2ggZGV0ZWN0aW9uIHRvdGFsbHkgZnJlc2hcbiAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cmlnZ2VyVHlwZTtcbiAgfSxcblxuICAvKipcbiAgICogd2UgaGF2ZSBkaWZmZXJlbnQgZXZlbnRzIGZvciBlYWNoIGRldmljZS9icm93c2VyXG4gICAqIGRldGVybWluZSB3aGF0IHdlIG5lZWQgYW5kIHNldCB0aGVtIGluIHRoZSBFVkVOVF9UWVBFUyBjb25zdGFudFxuICAgKiB0aGUgYG9uVG91Y2hgIG1ldGhvZCBpcyBiaW5kIHRvIHRoZXNlIHByb3BlcnRpZXMuXG4gICAqIEBtZXRob2QgZGV0ZXJtaW5lRXZlbnRUeXBlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IGV2ZW50c1xuICAgKi9cbiAgZGV0ZXJtaW5lRXZlbnRUeXBlczogZnVuY3Rpb24gZGV0ZXJtaW5lRXZlbnRUeXBlcygpIHtcbiAgICB2YXIgdHlwZXM7XG4gICAgaWYoR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTKSB7XG4gICAgICBpZih3aW5kb3cuUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIHR5cGVzID0gW1xuICAgICAgICAgICdwb2ludGVyZG93bicsXG4gICAgICAgICAgJ3BvaW50ZXJtb3ZlJyxcbiAgICAgICAgICAncG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwgbG9zdHBvaW50ZXJjYXB0dXJlJ1xuICAgICAgICBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZXMgPSBbXG4gICAgICAgICAgJ01TUG9pbnRlckRvd24nLFxuICAgICAgICAgICdNU1BvaW50ZXJNb3ZlJyxcbiAgICAgICAgICAnTVNQb2ludGVyVXAgTVNQb2ludGVyQ2FuY2VsIE1TTG9zdFBvaW50ZXJDYXB0dXJlJ1xuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihHZXN0dXJlRGV0ZWN0b3IuTk9fTU9VU0VFVkVOVFMpIHtcbiAgICAgIHR5cGVzID0gW1xuICAgICAgICAndG91Y2hzdGFydCcsXG4gICAgICAgICd0b3VjaG1vdmUnLFxuICAgICAgICAndG91Y2hlbmQgdG91Y2hjYW5jZWwnXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlcyA9IFtcbiAgICAgICAgJ3RvdWNoc3RhcnQgbW91c2Vkb3duJyxcbiAgICAgICAgJ3RvdWNobW92ZSBtb3VzZW1vdmUnLFxuICAgICAgICAndG91Y2hlbmQgdG91Y2hjYW5jZWwgbW91c2V1cCdcbiAgICAgIF07XG4gICAgfVxuXG4gICAgRVZFTlRfVFlQRVNbRVZFTlRfU1RBUlRdID0gdHlwZXNbMF07XG4gICAgRVZFTlRfVFlQRVNbRVZFTlRfTU9WRV0gPSB0eXBlc1sxXTtcbiAgICBFVkVOVF9UWVBFU1tFVkVOVF9FTkRdID0gdHlwZXNbMl07XG4gICAgcmV0dXJuIEVWRU5UX1RZUEVTO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjcmVhdGUgdG91Y2hMaXN0IGRlcGVuZGluZyBvbiB0aGUgZXZlbnRcbiAgICogQG1ldGhvZCBnZXRUb3VjaExpc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAgICogQHJldHVybiB7QXJyYXl9IHRvdWNoZXNcbiAgICovXG4gIGdldFRvdWNoTGlzdDogZnVuY3Rpb24gZ2V0VG91Y2hMaXN0KGV2LCBldmVudFR5cGUpIHtcbiAgICAvLyBnZXQgdGhlIGZha2UgcG9pbnRlckV2ZW50IHRvdWNobGlzdFxuICAgIGlmKEdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUykge1xuICAgICAgcmV0dXJuIFBvaW50ZXJFdmVudC5nZXRUb3VjaExpc3QoKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIHRvdWNobGlzdFxuICAgIGlmKGV2LnRvdWNoZXMpIHtcbiAgICAgIGlmKGV2ZW50VHlwZSA9PSBFVkVOVF9NT1ZFKSB7XG4gICAgICAgIHJldHVybiBldi50b3VjaGVzO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgICAgIHZhciBjb25jYXQgPSBbXS5jb25jYXQoVXRpbHMudG9BcnJheShldi50b3VjaGVzKSwgVXRpbHMudG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcykpO1xuICAgICAgdmFyIHRvdWNoTGlzdCA9IFtdO1xuXG4gICAgICBVdGlscy5lYWNoKGNvbmNhdCwgZnVuY3Rpb24odG91Y2gpIHtcbiAgICAgICAgaWYoVXRpbHMuaW5BcnJheShpZGVudGlmaWVycywgdG91Y2guaWRlbnRpZmllcikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdG91Y2hMaXN0LnB1c2godG91Y2gpO1xuICAgICAgICB9XG4gICAgICAgIGlkZW50aWZpZXJzLnB1c2godG91Y2guaWRlbnRpZmllcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRvdWNoTGlzdDtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGZha2UgdG91Y2hMaXN0IGZyb20gbW91c2UgcG9zaXRpb25cbiAgICBldi5pZGVudGlmaWVyID0gMTtcbiAgICByZXR1cm4gW2V2XTtcbiAgfSxcblxuICAvKipcbiAgICogY29sbGVjdCBiYXNpYyBldmVudCBkYXRhXG4gICAqIEBtZXRob2QgY29sbGVjdEV2ZW50RGF0YVxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7QXJyYXl9IHRvdWNoZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEByZXR1cm4ge09iamVjdH0gZXZcbiAgICovXG4gIGNvbGxlY3RFdmVudERhdGE6IGZ1bmN0aW9uIGNvbGxlY3RFdmVudERhdGEoZWxlbWVudCwgZXZlbnRUeXBlLCB0b3VjaGVzLCBldikge1xuICAgIC8vIGZpbmQgb3V0IHBvaW50ZXJUeXBlXG4gICAgdmFyIHBvaW50ZXJUeXBlID0gUE9JTlRFUl9UT1VDSDtcbiAgICBpZihVdGlscy5pblN0cihldi50eXBlLCAnbW91c2UnKSB8fCBQb2ludGVyRXZlbnQubWF0Y2hUeXBlKFBPSU5URVJfTU9VU0UsIGV2KSkge1xuICAgICAgcG9pbnRlclR5cGUgPSBQT0lOVEVSX01PVVNFO1xuICAgIH0gZWxzZSBpZihQb2ludGVyRXZlbnQubWF0Y2hUeXBlKFBPSU5URVJfUEVOLCBldikpIHtcbiAgICAgIHBvaW50ZXJUeXBlID0gUE9JTlRFUl9QRU47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNlbnRlcjogVXRpbHMuZ2V0Q2VudGVyKHRvdWNoZXMpLFxuICAgICAgdGltZVN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgdGFyZ2V0OiBldi50YXJnZXQsXG4gICAgICB0b3VjaGVzOiB0b3VjaGVzLFxuICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUsXG4gICAgICBwb2ludGVyVHlwZTogcG9pbnRlclR5cGUsXG4gICAgICBzcmNFdmVudDogZXYsXG5cbiAgICAgIC8qKlxuICAgICAgICogcHJldmVudCB0aGUgYnJvd3NlciBkZWZhdWx0IGFjdGlvbnNcbiAgICAgICAqIG1vc3RseSB1c2VkIHRvIGRpc2FibGUgc2Nyb2xsaW5nIG9mIHRoZSBicm93c2VyXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHNyY0V2ZW50ID0gdGhpcy5zcmNFdmVudDtcbiAgICAgICAgc3JjRXZlbnQucHJldmVudE1hbmlwdWxhdGlvbiAmJiBzcmNFdmVudC5wcmV2ZW50TWFuaXB1bGF0aW9uKCk7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0ICYmIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIHN0b3AgYnViYmxpbmcgdGhlIGV2ZW50IHVwIHRvIGl0cyBwYXJlbnRzXG4gICAgICAgKi9cbiAgICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIGltbWVkaWF0ZWx5IHN0b3AgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICAgICAqIG1pZ2h0IGJlIHVzZWZ1bCBhZnRlciBhIHN3aXBlIHdhcyBkZXRlY3RlZFxuICAgICAgICogQHJldHVybiB7Kn1cbiAgICAgICAqL1xuICAgICAgc3RvcERldGVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBEZXRlY3Rpb24uc3RvcERldGVjdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICpcbiAqIEBjbGFzcyBQb2ludGVyRXZlbnRcbiAqIEBzdGF0aWNcbiAqL1xudmFyIFBvaW50ZXJFdmVudCA9IEdlc3R1cmVEZXRlY3Rvci5Qb2ludGVyRXZlbnQgPSB7XG4gIC8qKlxuICAgKiBob2xkcyBhbGwgcG9pbnRlcnMsIGJ5IGBpZGVudGlmaWVyYFxuICAgKiBAcHJvcGVydHkgcG9pbnRlcnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHBvaW50ZXJzOiB7fSxcblxuICAvKipcbiAgICogZ2V0IHRoZSBwb2ludGVycyBhcyBhbiBhcnJheVxuICAgKiBAbWV0aG9kIGdldFRvdWNoTGlzdFxuICAgKiBAcmV0dXJuIHtBcnJheX0gdG91Y2hsaXN0XG4gICAqL1xuICBnZXRUb3VjaExpc3Q6IGZ1bmN0aW9uIGdldFRvdWNoTGlzdCgpIHtcbiAgICB2YXIgdG91Y2hsaXN0ID0gW107XG4gICAgLy8gd2UgY2FuIHVzZSBmb3JFYWNoIHNpbmNlIHBvaW50ZXJFdmVudHMgb25seSBpcyBpbiBJRTEwXG4gICAgVXRpbHMuZWFjaCh0aGlzLnBvaW50ZXJzLCBmdW5jdGlvbihwb2ludGVyKSB7XG4gICAgICB0b3VjaGxpc3QucHVzaChwb2ludGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hsaXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiB1cGRhdGUgdGhlIHBvc2l0aW9uIG9mIGEgcG9pbnRlclxuICAgKiBAbWV0aG9kIHVwZGF0ZVBvaW50ZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZSBtYXRjaGVzIGBFVkVOVF9TVEFSVHxNT1ZFfEVORGBcbiAgICogQHBhcmFtIHtPYmplY3R9IHBvaW50ZXJFdmVudFxuICAgKi9cbiAgdXBkYXRlUG9pbnRlcjogZnVuY3Rpb24gdXBkYXRlUG9pbnRlcihldmVudFR5cGUsIHBvaW50ZXJFdmVudCkge1xuICAgIGlmKGV2ZW50VHlwZSA9PSBFVkVOVF9FTkQgfHwgKGV2ZW50VHlwZSAhPSBFVkVOVF9FTkQgJiYgcG9pbnRlckV2ZW50LmJ1dHRvbnMgIT09IDEpKSB7XG4gICAgICBkZWxldGUgdGhpcy5wb2ludGVyc1twb2ludGVyRXZlbnQucG9pbnRlcklkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRlckV2ZW50LmlkZW50aWZpZXIgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgdGhpcy5wb2ludGVyc1twb2ludGVyRXZlbnQucG9pbnRlcklkXSA9IHBvaW50ZXJFdmVudDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNoZWNrIGlmIGV2IG1hdGNoZXMgcG9pbnRlcnR5cGVcbiAgICogQG1ldGhvZCBtYXRjaFR5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBvaW50ZXJUeXBlIG1hdGNoZXMgYFBPSU5URVJfTU9VU0V8VE9VQ0h8UEVOYFxuICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gZXZcbiAgICovXG4gIG1hdGNoVHlwZTogZnVuY3Rpb24gbWF0Y2hUeXBlKHBvaW50ZXJUeXBlLCBldikge1xuICAgIGlmKCFldi5wb2ludGVyVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBwdCA9IGV2LnBvaW50ZXJUeXBlLFxuICAgICAgICB0eXBlcyA9IHt9O1xuXG4gICAgdHlwZXNbUE9JTlRFUl9NT1VTRV0gPSAocHQgPT09IChldi5NU1BPSU5URVJfVFlQRV9NT1VTRSB8fCBQT0lOVEVSX01PVVNFKSk7XG4gICAgdHlwZXNbUE9JTlRFUl9UT1VDSF0gPSAocHQgPT09IChldi5NU1BPSU5URVJfVFlQRV9UT1VDSCB8fCBQT0lOVEVSX1RPVUNIKSk7XG4gICAgdHlwZXNbUE9JTlRFUl9QRU5dID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfUEVOIHx8IFBPSU5URVJfUEVOKSk7XG4gICAgcmV0dXJuIHR5cGVzW3BvaW50ZXJUeXBlXTtcbiAgfSxcblxuICAvKipcbiAgICogcmVzZXQgdGhlIHN0b3JlZCBwb2ludGVyc1xuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqL1xuICByZXNldDogZnVuY3Rpb24gcmVzZXRMaXN0KCkge1xuICAgIHRoaXMucG9pbnRlcnMgPSB7fTtcbiAgfVxufTtcblxuXG4vKipcbiAqIEBtb2R1bGUgR2VzdHVyZURldGVjdG9yXG4gKlxuICogQGNsYXNzIERldGVjdGlvblxuICogQHN0YXRpY1xuICovXG52YXIgRGV0ZWN0aW9uID0gR2VzdHVyZURldGVjdG9yLmRldGVjdGlvbiA9IHtcbiAgLy8gY29udGFpbnMgYWxsIHJlZ2lzdGVyZWQgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gIGdlc3R1cmVzOiBbXSxcblxuICAvLyBkYXRhIG9mIHRoZSBjdXJyZW50IEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGRldGVjdGlvbiBzZXNzaW9uXG4gIGN1cnJlbnQ6IG51bGwsXG5cbiAgLy8gdGhlIHByZXZpb3VzIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIHNlc3Npb24gZGF0YVxuICAvLyBpcyBhIGZ1bGwgY2xvbmUgb2YgdGhlIHByZXZpb3VzIGdlc3R1cmUuY3VycmVudCBvYmplY3RcbiAgcHJldmlvdXM6IG51bGwsXG5cbiAgLy8gd2hlbiB0aGlzIGJlY29tZXMgdHJ1ZSwgbm8gZ2VzdHVyZXMgYXJlIGZpcmVkXG4gIHN0b3BwZWQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBzdGFydCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICogQG1ldGhvZCBzdGFydERldGVjdFxuICAgKiBAcGFyYW0ge0dlc3R1cmVEZXRlY3Rvci5JbnN0YW5jZX0gaW5zdFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnREYXRhXG4gICAqL1xuICBzdGFydERldGVjdDogZnVuY3Rpb24gc3RhcnREZXRlY3QoaW5zdCwgZXZlbnREYXRhKSB7XG4gICAgLy8gYWxyZWFkeSBidXN5IHdpdGggYSBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBkZXRlY3Rpb24gb24gYW4gZWxlbWVudFxuICAgIGlmKHRoaXMuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuXG4gICAgLy8gaG9sZHMgY3VycmVudCBzZXNzaW9uXG4gICAgdGhpcy5jdXJyZW50ID0ge1xuICAgICAgaW5zdDogaW5zdCwgLy8gcmVmZXJlbmNlIHRvIEdlc3R1cmVEZXRlY3Rvckluc3RhbmNlIHdlJ3JlIHdvcmtpbmcgZm9yXG4gICAgICBzdGFydEV2ZW50OiBVdGlscy5leHRlbmQoe30sIGV2ZW50RGF0YSksIC8vIHN0YXJ0IGV2ZW50RGF0YSBmb3IgZGlzdGFuY2VzLCB0aW1pbmcgZXRjXG4gICAgICBsYXN0RXZlbnQ6IGZhbHNlLCAvLyBsYXN0IGV2ZW50RGF0YVxuICAgICAgbGFzdENhbGNFdmVudDogZmFsc2UsIC8vIGxhc3QgZXZlbnREYXRhIGZvciBjYWxjdWxhdGlvbnMuXG4gICAgICBmdXR1cmVDYWxjRXZlbnQ6IGZhbHNlLCAvLyBsYXN0IGV2ZW50RGF0YSBmb3IgY2FsY3VsYXRpb25zLlxuICAgICAgbGFzdENhbGNEYXRhOiB7fSwgLy8gbGFzdCBsYXN0Q2FsY0RhdGFcbiAgICAgIG5hbWU6ICcnIC8vIGN1cnJlbnQgZ2VzdHVyZSB3ZSdyZSBpbi9kZXRlY3RlZCwgY2FuIGJlICd0YXAnLCAnaG9sZCcgZXRjXG4gICAgfTtcblxuICAgIHRoaXMuZGV0ZWN0KGV2ZW50RGF0YSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGRldGVjdGlvblxuICAgKiBAbWV0aG9kIGRldGVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnREYXRhXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGRldGVjdDogZnVuY3Rpb24gZGV0ZWN0KGV2ZW50RGF0YSkge1xuICAgIGlmKCF0aGlzLmN1cnJlbnQgfHwgdGhpcy5zdG9wcGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXh0ZW5kIGV2ZW50IGRhdGEgd2l0aCBjYWxjdWxhdGlvbnMgYWJvdXQgc2NhbGUsIGRpc3RhbmNlIGV0Y1xuICAgIGV2ZW50RGF0YSA9IHRoaXMuZXh0ZW5kRXZlbnREYXRhKGV2ZW50RGF0YSk7XG5cbiAgICAvLyBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2UgYW5kIGluc3RhbmNlIG9wdGlvbnNcbiAgICB2YXIgaW5zdCA9IHRoaXMuY3VycmVudC5pbnN0LFxuICAgICAgICBpbnN0T3B0aW9ucyA9IGluc3Qub3B0aW9ucztcblxuICAgIC8vIGNhbGwgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgaGFuZGxlcnNcbiAgICBVdGlscy5lYWNoKHRoaXMuZ2VzdHVyZXMsIGZ1bmN0aW9uIHRyaWdnZXJHZXN0dXJlKGdlc3R1cmUpIHtcbiAgICAgIC8vIG9ubHkgd2hlbiB0aGUgaW5zdGFuY2Ugb3B0aW9ucyBoYXZlIGVuYWJsZWQgdGhpcyBnZXN0dXJlXG4gICAgICBpZighdGhpcy5zdG9wcGVkICYmIGluc3QuZW5hYmxlZCAmJiBpbnN0T3B0aW9uc1tnZXN0dXJlLm5hbWVdKSB7XG4gICAgICAgIGdlc3R1cmUuaGFuZGxlci5jYWxsKGdlc3R1cmUsIGV2ZW50RGF0YSwgaW5zdCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICAvLyBzdG9yZSBhcyBwcmV2aW91cyBldmVudCBldmVudFxuICAgIGlmKHRoaXMuY3VycmVudCkge1xuICAgICAgdGhpcy5jdXJyZW50Lmxhc3RFdmVudCA9IGV2ZW50RGF0YTtcbiAgICB9XG5cbiAgICBpZihldmVudERhdGEuZXZlbnRUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgdGhpcy5zdG9wRGV0ZWN0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50RGF0YTtcbiAgfSxcblxuICAvKipcbiAgICogY2xlYXIgdGhlIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIHZhcnNcbiAgICogdGhpcyBpcyBjYWxsZWQgb24gZW5kRGV0ZWN0LCBidXQgY2FuIGFsc28gYmUgdXNlZCB3aGVuIGEgZmluYWwgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgaGFzIGJlZW4gZGV0ZWN0ZWRcbiAgICogdG8gc3RvcCBvdGhlciBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMgZnJvbSBiZWluZyBmaXJlZFxuICAgKiBAbWV0aG9kIHN0b3BEZXRlY3RcbiAgICovXG4gIHN0b3BEZXRlY3Q6IGZ1bmN0aW9uIHN0b3BEZXRlY3QoKSB7XG4gICAgLy8gY2xvbmUgY3VycmVudCBkYXRhIHRvIHRoZSBzdG9yZSBhcyB0aGUgcHJldmlvdXMgZ2VzdHVyZVxuICAgIC8vIHVzZWQgZm9yIHRoZSBkb3VibGUgdGFwIGdlc3R1cmUsIHNpbmNlIHRoaXMgaXMgYW4gb3RoZXIgZ2VzdHVyZSBkZXRlY3Qgc2Vzc2lvblxuICAgIHRoaXMucHJldmlvdXMgPSBVdGlscy5leHRlbmQoe30sIHRoaXMuY3VycmVudCk7XG5cbiAgICAvLyByZXNldCB0aGUgY3VycmVudFxuICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgdGhpcy5zdG9wcGVkID0gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHZlbG9jaXR5LCBhbmdsZSBhbmQgZGlyZWN0aW9uXG4gICAqIEBtZXRob2QgZ2V0VmVsb2NpdHlEYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKiBAcGFyYW0ge09iamVjdH0gY2VudGVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhWFxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFZXG4gICAqL1xuICBnZXRDYWxjdWxhdGVkRGF0YTogZnVuY3Rpb24gZ2V0Q2FsY3VsYXRlZERhdGEoZXYsIGNlbnRlciwgZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSkge1xuICAgIHZhciBjdXIgPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgIHJlY2FsYyA9IGZhbHNlLFxuICAgICAgICBjYWxjRXYgPSBjdXIubGFzdENhbGNFdmVudCxcbiAgICAgICAgY2FsY0RhdGEgPSBjdXIubGFzdENhbGNEYXRhO1xuXG4gICAgaWYoY2FsY0V2ICYmIGV2LnRpbWVTdGFtcCAtIGNhbGNFdi50aW1lU3RhbXAgPiBHZXN0dXJlRGV0ZWN0b3IuQ0FMQ1VMQVRFX0lOVEVSVkFMKSB7XG4gICAgICBjZW50ZXIgPSBjYWxjRXYuY2VudGVyO1xuICAgICAgZGVsdGFUaW1lID0gZXYudGltZVN0YW1wIC0gY2FsY0V2LnRpbWVTdGFtcDtcbiAgICAgIGRlbHRhWCA9IGV2LmNlbnRlci5jbGllbnRYIC0gY2FsY0V2LmNlbnRlci5jbGllbnRYO1xuICAgICAgZGVsdGFZID0gZXYuY2VudGVyLmNsaWVudFkgLSBjYWxjRXYuY2VudGVyLmNsaWVudFk7XG4gICAgICByZWNhbGMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCB8fCBldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgY3VyLmZ1dHVyZUNhbGNFdmVudCA9IGV2O1xuICAgIH1cblxuICAgIGlmKCFjdXIubGFzdENhbGNFdmVudCB8fCByZWNhbGMpIHtcbiAgICAgIGNhbGNEYXRhLnZlbG9jaXR5ID0gVXRpbHMuZ2V0VmVsb2NpdHkoZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICBjYWxjRGF0YS5hbmdsZSA9IFV0aWxzLmdldEFuZ2xlKGNlbnRlciwgZXYuY2VudGVyKTtcbiAgICAgIGNhbGNEYXRhLmRpcmVjdGlvbiA9IFV0aWxzLmdldERpcmVjdGlvbihjZW50ZXIsIGV2LmNlbnRlcik7XG5cbiAgICAgIGN1ci5sYXN0Q2FsY0V2ZW50ID0gY3VyLmZ1dHVyZUNhbGNFdmVudCB8fCBldjtcbiAgICAgIGN1ci5mdXR1cmVDYWxjRXZlbnQgPSBldjtcbiAgICB9XG5cbiAgICBldi52ZWxvY2l0eVggPSBjYWxjRGF0YS52ZWxvY2l0eS54O1xuICAgIGV2LnZlbG9jaXR5WSA9IGNhbGNEYXRhLnZlbG9jaXR5Lnk7XG4gICAgZXYuaW50ZXJpbUFuZ2xlID0gY2FsY0RhdGEuYW5nbGU7XG4gICAgZXYuaW50ZXJpbURpcmVjdGlvbiA9IGNhbGNEYXRhLmRpcmVjdGlvbjtcbiAgfSxcblxuICAvKipcbiAgICogZXh0ZW5kIGV2ZW50RGF0YSBmb3IgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzXG4gICAqIEBtZXRob2QgZXh0ZW5kRXZlbnREYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGV2XG4gICAqL1xuICBleHRlbmRFdmVudERhdGE6IGZ1bmN0aW9uIGV4dGVuZEV2ZW50RGF0YShldikge1xuICAgIHZhciBjdXIgPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgIHN0YXJ0RXYgPSBjdXIuc3RhcnRFdmVudCxcbiAgICAgICAgbGFzdEV2ID0gY3VyLmxhc3RFdmVudCB8fCBzdGFydEV2O1xuXG4gICAgLy8gdXBkYXRlIHRoZSBzdGFydCB0b3VjaGxpc3QgdG8gY2FsY3VsYXRlIHRoZSBzY2FsZS9yb3RhdGlvblxuICAgIGlmKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCB8fCBldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgc3RhcnRFdi50b3VjaGVzID0gW107XG4gICAgICBVdGlscy5lYWNoKGV2LnRvdWNoZXMsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIHN0YXJ0RXYudG91Y2hlcy5wdXNoKHtcbiAgICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFlcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgZGVsdGFUaW1lID0gZXYudGltZVN0YW1wIC0gc3RhcnRFdi50aW1lU3RhbXAsXG4gICAgICAgIGRlbHRhWCA9IGV2LmNlbnRlci5jbGllbnRYIC0gc3RhcnRFdi5jZW50ZXIuY2xpZW50WCxcbiAgICAgICAgZGVsdGFZID0gZXYuY2VudGVyLmNsaWVudFkgLSBzdGFydEV2LmNlbnRlci5jbGllbnRZO1xuXG4gICAgdGhpcy5nZXRDYWxjdWxhdGVkRGF0YShldiwgbGFzdEV2LmNlbnRlciwgZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICBVdGlscy5leHRlbmQoZXYsIHtcbiAgICAgIHN0YXJ0RXZlbnQ6IHN0YXJ0RXYsXG5cbiAgICAgIGRlbHRhVGltZTogZGVsdGFUaW1lLFxuICAgICAgZGVsdGFYOiBkZWx0YVgsXG4gICAgICBkZWx0YVk6IGRlbHRhWSxcblxuICAgICAgZGlzdGFuY2U6IFV0aWxzLmdldERpc3RhbmNlKHN0YXJ0RXYuY2VudGVyLCBldi5jZW50ZXIpLFxuICAgICAgYW5nbGU6IFV0aWxzLmdldEFuZ2xlKHN0YXJ0RXYuY2VudGVyLCBldi5jZW50ZXIpLFxuICAgICAgZGlyZWN0aW9uOiBVdGlscy5nZXREaXJlY3Rpb24oc3RhcnRFdi5jZW50ZXIsIGV2LmNlbnRlciksXG4gICAgICBzY2FsZTogVXRpbHMuZ2V0U2NhbGUoc3RhcnRFdi50b3VjaGVzLCBldi50b3VjaGVzKSxcbiAgICAgIHJvdGF0aW9uOiBVdGlscy5nZXRSb3RhdGlvbihzdGFydEV2LnRvdWNoZXMsIGV2LnRvdWNoZXMpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXY7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlZ2lzdGVyIG5ldyBnZXN0dXJlXG4gICAqIEBtZXRob2QgcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGdlc3R1cmUgb2JqZWN0LCBzZWUgYGdlc3R1cmVzL2AgZm9yIGRvY3VtZW50YXRpb25cbiAgICogQHJldHVybiB7QXJyYXl9IGdlc3R1cmVzXG4gICAqL1xuICByZWdpc3RlcjogZnVuY3Rpb24gcmVnaXN0ZXIoZ2VzdHVyZSkge1xuICAgIC8vIGFkZCBhbiBlbmFibGUgZ2VzdHVyZSBvcHRpb25zIGlmIHRoZXJlIGlzIG5vIGdpdmVuXG4gICAgdmFyIG9wdGlvbnMgPSBnZXN0dXJlLmRlZmF1bHRzIHx8IHt9O1xuICAgIGlmKG9wdGlvbnNbZ2VzdHVyZS5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zW2dlc3R1cmUubmFtZV0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIGV4dGVuZCBHZXN0dXJlRGV0ZWN0b3IgZGVmYXVsdCBvcHRpb25zIHdpdGggdGhlIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIG9wdGlvbnNcbiAgICBVdGlscy5leHRlbmQoR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzLCBvcHRpb25zLCB0cnVlKTtcblxuICAgIC8vIHNldCBpdHMgaW5kZXhcbiAgICBnZXN0dXJlLmluZGV4ID0gZ2VzdHVyZS5pbmRleCB8fCAxMDAwO1xuXG4gICAgLy8gYWRkIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIHRvIHRoZSBsaXN0XG4gICAgdGhpcy5nZXN0dXJlcy5wdXNoKGdlc3R1cmUpO1xuXG4gICAgLy8gc29ydCB0aGUgbGlzdCBieSBpbmRleFxuICAgIHRoaXMuZ2VzdHVyZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICBpZihhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZihhLmluZGV4ID4gYi5pbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2VzdHVyZXM7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICovXG5cbi8qKlxuICogY3JlYXRlIG5ldyBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2VcbiAqIGFsbCBtZXRob2RzIHNob3VsZCByZXR1cm4gdGhlIGluc3RhbmNlIGl0c2VsZiwgc28gaXQgaXMgY2hhaW5hYmxlLlxuICpcbiAqIEBjbGFzcyBJbnN0YW5jZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIG9wdGlvbnMgYXJlIG1lcmdlZCB3aXRoIGBHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHNgXG4gKiBAcmV0dXJuIHtHZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2V9XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5JbnN0YW5jZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIHNldHVwIEdlc3R1cmVEZXRlY3RvckpTIHdpbmRvdyBldmVudHMgYW5kIHJlZ2lzdGVyIGFsbCBnZXN0dXJlc1xuICAvLyB0aGlzIGFsc28gc2V0cyB1cCB0aGUgZGVmYXVsdCBvcHRpb25zXG4gIHNldHVwKCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBlbGVtZW50XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICovXG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBlbmFibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBvcHRpb25zLCBtZXJnZWQgd2l0aCB0aGUgZGVmYXVsdHNcbiAgICogb3B0aW9ucyB3aXRoIGFuIF8gYXJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2VcbiAgICogQHByb3BlcnR5IG9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIFV0aWxzLmVhY2gob3B0aW9ucywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBkZWxldGUgb3B0aW9uc1tuYW1lXTtcbiAgICBvcHRpb25zW1V0aWxzLnRvQ2FtZWxDYXNlKG5hbWUpXSA9IHZhbHVlO1xuICB9KTtcblxuICB0aGlzLm9wdGlvbnMgPSBVdGlscy5leHRlbmQoVXRpbHMuZXh0ZW5kKHt9LCBHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMpLCBvcHRpb25zIHx8IHt9KTtcblxuICAvLyBhZGQgc29tZSBjc3MgdG8gdGhlIGVsZW1lbnQgdG8gcHJldmVudCB0aGUgYnJvd3NlciBmcm9tIGRvaW5nIGl0cyBuYXRpdmUgYmVoYXZpb3JcbiAgaWYodGhpcy5vcHRpb25zLmJlaGF2aW9yKSB7XG4gICAgVXRpbHMudG9nZ2xlQmVoYXZpb3IodGhpcy5lbGVtZW50LCB0aGlzLm9wdGlvbnMuYmVoYXZpb3IsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV2ZW50IHN0YXJ0IGhhbmRsZXIgb24gdGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIGRldGVjdGlvblxuICAgKiBAcHJvcGVydHkgZXZlbnRTdGFydEhhbmRsZXJcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHRoaXMuZXZlbnRTdGFydEhhbmRsZXIgPSBFdmVudC5vblRvdWNoKGVsZW1lbnQsIEVWRU5UX1NUQVJULCBmdW5jdGlvbihldikge1xuICAgIGlmKHNlbGYuZW5hYmxlZCAmJiBldi5ldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgIERldGVjdGlvbi5zdGFydERldGVjdChzZWxmLCBldik7XG4gICAgfSBlbHNlIGlmKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCkge1xuICAgICAgRGV0ZWN0aW9uLmRldGVjdChldik7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICoga2VlcCBhIGxpc3Qgb2YgdXNlciBldmVudCBoYW5kbGVycyB3aGljaCBuZWVkcyB0byBiZSByZW1vdmVkIHdoZW4gY2FsbGluZyAnZGlzcG9zZSdcbiAgICogQHByb3BlcnR5IGV2ZW50SGFuZGxlcnNcbiAgICogQHR5cGUge0FycmF5fVxuICAgKi9cbiAgdGhpcy5ldmVudEhhbmRsZXJzID0gW107XG59O1xuXG5HZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogYmluZCBldmVudHMgdG8gdGhlIGluc3RhbmNlXG4gICAqIEBtZXRob2Qgb25cbiAgICogQGNoYWluYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZ2VzdHVyZXMgbXVsdGlwbGUgZ2VzdHVyZXMgYnkgc3BsaXR0aW5nIHdpdGggYSBzcGFjZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYW5kbGVyLmV2IGV2ZW50IG9iamVjdFxuICAgKi9cbiAgb246IGZ1bmN0aW9uIG9uRXZlbnQoZ2VzdHVyZXMsIGhhbmRsZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgRXZlbnQub24oc2VsZi5lbGVtZW50LCBnZXN0dXJlcywgaGFuZGxlciwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgc2VsZi5ldmVudEhhbmRsZXJzLnB1c2goeyBnZXN0dXJlOiB0eXBlLCBoYW5kbGVyOiBoYW5kbGVyIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9LFxuXG4gIC8qKlxuICAgKiB1bmJpbmQgZXZlbnRzIHRvIHRoZSBpbnN0YW5jZVxuICAgKiBAbWV0aG9kIG9mZlxuICAgKiBAY2hhaW5hYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnZXN0dXJlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqL1xuICBvZmY6IGZ1bmN0aW9uIG9mZkV2ZW50KGdlc3R1cmVzLCBoYW5kbGVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgRXZlbnQub2ZmKHNlbGYuZWxlbWVudCwgZ2VzdHVyZXMsIGhhbmRsZXIsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBpbmRleCA9IFV0aWxzLmluQXJyYXkoeyBnZXN0dXJlOiB0eXBlLCBoYW5kbGVyOiBoYW5kbGVyIH0pO1xuICAgICAgaWYoaW5kZXggIT09IGZhbHNlKSB7XG4gICAgICAgIHNlbGYuZXZlbnRIYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9LFxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGdlc3R1cmUgZXZlbnRcbiAgICogQG1ldGhvZCB0cmlnZ2VyXG4gICAqIEBjaGFpbmFibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGdlc3R1cmVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdXG4gICAqL1xuICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZ2VzdHVyZSwgZXZlbnREYXRhKSB7XG4gICAgLy8gb3B0aW9uYWxcbiAgICBpZighZXZlbnREYXRhKSB7XG4gICAgICBldmVudERhdGEgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgRE9NIGV2ZW50XG4gICAgdmFyIGV2ZW50ID0gR2VzdHVyZURldGVjdG9yLkRPQ1VNRU5ULmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LmluaXRFdmVudChnZXN0dXJlLCB0cnVlLCB0cnVlKTtcbiAgICBldmVudC5nZXN0dXJlID0gZXZlbnREYXRhO1xuXG4gICAgLy8gdHJpZ2dlciBvbiB0aGUgdGFyZ2V0IGlmIGl0IGlzIGluIHRoZSBpbnN0YW5jZSBlbGVtZW50LFxuICAgIC8vIHRoaXMgaXMgZm9yIGV2ZW50IGRlbGVnYXRpb24gdHJpY2tzXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgaWYoVXRpbHMuaGFzUGFyZW50KGV2ZW50RGF0YS50YXJnZXQsIGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50ID0gZXZlbnREYXRhLnRhcmdldDtcbiAgICB9XG5cbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBlbmFibGUgb2YgZGlzYWJsZSBHZXN0dXJlRGV0ZWN0b3IuanMgZGV0ZWN0aW9uXG4gICAqIEBtZXRob2QgZW5hYmxlXG4gICAqIEBjaGFpbmFibGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0ZVxuICAgKi9cbiAgZW5hYmxlOiBmdW5jdGlvbiBlbmFibGUoc3RhdGUpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBzdGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogZGlzcG9zZSB0aGlzIEdlc3R1cmVEZXRlY3RvciBpbnN0YW5jZVxuICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICogQHJldHVybiB7TnVsbH1cbiAgICovXG4gIGRpc3Bvc2U6IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgdmFyIGksIGVoO1xuXG4gICAgLy8gdW5kbyBhbGwgY2hhbmdlcyBtYWRlIGJ5IHN0b3BfYnJvd3Nlcl9iZWhhdmlvclxuICAgIFV0aWxzLnRvZ2dsZUJlaGF2aW9yKHRoaXMuZWxlbWVudCwgdGhpcy5vcHRpb25zLmJlaGF2aW9yLCBmYWxzZSk7XG5cbiAgICAvLyB1bmJpbmQgYWxsIGN1c3RvbSBldmVudCBoYW5kbGVyc1xuICAgIGZvcihpID0gLTE7IChlaCA9IHRoaXMuZXZlbnRIYW5kbGVyc1srK2ldKTspIHtcbiAgICAgIFV0aWxzLm9mZih0aGlzLmVsZW1lbnQsIGVoLmdlc3R1cmUsIGVoLmhhbmRsZXIpO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IFtdO1xuXG4gICAgLy8gdW5iaW5kIHRoZSBzdGFydCBldmVudCBsaXN0ZW5lclxuICAgIEV2ZW50Lm9mZih0aGlzLmVsZW1lbnQsIEVWRU5UX1RZUEVTW0VWRU5UX1NUQVJUXSwgdGhpcy5ldmVudFN0YXJ0SGFuZGxlcik7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuXG4vKipcbiAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAqL1xuLyoqXG4gKiBNb3ZlIHdpdGggeCBmaW5nZXJzIChkZWZhdWx0IDEpIGFyb3VuZCBvbiB0aGUgcGFnZS5cbiAqIFByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvciBpcyBhIGdvb2Qgd2F5IHRvIGltcHJvdmUgZmVlbCBhbmQgd29ya2luZy5cbiAqIGBgYGBcbiAqICBHZXN0dXJlRGV0ZWN0b3J0aW1lLm9uKFwiZHJhZ1wiLCBmdW5jdGlvbihldikge1xuICogICAgY29uc29sZS5sb2coZXYpO1xuICogICAgZXYuZ2VzdHVyZS5wcmV2ZW50RGVmYXVsdCgpO1xuICogIH0pO1xuICogYGBgYFxuICpcbiAqIEBjbGFzcyBEcmFnXG4gKiBAc3RhdGljXG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdcbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG4vKipcbiAqIEBldmVudCBkcmFnc3RhcnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG4vKipcbiAqIEBldmVudCBkcmFnZW5kXG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhcGxlZnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG4vKipcbiAqIEBldmVudCBkcmFncmlnaHRcbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG4vKipcbiAqIEBldmVudCBkcmFndXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG4vKipcbiAqIEBldmVudCBkcmFnZG93blxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICovXG4oZnVuY3Rpb24obmFtZSkge1xuICB2YXIgdHJpZ2dlcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZHJhZ0dlc3R1cmUoZXYsIGluc3QpIHtcbiAgICB2YXIgY3VyID0gRGV0ZWN0aW9uLmN1cnJlbnQ7XG5cbiAgICAvLyBtYXggdG91Y2hlc1xuICAgIGlmKGluc3Qub3B0aW9ucy5kcmFnTWF4VG91Y2hlcyA+IDAgJiZcbiAgICAgIGV2LnRvdWNoZXMubGVuZ3RoID4gaW5zdC5vcHRpb25zLmRyYWdNYXhUb3VjaGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoKGV2LmV2ZW50VHlwZSkge1xuICAgIGNhc2UgRVZFTlRfU1RBUlQ6XG4gICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgLy8gd2hlbiB0aGUgZGlzdGFuY2Ugd2UgbW92ZWQgaXMgdG9vIHNtYWxsIHdlIHNraXAgdGhpcyBnZXN0dXJlXG4gICAgICAvLyBvciB3ZSBjYW4gYmUgYWxyZWFkeSBpbiBkcmFnZ2luZ1xuICAgICAgaWYoZXYuZGlzdGFuY2UgPCBpbnN0Lm9wdGlvbnMuZHJhZ01pbkRpc3RhbmNlICYmXG4gICAgICAgIGN1ci5uYW1lICE9IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhcnRDZW50ZXIgPSBjdXIuc3RhcnRFdmVudC5jZW50ZXI7XG5cbiAgICAgIC8vIHdlIGFyZSBkcmFnZ2luZyFcbiAgICAgIGlmKGN1ci5uYW1lICE9IG5hbWUpIHtcbiAgICAgICAgY3VyLm5hbWUgPSBuYW1lO1xuICAgICAgICBpZihpbnN0Lm9wdGlvbnMuZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvbiAmJiBldi5kaXN0YW5jZSA+IDApIHtcbiAgICAgICAgICAvLyBXaGVuIGEgZHJhZyBpcyB0cmlnZ2VyZWQsIHNldCB0aGUgZXZlbnQgY2VudGVyIHRvIGRyYWdNaW5EaXN0YW5jZSBwaXhlbHMgZnJvbSB0aGUgb3JpZ2luYWwgZXZlbnQgY2VudGVyLlxuICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcyBjb3JyZWN0aW9uLCB0aGUgZHJhZ2dlZCBkaXN0YW5jZSB3b3VsZCBqdW1wc3RhcnQgYXQgZHJhZ01pbkRpc3RhbmNlIHBpeGVscyBpbnN0ZWFkIG9mIGF0IDAuXG4gICAgICAgICAgLy8gSXQgbWlnaHQgYmUgdXNlZnVsIHRvIHNhdmUgdGhlIG9yaWdpbmFsIHN0YXJ0IHBvaW50IHNvbWV3aGVyZVxuICAgICAgICAgIHZhciBmYWN0b3IgPSBNYXRoLmFicyhpbnN0Lm9wdGlvbnMuZHJhZ01pbkRpc3RhbmNlIC8gZXYuZGlzdGFuY2UpO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLnBhZ2VYICs9IGV2LmRlbHRhWCAqIGZhY3RvcjtcbiAgICAgICAgICBzdGFydENlbnRlci5wYWdlWSArPSBldi5kZWx0YVkgKiBmYWN0b3I7XG4gICAgICAgICAgc3RhcnRDZW50ZXIuY2xpZW50WCArPSBldi5kZWx0YVggKiBmYWN0b3I7XG4gICAgICAgICAgc3RhcnRDZW50ZXIuY2xpZW50WSArPSBldi5kZWx0YVkgKiBmYWN0b3I7XG5cbiAgICAgICAgICAvLyByZWNhbGN1bGF0ZSBldmVudCBkYXRhIHVzaW5nIG5ldyBzdGFydCBwb2ludFxuICAgICAgICAgIGV2ID0gRGV0ZWN0aW9uLmV4dGVuZEV2ZW50RGF0YShldik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbG9jayBkcmFnIHRvIGF4aXM/XG4gICAgICBpZihjdXIubGFzdEV2ZW50LmRyYWdMb2NrVG9BeGlzIHx8XG4gICAgICAgICggaW5zdC5vcHRpb25zLmRyYWdMb2NrVG9BeGlzICYmXG4gICAgICAgICAgaW5zdC5vcHRpb25zLmRyYWdMb2NrTWluRGlzdGFuY2UgPD0gZXYuZGlzdGFuY2VcbiAgICAgICAgKSkge1xuICAgICAgICAgIGV2LmRyYWdMb2NrVG9BeGlzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGtlZXAgZGlyZWN0aW9uIG9uIHRoZSBheGlzIHRoYXQgdGhlIGRyYWcgZ2VzdHVyZSBzdGFydGVkIG9uXG4gICAgICAgIHZhciBsYXN0RGlyZWN0aW9uID0gY3VyLmxhc3RFdmVudC5kaXJlY3Rpb247XG4gICAgICAgIGlmKGV2LmRyYWdMb2NrVG9BeGlzICYmIGxhc3REaXJlY3Rpb24gIT09IGV2LmRpcmVjdGlvbikge1xuICAgICAgICAgIGlmKFV0aWxzLmlzVmVydGljYWwobGFzdERpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGV2LmRpcmVjdGlvbiA9IChldi5kZWx0YVkgPCAwKSA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldi5kaXJlY3Rpb24gPSAoZXYuZGVsdGFYIDwgMCkgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCB0aW1lLCB0cmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICBpZighdHJpZ2dlcmVkKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnc3RhcnQnLCBldik7XG4gICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyaWdnZXIgZXZlbnRzXG4gICAgICAgIGluc3QudHJpZ2dlcihuYW1lLCBldik7XG4gICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgZXYuZGlyZWN0aW9uLCBldik7XG5cbiAgICAgICAgdmFyIGlzVmVydGljYWwgPSBVdGlscy5pc1ZlcnRpY2FsKGV2LmRpcmVjdGlvbik7XG5cbiAgICAgICAgLy8gYmxvY2sgdGhlIGJyb3dzZXIgZXZlbnRzXG4gICAgICAgIGlmKChpbnN0Lm9wdGlvbnMuZHJhZ0Jsb2NrVmVydGljYWwgJiYgaXNWZXJ0aWNhbCkgfHxcbiAgICAgICAgICAoaW5zdC5vcHRpb25zLmRyYWdCbG9ja0hvcml6b250YWwgJiYgIWlzVmVydGljYWwpKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9SRUxFQVNFOlxuICAgICAgICBpZih0cmlnZ2VyZWQgJiYgZXYuY2hhbmdlZExlbmd0aCA8PSBpbnN0Lm9wdGlvbnMuZHJhZ01heFRvdWNoZXMpIHtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSArICdlbmQnLCBldik7XG4gICAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfRU5EOlxuICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLkRyYWcgPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaW5kZXg6IDUwLFxuICAgICAgaGFuZGxlcjogZHJhZ0dlc3R1cmUsXG4gICAgICBkZWZhdWx0czoge1xuICAgICAgICAvKipcbiAgICAgICAgICogbWluaW1hbCBtb3ZlbWVudCB0aGF0IGhhdmUgdG8gYmUgbWFkZSBiZWZvcmUgdGhlIGRyYWcgZXZlbnQgZ2V0cyB0cmlnZ2VyZWRcbiAgICAgICAgICogQHByb3BlcnR5IGRyYWdNaW5EaXN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ01pbkRpc3RhbmNlOiAxMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IGRyYWdEaXN0YW5jZUNvcnJlY3Rpb24gdG8gdHJ1ZSB0byBtYWtlIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgZHJhZ1xuICAgICAgICAgKiBiZSBjYWxjdWxhdGVkIGZyb20gd2hlcmUgdGhlIGRyYWcgd2FzIHRyaWdnZXJlZCwgbm90IGZyb20gd2hlcmUgdGhlIHRvdWNoIHN0YXJ0ZWQuXG4gICAgICAgICAqIFVzZWZ1bCB0byBhdm9pZCBhIGplcmstc3RhcnRpbmcgZHJhZywgd2hpY2ggY2FuIG1ha2UgZmluZS1hZGp1c3RtZW50c1xuICAgICAgICAgKiB0aHJvdWdoIGRyYWdnaW5nIGRpZmZpY3VsdCwgYW5kIGJlIHZpc3VhbGx5IHVuYXBwZWFsaW5nLlxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvbjogdHJ1ZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogc2V0IDAgZm9yIHVubGltaXRlZCwgYnV0IHRoaXMgY2FuIGNvbmZsaWN0IHdpdGggdHJhbnNmb3JtXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTWF4VG91Y2hlc1xuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTWF4VG91Y2hlczogMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogcHJldmVudCBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3Igd2hlbiBkcmFnZ2luZyBvY2N1cnNcbiAgICAgICAgICogYmUgY2FyZWZ1bCB3aXRoIGl0LCBpdCBtYWtlcyB0aGUgZWxlbWVudCBhIGJsb2NraW5nIGVsZW1lbnRcbiAgICAgICAgICogd2hlbiB5b3UgYXJlIHVzaW5nIHRoZSBkcmFnIGdlc3R1cmUsIGl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBzZXQgdGhpcyB0cnVlXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnQmxvY2tIb3Jpem9udGFsXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ0Jsb2NrSG9yaXpvbnRhbDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHNhbWUgYXMgYGRyYWdCbG9ja0hvcml6b250YWxgLCBidXQgZm9yIHZlcnRpY2FsIG1vdmVtZW50XG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnQmxvY2tWZXJ0aWNhbFxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdCbG9ja1ZlcnRpY2FsOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZHJhZ0xvY2tUb0F4aXMga2VlcHMgdGhlIGRyYWcgZ2VzdHVyZSBvbiB0aGUgYXhpcyB0aGF0IGl0IHN0YXJ0ZWQgb24sXG4gICAgICAgICAqIEl0IGRpc2FsbG93cyB2ZXJ0aWNhbCBkaXJlY3Rpb25zIGlmIHRoZSBpbml0aWFsIGRpcmVjdGlvbiB3YXMgaG9yaXpvbnRhbCwgYW5kIHZpY2UgdmVyc2EuXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTG9ja1RvQXhpc1xuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdMb2NrVG9BeGlzOiBmYWxzZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZHJhZyBsb2NrIG9ubHkga2lja3MgaW4gd2hlbiBkaXN0YW5jZSA+IGRyYWdMb2NrTWluRGlzdGFuY2VcbiAgICAgICAgICogVGhpcyB3YXksIGxvY2tpbmcgb2NjdXJzIG9ubHkgd2hlbiB0aGUgZGlzdGFuY2UgaGFzIGJlY29tZSBsYXJnZSBlbm91Z2ggdG8gcmVsaWFibHkgZGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb25cbiAgICAgICAgICogQHByb3BlcnR5IGRyYWdMb2NrTWluRGlzdGFuY2VcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMjVcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdMb2NrTWluRGlzdGFuY2U6IDI1XG4gICAgICB9XG4gICAgfTtcbiAgfSkoJ2RyYWcnKTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIHRyaWdnZXIgYSBzaW1wbGUgZ2VzdHVyZSBldmVudCwgc28geW91IGNhbiBkbyBhbnl0aGluZyBpbiB5b3VyIGhhbmRsZXIuXG4gICAqIG9ubHkgdXNhYmxlIGlmIHlvdSBrbm93IHdoYXQgeW91ciBkb2luZy4uLlxuICAgKlxuICAgKiBAY2xhc3MgR2VzdHVyZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IGdlc3R1cmVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuR2VzdHVyZSA9IHtcbiAgICBuYW1lOiAnZ2VzdHVyZScsXG4gICAgaW5kZXg6IDEzMzcsXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gcmVsZWFzZUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUsIGV2KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiBUb3VjaCBzdGF5cyBhdCB0aGUgc2FtZSBwbGFjZSBmb3IgeCB0aW1lXG4gICAqXG4gICAqIEBjbGFzcyBIb2xkXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgaG9sZFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqL1xuICAoZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciB0aW1lcjtcblxuICAgIGZ1bmN0aW9uIGhvbGRHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGluc3Qub3B0aW9ucyxcbiAgICAgICAgICBjdXJyZW50ID0gRGV0ZWN0aW9uLmN1cnJlbnQ7XG5cbiAgICAgIHN3aXRjaChldi5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgRVZFTlRfU1RBUlQ6XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBnZXN0dXJlIHNvIHdlIGNhbiBjaGVjayBpbiB0aGUgdGltZW91dCBpZiBpdCBzdGlsbCBpc1xuICAgICAgICBjdXJyZW50Lm5hbWUgPSBuYW1lO1xuXG4gICAgICAgIC8vIHNldCB0aW1lciBhbmQgaWYgYWZ0ZXIgdGhlIHRpbWVvdXQgaXQgc3RpbGwgaXMgaG9sZCxcbiAgICAgICAgLy8gd2UgdHJpZ2dlciB0aGUgaG9sZCBldmVudFxuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYoY3VycmVudCAmJiBjdXJyZW50Lm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUsIGV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMuaG9sZFRpbWVvdXQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgICBpZihldi5kaXN0YW5jZSA+IG9wdGlvbnMuaG9sZFRocmVzaG9sZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfUkVMRUFTRTpcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLkhvbGQgPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaW5kZXg6IDEwLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcm9wZXJ0eSBob2xkVGltZW91dFxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCA1MDBcbiAgICAgICAgICovXG4gICAgICAgIGhvbGRUaW1lb3V0OiA1MDAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1vdmVtZW50IGFsbG93ZWQgd2hpbGUgaG9sZGluZ1xuICAgICAgICAgKiBAcHJvcGVydHkgaG9sZFRocmVzaG9sZFxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAyXG4gICAgICAgICAqL1xuICAgICAgICBob2xkVGhyZXNob2xkOiAyXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogaG9sZEdlc3R1cmVcbiAgICB9O1xuICB9KSgnaG9sZCcpO1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogd2hlbiBhIHRvdWNoIGlzIGJlaW5nIHJlbGVhc2VkIGZyb20gdGhlIHBhZ2VcbiAgICpcbiAgICogQGNsYXNzIFJlbGVhc2VcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCByZWxlYXNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLlJlbGVhc2UgPSB7XG4gICAgbmFtZTogJ3JlbGVhc2UnLFxuICAgIGluZGV4OiBJbmZpbml0eSxcbiAgICBoYW5kbGVyOiBmdW5jdGlvbiByZWxlYXNlR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgaWYoZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgICAgaW5zdC50cmlnZ2VyKHRoaXMubmFtZSwgZXYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIHRyaWdnZXJzIHN3aXBlIGV2ZW50cyB3aGVuIHRoZSBlbmQgdmVsb2NpdHkgaXMgYWJvdmUgdGhlIHRocmVzaG9sZFxuICAgKiBmb3IgYmVzdCB1c2FnZSwgc2V0IGBwcmV2ZW50RGVmYXVsdGAgKG9uIHRoZSBkcmFnIGdlc3R1cmUpIHRvIGB0cnVlYFxuICAgKiBgYGBgXG4gICAqICBHZXN0dXJlRGV0ZWN0b3J0aW1lLm9uKFwiZHJhZ2xlZnQgc3dpcGVsZWZ0XCIsIGZ1bmN0aW9uKGV2KSB7XG4gICAqICAgIGNvbnNvbGUubG9nKGV2KTtcbiAgICogICAgZXYuZ2VzdHVyZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgKiAgfSk7XG4gICAqIGBgYGBcbiAgICpcbiAgICogQGNsYXNzIFN3aXBlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHN3aXBlbGVmdFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVyaWdodFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGV1cFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVkb3duXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLlN3aXBlID0ge1xuICAgIG5hbWU6ICdzd2lwZScsXG4gICAgaW5kZXg6IDQwLFxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAvKipcbiAgICAgICAqIEBwcm9wZXJ0eSBzd2lwZU1pblRvdWNoZXNcbiAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgKi9cbiAgICAgIHN3aXBlTWluVG91Y2hlczogMSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAcHJvcGVydHkgc3dpcGVNYXhUb3VjaGVzXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICovXG4gICAgICBzd2lwZU1heFRvdWNoZXM6IDEsXG5cbiAgICAgIC8qKlxuICAgICAgICogaG9yaXpvbnRhbCBzd2lwZSB2ZWxvY2l0eVxuICAgICAgICogQHByb3BlcnR5IHN3aXBlVmVsb2NpdHlYXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMC42XG4gICAgICAgKi9cbiAgICAgIHN3aXBlVmVsb2NpdHlYOiAwLjYsXG5cbiAgICAgIC8qKlxuICAgICAgICogdmVydGljYWwgc3dpcGUgdmVsb2NpdHlcbiAgICAgICAqIEBwcm9wZXJ0eSBzd2lwZVZlbG9jaXR5WVxuICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAqIEBkZWZhdWx0IDAuNlxuICAgICAgICovXG4gICAgICBzd2lwZVZlbG9jaXR5WTogMC42XG4gICAgfSxcblxuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIHN3aXBlR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgaWYoZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBldi50b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnM7XG5cbiAgICAgICAgLy8gbWF4IHRvdWNoZXNcbiAgICAgICAgaWYodG91Y2hlcyA8IG9wdGlvbnMuc3dpcGVNaW5Ub3VjaGVzIHx8XG4gICAgICAgICAgdG91Y2hlcyA+IG9wdGlvbnMuc3dpcGVNYXhUb3VjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgZGlzdGFuY2Ugd2UgbW92ZWQgaXMgdG9vIHNtYWxsIHdlIHNraXAgdGhpcyBnZXN0dXJlXG4gICAgICAgIC8vIG9yIHdlIGNhbiBiZSBhbHJlYWR5IGluIGRyYWdnaW5nXG4gICAgICAgIGlmKGV2LnZlbG9jaXR5WCA+IG9wdGlvbnMuc3dpcGVWZWxvY2l0eVggfHxcbiAgICAgICAgICBldi52ZWxvY2l0eVkgPiBvcHRpb25zLnN3aXBlVmVsb2NpdHlZKSB7XG4gICAgICAgICAgLy8gdHJpZ2dlciBzd2lwZSBldmVudHNcbiAgICAgICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lLCBldik7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKHRoaXMubmFtZSArIGV2LmRpcmVjdGlvbiwgZXYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogU2luZ2xlIHRhcCBhbmQgYSBkb3VibGUgdGFwIG9uIGEgcGxhY2VcbiAgICpcbiAgICogQGNsYXNzIFRhcFxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHRhcFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgZG91YmxldGFwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICovXG4gIChmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGhhc01vdmVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiB0YXBHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGluc3Qub3B0aW9ucyxcbiAgICAgICAgICBjdXJyZW50ID0gRGV0ZWN0aW9uLmN1cnJlbnQsXG4gICAgICAgICAgcHJldiA9IERldGVjdGlvbi5wcmV2aW91cyxcbiAgICAgICAgICBzaW5jZVByZXYsXG4gICAgICAgICAgZGlkRG91YmxlVGFwO1xuXG4gICAgICBzd2l0Y2goZXYuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgICBoYXNNb3ZlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgICBoYXNNb3ZlZCA9IGhhc01vdmVkIHx8IChldi5kaXN0YW5jZSA+IG9wdGlvbnMudGFwTWF4RGlzdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9FTkQ6XG4gICAgICAgIGlmKCFVdGlscy5pblN0cihldi5zcmNFdmVudC50eXBlLCAnY2FuY2VsJykgJiYgZXYuZGVsdGFUaW1lIDwgb3B0aW9ucy50YXBNYXhUaW1lICYmICFoYXNNb3ZlZCkge1xuICAgICAgICAgIC8vIHByZXZpb3VzIGdlc3R1cmUsIGZvciB0aGUgZG91YmxlIHRhcCBzaW5jZSB0aGVzZSBhcmUgdHdvIGRpZmZlcmVudCBnZXN0dXJlIGRldGVjdGlvbnNcbiAgICAgICAgICBzaW5jZVByZXYgPSBwcmV2ICYmIHByZXYubGFzdEV2ZW50ICYmIGV2LnRpbWVTdGFtcCAtIHByZXYubGFzdEV2ZW50LnRpbWVTdGFtcDtcbiAgICAgICAgICBkaWREb3VibGVUYXAgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIGNoZWNrIGlmIGRvdWJsZSB0YXBcbiAgICAgICAgICBpZihwcmV2ICYmIHByZXYubmFtZSA9PSBuYW1lICYmXG4gICAgICAgICAgICAoc2luY2VQcmV2ICYmIHNpbmNlUHJldiA8IG9wdGlvbnMuZG91YmxlVGFwSW50ZXJ2YWwpICYmXG4gICAgICAgICAgICBldi5kaXN0YW5jZSA8IG9wdGlvbnMuZG91YmxlVGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3QudHJpZ2dlcignZG91YmxldGFwJywgZXYpO1xuICAgICAgICAgICAgZGlkRG91YmxlVGFwID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkbyBhIHNpbmdsZSB0YXBcbiAgICAgICAgICBpZighZGlkRG91YmxlVGFwIHx8IG9wdGlvbnMudGFwQWx3YXlzKSB7XG4gICAgICAgICAgICBjdXJyZW50Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKGN1cnJlbnQubmFtZSwgZXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuVGFwID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiAxMDAsXG4gICAgICBoYW5kbGVyOiB0YXBHZXN0dXJlLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCB0aW1lIG9mIGEgdGFwLCB0aGlzIGlzIGZvciB0aGUgc2xvdyB0YXBwZXJzXG4gICAgICAgICAqIEBwcm9wZXJ0eSB0YXBNYXhUaW1lXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDI1MFxuICAgICAgICAgKi9cbiAgICAgICAgdGFwTWF4VGltZTogMjUwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggZGlzdGFuY2Ugb2YgbW92ZW1lbnQgb2YgYSB0YXAsIHRoaXMgaXMgZm9yIHRoZSBzbG93IHRhcHBlcnNcbiAgICAgICAgICogQHByb3BlcnR5IHRhcE1heERpc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgICAqL1xuICAgICAgICB0YXBNYXhEaXN0YW5jZTogMTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsd2F5cyB0cmlnZ2VyIHRoZSBgdGFwYCBldmVudCwgZXZlbiB3aGlsZSBkb3VibGUtdGFwcGluZ1xuICAgICAgICAgKiBAcHJvcGVydHkgdGFwQWx3YXlzXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICAqL1xuICAgICAgICB0YXBBbHdheXM6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCBkaXN0YW5jZSBiZXR3ZWVuIHR3byB0YXBzXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkb3VibGVUYXBEaXN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICAgKi9cbiAgICAgICAgZG91YmxlVGFwRGlzdGFuY2U6IDIwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggdGltZSBiZXR3ZWVuIHR3byB0YXBzXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkb3VibGVUYXBJbnRlcnZhbFxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAzMDBcbiAgICAgICAgICovXG4gICAgICAgIGRvdWJsZVRhcEludGVydmFsOiAzMDBcbiAgICAgIH1cbiAgICB9O1xuICB9KSgndGFwJyk7XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB3aGVuIGEgdG91Y2ggaXMgYmVpbmcgdG91Y2hlZCBhdCB0aGUgcGFnZVxuICAgKlxuICAgKiBAY2xhc3MgVG91Y2hcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0b3VjaFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Ub3VjaCA9IHtcbiAgICBuYW1lOiAndG91Y2gnLFxuICAgIGluZGV4OiAtSW5maW5pdHksXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogY2FsbCBwcmV2ZW50RGVmYXVsdCBhdCB0b3VjaHN0YXJ0LCBhbmQgbWFrZXMgdGhlIGVsZW1lbnQgYmxvY2tpbmcgYnkgZGlzYWJsaW5nIHRoZSBzY3JvbGxpbmcgb2YgdGhlIHBhZ2UsXG4gICAgICAgKiBidXQgaXQgaW1wcm92ZXMgZ2VzdHVyZXMgbGlrZSB0cmFuc2Zvcm1pbmcgYW5kIGRyYWdnaW5nLlxuICAgICAgICogYmUgY2FyZWZ1bCB3aXRoIHVzaW5nIHRoaXMsIGl0IGNhbiBiZSB2ZXJ5IGFubm95aW5nIGZvciB1c2VycyB0byBiZSBzdHVjayBvbiB0aGUgcGFnZVxuICAgICAgICogQHByb3BlcnR5IHByZXZlbnREZWZhdWx0XG4gICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnREZWZhdWx0OiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBkaXNhYmxlIG1vdXNlIGV2ZW50cywgc28gb25seSB0b3VjaCAob3IgcGVuISkgaW5wdXQgdHJpZ2dlcnMgZXZlbnRzXG4gICAgICAgKiBAcHJvcGVydHkgcHJldmVudE1vdXNlXG4gICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnRNb3VzZTogZmFsc2VcbiAgICB9LFxuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIHRvdWNoR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgaWYoaW5zdC5vcHRpb25zLnByZXZlbnRNb3VzZSAmJiBldi5wb2ludGVyVHlwZSA9PSBQT0lOVEVSX01PVVNFKSB7XG4gICAgICAgIGV2LnN0b3BEZXRlY3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZihpbnN0Lm9wdGlvbnMucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYoZXYuZXZlbnRUeXBlID09IEVWRU5UX1RPVUNIKSB7XG4gICAgICAgIGluc3QudHJpZ2dlcigndG91Y2gnLCBldik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogVXNlciB3YW50IHRvIHNjYWxlIG9yIHJvdGF0ZSB3aXRoIDIgZmluZ2Vyc1xuICAgKiBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3IgaXMgYSBnb29kIHdheSB0byBpbXByb3ZlIGZlZWwgYW5kIHdvcmtpbmcuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGVcbiAgICogYHByZXZlbnREZWZhdWx0YCBvcHRpb24uXG4gICAqXG4gICAqIEBjbGFzcyBUcmFuc2Zvcm1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHRyYW5zZm9ybXN0YXJ0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0cmFuc2Zvcm1lbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHBpbmNoaW5cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHBpbmNob3V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCByb3RhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgdHJpZ2dlcmVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1HZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBzd2l0Y2goZXYuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfTU9WRTpcbiAgICAgICAgLy8gYXQgbGVhc3QgbXVsdGl0b3VjaFxuICAgICAgICBpZihldi50b3VjaGVzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2NhbGVUaHJlc2hvbGQgPSBNYXRoLmFicygxIC0gZXYuc2NhbGUpO1xuICAgICAgICB2YXIgcm90YXRpb25UaHJlc2hvbGQgPSBNYXRoLmFicyhldi5yb3RhdGlvbik7XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgZGlzdGFuY2Ugd2UgbW92ZWQgaXMgdG9vIHNtYWxsIHdlIHNraXAgdGhpcyBnZXN0dXJlXG4gICAgICAgIC8vIG9yIHdlIGNhbiBiZSBhbHJlYWR5IGluIGRyYWdnaW5nXG4gICAgICAgIGlmKHNjYWxlVGhyZXNob2xkIDwgaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblNjYWxlICYmXG4gICAgICAgICAgcm90YXRpb25UaHJlc2hvbGQgPCBpbnN0Lm9wdGlvbnMudHJhbnNmb3JtTWluUm90YXRpb24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBhcmUgdHJhbnNmb3JtaW5nIVxuICAgICAgICBEZXRlY3Rpb24uY3VycmVudC5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBmaXJzdCB0aW1lLCB0cmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICBpZighdHJpZ2dlcmVkKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnc3RhcnQnLCBldik7XG4gICAgICAgICAgdHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QudHJpZ2dlcihuYW1lLCBldik7IC8vIGJhc2ljIHRyYW5zZm9ybSBldmVudFxuXG4gICAgICAgIC8vIHRyaWdnZXIgcm90YXRlIGV2ZW50XG4gICAgICAgIGlmKHJvdGF0aW9uVGhyZXNob2xkID4gaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblJvdGF0aW9uKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKCdyb3RhdGUnLCBldik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIHBpbmNoIGV2ZW50XG4gICAgICAgIGlmKHNjYWxlVGhyZXNob2xkID4gaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblNjYWxlKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKCdwaW5jaCcsIGV2KTtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIoJ3BpbmNoJyArIChldi5zY2FsZSA8IDEgPyAnaW4nIDogJ291dCcpLCBldik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfUkVMRUFTRTpcbiAgICAgICAgaWYodHJpZ2dlcmVkICYmIGV2LmNoYW5nZWRMZW5ndGggPCAyKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnZW5kJywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5UcmFuc2Zvcm0gPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaW5kZXg6IDQ1LFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1pbmltYWwgc2NhbGUgZmFjdG9yLCBubyBzY2FsZSBpcyAxLCB6b29taW4gaXMgdG8gMCBhbmQgem9vbW91dCB1bnRpbCBoaWdoZXIgdGhlbiAxXG4gICAgICAgICAqIEBwcm9wZXJ0eSB0cmFuc2Zvcm1NaW5TY2FsZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwLjAxXG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zvcm1NaW5TY2FsZTogMC4wMSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogcm90YXRpb24gaW4gZGVncmVlc1xuICAgICAgICAgKiBAcHJvcGVydHkgdHJhbnNmb3JtTWluUm90YXRpb25cbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtTWluUm90YXRpb246IDFcbiAgICAgIH0sXG5cbiAgICAgIGhhbmRsZXI6IHRyYW5zZm9ybUdlc3R1cmVcbiAgICB9O1xuICB9KSgndHJhbnNmb3JtJyk7XG5cbiAgLy8gQU1EIGV4cG9ydFxuICBpZih0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBHZXN0dXJlRGV0ZWN0b3I7XG4gICAgfSk7XG4gICAgLy8gY29tbW9uanMgZXhwb3J0XG4gIH0gZWxzZSBpZih0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gR2VzdHVyZURldGVjdG9yO1xuICAgIC8vIGJyb3dzZXIgZXhwb3J0XG4gIH0gZWxzZSB7XG4gICAgd2luZG93Lm9ucyA9IHdpbmRvdy5vbnMgfHwge307XG4gICAgd2luZG93Lm9ucy5HZXN0dXJlRGV0ZWN0b3IgPSBHZXN0dXJlRGV0ZWN0b3I7XG4gIH1cblxufSkod2luZG93KTtcbiIsIigob25zKSA9PiB7XG5cbiAgLy8gZmFzdGNsaWNrXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gRmFzdENsaWNrLmF0dGFjaChkb2N1bWVudC5ib2R5KSwgZmFsc2UpO1xuXG4gIC8vIG9ucy5fZGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgIG9ucy5fZGVmYXVsdERldmljZUJhY2tCdXR0b25IYW5kbGVyID0gb25zLl9kZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlci5jcmVhdGVIYW5kbGVyKHdpbmRvdy5kb2N1bWVudC5ib2R5LCAoKSA9PiB7XG4gICAgICBuYXZpZ2F0b3IuYXBwLmV4aXRBcHAoKTtcbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuXG4gIC8vIHNldHVwIGxvYWRpbmcgcGxhY2Vob2xkZXJcbiAgb25zLnJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG9ucy5fc2V0dXBMb2FkaW5nUGxhY2VIb2xkZXJzKCk7XG4gIH0pO1xuXG4gIC8vIHZpZXdwb3J0LmpzXG4gIG5ldyBWaWV3cG9ydCgpLnNldHVwKCk7XG5cbiAgLy8gbW9kZXJuaXplXG4gIE1vZGVybml6ci50ZXN0U3R5bGVzKCcjbW9kZXJuaXpyIHsgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2ggfScsIGZ1bmN0aW9uKGVsZW0sIHJ1bGUpIHtcbiAgICBNb2Rlcm5penIuYWRkVGVzdChcbiAgICAgICdvdmVyZmxvd3RvdWNoJyxcbiAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nJykgPT0gJ3RvdWNoJyk7XG4gIH0pO1xuXG4gIC8vIEJhc2VFbGVtZW50XG4gIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICBvbnMuX0Jhc2VFbGVtZW50ID0gKCkgPT4ge307XG4gICAgb25zLl9CYXNlRWxlbWVudC5wcm90b3R5cGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgfSBlbHNlIHtcbiAgICBvbnMuX0Jhc2VFbGVtZW50ID0gSFRNTEVsZW1lbnQ7XG4gIH1cbn0pKHdpbmRvdy5vbnMgPSB3aW5kb3cub25zIHx8IHt9KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcnOiAnYWxlcnQtZGlhbG9nLS0qJyxcbiAgICAnLmFsZXJ0LWRpYWxvZy10aXRsZSc6ICdhbGVydC1kaWFsb2ctdGl0bGUtLSonLFxuICAgICcuYWxlcnQtZGlhbG9nLWNvbnRlbnQnOiAnYWxlcnQtZGlhbG9nLWNvbnRlbnQtLSonXG4gIH07XG4gIGNvbnN0IEFuaW1hdG9yRmFjdG9yeSA9IG9ucy5faW50ZXJuYWwuQW5pbWF0b3JGYWN0b3J5O1xuICBjb25zdCBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3I7XG4gIGNvbnN0IElPU0FsZXJ0RGlhbG9nQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLklPU0FsZXJ0RGlhbG9nQW5pbWF0b3I7XG4gIGNvbnN0IFNsaWRlRGlhbG9nQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLlNsaWRlRGlhbG9nQW5pbWF0b3I7XG4gIGNvbnN0IEFsZXJ0RGlhbG9nQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLkFsZXJ0RGlhbG9nQW5pbWF0b3I7XG5cbiAgY2xhc3MgQWxlcnREaWFsb2dFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBnZXQgX3RpdGxlRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmFsZXJ0LWRpYWxvZy10aXRsZScpO1xuICAgIH1cblxuICAgIGdldCBfY29udGVudEVsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5hbGVydC1kaWFsb2ctY29udGVudCcpO1xuICAgIH1cblxuICAgIGdldCBfZGlhbG9nKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgICAgdGhpcy5fbWFzayA9IHRoaXMuX2NyZWF0ZU1hc2sodGhpcy5nZXRBdHRyaWJ1dGUoJ21hc2stY29sb3InKSk7XG5cbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcblxuICAgICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICAgIGFuaW1hdG9yczogT25zQWxlcnREaWFsb2dFbGVtZW50Ll9hbmltYXRvckRpY3QsXG4gICAgICAgIGJhc2VDbGFzczogQWxlcnREaWFsb2dBbmltYXRvcixcbiAgICAgICAgYmFzZUNsYXNzTmFtZTogJ0FsZXJ0RGlhbG9nQW5pbWF0b3InLFxuICAgICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJyksXG4gICAgICAgIGRlZmF1bHRBbmltYXRpb25PcHRpb25zOiBBbmltYXRvckZhY3RvcnkucGFyc2VKU09OU2FmZWx5KHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpKVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3Zpc2libGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Rvb3JMb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgICB0aGlzLl9ib3VuZENhbmNlbCA9IHRoaXMuX2NhbmNlbC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIF9jb21waWxlKCkge1xuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5zdHlsZS56SW5kZXggPSAnMjAwMDEnO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdhbGVydC1kaWFsb2cnKTtcblxuICAgICAgaWYgKG9ucy5wbGF0Zm9ybS5pc0FuZHJvaWQoKSkge1xuICAgICAgICBsZXQgbW9kaWZpZXIgPSB0aGlzLmhhc0F0dHJpYnV0ZSgnbW9kaWZpZXInKSA/IHRoaXMuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpIDogJyc7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdtb2RpZmllcicsIChtb2RpZmllciArICcgYW5kcm9pZCcpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBvciBlbmFibGUgYWxlcnQgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufVxuICAgICAqL1xuICAgIHNldERpc2FibGVkKGRpc2FibGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGRpc2FibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbi4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgYWxlcnQgZGlhbG9nIGlzIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2UgYWxlcnQgZGlhbG9nIGNhbmNlbGFibGUgb3IgdW5jYW5jZWxhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufVxuICAgICAqL1xuICAgIHNldENhbmNlbGFibGUoY2FuY2VsYWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiBjYW5jZWxhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbi4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbmNlbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2NhbmNlbGFibGUnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnY2FuY2VsYWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgYWxlcnQgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdIGNhbGxiYWNrIGFmdGVyIGRpYWxvZyBpcyBzaG93blxuICAgICAqL1xuICAgIHNob3cob3B0aW9ucyA9IHt9KSB7XG4gICAgICBsZXQgY2FuY2VsID0gZmFsc2U7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncHJlc2hvdycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgYWxlcnREaWFsb2c6IHRoaXMsXG4gICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghY2FuY2VsKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcblxuICAgICAgICAgIHRoaXMuX21hc2suc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICAgICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG4gICAgICAgICAgYW5pbWF0b3Iuc2hvdyh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHVubG9jaygpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncG9zdHNob3cnLCB7XG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgIGRldGFpbDoge2FsZXJ0RGlhbG9nOiB0aGlzfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZSBhbGVydCBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl0gYW5pbWF0aW9uIHR5cGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc10gYW5pbWF0aW9uIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja10gY2FsbGJhY2sgYWZ0ZXIgZGlhbG9nIGlzIGhpZGRlblxuICAgICAqL1xuICAgIGhpZGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICBsZXQgY2FuY2VsID0gZmFsc2U7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncHJlaGlkZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgYWxlcnREaWFsb2c6IHRoaXMsXG4gICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghY2FuY2VsKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcblxuICAgICAgICAgIGNvbnN0IGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuICAgICAgICAgIGFuaW1hdG9yLmhpZGUodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdW5sb2NrKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwb3N0aGlkZScsIHtcbiAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7YWxlcnREaWFsb2c6IHRoaXN9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIGFsZXJ0IGRpYWxvZyBpcyB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1Nob3duKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBhbGVydCBkaWFsb2cuXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbWFzay5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX21hc2sucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLl9tYXNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpc0NhbmNlbGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2NhbmNlbGFibGUnKTtcbiAgICB9XG5cbiAgICBfb25EZXZpY2VCYWNrQnV0dG9uKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5pc0NhbmNlbGFibGUoKSkge1xuICAgICAgICB0aGlzLl9jYW5jZWwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50LmNhbGxQYXJlbnRIYW5kbGVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NhbmNlbCgpIHtcbiAgICAgIGlmICh0aGlzLmlzQ2FuY2VsYWJsZSgpKSB7XG4gICAgICAgIHRoaXMuaGlkZSh7XG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NhbmNlbCcsIHtidWJibGVzOiB0cnVlfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NyZWF0ZU1hc2soY29sb3IpIHtcbiAgICAgIHRoaXMuX21hc2sgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXY+PC9kaXY+Jyk7XG4gICAgICB0aGlzLl9tYXNrLmNsYXNzTGlzdC5hZGQoJ2FsZXJ0LWRpYWxvZy1tYXNrJyk7XG4gICAgICB0aGlzLl9tYXNrLnN0eWxlLnpJbmRleCA9IDIwMDAwO1xuICAgICAgdGhpcy5fbWFzay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9tYXNrKTtcbiAgICAgIHJldHVybiB0aGlzLl9tYXNrO1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCB0aGlzLl9vbkRldmljZUJhY2tCdXR0b24uYmluZCh0aGlzKSk7XG5cbiAgICAgIHRoaXMuX21hc2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZENhbmNlbCwgZmFsc2UpO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG5cbiAgICAgIHRoaXMuX21hc2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZENhbmNlbC5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXdpbmRvdy5PbnNBbGVydERpYWxvZ0VsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zQWxlcnREaWFsb2dFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtYWxlcnQtZGlhbG9nJywge1xuICAgICAgcHJvdG90eXBlOiBBbGVydERpYWxvZ0VsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG5cbiAgICB3aW5kb3cuT25zQWxlcnREaWFsb2dFbGVtZW50Ll9hbmltYXRvckRpY3QgPSB7XG4gICAgICAnZGVmYXVsdCc6IG9ucy5wbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIDogSU9TQWxlcnREaWFsb2dBbmltYXRvcixcbiAgICAgICdmYWRlJzogb25zLnBsYXRmb3JtLmlzQW5kcm9pZCgpID8gQW5kcm9pZEFsZXJ0RGlhbG9nQW5pbWF0b3IgOiBJT1NBbGVydERpYWxvZ0FuaW1hdG9yLFxuICAgICAgJ3NsaWRlJzogU2xpZGVEaWFsb2dBbmltYXRvcixcbiAgICAgICdub25lJzogQWxlcnREaWFsb2dBbmltYXRvclxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7RGlhbG9nQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAgICovXG4gICAgd2luZG93Lk9uc0FsZXJ0RGlhbG9nRWxlbWVudC5yZWdpc3RlckFuaW1hdG9yID0gZnVuY3Rpb24obmFtZSwgQW5pbWF0b3IpIHtcbiAgICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIEFsZXJ0RGlhbG9nQW5pbWF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJBbmltYXRvclwiIHBhcmFtIG11c3QgaW5oZXJpdCBEaWFsb2dBbmltYXRvcicpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gICAgfTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcbiAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJ0b29sYmFyLWJ1dHRvbi0tcXVpZXRcIlxuICAgICAgc3R5bGU9XCJoZWlnaHQ6IDQ0cHg7IGxpbmUtaGVpZ2h0OiAwOyBwYWRkaW5nOiAwIDEwcHggMCAwOyBwb3NpdGlvbjogcmVsYXRpdmU7XCI+XG5cbiAgICAgIDxpIGNsYXNzPVwiaW9uLWlvcy1hcnJvdy1iYWNrIG9ucy1iYWNrLWJ1dHRvbl9faWNvblwiXG4gICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgICAgICBoZWlnaHQ6IDQ0cHg7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDQ0cHg7XG4gICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xuICAgICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICAgICAgd2lkdGg6IDE2cHg7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgIHBhZGRpbmctdG9wOiAxcHg7XCI+PC9pPlxuXG4gICAgICA8c3BhblxuICAgICAgICBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiB0b3A7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbGluZS1oZWlnaHQ6IDQ0cHg7IGhlaWdodDogNDRweDtcIlxuICAgICAgICBjbGFzcz1cImJhY2stYnV0dG9uX19sYWJlbFwiPjwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gIGApO1xuICBjb25zdCBzY2hlbWUgPSB7XG4gICAgJy50b29sYmFyLWJ1dHRvbi0tcXVpZXQnOiAndG9vbGJhci1idXR0b24tLSonXG4gIH07XG5cbiAgY2xhc3MgQmFja0J1dHRvbkVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIHRoaXMuX2JvdW5kT25DbGljayA9IHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBfY29tcGlsZSgpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIGNvbnN0IGlubmVyID0gdGVtcGxhdGUucXVlcnlTZWxlY3RvcignLmJhY2stYnV0dG9uX19sYWJlbCcpO1xuICAgICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgICBpbm5lci5hcHBlbmRDaGlsZCh0aGlzLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgICAgaWYgKGlubmVyLmlubmVySFRNTC50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIGlubmVyLnRleHRDb250ZW50ID0gJ0JhY2snO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgX29uQ2xpY2soKSB7XG4gICAgICBjb25zdCBuYXZpZ2F0b3IgPSB1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy1uYXZpZ2F0b3InKTtcbiAgICAgIGlmIChuYXZpZ2F0b3IpIHtcbiAgICAgICAgbmF2aWdhdG9yLnBvcFBhZ2Uoe2NhbmNlbElmUnVubmluZzogdHJ1ZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRPbkNsaWNrLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0JhY2tCdXR0b25FbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0JhY2tCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtYmFjay1idXR0b24nLCB7XG4gICAgICBwcm90b3R5cGU6IEJhY2tCdXR0b25FbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHNjaGVtZSA9IHsnJzogJ2JvdHRvbS1iYXItLSonfTtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG5cbiAgY2xhc3MgQm90dG9tVG9vbGJhckVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnYm90dG9tLWJhcicpO1xuICAgICAgdGhpcy5zdHlsZS56SW5kZXggPSAnMCc7XG4gICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGUoKSB7XG4gICAgICBjb25zdCBpbmxpbmUgPSB0eXBlb2YgdGhpcy5nZXRBdHRyaWJ1dGUoJ2lubGluZScpID09PSAnc3RyaW5nJztcblxuICAgICAgdGhpcy5zdHlsZS5wb3NpdGlvbiA9IGlubGluZSA/ICdzdGF0aWMnIDogJ2Fic29sdXRlJztcbiAgICB9XG4gIH1cblxuICBpZiAoIXdpbmRvdy5PbnNCb3R0b21Ub29sYmFyRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNCb3R0b21Ub29sYmFyRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWJvdHRvbS10b29sYmFyJywge1xuICAgICAgcHJvdG90eXBlOiBCb3R0b21Ub29sYmFyRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBzY2hlbWUgPSB7Jyc6ICdidXR0b24tLSonfTtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG5cbiAgY2xhc3MgQnV0dG9uRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdidXR0b24nKTtcblxuICAgICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zQnV0dG9uRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtYnV0dG9uJywge1xuICAgICAgcHJvdG90eXBlOiBCdXR0b25FbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCBzY2hlbWUgPSB7Jyc6ICdjYXJvdXNlbC1pdGVtLS0qJ307XG5cbiAgY2xhc3MgQ2Fyb3VzZWxJdGVtRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0Nhcm91c2VsSXRlbUVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zQ2Fyb3VzZWxJdGVtRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWNhcm91c2VsLWl0ZW0nLCB7XG4gICAgICBwcm90b3R5cGU6IENhcm91c2VsSXRlbUVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG4gIGNvbnN0IHNjaGVtZSA9IHsnJzogJ2Nhcm91c2VsLS0qJ307XG5cbiAgY29uc3QgVmVydGljYWxNb2RlVHJhaXQgPSB7XG5cbiAgICBfZ2V0U2Nyb2xsRGVsdGE6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQuZ2VzdHVyZS5kZWx0YVk7XG4gICAgfSxcblxuICAgIF9nZXRTY3JvbGxWZWxvY2l0eTogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5nZXN0dXJlLnZlbG9jaXR5WTtcbiAgICB9LFxuXG4gICAgX2dldEVsZW1lbnRTaXplOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5fY3VycmVudEVsZW1lbnRTaXplKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50U2l6ZSA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudEVsZW1lbnRTaXplO1xuICAgIH0sXG5cbiAgICBfZ2VuZXJhdGVTY3JvbGxUcmFuc2Zvcm06IGZ1bmN0aW9uKHNjcm9sbCkge1xuICAgICAgcmV0dXJuICd0cmFuc2xhdGUzZCgwcHgsICcgKyAtc2Nyb2xsICsgJ3B4LCAwcHgpJztcbiAgICB9LFxuXG4gICAgX2xheW91dENhcm91c2VsSXRlbXM6IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1FbGVtZW50cygpO1xuXG4gICAgICBjb25zdCBzaXplQXR0ciA9IHRoaXMuX2dldENhcm91c2VsSXRlbVNpemVBdHRyKCk7XG4gICAgICBjb25zdCBzaXplSW5mbyA9IHRoaXMuX2RlY29tcG9zZVNpemVTdHJpbmcoc2l6ZUF0dHIpO1xuXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gICAgICBjb25zdCB0b3RhbFdpZHRoID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB8fCAwO1xuICAgICAgY29uc3QgZmluYWxXaWR0aCA9IHRvdGFsV2lkdGggLSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdMZWZ0LCAxMCkgLSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCwgMTApO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUuaGVpZ2h0ID0gc2l6ZUF0dHI7XG4gICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLndpZHRoID0gZmluYWxXaWR0aCArICdweCc7XG4gICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnRvcCA9IChpICogc2l6ZUluZm8ubnVtYmVyKSArIHNpemVJbmZvLnVuaXQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IEhvcml6b250YWxNb2RlVHJhaXQgPSB7XG5cbiAgICBfZ2V0U2Nyb2xsRGVsdGE6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQuZ2VzdHVyZS5kZWx0YVg7XG4gICAgfSxcblxuICAgIF9nZXRTY3JvbGxWZWxvY2l0eTogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5nZXN0dXJlLnZlbG9jaXR5WDtcbiAgICB9LFxuXG4gICAgX2dldEVsZW1lbnRTaXplOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5fY3VycmVudEVsZW1lbnRTaXplKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50U2l6ZSA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50RWxlbWVudFNpemU7XG4gICAgfSxcblxuICAgIF9nZW5lcmF0ZVNjcm9sbFRyYW5zZm9ybTogZnVuY3Rpb24oc2Nyb2xsKSB7XG4gICAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyAtc2Nyb2xsICsgJ3B4LCAwcHgsIDBweCknO1xuICAgIH0sXG5cbiAgICBfbGF5b3V0Q2Fyb3VzZWxJdGVtczogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuX2dldENhcm91c2VsSXRlbUVsZW1lbnRzKCk7XG5cbiAgICAgIGNvbnN0IHNpemVBdHRyID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZUF0dHIoKTtcbiAgICAgIGNvbnN0IHNpemVJbmZvID0gdGhpcy5fZGVjb21wb3NlU2l6ZVN0cmluZyhzaXplQXR0cik7XG5cbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTtcbiAgICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgfHwgMDtcbiAgICAgIGNvbnN0IGZpbmFsSGVpZ2h0ID0gdG90YWxIZWlnaHQgLSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsIDEwKSAtIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSwgMTApO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUuaGVpZ2h0ID0gZmluYWxIZWlnaHQgKyAncHgnO1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS53aWR0aCA9IHNpemVBdHRyO1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5sZWZ0ID0gKGkgKiBzaXplSW5mby5udW1iZXIpICsgc2l6ZUluZm8udW5pdDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY2xhc3MgQ2Fyb3VzZWxFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gICAgICB0aGlzLl9kb29yTG9jayA9IG5ldyBEb29yTG9jaygpO1xuICAgICAgdGhpcy5fc2Nyb2xsID0gMDtcbiAgICAgIHRoaXMuX2xhc3RBY3RpdmVJbmRleCA9IDA7XG5cbiAgICAgIHRoaXMuX2JvdW5kT25EcmFnID0gdGhpcy5fb25EcmFnLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9ib3VuZE9uRHJhZ0VuZCA9IHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPblJlc2l6ZSA9IHRoaXMuX29uUmVzaXplLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuX21peGluKHRoaXMuX2lzVmVydGljYWwoKSA/IFZlcnRpY2FsTW9kZVRyYWl0IDogSG9yaXpvbnRhbE1vZGVUcmFpdCk7XG5cbiAgICAgIHRoaXMuX2xheW91dENhcm91c2VsSXRlbXMoKTtcbiAgICAgIHRoaXMuX3NldHVwSW5pdGlhbEluZGV4KCk7XG5cbiAgICAgIHRoaXMuX3NhdmVMYXN0U3RhdGUoKTtcbiAgICB9XG5cbiAgICBfb25SZXNpemUoKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICBfb25EaXJlY3Rpb25DaGFuZ2UoKSB7XG4gICAgICBpZiAodGhpcy5faXNWZXJ0aWNhbCgpKSB7XG4gICAgICAgIHRoaXMuc3R5bGUub3ZlcmZsb3dYID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLnN0eWxlLm92ZXJmbG93WSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdHlsZS5vdmVyZmxvd1ggPSAnJztcbiAgICAgICAgdGhpcy5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIF9zYXZlTGFzdFN0YXRlKCkge1xuICAgICAgdGhpcy5fbGFzdFN0YXRlID0ge1xuICAgICAgICBlbGVtZW50U2l6ZTogdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpLFxuICAgICAgICBjYXJvdXNlbEVsZW1lbnRDb3VudDogdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtQ291bnQoKSxcbiAgICAgICAgd2lkdGg6IHRoaXMuX2dldENhcm91c2VsSXRlbVNpemUoKSAqIHRoaXMuX2dldENhcm91c2VsSXRlbUNvdW50KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIF9nZXRDYXJvdXNlbEl0ZW1TaXplKCkge1xuICAgICAgY29uc3Qgc2l6ZUF0dHIgPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1TaXplQXR0cigpO1xuICAgICAgY29uc3Qgc2l6ZUluZm8gPSB0aGlzLl9kZWNvbXBvc2VTaXplU3RyaW5nKHNpemVBdHRyKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRTaXplID0gdGhpcy5fZ2V0RWxlbWVudFNpemUoKTtcblxuICAgICAgaWYgKHNpemVJbmZvLnVuaXQgPT09ICclJykge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChzaXplSW5mby5udW1iZXIgLyAxMDAgKiBlbGVtZW50U2l6ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNpemVJbmZvLnVuaXQgPT09ICdweCcpIHtcbiAgICAgICAgcmV0dXJuIHNpemVJbmZvLm51bWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBfZ2V0SW5pdGlhbEluZGV4KCkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnaW5pdGlhbC1pbmRleCcpLCAxMCk7XG5cbiAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09ICdudW1iZXInICYmICFpc05hTihpbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGluZGV4LCB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1Db3VudCgpIC0gMSksIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIF9nZXRDYXJvdXNlbEl0ZW1TaXplQXR0cigpIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gJ2l0ZW0tJyArICh0aGlzLl9pc1ZlcnRpY2FsKCkgPyAnaGVpZ2h0JyA6ICd3aWR0aCcpO1xuICAgICAgY29uc3QgaXRlbVNpemVBdHRyID0gKCcnICsgdGhpcy5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpKS50cmltKCk7XG5cbiAgICAgIHJldHVybiBpdGVtU2l6ZUF0dHIubWF0Y2goL15cXGQrKHB4fCUpJC8pID8gaXRlbVNpemVBdHRyIDogJzEwMCUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBfZGVjb21wb3NlU2l6ZVN0cmluZyhzaXplKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gc2l6ZS5tYXRjaCgvXihcXGQrKShweHwlKS8pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBudW1iZXI6IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSxcbiAgICAgICAgdW5pdDogbWF0Y2hlc1syXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgX3NldHVwSW5pdGlhbEluZGV4KCkge1xuICAgICAgdGhpcy5fc2Nyb2xsID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpICogdGhpcy5fZ2V0SW5pdGlhbEluZGV4KCk7XG4gICAgICB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJbml0aWFsSW5kZXgoKTtcbiAgICAgIHRoaXMuX3Njcm9sbFRvKHRoaXMuX3Njcm9sbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzd2lwZWFibGVcbiAgICAgKi9cbiAgICBzZXRTd2lwZWFibGUoc3dpcGVhYmxlKSB7XG4gICAgICBpZiAoc3dpcGVhYmxlKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzd2lwZWFibGUnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnc3dpcGVhYmxlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1N3aXBlYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnc3dpcGVhYmxlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHJhdGlvXG4gICAgICovXG4gICAgc2V0QXV0b1Njcm9sbFJhdGlvKHJhdGlvKSB7XG4gICAgICBpZiAocmF0aW8gPCAwLjAgfHwgcmF0aW8gPiAxLjApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJhdGlvLicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXV0by1zY3JvbGwtcmF0aW8nLCByYXRpbyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEF1dG9TY3JvbGxSYXRpbygpIHtcbiAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXV0by1zY3JvbGwtcmF0aW8nKTtcblxuICAgICAgaWYgKCFhdHRyKSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gcGFyc2VGbG9hdChhdHRyKTtcbiAgICAgIGlmIChzY3JvbGxSYXRpbyA8IDAuMCB8fCBzY3JvbGxSYXRpbyA+IDEuMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmF0aW8uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpc05hTihzY3JvbGxSYXRpbykgPyAwLjUgOiBzY3JvbGxSYXRpbztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKi9cbiAgICBzZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleChpbmRleCwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIHRoaXMuX2dldENhcm91c2VsSXRlbUNvdW50KCkgLSAxKSk7XG4gICAgICBjb25zdCBzY3JvbGwgPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1TaXplKCkgKiBpbmRleDtcbiAgICAgIGNvbnN0IG1heCA9IHRoaXMuX2NhbGN1bGF0ZU1heFNjcm9sbCgpO1xuXG4gICAgICB0aGlzLl9zY3JvbGwgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHNjcm9sbCkpO1xuICAgICAgdGhpcy5fc2Nyb2xsVG8odGhpcy5fc2Nyb2xsLCB7YW5pbWF0ZTogb3B0aW9ucy5hbmltYXRpb24gIT09ICdub25lJywgY2FsbGJhY2s6IG9wdGlvbnMuY2FsbGJhY2t9KTtcblxuICAgICAgdGhpcy5fdHJ5RmlyZVBvc3RDaGFuZ2VFdmVudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBnZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleCgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbCA9IHRoaXMuX3Njcm9sbDtcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtQ291bnQoKTtcbiAgICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1TaXplKCk7XG5cbiAgICAgIGlmIChzY3JvbGwgPCAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKHNpemUgKiBpIDw9IHNjcm9sbCAmJiBzaXplICogKGkgKyAxKSA+IHNjcm9sbCkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG1heCBjYXJvdXNlbCBpbmRleFxuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAgICovXG4gICAgbmV4dChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleCh0aGlzLmdldEFjdGl2ZUNhcm91c2VsSXRlbUluZGV4KCkgKyAxLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKi9cbiAgICBwcmV2KG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldEFjdGl2ZUNhcm91c2VsSXRlbUluZGV4KHRoaXMuZ2V0QWN0aXZlQ2Fyb3VzZWxJdGVtSW5kZXgoKSAtIDEsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZFxuICAgICAqL1xuICAgIHNldEF1dG9TY3JvbGxFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhdXRvLXNjcm9sbCcsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhdXRvLXNjcm9sbCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNBdXRvU2Nyb2xsRW5hYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnYXV0by1zY3JvbGwnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkXG4gICAgICovXG4gICAgc2V0RGlzYWJsZWQoZGlzYWJsZWQpIHtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzY3JvbGxhYmxlXG4gICAgICovXG4gICAgc2V0T3ZlcnNjcm9sbGFibGUoc2Nyb2xsYWJsZSkge1xuICAgICAgaWYgKHNjcm9sbGFibGUpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ292ZXJzY3JvbGxhYmxlJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ292ZXJzY3JvbGxhYmxlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc092ZXJzY3JvbGxhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdvdmVyc2Nyb2xsYWJsZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgX2lzRW5hYmxlZENoYW5nZUV2ZW50KCkge1xuICAgICAgY29uc3QgZWxlbWVudFNpemUgPSB0aGlzLl9nZXRFbGVtZW50U2l6ZSgpO1xuICAgICAgY29uc3QgY2Fyb3VzZWxJdGVtU2l6ZSA9IHRoaXMuX2dldENhcm91c2VsSXRlbVNpemUoKTtcblxuICAgICAgcmV0dXJuIHRoaXMuaXNBdXRvU2Nyb2xsRW5hYmxlZCgpICYmIGVsZW1lbnRTaXplID09PSBjYXJvdXNlbEl0ZW1TaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgX2lzVmVydGljYWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpID09PSAndmVydGljYWwnO1xuICAgIH1cblxuICAgIF9wcmVwYXJlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgPSBuZXcgb25zLkdlc3R1cmVEZXRlY3Rvcih0aGlzLCB7XG4gICAgICAgIGRyYWdNaW5EaXN0YW5jZTogMVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vbignZHJhZyBkcmFnbGVmdCBkcmFncmlnaHQgZHJhZ3VwIGRyYWdkb3duIHN3aXBlIHN3aXBlbGVmdCBzd2lwZXJpZ2h0IHN3aXBldXAgc3dpcGVkb3duJywgdGhpcy5fYm91bmRPbkRyYWcpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yLm9uKCdkcmFnZW5kJywgdGhpcy5fYm91bmRPbkRyYWdFbmQpO1xuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPblJlc2l6ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yLm9mZignZHJhZyBkcmFnbGVmdCBkcmFncmlnaHQgZHJhZ3VwIGRyYWdkb3duIHN3aXBlIHN3aXBlbGVmdCBzd2lwZXJpZ2h0IHN3aXBldXAgc3dpcGVkb3duJywgdGhpcy5fYm91bmRPbkRyYWcpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yLm9mZignZHJhZ2VuZCcsIHRoaXMuX2JvdW5kT25EcmFnRW5kKTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5kaXNwb3NlKCk7XG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE9uUmVzaXplLCB0cnVlKTtcbiAgICB9XG5cbiAgICBfdHJ5RmlyZVBvc3RDaGFuZ2VFdmVudCgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuZ2V0QWN0aXZlQ2Fyb3VzZWxJdGVtSW5kZXgoKTtcblxuICAgICAgaWYgKHRoaXMuX2xhc3RBY3RpdmVJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgIGNvbnN0IGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX2xhc3RBY3RpdmVJbmRleDtcbiAgICAgICAgdGhpcy5fbGFzdEFjdGl2ZUluZGV4ID0gY3VycmVudEluZGV4O1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdwb3N0Y2hhbmdlJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBjYXJvdXNlbDogdGhpcyxcbiAgICAgICAgICAgIGFjdGl2ZUluZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICBsYXN0QWN0aXZlSW5kZXg6IGxhc3RBY3RpdmVJbmRleFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX29uRHJhZyhldmVudCkge1xuICAgICAgaWYgKCF0aGlzLmlzU3dpcGVhYmxlKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBldmVudC5nZXN0dXJlLmRpcmVjdGlvbjtcbiAgICAgIGlmICgodGhpcy5faXNWZXJ0aWNhbCgpICYmIChkaXJlY3Rpb24gPT09ICdsZWZ0JyB8fCBkaXJlY3Rpb24gPT09ICdyaWdodCcpKSB8fCAoIXRoaXMuX2lzVmVydGljYWwoKSAmJiAoZGlyZWN0aW9uID09PSAndXAnIHx8IGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgdGhpcy5fbGFzdERyYWdFdmVudCA9IGV2ZW50O1xuXG4gICAgICBjb25zdCBzY3JvbGwgPSB0aGlzLl9zY3JvbGwgLSB0aGlzLl9nZXRTY3JvbGxEZWx0YShldmVudCk7XG4gICAgICB0aGlzLl9zY3JvbGxUbyhzY3JvbGwpO1xuICAgICAgZXZlbnQuZ2VzdHVyZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB0aGlzLl90cnlGaXJlUG9zdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuXG4gICAgX29uRHJhZ0VuZChldmVudCkge1xuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnRTaXplID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoIXRoaXMuaXNTd2lwZWFibGUoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Njcm9sbCA9IHRoaXMuX3Njcm9sbCAtIHRoaXMuX2dldFNjcm9sbERlbHRhKGV2ZW50KTtcblxuICAgICAgaWYgKHRoaXMuX2dldFNjcm9sbERlbHRhKGV2ZW50KSAhPT0gMCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzT3ZlclNjcm9sbCh0aGlzLl9zY3JvbGwpKSB7XG4gICAgICAgIGxldCB3YWl0Rm9yQWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG92ZXJzY3JvbGxFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnb3ZlcnNjcm9sbCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgY2Fyb3VzZWw6IHRoaXMsXG4gICAgICAgICAgICBhY3RpdmVJbmRleDogdGhpcy5nZXRBY3RpdmVDYXJvdXNlbEl0ZW1JbmRleCgpLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLl9nZXRPdmVyU2Nyb2xsRGlyZWN0aW9uKCksXG4gICAgICAgICAgICB3YWl0VG9SZXR1cm46IChwcm9taXNlKSA9PiB7XG4gICAgICAgICAgICAgIHdhaXRGb3JBY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4gdGhpcy5fc2Nyb2xsVG9LaWxsT3ZlclNjcm9sbCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQob3ZlcnNjcm9sbEV2ZW50KTtcblxuICAgICAgICBpZiAoIXdhaXRGb3JBY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxUb0tpbGxPdmVyU2Nyb2xsKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0TW9tZW50dW1TY3JvbGwoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xhc3REcmFnRXZlbnQgPSBudWxsO1xuXG4gICAgICBldmVudC5nZXN0dXJlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyYWl0XG4gICAgICovXG4gICAgX21peGluKHRyYWl0KSB7XG4gICAgICBPYmplY3Qua2V5cyh0cmFpdCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdGhpc1trZXldID0gdHJhaXRba2V5XTtcbiAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgX3N0YXJ0TW9tZW50dW1TY3JvbGwoKSB7XG4gICAgICBpZiAodGhpcy5fbGFzdERyYWdFdmVudCkge1xuICAgICAgICBjb25zdCB2ZWxvY2l0eSA9IHRoaXMuX2dldFNjcm9sbFZlbG9jaXR5KHRoaXMuX2xhc3REcmFnRXZlbnQpO1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IDAuMztcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBkdXJhdGlvbiAqIDEwMCAqIHZlbG9jaXR5O1xuICAgICAgICBjb25zdCBzY3JvbGwgPSB0aGlzLl9ub3JtYWxpemVTY3JvbGxQb3NpdGlvbihcbiAgICAgICAgICB0aGlzLl9zY3JvbGwgKyAodGhpcy5fZ2V0U2Nyb2xsRGVsdGEodGhpcy5fbGFzdERyYWdFdmVudCkgPiAwID8gLXNjcm9sbERlbHRhIDogc2Nyb2xsRGVsdGEpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsID0gc2Nyb2xsO1xuXG4gICAgICAgIGFuaW1pdCh0aGlzLl9nZXRDYXJvdXNlbEl0ZW1FbGVtZW50cygpKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMuX2dlbmVyYXRlU2Nyb2xsVHJhbnNmb3JtKHRoaXMuX3Njcm9sbClcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1pbmc6ICdjdWJpYy1iZXppZXIoLjEsIC43LCAuMSwgMSknXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucXVldWUoZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgdGhpcy5fdHJ5RmlyZVBvc3RDaGFuZ2VFdmVudCgpO1xuICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAucGxheSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9ub3JtYWxpemVTY3JvbGxQb3NpdGlvbihzY3JvbGwpIHtcbiAgICAgIGNvbnN0IG1heCA9IHRoaXMuX2NhbGN1bGF0ZU1heFNjcm9sbCgpO1xuXG4gICAgICBpZiAodGhpcy5pc0F1dG9TY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgICAgbGV0IGFyciA9IFtdO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtQ291bnQoKTsgaSsrKSB7XG4gICAgICAgICAgaWYgKG1heCA+PSBpICogc2l6ZSkge1xuICAgICAgICAgICAgYXJyLnB1c2goaSAqIHNpemUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhcnIucHVzaChtYXgpO1xuXG4gICAgICAgIGFyci5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgICAgbGVmdCA9IE1hdGguYWJzKGxlZnQgLSBzY3JvbGwpO1xuICAgICAgICAgIHJpZ2h0ID0gTWF0aC5hYnMocmlnaHQgLSBzY3JvbGwpO1xuXG4gICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXJyID0gYXJyLmZpbHRlcihmdW5jdGlvbihpdGVtLCBwb3MpIHtcbiAgICAgICAgICByZXR1cm4gIXBvcyB8fCBpdGVtICE9IGFycltwb3MgLSAxXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbGFzdFNjcm9sbCA9IHRoaXMuX2xhc3RBY3RpdmVJbmRleCAqIHNpemU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gTWF0aC5hYnMoc2Nyb2xsIC0gbGFzdFNjcm9sbCkgLyBzaXplO1xuXG4gICAgICAgIGlmIChzY3JvbGxSYXRpbyA8PSB0aGlzLmdldEF1dG9TY3JvbGxSYXRpbygpKSB7XG4gICAgICAgICAgcmV0dXJuIGxhc3RTY3JvbGw7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsUmF0aW8gPiB0aGlzLmdldEF1dG9TY3JvbGxSYXRpbygpICYmIHNjcm9sbFJhdGlvIDwgMS4wKSB7XG4gICAgICAgICAgaWYgKGFyclswXSA9PT0gbGFzdFNjcm9sbCAmJiBhcnIubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGFyclsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG1heCwgc2Nyb2xsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7QXJyYXl9XG4gICAgICovXG4gICAgX2dldENhcm91c2VsSXRlbUVsZW1lbnRzKCkge1xuICAgICAgcmV0dXJuIG9ucy5fdXRpbC5hcnJheUZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdvbnMtY2Fyb3VzZWwtaXRlbScpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Nyb2xsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqL1xuICAgIF9zY3JvbGxUbyhzY3JvbGwsIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgY29uc3QgaXNPdmVyc2Nyb2xsYWJsZSA9IHRoaXMuaXNPdmVyc2Nyb2xsYWJsZSgpO1xuXG4gICAgICBjb25zdCBub3JtYWxpemVTY3JvbGwgPSAoc2Nyb2xsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJhdGlvID0gMC4zNTtcblxuICAgICAgICBpZiAoc2Nyb2xsIDwgMCkge1xuICAgICAgICAgIHJldHVybiBpc092ZXJzY3JvbGxhYmxlID8gTWF0aC5yb3VuZChzY3JvbGwgKiByYXRpbykgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4U2Nyb2xsID0gdGhpcy5fY2FsY3VsYXRlTWF4U2Nyb2xsKCk7XG4gICAgICAgIGlmIChtYXhTY3JvbGwgPCBzY3JvbGwpIHtcbiAgICAgICAgICByZXR1cm4gaXNPdmVyc2Nyb2xsYWJsZSA/IG1heFNjcm9sbCArIE1hdGgucm91bmQoKHNjcm9sbCAtIG1heFNjcm9sbCkgKiByYXRpbykgOiBtYXhTY3JvbGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2Nyb2xsO1xuICAgICAgfTtcblxuICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSkge1xuICAgICAgICBhbmltaXQodGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtRWxlbWVudHMoKSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLl9nZW5lcmF0ZVNjcm9sbFRyYW5zZm9ybShub3JtYWxpemVTY3JvbGwoc2Nyb2xsKSlcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMC4zLFxuICAgICAgICAgICAgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBsYXkob3B0aW9ucy5jYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmltaXQodGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtRWxlbWVudHMoKSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLl9nZW5lcmF0ZVNjcm9sbFRyYW5zZm9ybShub3JtYWxpemVTY3JvbGwoc2Nyb2xsKSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wbGF5KG9wdGlvbnMuY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGVNYXhTY3JvbGwoKSB7XG4gICAgICBjb25zdCBtYXggPSB0aGlzLl9nZXRDYXJvdXNlbEl0ZW1Db3VudCgpICogdGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtU2l6ZSgpIC0gdGhpcy5fZ2V0RWxlbWVudFNpemUoKTtcbiAgICAgIHJldHVybiBNYXRoLmNlaWwobWF4IDwgMCA/IDAgOiBtYXgpOyAvLyBOZWVkIHRvIHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlLlxuICAgIH1cblxuICAgIF9pc092ZXJTY3JvbGwoc2Nyb2xsKSB7XG4gICAgICBpZiAoc2Nyb2xsIDwgMCB8fCBzY3JvbGwgPiB0aGlzLl9jYWxjdWxhdGVNYXhTY3JvbGwoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBfZ2V0T3ZlclNjcm9sbERpcmVjdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLl9pc1ZlcnRpY2FsKCkpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbCA8PSAwKSB7XG4gICAgICAgICAgcmV0dXJuICd1cCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICdkb3duJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbCA8PSAwKSB7XG4gICAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIF9zY3JvbGxUb0tpbGxPdmVyU2Nyb2xsKCkge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSAwLjQ7XG5cbiAgICAgIGlmICh0aGlzLl9zY3JvbGwgPCAwKSB7XG4gICAgICAgIGFuaW1pdCh0aGlzLl9nZXRDYXJvdXNlbEl0ZW1FbGVtZW50cygpKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMuX2dlbmVyYXRlU2Nyb2xsVHJhbnNmb3JtKDApXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNCwgLjEsIDEpJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBsYXkoKTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSB0aGlzLl9jYWxjdWxhdGVNYXhTY3JvbGwoKTtcblxuICAgICAgaWYgKG1heFNjcm9sbCA8IHRoaXMuX3Njcm9sbCkge1xuICAgICAgICBhbmltaXQodGhpcy5fZ2V0Q2Fyb3VzZWxJdGVtRWxlbWVudHMoKSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLl9nZW5lcmF0ZVNjcm9sbFRyYW5zZm9ybShtYXhTY3JvbGwpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC4xLCAuNCwgLjEsIDEpJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBsYXkoKTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsID0gbWF4U2Nyb2xsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAgICovXG4gICAgX2dldENhcm91c2VsSXRlbUNvdW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldENhcm91c2VsSXRlbUVsZW1lbnRzKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggY2Fyb3VzZWwgaXRlbSBsYXlvdXQuXG4gICAgICovXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgIC8vIEJ1ZyBmaXhcbiAgICAgIGlmICh0aGlzLl9nZXRDYXJvdXNlbEl0ZW1TaXplKCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9taXhpbih0aGlzLl9pc1ZlcnRpY2FsKCkgPyBWZXJ0aWNhbE1vZGVUcmFpdCA6IEhvcml6b250YWxNb2RlVHJhaXQpO1xuICAgICAgdGhpcy5fbGF5b3V0Q2Fyb3VzZWxJdGVtcygpO1xuXG4gICAgICBpZiAodGhpcy5fbGFzdFN0YXRlICYmIHRoaXMuX2xhc3RTdGF0ZS53aWR0aCA+IDApIHtcbiAgICAgICAgbGV0IHNjcm9sbCA9IHRoaXMuX3Njcm9sbDtcblxuICAgICAgICBpZiAodGhpcy5faXNPdmVyU2Nyb2xsKHNjcm9sbCkpIHtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxUb0tpbGxPdmVyU2Nyb2xsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNBdXRvU2Nyb2xsRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBzY3JvbGwgPSB0aGlzLl9ub3JtYWxpemVTY3JvbGxQb3NpdGlvbihzY3JvbGwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX3Njcm9sbFRvKHNjcm9sbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2F2ZUxhc3RTdGF0ZSgpO1xuXG4gICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVmcmVzaCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7Y2Fyb3VzZWw6IHRoaXN9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxuXG4gICAgZmlyc3QoKSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZUNhcm91c2VsSXRlbUluZGV4KDApO1xuICAgIH1cblxuICAgIGxhc3QoKSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZUNhcm91c2VsSXRlbUluZGV4KFxuICAgICAgICBNYXRoLm1heCh0aGlzLl9nZXRDYXJvdXNlbEl0ZW1Db3VudCgpIC0gMSwgMClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX3ByZXBhcmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICB0aGlzLl9sYXlvdXRDYXJvdXNlbEl0ZW1zKCk7XG4gICAgICB0aGlzLl9zZXR1cEluaXRpYWxJbmRleCgpO1xuXG4gICAgICB0aGlzLl9zYXZlTGFzdFN0YXRlKCk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2RpcmVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5fb25EaXJlY3Rpb25DaGFuZ2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZXRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuXG4gIGlmICghd2luZG93Lk9uc0Nhcm91c2VsRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNDYXJvdXNlbEVsZW1lbnQgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy1jYXJvdXNlbCcsIHtcbiAgICAgIHByb3RvdHlwZTogQ2Fyb3VzZWxFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIENvbHVtbkVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSkge1xuICAgICAgICB0aGlzLl91cGRhdGVXaWR0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ3dpZHRoJykge1xuICAgICAgICB0aGlzLl91cGRhdGVXaWR0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVXaWR0aCgpIHtcbiAgICAgIGxldCB3aWR0aCA9IHRoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgICAgaWYgKHR5cGVvZiB3aWR0aCAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdpZHRoID0gKCcnICsgd2lkdGgpLnRyaW0oKTtcbiAgICAgICAgd2lkdGggPSB3aWR0aC5tYXRjaCgvXlxcZCskLykgPyB3aWR0aCArICclJyA6IHdpZHRoO1xuXG4gICAgICAgIHRoaXMuc3R5bGUud2Via2l0Qm94RmxleCA9ICcwJztcbiAgICAgICAgdGhpcy5zdHlsZS53ZWJraXRGbGV4ID0gJzAgMCAnICsgd2lkdGg7XG4gICAgICAgIHRoaXMuc3R5bGUubW96Qm94RmxleCA9ICcwJztcbiAgICAgICAgdGhpcy5zdHlsZS5tb3pGbGV4ID0gJzAgMCAnICsgd2lkdGg7XG4gICAgICAgIHRoaXMuc3R5bGUubXNGbGV4ID0gJzAgMCAnICsgd2lkdGg7XG4gICAgICAgIHRoaXMuc3R5bGUuZmxleCA9ICcwIDAgJyArIHdpZHRoO1xuICAgICAgICB0aGlzLnN0eWxlLm1heFdpZHRoID0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zQ29sRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNDb2xFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtY29sJywge1xuICAgICAgcHJvdG90eXBlOiBDb2x1bW5FbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCBzY2hlbWUgPSB7XG4gICAgJy5kaWFsb2cnOiAnZGlhbG9nLS0qJ1xuICB9O1xuICBjb25zdCBBbmltYXRvckZhY3RvcnkgPSBvbnMuX2ludGVybmFsLkFuaW1hdG9yRmFjdG9yeTtcbiAgY29uc3QgQW5kcm9pZERpYWxvZ0FuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5BbmRyb2lkRGlhbG9nQW5pbWF0b3I7XG4gIGNvbnN0IElPU0RpYWxvZ0FuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5JT1NEaWFsb2dBbmltYXRvcjtcbiAgY29uc3QgU2xpZGVEaWFsb2dBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuU2xpZGVEaWFsb2dBbmltYXRvcjtcbiAgY29uc3QgRGlhbG9nQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLkRpYWxvZ0FuaW1hdG9yO1xuICBjb25zdCB0ZW1wbGF0ZVNvdXJjZSA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgPGRpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctbWFza1wiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZ1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjbGFzcyBEaWFsb2dFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgICAqL1xuICAgIGdldCBfbWFzaygpIHtcbiAgICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmRpYWxvZy1tYXNrJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICAgKi9cbiAgICBnZXQgX2RpYWxvZygpIHtcbiAgICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmRpYWxvZycpO1xuICAgIH1cblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcblxuICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fZG9vckxvY2sgPSBuZXcgRG9vckxvY2soKTtcbiAgICAgIHRoaXMuX2JvdW5kQ2FuY2VsID0gdGhpcy5fY2FuY2VsLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuX2FuaW1hdG9yRmFjdG9yeSA9IG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgICBhbmltYXRvcnM6IE9uc0RpYWxvZ0VsZW1lbnQuX2FuaW1hdG9yRGljdCxcbiAgICAgICAgYmFzZUNsYXNzOiBEaWFsb2dBbmltYXRvcixcbiAgICAgICAgYmFzZUNsYXNzTmFtZTogJ0RpYWxvZ0FuaW1hdG9yJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpLFxuICAgICAgICBkZWZhdWx0QW5pbWF0aW9uT3B0aW9uczogQW5pbWF0b3JGYWN0b3J5LnBhcnNlSlNPTlNhZmVseSh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jb21waWxlKCkge1xuICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcblxuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlU291cmNlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIGNvbnN0IGRpYWxvZyA9IHRlbXBsYXRlLmNoaWxkcmVuWzFdO1xuXG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgZGlhbG9nLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZSk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0aGlzLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgZGlhbG9nLmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0ZW1wbGF0ZS5maXJzdENoaWxkKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2RpYWxvZy5zdHlsZS56SW5kZXggPSAyMDAwMTtcbiAgICAgIHRoaXMuX21hc2suc3R5bGUuekluZGV4ID0gMjAwMDA7XG5cbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCduby1zdGF0dXMtYmFyLWZpbGwnLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICBnZXREZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcjtcbiAgICB9XG5cbiAgICBfb25EZXZpY2VCYWNrQnV0dG9uKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5pc0NhbmNlbGFibGUoKSkge1xuICAgICAgICB0aGlzLl9jYW5jZWwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50LmNhbGxQYXJlbnRIYW5kbGVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NhbmNlbCgpIHtcbiAgICAgIGlmICh0aGlzLmlzQ2FuY2VsYWJsZSgpKSB7XG4gICAgICAgIHRoaXMuaGlkZSh7XG4gICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NhbmNlbCcsIHtidWJibGVzOiB0cnVlfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl0gYW5pbWF0aW9uIHR5cGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc10gYW5pbWF0aW9uIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja10gY2FsbGJhY2sgYWZ0ZXIgZGlhbG9nIGlzIHNob3duXG4gICAgICovXG4gICAgc2hvdyhvcHRpb25zID0ge30pIHtcbiAgICAgIGxldCBjYW5jZWwgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwcmVzaG93Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBkaWFsb2c6IHRoaXMsXG4gICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghY2FuY2VsKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcblxuICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuXG4gICAgICAgICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG5cbiAgICAgICAgICBhbmltYXRvci5zaG93KHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdW5sb2NrKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3Bvc3RzaG93Jywge1xuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXRhaWw6IHtkaWFsb2c6IHRoaXN9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGUgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdIGNhbGxiYWNrIGFmdGVyIGRpYWxvZyBpcyBoaWRkZW5cbiAgICAgKi9cbiAgICBoaWRlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgbGV0IGNhbmNlbCA9IGZhbHNlO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3ByZWhpZGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGRpYWxvZzogdGhpcyxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgaWYgKCFjYW5jZWwpIHtcbiAgICAgICAgdGhpcy5fZG9vckxvY2sud2FpdFVubG9jaygoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICAgICAgYW5pbWF0b3IuaGlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3Bvc3RoaWRlJywge1xuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXRhaWw6IHtkaWFsb2c6IHRoaXN9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGRpYWxvZy5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiBkaWFsb2cgaXMgdmlzaWJsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTaG93bigpIHtcbiAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIGRpYWxvZyBpcyBjYW5jZWxhYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0NhbmNlbGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2NhbmNlbGFibGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0RGlzYWJsZWQoZGlzYWJsZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlzYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiBkaWFsb2cgaXMgZGlzYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZSBkaWFsb2cgY2FuY2VsYWJsZSBvciB1bmNhbmNlbGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0Q2FuY2VsYWJsZShjYW5jZWxhYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbmNlbGFibGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FuY2VsYWJsZSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2FuY2VsYWJsZScsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdjYW5jZWxhYmxlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2RldmljZUJhY2tCdXR0b25IYW5kbGVyID0gb25zLl9kZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlci5jcmVhdGVIYW5kbGVyKHRoaXMsIHRoaXMuX29uRGV2aWNlQmFja0J1dHRvbi5iaW5kKHRoaXMpKTtcblxuICAgICAgdGhpcy5fbWFzay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kQ2FuY2VsLCBmYWxzZSk7XG5cbiAgICB9XG5cbiAgICBkZXRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgICB0aGlzLl9tYXNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRDYW5jZWwuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zRGlhbG9nRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNEaWFsb2dFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtZGlhbG9nJywge1xuICAgICAgcHJvdG90eXBlOiBEaWFsb2dFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuXG4gICAgd2luZG93Lk9uc0RpYWxvZ0VsZW1lbnQuX2FuaW1hdG9yRGljdCA9IHtcbiAgICAgICdkZWZhdWx0Jzogb25zLnBsYXRmb3JtLmlzQW5kcm9pZCgpID8gQW5kcm9pZERpYWxvZ0FuaW1hdG9yIDogSU9TRGlhbG9nQW5pbWF0b3IsXG4gICAgICAnZmFkZSc6IG9ucy5wbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFuZHJvaWREaWFsb2dBbmltYXRvciA6IElPU0RpYWxvZ0FuaW1hdG9yLFxuICAgICAgJ3NsaWRlJzogU2xpZGVEaWFsb2dBbmltYXRvcixcbiAgICAgICdub25lJzogRGlhbG9nQW5pbWF0b3JcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge0RpYWxvZ0FuaW1hdG9yfSBBbmltYXRvclxuICAgICAqL1xuICAgIHdpbmRvdy5PbnNEaWFsb2dFbGVtZW50LnJlZ2lzdGVyQW5pbWF0b3IgPSBmdW5jdGlvbihuYW1lLCBBbmltYXRvcikge1xuICAgICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgRGlhbG9nQW5pbWF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJBbmltYXRvclwiIHBhcmFtIG11c3QgaW5oZXJpdCBEaWFsb2dBbmltYXRvcicpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gICAgfTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBHZXN0dXJlRGV0ZWN0b3JFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbmV3IG9ucy5HZXN0dXJlRGV0ZWN0b3IodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zR2VzdHVyZURldGVjdG9yRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNHZXN0dXJlRGV0ZWN0b3JFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtZ2VzdHVyZS1kZXRlY3RvcicsIHtcbiAgICAgIHByb3RvdHlwZTogR2VzdHVyZURldGVjdG9yRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBJY29uRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChbJ2ljb24nLCAnc2l6ZSddLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGUoKSB7XG4gICAgICB0aGlzLl9jbGVhbkNsYXNzQXR0cmlidXRlKCk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkZWQgPSB0aGlzLl9idWlsZENsYXNzQW5kU3R5bGUodGhpcyk7XG5cbiAgICAgIGZvciAobGV0IGtleSBpbiBidWlsZGVkLnN0eWxlKSB7XG4gICAgICAgIGlmIChidWlsZGVkLnN0eWxlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0eWxlW2tleV0gPSBidWlsZGVkLnN0eWxlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnVpbGRlZC5jbGFzc0xpc3QuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB1bm5lZWRlZCBjbGFzcyB2YWx1ZS5cbiAgICAgKi9cbiAgICBfY2xlYW5DbGFzc0F0dHJpYnV0ZSgpIHtcbiAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuY2xhc3NMaXN0O1xuXG4gICAgICBBcnJheS5hcHBseShudWxsLCB0aGlzLmNsYXNzTGlzdCkuZmlsdGVyKGtsYXNzID0+IHtcbiAgICAgICAgcmV0dXJuIGtsYXNzID09PSAnZmEnIHx8IGtsYXNzLmluZGV4T2YoJ2ZhLScpID09PSAwIHx8IGtsYXNzLmluZGV4T2YoJ2lvbi0nKSA9PT0gMDtcbiAgICAgIH0pLmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNsYXNzTGlzdC5yZW1vdmUoJ29ucy1pY29uLS1pb24nKTtcbiAgICB9XG5cbiAgICBfYnVpbGRDbGFzc0FuZFN0eWxlKCkge1xuICAgICAgY29uc3QgY2xhc3NMaXN0ID0gWydvbnMtaWNvbiddO1xuICAgICAgY29uc3Qgc3R5bGUgPSB7fTtcblxuICAgICAgLy8gaWNvblxuICAgICAgY29uc3QgaWNvbk5hbWUgPSAnJyArIHRoaXMuZ2V0QXR0cmlidXRlKCdpY29uJyk7XG4gICAgICBpZiAoaWNvbk5hbWUuaW5kZXhPZignaW9uLScpID09PSAwKSB7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKGljb25OYW1lKTtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goJ29ucy1pY29uLS1pb24nKTtcbiAgICAgIH0gZWxzZSBpZiAoaWNvbk5hbWUuaW5kZXhPZignZmEtJykgPT09IDApIHtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goaWNvbk5hbWUpO1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgnZmEnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKCdmYScpO1xuICAgICAgICBjbGFzc0xpc3QucHVzaCgnZmEtJyArIGljb25OYW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2l6ZVxuICAgICAgY29uc3Qgc2l6ZSA9ICcnICsgdGhpcy5nZXRBdHRyaWJ1dGUoJ3NpemUnKTtcbiAgICAgIGlmIChzaXplLm1hdGNoKC9eWzEtNV14fGxnJC8pKSB7XG4gICAgICAgIGNsYXNzTGlzdC5wdXNoKCdmYS0nICsgc2l6ZSk7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2ZvbnQtc2l6ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGUuZm9udFNpemUgPSBzaXplO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc0xpc3Q6IGNsYXNzTGlzdCxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0ljb25FbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0ljb25FbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtaWNvbicsIHtcbiAgICAgIHByb3RvdHlwZTogSWNvbkVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0geycnOiAnbGlzdF9faGVhZGVyLS0qJ307XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuXG4gIGNsYXNzIExpc3RIZWFkZXJFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdsaXN0X19oZWFkZXInKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0xpc3RIZWFkZXJFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0xpc3RIZWFkZXJFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtbGlzdC1oZWFkZXInLCB7XG4gICAgICBwcm90b3R5cGU6IExpc3RIZWFkZXJFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHNjaGVtZSA9IHsnJzogJ2xpc3RfX2l0ZW0tLSonfTtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG5cbiAgY2xhc3MgTGlzdEl0ZW1FbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdsaXN0X19pdGVtJyk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBvbnMuR2VzdHVyZURldGVjdG9yKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPbkRyYWcgPSB0aGlzLl9vbkRyYWcuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLl9ib3VuZE9uRHJhZyk7XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMuX2JvdW5kT25EcmFnKTtcbiAgICB9XG5cbiAgICBfb25EcmFnKGV2ZW50KSB7XG4gICAgICBsZXQgZyA9IGV2ZW50Lmdlc3R1cmU7XG4gICAgICAvLyBQcmV2ZW50IHZlcnRpY2FsIHNjcm9sbGluZyBpZiB0aGUgdXNlcnMgcGFucyBsZWZ0IG9yIHJpZ2h0LlxuICAgICAgaWYgKHRoaXMuX3Nob3VsZExvY2tPbkRyYWcoKSAmJiBbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGcuZGlyZWN0aW9uKSA+IC0xKSB7XG4gICAgICAgIGcucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfc2hvdWxkTG9ja09uRHJhZygpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnbG9jay1vbi1kcmFnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zTGlzdEl0ZW1FbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0xpc3RJdGVtRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLWxpc3QtaXRlbScsIHtcbiAgICAgIHByb3RvdHlwZTogTGlzdEl0ZW1FbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHNjaGVtZSA9IHsnJzogJ2xpc3QtLSonfTtcbiAgY29uc3QgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG5cbiAgY2xhc3MgTGlzdEVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2xpc3QnKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc0xpc3RFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc0xpc3RFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtbGlzdCcsIHtcbiAgICAgIHByb3RvdHlwZTogTGlzdEVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcnOiAnbW9kYWwtLSonLFxuICAgICdtb2RhbF9fY29udGVudCc6ICdtb2RhbC0tKl9fY29udGVudCdcbiAgfTtcblxuICBjb25zdCBBbmltYXRvckZhY3RvcnkgPSBvbnMuX2ludGVybmFsLkFuaW1hdG9yRmFjdG9yeTtcbiAgY29uc3QgTW9kYWxBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTW9kYWxBbmltYXRvcjtcbiAgY29uc3QgRmFkZU1vZGFsQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLkZhZGVNb2RhbEFuaW1hdG9yO1xuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcblxuICBjbGFzcyBNb2RhbEVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2Rvb3JMb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgICAgYW5pbWF0b3JzOiBPbnNNb2RhbEVsZW1lbnQuX2FuaW1hdG9yRGljdCxcbiAgICAgICAgYmFzZUNsYXNzOiBNb2RhbEFuaW1hdG9yLFxuICAgICAgICBiYXNlQ2xhc3NOYW1lOiAnTW9kYWxBbmltYXRvcicsXG4gICAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnM6IEFuaW1hdG9yRmFjdG9yeS5wYXJzZUpTT05TYWZlbHkodGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykpIHx8IHt9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICAgIH1cblxuICAgIGdldERldmljZUJhY2tCdXR0b25IYW5kbGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RldmljZUJhY2tCdXR0b25IYW5kbGVyO1xuICAgIH1cblxuICAgIHNldERldmljZUJhY2tCdXR0b25IYW5kbGVyKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gICAgICB0aGlzLl9vbkRldmljZUJhY2tCdXR0b24gPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBfb25EZXZpY2VCYWNrQnV0dG9uKCkge1xuICAgICAgLy8gRG8gbm90aGluZyBhbmQgc3RvcCBkZXZpY2UtYmFja2J1dHRvbiBoYW5kbGVyIGNoYWluLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF9jb21waWxlKCkge1xuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdtb2RhbCcpO1xuXG4gICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ21vZGFsX19jb250ZW50Jyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkTm9kZXNbMF07XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgIHdyYXBwZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICBpZiAodGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICBzZXRJbW1lZGlhdGUodGhpcy5fZW5zdXJlTm9kZVBvc2l0aW9uLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgdGhpcy5fb25EZXZpY2VCYWNrQnV0dG9uLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIF9lbnN1cmVOb2RlUG9zaXRpb24oKSB7XG4gICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fCB0aGlzLmhhc0F0dHJpYnV0ZSgnaW5saW5lJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgcGFnZSA9IHBhZ2UucGFyZW50Tm9kZTtcblxuICAgICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYWdlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwYWdlLl9yZWdpc3RlckV4dHJhRWxlbWVudCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpc1Nob3duKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgbW9kYWwgdmlldy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBhbmltYXRpb24gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXSBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXSBjYWxsYmFjayBhZnRlciBtb2RhbCBpcyBzaG93blxuICAgICAqL1xuICAgIHNob3cob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcblxuICAgICAgdGhpcy5fZG9vckxvY2sud2FpdFVubG9jaygoKSA9PiB7XG4gICAgICAgIHZhciB1bmxvY2sgPSB0aGlzLl9kb29yTG9jay5sb2NrKCksXG4gICAgICAgICAgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ3RhYmxlJztcbiAgICAgICAgYW5pbWF0b3Iuc2hvdyh0aGlzLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSBtb2RhbCB2aWV3LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdIGNhbGxiYWNrIGFmdGVyIG1vZGFsIGlzIHRvZ2dsZWRcbiAgICAgKi9cbiAgICB0b2dnbGUoKSB7XG4gICAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGUgbW9kYWwgdmlldy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBhbmltYXRpb24gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXSBhbmltYXRpb24gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXSBjYWxsYmFjayBhZnRlciBtb2RhbCBpcyBoaWRkZW5cbiAgICAgKi9cbiAgICBoaWRlKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICB2YXIgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICB2YXIgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpLFxuICAgICAgICAgIGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICAgIGFuaW1hdG9yLmhpZGUodGhpcywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zTW9kYWxFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc01vZGFsRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLW1vZGFsJywge1xuICAgICAgcHJvdG90eXBlOiBNb2RhbEVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG5cbiAgICB3aW5kb3cuT25zTW9kYWxFbGVtZW50Ll9hbmltYXRvckRpY3QgPSB7XG4gICAgICAnZGVmYXVsdCc6IE1vZGFsQW5pbWF0b3IsXG4gICAgICAnZmFkZSc6IEZhZGVNb2RhbEFuaW1hdG9yLFxuICAgICAgJ25vbmUnOiBNb2RhbEFuaW1hdG9yXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICAgKi9cbiAgICB3aW5kb3cuT25zTW9kYWxFbGVtZW50LnJlZ2lzdGVyQW5pbWF0b3IgPSBmdW5jdGlvbihuYW1lLCBBbmltYXRvcikge1xuICAgICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kYWxBbmltYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIkFuaW1hdG9yXCIgcGFyYW0gbXVzdCBpbmhlcml0IE1vZGFsQW5pbWF0b3InKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICAgIH07XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgQW5pbWF0b3JGYWN0b3J5ID0gb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3Rvcnk7XG4gIGNvbnN0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yO1xuICBjb25zdCBJT1NTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuSU9TU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3I7XG4gIGNvbnN0IFNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yID0gb25zLl9pbnRlcm5hbC5TaW1wbGVTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTGlmdE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuRmFkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgTnVsbE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA9IG9ucy5faW50ZXJuYWwuTnVsbE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcjtcbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcbiAgY29uc3QgQXN5bmNIb29rID0gb25zLl9pbnRlcm5hbC5Bc3luY0hvb2s7XG4gIGNvbnN0IE5hdmlnYXRvclBhZ2UgPSBvbnMuX2ludGVybmFsLk5hdmlnYXRvclBhZ2U7XG5cbiAgY2xhc3MgTmF2aWdhdG9yRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fZG9vckxvY2sgPSBuZXcgRG9vckxvY2soKTtcbiAgICAgIHRoaXMuX3BhZ2VzID0gW107XG4gICAgICB0aGlzLl9ib3VuZE9uRGV2aWNlQmFja0J1dHRvbiA9IHRoaXMuX29uRGV2aWNlQmFja0J1dHRvbi5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5faXNQdXNoaW5nID0gdGhpcy5faXNQb3BwaW5nID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuX2luaXRpYWxIVE1MID0gdGhpcy5pbm5lckhUTUw7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgdGhpcy5fY29tcGlsZVBhZ2VIb29rID0gbmV3IEFzeW5jSG9vaygpO1xuICAgICAgdGhpcy5fbGlua1BhZ2VIb29rID0gbmV3IEFzeW5jSG9vaygpO1xuXG4gICAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgICAgYW5pbWF0b3JzOiB3aW5kb3cuT25zTmF2aWdhdG9yRWxlbWVudC5fdHJhbnNpdGlvbkFuaW1hdG9yRGljdCxcbiAgICAgICAgYmFzZUNsYXNzOiBOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IsXG4gICAgICAgIGJhc2VDbGFzc05hbWU6ICdOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3InLFxuICAgICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJyksXG4gICAgICAgIGRlZmF1bHRBbmltYXRpb25PcHRpb25zOiBBbmltYXRvckZhY3RvcnkucGFyc2VKU09OU2FmZWx5KHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpKSB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBjYW5Qb3BQYWdlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmxlbmd0aCA+IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcGFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICovXG4gICAgcmVwbGFjZVBhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGNvbnN0IG9uVHJhbnNpdGlvbkVuZCA9IG9wdGlvbnMub25UcmFuc2l0aW9uRW5kIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIG9wdGlvbnMub25UcmFuc2l0aW9uRW5kID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcGFnZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuX3BhZ2VzW3RoaXMuX3BhZ2VzLmxlbmd0aCAtIDJdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBvblRyYW5zaXRpb25FbmQoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnB1c2hQYWdlKHBhZ2UsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvcHMgY3VycmVudCBwYWdlIGZyb20gdGhlIHBhZ2Ugc3RhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlZnJlc2hdXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMub25UcmFuc2l0aW9uRW5kXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2FuY2VsSWZSdW5uaW5nXVxuICAgICAqL1xuICAgIHBvcFBhZ2Uob3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmIChvcHRpb25zLmNhbmNlbElmUnVubmluZyAmJiB0aGlzLl9pc1BvcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbnMtbmF2aWdhdG9yXFwncyBwYWdlIHN0YWNrIGlzIGVtcHR5LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2VtaXRQcmVQb3BFdmVudCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlZnJlc2gpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gMjtcblxuICAgICAgICAgIGlmICghdGhpcy5fcGFnZXNbaW5kZXhdLnBhZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVmcmVzaCBvcHRpb24gY2Fubm90IGJlIHVzZWQgd2l0aCBwYWdlcyBkaXJlY3RseSBpbnNpZGUgdGhlIE5hdmlnYXRvci4gVXNlIG9ucy10ZW1wbGF0ZSBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyh0aGlzLl9wYWdlc1tpbmRleF0ucGFnZSkudGhlbih0ZW1wbGF0ZUhUTUwgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NyZWF0ZVBhZ2VFbGVtZW50KHRlbXBsYXRlSFRNTCk7XG4gICAgICAgICAgICBjb25zdCBwYWdlT2JqZWN0ID0gdGhpcy5fY3JlYXRlUGFnZU9iamVjdCh0aGlzLl9wYWdlc1tpbmRleF0ucGFnZSwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NvbXBpbGVQYWdlSG9vay5ydW4oKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fbGlua1BhZ2VIb29rLnJ1bigoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIHRoaXMuX3BhZ2VzW2luZGV4XSA/IHRoaXMuX3BhZ2VzW2luZGV4XS5lbGVtZW50IDogbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFnZXMuc3BsaWNlKGluZGV4LCAwLCBwYWdlT2JqZWN0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3BhZ2VzW2luZGV4ICsgMV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvcFBhZ2Uob3B0aW9ucywgdW5sb2NrKTtcbiAgICAgICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9LCBlbGVtZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BvcFBhZ2Uob3B0aW9ucywgdW5sb2NrKTtcbiAgICAgICAgfVxuXG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIF9wb3BQYWdlKG9wdGlvbnMsIHVubG9jaykge1xuICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5fcGFnZXMucG9wKCk7XG5cbiAgICAgIGlmICh0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAxXSkge1xuICAgICAgICB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAxXS5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRlclBhZ2UgPSB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAxXTtcblxuICAgICAgLy8gZm9yIFwicG9zdHBvcFwiIGV2ZW50XG4gICAgICBjb25zdCBldmVudERldGFpbCA9IHtcbiAgICAgICAgbGVhdmVQYWdlOiBsZWF2ZVBhZ2UsXG4gICAgICAgIGVudGVyUGFnZTogdGhpcy5fcGFnZXNbdGhpcy5fcGFnZXMubGVuZ3RoIC0gMV0sXG4gICAgICAgIG5hdmlnYXRvcjogdGhpc1xuICAgICAgfTtcblxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGxlYXZlUGFnZS5kZXN0cm95KCk7XG5cbiAgICAgICAgdGhpcy5faXNQb3BwaW5nID0gZmFsc2U7XG4gICAgICAgIHVubG9jaygpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdwb3N0cG9wJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBldmVudERldGFpbFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICBldmVudC5sZWF2ZVBhZ2UgPSBudWxsO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblRyYW5zaXRpb25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRpb25zLm9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9pc1BvcHBpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zLCBsZWF2ZVBhZ2Uub3B0aW9ucy5hbmltYXRvcik7XG4gICAgICBhbmltYXRvci5wb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBwYWdlIG9iamVjdCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIHBhZ2VVcmwgaW50byB0aGUgcGFnZSBzdGFjayBhbmRcbiAgICAgKiBpZiBvcHRpb25zIG9iamVjdCBpcyBzcGVjaWZpZWQsIGFwcGx5IHRoZSBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtTdHJpbmcvTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAgICovXG4gICAgaW5zZXJ0UGFnZShpbmRleCwgcGFnZSwgb3B0aW9ucykge1xuXG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0LiBZb3Ugc3VwcGxpZWQgJyArIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVJbmRleCA9IGluZGV4ID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgIGluZGV4ID0gTWF0aC5hYnModGhpcy5wYWdlcy5sZW5ndGggKyBpbmRleCkgJSB0aGlzLnBhZ2VzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9O1xuXG4gICAgICBpbmRleCA9IG5vcm1hbGl6ZUluZGV4KGluZGV4KTtcblxuICAgICAgaWYgKGluZGV4ID49IHRoaXMucGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnB1c2hQYWdlLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICBjb25zdCB1bmxvY2sgPSB0aGlzLl9kb29yTG9jay5sb2NrKCk7XG5cbiAgICAgICAgb25zLl9pbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jKHBhZ2UpLnRoZW4odGVtcGxhdGVIVE1MID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY3JlYXRlUGFnZUVsZW1lbnQodGVtcGxhdGVIVE1MKTtcblxuICAgICAgICAgIGNvbnN0IHBhZ2VPYmplY3QgPSB0aGlzLl9jcmVhdGVQYWdlT2JqZWN0KHBhZ2UsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgdGhpcy5fY29tcGlsZVBhZ2VIb29rLnJ1bihlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xpbmtQYWdlSG9vay5ydW4oZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoZWxlbWVudCwgdGhpcy5fcGFnZXNbaW5kZXhdLmVsZW1lbnQpO1xuICAgICAgICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXgsIDAsIHBhZ2VPYmplY3QpO1xuXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVubG9jaygpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICB9LCAxMDAwIC8gNjApO1xuICAgICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgcGFnZSdzIG5hdmlnYXRvciBpdGVtLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGFjY2VzcyBvcHRpb25zIHBhc3NlZCBieSBwdXNoUGFnZSgpIG9yIHJlc2V0VG9QYWdlKCkgbWV0aG9kLlxuICAgICAqIGVnLiBvbnMubmF2aWdhdG9yLmdldEN1cnJlbnRQYWdlKCkub3B0aW9uc1xuICAgICAqXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIGdldEN1cnJlbnRQYWdlKCkge1xuICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzW3RoaXMuX3BhZ2VzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIF9kZXN0cm95KCkge1xuICAgICAgdGhpcy5fcGFnZXMuZm9yRWFjaChmdW5jdGlvbihwYWdlKSB7XG4gICAgICAgIHBhZ2UuZGVzdHJveSgpO1xuICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBnZXQgcGFnZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFnZXMuc2xpY2UoMCk7XG4gICAgfVxuXG4gICAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhpcy5wb3BQYWdlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBwYWdlIHN0YWNrIGFuZCBhZGQgdGhlIHNwZWNpZmllZCBwYWdlVXJsIHRvIHRoZSBwYWdlIHN0YWNrLlxuICAgICAqIElmIG9wdGlvbnMgb2JqZWN0IGlzIHNwZWNpZmllZCwgYXBwbHkgdGhlIG9wdGlvbnMuXG4gICAgICogdGhlIG9wdGlvbnMgb2JqZWN0IGluY2x1ZGUgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgbmF2aWdhdG9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICovXG4gICAgcmVzZXRUb1BhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmICghb3B0aW9ucy5hbmltYXRvciAmJiAhb3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgb3B0aW9ucy5hbmltYXRpb24gPSAnbm9uZSc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uVHJhbnNpdGlvbkVuZCA9IG9wdGlvbnMub25UcmFuc2l0aW9uRW5kIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIG9wdGlvbnMub25UcmFuc2l0aW9uRW5kID0gKCkgPT4ge1xuICAgICAgICB3aGlsZSAodGhpcy5fcGFnZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMuX3BhZ2VzLnNoaWZ0KCkuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIG9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5wdXNoUGFnZShwYWdlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCB0aGlzLl9ib3VuZE9uRGV2aWNlQmFja0J1dHRvbik7XG5cbiAgICAgIHdpbmRvdy5PbnNOYXZpZ2F0b3JFbGVtZW50LnJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2xpbmtQYWdlSG9vay5mcmVlemUoKTtcbiAgICAgICAgICB0aGlzLl9jb21waWxlUGFnZUhvb2suZnJlZXplKCk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSAodGhpcy5faW5pdGlhbEhUTUwgfHwgJycpLm1hdGNoKC9eXFxzKjxvbnMtcGFnZS8pID8gdGhpcy5faW5pdGlhbEhUTUwgOiAnPG9ucy1wYWdlPicgKyB0aGlzLl9pbml0aWFsSFRNTCArICc8L29ucy1wYWdlPic7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY3JlYXRlUGFnZUVsZW1lbnQoaHRtbCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3B1c2hQYWdlRE9NKCcnLCBlbGVtZW50LCB7fSwgZnVuY3Rpb24oKSB7fSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFBhZ2UodGhpcy5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKSwge2FuaW1hdGlvbjogJ25vbmUnfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2luaXRpYWxIVE1MID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgcGFnZVVybCBpbnRvIHRoZSBwYWdlIHN0YWNrIGFuZFxuICAgICAqIGlmIG9wdGlvbnMgb2JqZWN0IGlzIHNwZWNpZmllZCwgYXBwbHkgdGhlIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge1N0cmluZy9OYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3J9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5vblRyYW5zaXRpb25FbmRdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jYW5jZWxJZlJ1bm5pbmddXG4gICAgICovXG4gICAgcHVzaFBhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgIGlmIChvcHRpb25zLmNhbmNlbElmUnVubmluZyAmJiB0aGlzLl9pc1B1c2hpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuIFlvdSBzdXBwbGllZCAnICsgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9lbWl0UHJlUHVzaEV2ZW50KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kb29yTG9jay53YWl0VW5sb2NrKCgpID0+IHRoaXMuX3B1c2hQYWdlKHBhZ2UsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBfcHVzaFBhZ2UocGFnZSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgdW5sb2NrID0gdGhpcy5fZG9vckxvY2subG9jaygpO1xuICAgICAgY29uc3QgZG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB1bmxvY2soKTtcbiAgICAgIH07XG5cbiAgICAgIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKHRlbXBsYXRlSFRNTCA9PiB7XG4gICAgICAgIHRoaXMuX3B1c2hQYWdlRE9NKHBhZ2UsIHRoaXMuX2NyZWF0ZVBhZ2VFbGVtZW50KHRlbXBsYXRlSFRNTCksIG9wdGlvbnMsIGRvbmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2UgUGFnZSBuYW1lLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbdW5sb2NrXVxuICAgICAqL1xuICAgIF9wdXNoUGFnZURPTShwYWdlLCBlbGVtZW50LCBvcHRpb25zLCB1bmxvY2spIHtcblxuICAgICAgdW5sb2NrID0gdW5sb2NrIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgY29uc3QgcGFnZU9iamVjdCA9IHRoaXMuX2NyZWF0ZVBhZ2VPYmplY3QocGFnZSwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgIC8vIGZvciBcInBvc3RwdXNoXCIgZXZlbnRcbiAgICAgIGNvbnN0IGV2ZW50RGV0YWlsID0ge1xuICAgICAgICBlbnRlclBhZ2U6IHBhZ2VPYmplY3QsXG4gICAgICAgIGxlYXZlUGFnZTogdGhpcy5fcGFnZXNbdGhpcy5fcGFnZXMubGVuZ3RoIC0gMV0sXG4gICAgICAgIG5hdmlnYXRvcjogdGhpc1xuICAgICAgfTtcblxuICAgICAgdGhpcy5fcGFnZXMucHVzaChwYWdlT2JqZWN0KTtcblxuICAgICAgY29uc3QgZG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fcGFnZXNbdGhpcy5fcGFnZXMubGVuZ3RoIC0gMl0pIHtcbiAgICAgICAgICB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAyXS5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pc1B1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgdW5sb2NrKCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3Bvc3RwdXNoJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBldmVudERldGFpbFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblRyYW5zaXRpb25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRpb25zLm9uVHJhbnNpdGlvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLl9pc1B1c2hpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLl9jb21waWxlUGFnZUhvb2sucnVuKGVsZW1lbnQgPT4ge1xuICAgICAgICB0aGlzLl9saW5rUGFnZUhvb2sucnVuKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5fcGFnZXMuc2xpY2UoLTIpWzBdO1xuICAgICAgICAgICAgICBjb25zdCBlbnRlclBhZ2UgPSB0aGlzLl9wYWdlcy5zbGljZSgtMSlbMF07XG5cbiAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgb3B0aW9ucy5hbmltYXRvci5wdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBkb25lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAxMDAwIC8gNjApO1xuICAgICAgICB9LCBlbGVtZW50KTtcbiAgICAgIH0sIGVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgaWYgZXZlbnQgaXMgY2FuY2VsZWQuXG4gICAgICovXG4gICAgX2VtaXRQcmVQdXNoRXZlbnQoKSB7XG4gICAgICBsZXQgaXNDYW5jZWxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3ByZXB1c2gnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG5hdmlnYXRvcjogdGhpcyxcbiAgICAgICAgICBjdXJyZW50UGFnZTogdGhpcy5fcGFnZXMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Q3VycmVudFBhZ2UoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNDYW5jZWxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgcmV0dXJuIGlzQ2FuY2VsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciBpZiBldmVudCBpcyBjYW5jZWxlZC5cbiAgICAgKi9cbiAgICBfZW1pdFByZVBvcEV2ZW50KCkge1xuICAgICAgbGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5nZXRDdXJyZW50UGFnZSgpO1xuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3ByZXBvcCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgbmF2aWdhdG9yOiB0aGlzLFxuICAgICAgICAgIC8vIFRPRE86IGN1cnJlbnRQYWdlIHdpbGwgYmUgZGVwcmVjYXRlZFxuICAgICAgICAgIGN1cnJlbnRQYWdlOiBsZWF2ZVBhZ2UsXG4gICAgICAgICAgbGVhdmVQYWdlOiBsZWF2ZVBhZ2UsXG4gICAgICAgICAgZW50ZXJQYWdlOiB0aGlzLl9wYWdlc1t0aGlzLl9wYWdlcy5sZW5ndGggLSAyXSxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNDYW5jZWxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgIHJldHVybiBpc0NhbmNlbGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKi9cbiAgICBfY3JlYXRlUGFnZU9iamVjdChwYWdlLCBlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zLmFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICByZXR1cm4gbmV3IE5hdmlnYXRvclBhZ2Uoe1xuICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICBuYXZpZ2F0b3I6IHRoaXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVQYWdlRWxlbWVudCh0ZW1wbGF0ZUhUTUwpIHtcbiAgICAgIGNvbnN0IHBhZ2VFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KG9ucy5faW50ZXJuYWwubm9ybWFsaXplUGFnZUhUTUwoJycgKyB0ZW1wbGF0ZUhUTUwpKTtcblxuICAgICAgaWYgKHBhZ2VFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYW4gXCJvbnMtcGFnZVwiIGVsZW1lbnQgdG8gXCJvbnMtbmF2aWdhdG9yXCIuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWdlRWxlbWVudDtcbiAgICB9XG5cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc05hdmlnYXRvckVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zTmF2aWdhdG9yRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLW5hdmlnYXRvcicsIHtcbiAgICAgIHByb3RvdHlwZTogTmF2aWdhdG9yRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcblxuICAgIHdpbmRvdy5PbnNOYXZpZ2F0b3JFbGVtZW50Ll90cmFuc2l0aW9uQW5pbWF0b3JEaWN0ID0ge1xuICAgICAgJ2RlZmF1bHQnOiBvbnMucGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBTaW1wbGVTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvciA6IElPU1NsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ3NsaWRlJzogb25zLnBsYXRmb3JtLmlzQW5kcm9pZCgpID8gU2ltcGxlU2xpZGVOYXZpZ2F0b3JUcmFuc2l0aW9uQW5pbWF0b3IgOiBJT1NTbGlkZU5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcixcbiAgICAgICdzaW1wbGVzbGlkZSc6IFNpbXBsZVNsaWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ2xpZnQnOiBMaWZ0TmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ2ZhZGUnOiBGYWRlTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yLFxuICAgICAgJ25vbmUnOiBOdWxsTmF2aWdhdG9yVHJhbnNpdGlvbkFuaW1hdG9yXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICAgKi9cbiAgICB3aW5kb3cuT25zTmF2aWdhdG9yRWxlbWVudC5yZWdpc3RlckFuaW1hdG9yID0gZnVuY3Rpb24obmFtZSwgQW5pbWF0b3IpIHtcbiAgICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIkFuaW1hdG9yXCIgcGFyYW0gbXVzdCBpbmhlcml0IE5hdmlnYXRvclRyYW5zaXRpb25BbmltYXRvcicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmFuc2l0aW9uQW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gICAgfTtcblxuICAgIHdpbmRvdy5PbnNOYXZpZ2F0b3JFbGVtZW50LnJlYWR5ID0gZnVuY3Rpb24oZWxlbWVudCwgZG9uZSkge1xuICAgICAgZG9uZSgpO1xuICAgIH07XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcnOiAncGFnZS0tKicsXG4gICAgJy5wYWdlX19jb250ZW50JzogJ3BhZ2UtLSpfX2NvbnRlbnQnLFxuICAgICcucGFnZV9fYmFja2dyb3VuZCc6ICdwYWdlLS0qX19iYWNrZ3JvdW5kJ1xuICB9O1xuICBjb25zdCBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcbiAgY29uc3QgbnVsbFRvb2xiYXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb25zLXRvb2xiYXInKTtcblxuICBjbGFzcyBQYWdlRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdwYWdlJyk7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdpbml0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7T2JqZWN0L251bGx9XG4gICAgICovXG4gICAgZ2V0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHNldERldmljZUJhY2tCdXR0b25IYW5kbGVyKGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5fZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2dldENvbnRlbnRFbGVtZW50KCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2NvbnRlbnQnKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKCdmYWlsIHRvIGdldCBcIi5wYWdlX19jb250ZW50XCIgZWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIF9oYXNUb29sYmFyRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiAhIW9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy10b29sYmFyJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBfY2FuQW5pbWF0ZVRvb2xiYXIoKSB7XG4gICAgICBjb25zdCB0b29sYmFyID0gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKTtcbiAgICAgIGlmICh0b29sYmFyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuY2hpbGRyZW47XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRvb2xiYXInICYmICFlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoJ2lubGluZScpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgICAqL1xuICAgIF9nZXRCYWNrZ3JvdW5kRWxlbWVudCgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wYWdlX19iYWNrZ3JvdW5kJyk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcignZmFpbCB0byBnZXQgXCIucGFnZV9fYmFja2dyb3VuZFwiIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2dldEJvdHRvbVRvb2xiYXJFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1ib3R0b20tdG9vbGJhcicpIHx8IG9ucy5faW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH1cbiAgICAgKi9cbiAgICBfZ2V0VG9vbGJhckVsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKSB8fCBudWxsVG9vbGJhckVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgdG9vbGJhciBlbGVtZW50IHRvIHRoaXMgcGFnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBfcmVnaXN0ZXJUb29sYmFyKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuc2V0QXR0cmlidXRlKCduby1zdGF0dXMtYmFyLWZpbGwnLCAnJyk7XG5cbiAgICAgIGlmIChvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fc3RhdHVzLWJhci1maWxsJykpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoZWxlbWVudCwgdGhpcy5jaGlsZHJlblsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShlbGVtZW50LCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciB0b29sYmFyIGVsZW1lbnQgdG8gdGhpcyBwYWdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgICAqL1xuICAgIF9yZWdpc3RlckJvdHRvbVRvb2xiYXIoZWxlbWVudCkge1xuICAgICAgaWYgKCFvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fc3RhdHVzLWJhci1maWxsJykpIHtcbiAgICAgICAgY29uc3QgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBmaWxsLmNsYXNzTGlzdC5hZGQoJ3BhZ2VfX2JvdHRvbS1iYXItZmlsbCcpO1xuICAgICAgICBmaWxsLnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgICAgIGZpbGwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cbiAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoZmlsbCwgdGhpcy5jaGlsZHJlblswXSk7XG4gICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICBpZiAob25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2JhY2tncm91bmQnKSAmJiBvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fY29udGVudCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgYmFja2dyb3VuZC5jbGFzc0xpc3QuYWRkKCdwYWdlX19iYWNrZ3JvdW5kJyk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgncGFnZV9fY29udGVudCcpO1xuXG4gICAgICB3aGlsZSAodGhpcy5jaGlsZE5vZGVzWzBdKSB7XG4gICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7XG4gICAgICAgIGJhY2tncm91bmQuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoYmFja2dyb3VuZCk7XG4gICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcblxuICAgICAgdGhpcy5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgX3JlZ2lzdGVyRXh0cmFFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIGxldCBleHRyYSA9IG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wYWdlX19leHRyYScpO1xuICAgICAgaWYgKCFleHRyYSkge1xuICAgICAgICBleHRyYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBleHRyYS5jbGFzc0xpc3QuYWRkKCdwYWdlX19leHRyYScpO1xuICAgICAgICBleHRyYS5zdHlsZS56SW5kZXggPSAnMTAwMDEnO1xuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShleHRyYSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGV4dHJhLmluc2VydEJlZm9yZShlbGVtZW50LCBudWxsKTtcbiAgICB9XG5cbiAgICBfdHJ5VG9GaWxsU3RhdHVzQmFyKCkge1xuICAgICAgaWYgKG9ucy5faW50ZXJuYWwuc2hvdWxkRmlsbFN0YXR1c0Jhcih0aGlzKSkge1xuICAgICAgICAvLyBBZGp1c3RtZW50cyBmb3IgSU9TN1xuICAgICAgICBjb25zdCBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbGwuY2xhc3NMaXN0LmFkZCgncGFnZV9fc3RhdHVzLWJhci1maWxsJyk7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAnMHB4JztcbiAgICAgICAgZmlsbC5zdHlsZS5oZWlnaHQgPSAnMHB4JztcblxuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShmaWxsLCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZGVzdHJveSgpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkZXN0cm95Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICAgIGlmICh0aGlzLmdldERldmljZUJhY2tCdXR0b25IYW5kbGVyKCkpIHtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXdpbmRvdy5PbnNQYWdlRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNQYWdlRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXBhZ2UnLCB7XG4gICAgICBwcm90b3R5cGU6IFBhZ2VFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IHV0aWwgPSBvbnMuX3V0aWw7XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCBzY2hlbWUgPSB7XG4gICAgJy5wb3BvdmVyJzogJ3BvcG92ZXItLSonLFxuICAgICcucG9wb3Zlcl9fY29udGVudCc6ICdwb3BvdmVyX19jb250ZW50LS0qJ1xuICB9O1xuICBjb25zdCBQb3BvdmVyQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLlBvcG92ZXJBbmltYXRvcjtcbiAgY29uc3QgRmFkZVBvcG92ZXJBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuRmFkZVBvcG92ZXJBbmltYXRvcjtcbiAgY29uc3QgdGVtcGxhdGVTb3VyY2UgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1tYXNrXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicG9wb3ZlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlcl9fY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlcl9fYXJyb3dcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcbiAgY29uc3QgQW5pbWF0b3JGYWN0b3J5ID0gb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3Rvcnk7XG5cbiAgY2xhc3MgUG9wb3ZlckVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGdldCBfbWFzaygpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzBdO1xuICAgIH1cblxuICAgIGdldCBfcG9wb3ZlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzFdO1xuICAgIH1cblxuICAgIGdldCBfY29udGVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wb3BvdmVyLmNoaWxkcmVuWzBdO1xuICAgIH1cblxuICAgIGdldCBfYXJyb3coKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcG9wb3Zlci5jaGlsZHJlblsxXTtcbiAgICB9XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX21hc2suc3R5bGUuekluZGV4ID0gJzIwMDAwJztcbiAgICAgIHRoaXMuX3BvcG92ZXIuc3R5bGUuekluZGV4ID0gJzIwMDAxJztcblxuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdtYXNrLWNvbG9yJykpIHtcbiAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzay1jb2xvcicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLl9kb29yTG9jayA9IG5ldyBEb29yTG9jaygpO1xuICAgICAgdGhpcy5fYm91bmRPbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9ib3VuZENhbmNlbCA9IHRoaXMuX2NhbmNlbC5iaW5kKHRoaXMpO1xuXG5cbiAgICAgIHRoaXMuX2FuaW1hdG9yRmFjdG9yeSA9IHRoaXMuX2NyZWF0ZUFuaW1hdG9yRmFjdG9yeSgpO1xuICAgIH1cblxuICAgIF9jcmVhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICAgIGFuaW1hdG9yczogd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50Ll9hbmltYXRvckRpY3QsXG4gICAgICAgIGJhc2VDbGFzczogUG9wb3ZlckFuaW1hdG9yLFxuICAgICAgICBiYXNlQ2xhc3NOYW1lOiAnUG9wb3ZlckFuaW1hdG9yJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpIHx8ICdmYWRlJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnM6IEFuaW1hdG9yRmFjdG9yeS5wYXJzZUpTT05TYWZlbHkodGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25EZXZpY2VCYWNrQnV0dG9uKGV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5pc0NhbmNlbGFibGUoKSkge1xuICAgICAgICB0aGlzLl9jYW5jZWwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50LmNhbGxQYXJlbnRIYW5kbGVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3NldERpcmVjdGlvbihkaXJlY3Rpb24pIHtcbiAgICAgIGxldCBhcnJvd1Bvc2l0aW9uO1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIGFycm93UG9zaXRpb24gPSAncmlnaHQnO1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ3RvcCc7XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSAncmlnaHQnKSB7XG4gICAgICAgIGFycm93UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGlyZWN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb3BvdmVyQ2xhc3NMaXN0ID0gdGhpcy5fcG9wb3Zlci5jbGFzc0xpc3Q7XG4gICAgICBwb3BvdmVyQ2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlci0tdXAnKTtcbiAgICAgIHBvcG92ZXJDbGFzc0xpc3QucmVtb3ZlKCdwb3BvdmVyLS1kb3duJyk7XG4gICAgICBwb3BvdmVyQ2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlci0tbGVmdCcpO1xuICAgICAgcG9wb3ZlckNsYXNzTGlzdC5yZW1vdmUoJ3BvcG92ZXItLXJpZ2h0Jyk7XG4gICAgICBwb3BvdmVyQ2xhc3NMaXN0LmFkZCgncG9wb3Zlci0tJyArIGRpcmVjdGlvbik7XG5cbiAgICAgIGNvbnN0IGFycm93Q2xhc3NMaXN0ID0gdGhpcy5fYXJyb3cuY2xhc3NMaXN0O1xuICAgICAgYXJyb3dDbGFzc0xpc3QucmVtb3ZlKCdwb3BvdmVyX190b3AtYXJyb3cnKTtcbiAgICAgIGFycm93Q2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlcl9fYm90dG9tLWFycm93Jyk7XG4gICAgICBhcnJvd0NsYXNzTGlzdC5yZW1vdmUoJ3BvcG92ZXJfX2xlZnQtYXJyb3cnKTtcbiAgICAgIGFycm93Q2xhc3NMaXN0LnJlbW92ZSgncG9wb3Zlcl9fcmlnaHQtYXJyb3cnKTtcbiAgICAgIGFycm93Q2xhc3NMaXN0LmFkZCgncG9wb3Zlcl9fJyArIGFycm93UG9zaXRpb24gKyAnLWFycm93Jyk7XG4gICAgfVxuXG4gICAgX3Bvc2l0aW9uUG9wb3ZlckJ5RGlyZWN0aW9uKHRhcmdldCwgZGlyZWN0aW9uKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuX3BvcG92ZXI7XG4gICAgICBjb25zdCBwb3MgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBsZXQgb3duID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBhcnJvdyA9IGVsLmNoaWxkcmVuWzFdO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gMTQ7XG4gICAgICBjb25zdCBtYXJnaW4gPSA2O1xuICAgICAgY29uc3QgcmFkaXVzID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwucXVlcnlTZWxlY3RvcignLnBvcG92ZXJfX2NvbnRlbnQnKSkuYm9yZGVyUmFkaXVzKTtcblxuICAgICAgYXJyb3cuc3R5bGUudG9wID0gJyc7XG4gICAgICBhcnJvdy5zdHlsZS5sZWZ0ID0gJyc7XG5cbiAgICAgIHRoaXMuX3NldERpcmVjdGlvbihkaXJlY3Rpb24pO1xuXG4gICAgICAvLyBQb3NpdGlvbiBwb3BvdmVyIG5leHQgdG8gdGhlIHRhcmdldC5cbiAgICAgIGlmIChbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGRpcmVjdGlvbikgPiAtMSkge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09ICdsZWZ0Jykge1xuICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSAocG9zLnJpZ2h0IC0gcG9zLndpZHRoIC0gb3duLndpZHRoIC0gb2Zmc2V0KSArICdweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwuc3R5bGUubGVmdCA9IChwb3MucmlnaHQgKyBvZmZzZXQpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBlbC5zdHlsZS50b3AgPSAocG9zLmJvdHRvbSAtIHBvcy5oZWlnaHQgLyAyIC0gb3duLmhlaWdodCAvIDIpICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gJ3VwJykge1xuICAgICAgICAgIGVsLnN0eWxlLnRvcCA9IChwb3MuYm90dG9tIC0gcG9zLmhlaWdodCAtIG93bi5oZWlnaHQgLSBvZmZzZXQpICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbC5zdHlsZS50b3AgPSAocG9zLmJvdHRvbSArIG9mZnNldCkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGVsLnN0eWxlLmxlZnQgPSAocG9zLnJpZ2h0IC0gcG9zLndpZHRoIC8gMiAtIG93bi53aWR0aCAvIDIpICsgJ3B4JztcbiAgICAgIH1cblxuICAgICAgb3duID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIFRoaXMgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2lkZSBhbmQgdGhlIGh5cG90aGVudXNlIG9mIHRoZSBhcnJvdy5cbiAgICAgIGNvbnN0IGRpZmYgPSAoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gKHggLyAyKSAqIE1hdGguc3FydCgyKSAtIHggLyAyO1xuICAgICAgfSkocGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoYXJyb3cpLndpZHRoKSk7XG5cbiAgICAgIC8vIFRoaXMgaXMgdGhlIGxpbWl0IGZvciB0aGUgYXJyb3cuIElmIGl0J3MgbW92ZWQgZnVydGhlciB0aGFuIHRoaXMgaXQncyBvdXRzaWRlIHRoZSBwb3BvdmVyLlxuICAgICAgY29uc3QgbGltaXQgPSBtYXJnaW4gKyByYWRpdXMgKyBkaWZmICsgMjtcblxuXG4gICAgICAvLyBLZWVwIHBvcG92ZXIgaW5zaWRlIHdpbmRvdyBhbmQgYXJyb3cgaW5zaWRlIHBvcG92ZXIuXG4gICAgICBpZiAoWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihkaXJlY3Rpb24pID4gLTEpIHtcbiAgICAgICAgaWYgKG93bi50b3AgPCBtYXJnaW4pIHtcbiAgICAgICAgICBhcnJvdy5zdHlsZS50b3AgPSBNYXRoLm1heChvd24uaGVpZ2h0IC8gMiArIG93bi50b3AgLSBtYXJnaW4sIGxpbWl0KSAgKyAncHgnO1xuICAgICAgICAgIGVsLnN0eWxlLnRvcCA9IG1hcmdpbiArICdweCc7XG4gICAgICAgIH0gZWxzZSBpZiAob3duLmJvdHRvbSA+IHdpbmRvdy5pbm5lckhlaWdodCAtIG1hcmdpbikge1xuICAgICAgICAgIGFycm93LnN0eWxlLnRvcCA9IE1hdGgubWluKG93bi5oZWlnaHQgLyAyIC0gKHdpbmRvdy5pbm5lckhlaWdodCAtIG93bi5ib3R0b20pICsgbWFyZ2luLCBvd24uaGVpZ2h0IC0gbGltaXQpICsgJ3B4JztcbiAgICAgICAgICBlbC5zdHlsZS50b3AgPSAod2luZG93LmlubmVySGVpZ2h0IC0gb3duLmhlaWdodCAtIG1hcmdpbikgKyAncHgnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3duLmxlZnQgPCBtYXJnaW4pIHtcbiAgICAgICAgICBhcnJvdy5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgob3duLndpZHRoIC8gMiArIG93bi5sZWZ0IC0gbWFyZ2luLCBsaW1pdCkgKyAncHgnO1xuICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSBtYXJnaW4gKyAncHgnO1xuICAgICAgICB9IGVsc2UgaWYgKG93bi5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoIC0gbWFyZ2luKSB7XG4gICAgICAgICAgYXJyb3cuc3R5bGUubGVmdCA9IE1hdGgubWluKG93bi53aWR0aCAvIDIgLSAod2luZG93LmlubmVyV2lkdGggLSBvd24ucmlnaHQpICsgbWFyZ2luLCBvd24ud2lkdGggLSBsaW1pdCkgKyAncHgnO1xuICAgICAgICAgIGVsLnN0eWxlLmxlZnQgPSAod2luZG93LmlubmVyV2lkdGggLSBvd24ud2lkdGggLSBtYXJnaW4pICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IGFuaW1pdCBmcm9tIHJlc3RvcmluZyB0aGUgc3R5bGUuXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYW5pbWl0LW9yaWctc3R5bGUnKTtcbiAgICB9XG5cbiAgICBfcG9zaXRpb25Qb3BvdmVyKHRhcmdldCkge1xuICAgICAgY29uc3QgZGlyZWN0aW9ucyA9ICgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKSB7XG4gICAgICAgICAgcmV0dXJuIFsndXAnLCAnZG93bicsICdsZWZ0JywgJ3JpZ2h0J107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gVGhlIHBvcG92ZXIgc2hvdWxkIGJlIHBsYWNlZCBvbiB0aGUgc2lkZSB3aXRoIHRoZSBtb3N0IHNwYWNlLlxuICAgICAgY29uc3Qgc2NvcmVzID0ge1xuICAgICAgICBsZWZ0OiBwb3NpdGlvbi5sZWZ0LFxuICAgICAgICByaWdodDogd2luZG93LmlubmVyV2lkdGggLSBwb3NpdGlvbi5yaWdodCxcbiAgICAgICAgdXA6IHBvc2l0aW9uLnRvcCxcbiAgICAgICAgZG93bjogd2luZG93LmlubmVySGVpZ2h0IC0gcG9zaXRpb24uYm90dG9tXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvcmRlcmVkRGlyZWN0aW9ucyA9IE9iamVjdC5rZXlzKHNjb3Jlcykuc29ydCgoYSwgYikgPT4gLShzY29yZXNbYV0gLSBzY29yZXNbYl0pKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gb3JkZXJlZERpcmVjdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IG9yZGVyZWREaXJlY3Rpb25zW2ldO1xuICAgICAgICBpZiAoZGlyZWN0aW9ucy5pbmRleE9mKGRpcmVjdGlvbikgPiAtMSkge1xuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3ZlckJ5RGlyZWN0aW9uKHRhcmdldCwgZGlyZWN0aW9uKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfb25DaGFuZ2UoKSB7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhcmdldCkge1xuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3Zlcih0aGlzLl9jdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSB0ZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyX19jb250ZW50Jyk7XG4gICAgICBjb25zdCBzdHlsZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAodGVtcGxhdGVFbGVtZW50LmNoaWxkcmVuWzBdKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGVFbGVtZW50LmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlKSB7XG4gICAgICAgIHRoaXMuX3BvcG92ZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsIHN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBvcG92ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbdGFyZ2V0XSB0YXJnZXQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbdGFyZ2V0XSBjc3Mgc2VsZWN0b3JcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBbdGFyZ2V0XSBldmVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgc2hvdyh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC50YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgdW5kZWZpbmVkJyk7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gJiZcbiAgICAgICAgIShvcHRpb25zLmFuaW1hdGlvbiBpbiB3aW5kb3cuT25zUG9wb3ZlckVsZW1lbnQuX2FuaW1hdG9yRGljdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmltYXRvciAke29wdGlvbnMuYW5pbWF0aW9ufSBpcyBub3QgcmVnaXN0ZXJlZC5gKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncHJlc2hvdycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcG9wb3ZlcjogdGhpcyxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWNhbmNlbGVkKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcblxuICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICB0aGlzLl9jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3Zlcih0YXJnZXQpO1xuXG4gICAgICAgICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG4gICAgICAgICAgYW5pbWF0b3Iuc2hvdyh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHVubG9jaygpO1xuXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncG9zdHNob3cnLCB7XG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgIGRldGFpbDoge3BvcG92ZXI6IHRoaXN9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhpZGUgcG9wb3Zlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dIGFuaW1hdGlvbiB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIGFuaW1hdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgaGlkZShvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncHJlaGlkZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcG9wb3ZlcjogdGhpcyxcbiAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWNhbmNlbGVkKSB7XG4gICAgICAgIHRoaXMuX2Rvb3JMb2NrLndhaXRVbmxvY2soKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcblxuICAgICAgICAgIGNvbnN0IGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuICAgICAgICAgIGFuaW1hdG9yLmhpZGUodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdW5sb2NrKCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncG9zdGhpZGUnLCB7XG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgIGRldGFpbDoge3BvcG92ZXI6IHRoaXN9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcG9wb3ZlciBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTaG93bigpIHtcbiAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9tYXNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYm91bmRDYW5jZWwsIGZhbHNlKTtcblxuICAgICAgdGhpcy5fZGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBvbnMuX2RldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgdGhpcy5fb25EZXZpY2VCYWNrQnV0dG9uLmJpbmQodGhpcykpO1xuXG4gICAgICB0aGlzLl9wb3BvdmVyLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcbiAgICAgIHRoaXMuX3BvcG92ZXIuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCBmYWxzZSk7XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE9uQ2hhbmdlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX21hc2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZENhbmNlbCwgZmFsc2UpO1xuXG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG5cbiAgICAgIHRoaXMuX3BvcG92ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgZmFsc2UpO1xuICAgICAgdGhpcy5fcG9wb3Zlci5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2RpcmVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5fYm91bmRPbkNoYW5nZSgpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2FuaW1hdGlvbicgfHwgbmFtZSA9PT0gJ2FuaW1hdGlvbi1vcHRpb25zJykge1xuICAgICAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSB0aGlzLl9jcmVhdGVBbmltYXRvckZhY3RvcnkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgd2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgYmUgY2FuY2VsYWJsZSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0Q2FuY2VsYWJsZShjYW5jZWxhYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbmNlbGFibGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FuY2VsYWJsZSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2FuY2VsYWJsZScsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdjYW5jZWxhYmxlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgY2FuY2VsYWJsZSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGlzQ2FuY2VsYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnY2FuY2VsYWJsZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIHBvcG92ZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBET00gdHJlZS5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NhbmNlbCgpIHtcbiAgICAgIGlmICh0aGlzLmlzQ2FuY2VsYWJsZSgpKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtcG9wb3ZlcicsIHtcbiAgICAgIHByb3RvdHlwZTogUG9wb3ZlckVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG5cbiAgICB3aW5kb3cuT25zUG9wb3ZlckVsZW1lbnQuX2FuaW1hdG9yRGljdCA9IHtcbiAgICAgICdmYWRlJzogRmFkZVBvcG92ZXJBbmltYXRvcixcbiAgICAgICdub25lJzogUG9wb3ZlckFuaW1hdG9yXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtQb3BvdmVyQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAgICovXG4gICAgd2luZG93Lk9uc1BvcG92ZXJFbGVtZW50LnJlZ2lzdGVyQW5pbWF0b3IgPSBmdW5jdGlvbihuYW1lLCBBbmltYXRvcikge1xuICAgICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgUG9wb3ZlckFuaW1hdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiQW5pbWF0b3JcIiBwYXJhbSBtdXN0IGluaGVyaXQgUG9wb3ZlckFuaW1hdG9yJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9hbmltYXRvckRpY3RbbmFtZV0gPSBBbmltYXRvcjtcbiAgICB9O1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNvbnN0IFNUQVRFX0lOSVRJQUwgPSAnaW5pdGlhbCc7XG4gIGNvbnN0IFNUQVRFX1BSRUFDVElPTiA9ICdwcmVhY3Rpb24nO1xuICBjb25zdCBTVEFURV9BQ1RJT04gPSAnYWN0aW9uJztcbiAgY29uc3QgdXRpbCA9IG9ucy5fdXRpbDtcblxuICBjbGFzcyBQdWxsSG9va0VsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQgPSB0aGlzLl9jcmVhdGVTY3JvbGxFbGVtZW50KCk7XG4gICAgICB0aGlzLl9wYWdlRWxlbWVudCA9IHRoaXMuX3Njcm9sbEVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgaWYgKCF0aGlzLl9wYWdlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2VfX2NvbnRlbnQnKSAmJiAhdGhpcy5fcGFnZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdvbnMtc2Nyb2xsZXJfX2NvbnRlbnQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzxvbnMtcHVsbC1ob29rPiBtdXN0IGJlIGEgZGlyZWN0IGRlc2NlbmRhbnQgb2YgYW4gPG9ucy1wYWdlPiBvciBhbiA8b25zLXNjcm9sbGVyPiBlbGVtZW50LicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9ib3VuZE9uRHJhZyA9IHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPbkRyYWdTdGFydCA9IHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLl9ib3VuZE9uRHJhZ0VuZCA9IHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5fYm91bmRPblNjcm9sbCA9IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiA9IDA7XG5cbiAgICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX0lOSVRJQUwsIHRydWUpO1xuICAgICAgdGhpcy5fc2V0U3R5bGUoKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlU2Nyb2xsRWxlbWVudCgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxkaXYgY2xhc3M9XCJzY3JvbGxcIj48ZGl2PicpO1xuXG4gICAgICBjb25zdCBwYWdlRWxlbWVudCA9IHRoaXMucGFyZW50RWxlbWVudDtcblxuICAgICAgc2Nyb2xsRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzKTtcbiAgICAgIHdoaWxlIChwYWdlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICAgIHNjcm9sbEVsZW1lbnQuYXBwZW5kQ2hpbGQocGFnZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBwYWdlRWxlbWVudC5hcHBlbmRDaGlsZChzY3JvbGxFbGVtZW50KTtcblxuICAgICAgcmV0dXJuIHNjcm9sbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgX3NldFN0eWxlKCkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRIZWlnaHQoKTtcblxuICAgICAgdGhpcy5zdHlsZS50b3AgPSAnLScgKyBoZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5zdHlsZS5saW5lSGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICB9XG5cbiAgICBfb25TY3JvbGwoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9wYWdlRWxlbWVudDtcblxuICAgICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wIDwgMCkge1xuICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2dlbmVyYXRlVHJhbnNsYXRpb25UcmFuc2Zvcm0oc2Nyb2xsKSB7XG4gICAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkKDBweCwgJyArIHNjcm9sbCArICdweCwgMHB4KSc7XG4gICAgfVxuXG4gICAgX29uRHJhZyhldmVudCkge1xuICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSWdub3JlIHdoZW4gZHJhZ2dpbmcgbGVmdCBhbmQgcmlnaHQuXG4gICAgICBpZiAoZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb24gPT09ICdsZWZ0JyB8fCBldmVudC5nZXN0dXJlLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEhhY2sgdG8gbWFrZSBpdCB3b3JrIG9uIEFuZHJvaWQgNC40IFdlYlZpZXcuIFNjcm9sbHMgbWFudWFsbHkgbmVhciB0aGUgdG9wIG9mIHRoZSBwYWdlIHNvXG4gICAgICAvLyB0aGVyZSB3aWxsIGJlIG5vIGluZXJ0aWFsIHNjcm9sbCB3aGVuIHNjcm9sbGluZyBkb3duLiBBbGxvd2luZyBkZWZhdWx0IHNjcm9sbGluZyB3aWxsXG4gICAgICAvLyBraWxsIGFsbCAndG91Y2htb3ZlJyBldmVudHMuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fcGFnZUVsZW1lbnQ7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuX3N0YXJ0U2Nyb2xsIC0gZXZlbnQuZ2VzdHVyZS5kZWx0YVk7XG4gICAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb24gIT09ICd1cCcpIHtcbiAgICAgICAgZXZlbnQuZ2VzdHVyZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY3VycmVudFRyYW5zbGF0aW9uID09PSAwICYmIHRoaXMuX2dldEN1cnJlbnRTY3JvbGwoKSA9PT0gMCkge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uRHJhZ0xlbmd0aCA9IGV2ZW50Lmdlc3R1cmUuZGVsdGFZO1xuXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50Lmdlc3R1cmUuaW50ZXJpbURpcmVjdGlvbjtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkRyYWdMZW5ndGggLT0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uRHJhZ0xlbmd0aCArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbCA9IE1hdGgubWF4KGV2ZW50Lmdlc3R1cmUuZGVsdGFZIC0gdGhpcy5fc3RhcnRTY3JvbGwsIDApO1xuXG4gICAgICBpZiAodGhpcy5fdGhyZXNob2xkSGVpZ2h0RW5hYmxlZCgpICYmIHNjcm9sbCA+PSB0aGlzLmdldFRocmVzaG9sZEhlaWdodCgpKSB7XG4gICAgICAgIGV2ZW50Lmdlc3R1cmUuc3RvcERldGVjdCgpO1xuXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfQUNUSU9OKTtcbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGVUbyh0aGlzLmdldEhlaWdodCgpLCB7YW5pbWF0ZTogdHJ1ZX0pO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdEZvckFjdGlvbih0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChzY3JvbGwgPj0gdGhpcy5nZXRIZWlnaHQoKSkge1xuICAgICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9QUkVBQ1RJT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfSU5JVElBTCk7XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oc2Nyb2xsKTtcbiAgICB9XG5cbiAgICBfb25EcmFnU3RhcnQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXJ0U2Nyb2xsID0gdGhpcy5fZ2V0Q3VycmVudFNjcm9sbCgpO1xuICAgIH1cblxuICAgIF9vbkRyYWdFbmQoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gPiAwKSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbCA9IHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbjtcblxuICAgICAgICBpZiAoc2Nyb2xsID4gdGhpcy5nZXRIZWlnaHQoKSkge1xuICAgICAgICAgIHRoaXMuX3NldFN0YXRlKFNUQVRFX0FDVElPTik7XG5cbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGVUbyh0aGlzLmdldEhlaWdodCgpLCB7YW5pbWF0ZTogdHJ1ZX0pO1xuXG4gICAgICAgICAgdGhpcy5fd2FpdEZvckFjdGlvbih0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oMCwge2FuaW1hdGU6IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICovXG4gICAgc2V0QWN0aW9uQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgX3dhaXRGb3JBY3Rpb24oZG9uZSkge1xuICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2suY2FsbChudWxsLCBkb25lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIF9vbkRvbmUoZG9uZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHB1bGwgaG9vayBzdGlsbCBleGlzdHMuXG4gICAgICB0aGlzLl90cmFuc2xhdGVUbygwLCB7YW5pbWF0ZTogdHJ1ZX0pO1xuICAgICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfSU5JVElBTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldEhlaWdodCgpIHtcbiAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykgfHwgJzY0JywgMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKi9cbiAgICBzZXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7XG5cbiAgICAgIHRoaXMuX3NldFN0eWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRocmVzaG9sZEhlaWdodFxuICAgICAqL1xuICAgIHNldFRocmVzaG9sZEhlaWdodCh0aHJlc2hvbGRIZWlnaHQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0aHJlc2hvbGQtaGVpZ2h0JywgdGhyZXNob2xkSGVpZ2h0ICsgJ3B4Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIGdldFRocmVzaG9sZEhlaWdodCgpIHtcbiAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgndGhyZXNob2xkLWhlaWdodCcpIHx8ICc5NicsIDEwKTtcbiAgICB9XG5cbiAgICBfdGhyZXNob2xkSGVpZ2h0RW5hYmxlZCgpIHtcbiAgICAgIGNvbnN0IHRoID0gdGhpcy5nZXRUaHJlc2hvbGRIZWlnaHQoKTtcbiAgICAgIHJldHVybiB0aCA+IDAgJiYgdGggPj0gdGhpcy5nZXRIZWlnaHQoKTtcbiAgICB9XG5cbiAgICBfc2V0U3RhdGUoc3RhdGUsIG5vRXZlbnQpIHtcbiAgICAgIGNvbnN0IGxhc3RTdGF0ZSA9IHRoaXMuX2dldFN0YXRlKCk7XG5cbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHN0YXRlKTtcblxuICAgICAgaWYgKCFub0V2ZW50ICYmIGxhc3RTdGF0ZSAhPT0gdGhpcy5fZ2V0U3RhdGUoKSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGFuZ2VzdGF0ZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcHVsbEhvb2s6IHRoaXMsXG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBsYXN0U3RhdGU6IGxhc3RTdGF0ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRTdGF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc3RhdGUnKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50U3RhdGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U3RhdGUoKTtcbiAgICB9XG5cbiAgICBfZ2V0Q3VycmVudFNjcm9sbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYWdlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgZ2V0UHVsbERpc3RhbmNlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbjtcbiAgICB9XG5cbiAgICBpc0Rpc2FibGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIF9pc0NvbnRlbnRGaXhlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZml4ZWQtY29udGVudCcpO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkKGRpc2FibGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2dldFNjcm9sbGFibGVFbGVtZW50KCkge1xuICAgICAgaWYgKHRoaXMuX2lzQ29udGVudEZpeGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsRWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc2Nyb2xsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICAgKi9cbiAgICBfdHJhbnNsYXRlVG8oc2Nyb2xsLCBvcHRpb25zID0ge30pIHtcblxuICAgICAgLy90aGlzLl9zY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gPSBzY3JvbGw7XG4gICAgICAvL30uYmluZCh0aGlzKSk7XG5cbiAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUpIHtcbiAgICAgICAgYW5pbWl0KHRoaXMuX2dldFNjcm9sbGFibGVFbGVtZW50KCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVUcmFuc2xhdGlvblRyYW5zZm9ybShzY3JvbGwpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZHVyYXRpb246IDAuMyxcbiAgICAgICAgICAgIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKSdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wbGF5KG9wdGlvbnMuY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWl0KHRoaXMuX2dldFNjcm9sbGFibGVFbGVtZW50KCkpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVUcmFuc2xhdGlvblRyYW5zZm9ybShzY3JvbGwpXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGxheShvcHRpb25zLmNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2V0TWluaW11bVNjcm9sbCgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9IHRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgY29uc3QgcGFnZUhlaWdodCA9IHRoaXMuX3BhZ2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgcmV0dXJuIHNjcm9sbEhlaWdodCA+IHBhZ2VIZWlnaHQgPyAtKHNjcm9sbEhlaWdodCAtIHBhZ2VIZWlnaHQpIDogMDtcbiAgICB9XG5cbiAgICBfY3JlYXRlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgPSBuZXcgb25zLkdlc3R1cmVEZXRlY3Rvcih0aGlzLl9wYWdlRWxlbWVudCwge1xuICAgICAgICBkcmFnTWluRGlzdGFuY2U6IDEsXG4gICAgICAgIGRyYWdEaXN0YW5jZUNvcnJlY3Rpb246IGZhbHNlXG4gICAgICB9KTtcblxuICAgICAgLy8gQmluZCBsaXN0ZW5lcnNcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vbignZHJhZycsIHRoaXMuX2JvdW5kT25EcmFnKTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vbignZHJhZ3N0YXJ0JywgdGhpcy5fYm91bmRPbkRyYWdTdGFydCk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3Iub24oJ2RyYWdlbmQnLCB0aGlzLl9ib3VuZE9uRHJhZ0VuZCk7XG5cbiAgICAgIHRoaXMuX3Njcm9sbEVsZW1lbnQucGFyZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLl9ib3VuZE9uU2Nyb2xsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgX2Rlc3Ryb3lFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vZmYoJ2RyYWcnLCB0aGlzLl9ib3VuZE9uRHJhZyk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3Iub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLl9ib3VuZE9uRHJhZ1N0YXJ0KTtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5vZmYoJ2RyYWdlbmQnLCB0aGlzLl9ib3VuZE9uRHJhZ0VuZCk7XG5cbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgPSBudWxsO1xuXG4gICAgICB0aGlzLl9zY3JvbGxFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPblNjcm9sbCwgZmFsc2UpO1xuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jcmVhdGVFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9kZXN0cm95RXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1B1bGxIb29rRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNQdWxsSG9va0VsZW1lbnQgPSBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy1wdWxsLWhvb2snLCB7XG4gICAgICBwcm90b3R5cGU6IFB1bGxIb29rRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcblxuICAgIHdpbmRvdy5PbnNQdWxsSG9va0VsZW1lbnQuU1RBVEVfQUNUSU9OID0gU1RBVEVfQUNUSU9OO1xuICAgIHdpbmRvdy5PbnNQdWxsSG9va0VsZW1lbnQuU1RBVEVfSU5JVElBTCA9IFNUQVRFX0lOSVRJQUw7XG4gICAgd2luZG93Lk9uc1B1bGxIb29rRWxlbWVudC5TVEFURV9QUkVBQ1RJT04gPSBTVEFURV9QUkVBQ1RJT047XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG53aW5kb3cuT25zUm93RWxlbWVudCA9IHdpbmRvdy5PbnNSb3dFbGVtZW50ID8gd2luZG93Lk9uc1Jvd0VsZW1lbnQgOiBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy1yb3cnKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbndpbmRvdy5PbnNTY3JvbGxlckVsZW1lbnQgPSB3aW5kb3cuT25zU2Nyb2xsZXJFbGVtZW50ID8gd2luZG93Lk9uc1Njcm9sbGVyRWxlbWVudCA6IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXNjcm9sbGVyJyk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3Qgc2NoZW1lID0ge1xuICAgICcnOiAnc3dpdGNoLS0qJyxcbiAgICAnc3dpdGNoX19pbnB1dCc6ICdzd2l0Y2gtLSpfX2lucHV0JyxcbiAgICAnc3dpdGNoX190b2dnbGUnOiAnc3dpdGNoLS0qX190b2dnbGUnXG4gIH07XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCB0ZW1wbGF0ZVNvdXJjZSA9IG9ucy5fdXRpbC5jcmVhdGVFbGVtZW50KGBcbiAgICA8ZGl2PlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic3dpdGNoX19pbnB1dFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN3aXRjaF9fdG9nZ2xlXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIGApO1xuXG4gIGxldCBFeHRlbmRhYmxlTGFiZWxFbGVtZW50O1xuICBpZiAodHlwZW9mIEhUTUxMYWJlbEVsZW1lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBmb3IgU2FmYXJpXG4gICAgRXh0ZW5kYWJsZUxhYmVsRWxlbWVudCA9ICgpID0+IHt9O1xuICAgIEV4dGVuZGFibGVMYWJlbEVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgfSBlbHNlIHtcbiAgICBFeHRlbmRhYmxlTGFiZWxFbGVtZW50ID0gSFRNTExhYmVsRWxlbWVudDtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlSWQgPSAoKCkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICByZXR1cm4gKCkgPT4gJ29ucy1zd2l0Y2gtaWQtJyArIChpKyspO1xuICB9KSgpO1xuXG4gIGNsYXNzIFN3aXRjaEVsZW1lbnQgZXh0ZW5kcyBFeHRlbmRhYmxlTGFiZWxFbGVtZW50IHtcblxuICAgIGdldCBjaGVja2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldENoZWNrYm94KCkuY2hlY2tlZDtcbiAgICB9XG5cbiAgICBzZXQgY2hlY2tlZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fZ2V0Q2hlY2tib3goKS5jaGVja2VkID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjaGVja2VkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2NoZWNrZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZUZvckNoZWNrZWRBdHRyaWJ1dGUoKTtcbiAgICB9XG5cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q2hlY2tib3goKS5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICAgIHRoaXMuX2dldENoZWNrYm94KCkuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcblxuICAgICAgdGhpcy5fdXBkYXRlRm9yQ2hlY2tlZEF0dHJpYnV0ZSgpO1xuICAgICAgdGhpcy5fdXBkYXRlRm9yRGlzYWJsZWRBdHRyaWJ1dGUoKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlRm9yQ2hlY2tlZEF0dHJpYnV0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnY2hlY2tlZCcpKSB7XG4gICAgICAgIHRoaXMuX2dldENoZWNrYm94KCkuY2hlY2tlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9nZXRDaGVja2JveCgpLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlRm9yRGlzYWJsZWRBdHRyaWJ1dGUoKSB7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgdGhpcy5fZ2V0Q2hlY2tib3goKS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZ2V0Q2hlY2tib3goKS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ3N3aXRjaCcpO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB3aGlsZSAodGVtcGxhdGUuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jaGlsZHJlblswXSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9nZXRDaGVja2JveCgpLnNldEF0dHJpYnV0ZSgnbmFtZScsIGdlbmVyYXRlSWQoKSk7XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2dldENoZWNrYm94KCkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgYXR0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMuX2dldENoZWNrYm94KCkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgX29uQ2hhbmdlTGlzdGVuZXIoKSB7XG4gICAgICBpZiAodGhpcy5jaGVja2VkICE9PSB0cnVlKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2hlY2tlZCcsICcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIF9pc0NoZWNrZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q2hlY2tib3goKS5jaGVja2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBfc2V0Q2hlY2tlZChpc0NoZWNrZWQpIHtcbiAgICAgIGlzQ2hlY2tlZCA9ICEhaXNDaGVja2VkO1xuXG4gICAgICBjb25zdCBjaGVja2JveCA9IHRoaXMuX2dldENoZWNrYm94KCk7XG5cbiAgICAgIGlmIChjaGVja2JveC5jaGVja2VkICE9IGlzQ2hlY2tlZCkge1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gaXNDaGVja2VkO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRDaGVja2JveCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9Y2hlY2tib3hdJyk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUZvckNoZWNrZWRBdHRyaWJ1dGUoKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICB0aGlzLl91cGRhdGVGb3JEaXNhYmxlZEF0dHJpYnV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1N3aXRjaEVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zU3dpdGNoRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXN3aXRjaCcsIHtcbiAgICAgIHByb3RvdHlwZTogU3dpdGNoRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjb25zdCBzY2hlbWUgPSB7XG4gICAgJyc6ICd0YWItYmFyLS0qX19pdGVtJyxcbiAgICAnLnRhYi1iYXJfX2J1dHRvbic6ICd0YWItYmFyLS0qX19idXR0b24nXG4gIH07XG4gIGNvbnN0IE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuICBjb25zdCB1dGlsID0gb25zLl91dGlsO1xuICBjb25zdCB0ZW1wbGF0ZVNvdXJjZSA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgPGRpdj5cbiAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0YWItYmFyX19idXR0b24gdGFiLWJhci1pbm5lclwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgKTtcbiAgY29uc3QgZGVmYXVsdElubmVyVGVtcGxhdGVTb3VyY2UgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhcl9faWNvblwiPlxuICAgICAgICA8b25zLWljb24gaWNvbj1cImlvbi1jbG91ZFwiIHN0eWxlPVwiZm9udC1zaXplOiAyOHB4OyBsaW5lLWhlaWdodDogMzRweDsgdmVydGljYWwtYWxpZ246IHRvcDtcIj48L29ucy1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhcl9fbGFiZWxcIj5sYWJlbDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjbGFzcyBUYWJFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICB0aGlzLl9ib3VuZE9uQ2xpY2sgPSB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyk7XG5cbiAgICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgICB9XG5cbiAgICBfY29tcGlsZSgpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgbGV0IGhhc0NoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSk7XG5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICBoYXNDaGlsZHJlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB3aGlsZSAodGVtcGxhdGUuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jaGlsZHJlblswXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ3RhYi1iYXJfX2l0ZW0nKTtcblxuICAgICAgY29uc3QgYnV0dG9uID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWItYmFyX19idXR0b24nKTtcblxuICAgICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgICAgIHRoaXMuX2hhc0RlZmF1bHRUZW1wbGF0ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGFzRGVmYXVsdFRlbXBsYXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdFRlbXBsYXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURlZmF1bHRUZW1wbGF0ZSgpIHtcbiAgICAgIGlmICghdGhpcy5faGFzRGVmYXVsdFRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWItYmFyX19idXR0b24nKTtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBkZWZhdWx0SW5uZXJUZW1wbGF0ZVNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB3aGlsZSAodGVtcGxhdGUuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHRlbXBsYXRlLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBjb25zdCBpY29uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKTtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XG5cbiAgICAgIGlmICh0eXBlb2YgaWNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZ2V0SWNvbkVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoJ2ljb24nLCBpY29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBidXR0b24ucXVlcnlTZWxlY3RvcignLnRhYi1iYXJfX2ljb24nKTtcbiAgICAgICAgd3JhcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJykge1xuICAgICAgICBnZXRMYWJlbEVsZW1lbnQoKS50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0TGFiZWxFbGVtZW50KCkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnZXRMYWJlbEVsZW1lbnQoKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldExhYmVsRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYucXVlcnlTZWxlY3RvcignLnRhYi1iYXJfX2xhYmVsJyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldEljb25FbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gc2VsZi5xdWVyeVNlbGVjdG9yKCdvbnMtaWNvbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9vbkNsaWNrKCkge1xuICAgICAgY29uc3QgdGFiYmFyID0gdGhpcy5fZmluZFRhYmJhckVsZW1lbnQoKTtcbiAgICAgIGlmICh0YWJiYXIpIHtcbiAgICAgICAgdGFiYmFyLnNldEFjdGl2ZVRhYih0aGlzLl9maW5kVGFiSW5kZXgoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNQZXJzaXN0ZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKCdwZXJzaXN0ZW50Jyk7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlKCkge1xuICAgICAgY29uc3QgcmFkaW8gPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnaW5wdXQnKTtcbiAgICAgIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcblxuICAgICAgdXRpbC5hcnJheUZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdbb25zLXRhYi1pbmFjdGl2ZV0nKSlcbiAgICAgICAgLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpO1xuICAgICAgdXRpbC5hcnJheUZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdbb25zLXRhYi1hY3RpdmVdJykpXG4gICAgICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2luaGVyaXQnKTtcbiAgICB9XG5cbiAgICBzZXRJbmFjdGl2ZSgpIHtcbiAgICAgIGNvbnN0IHJhZGlvID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJ2lucHV0Jyk7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuXG4gICAgICB1dGlsLmFycmF5RnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbnMtdGFiLWluYWN0aXZlXScpKVxuICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmhlcml0Jyk7XG4gICAgICB1dGlsLmFycmF5RnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbnMtdGFiLWFjdGl2ZV0nKSlcbiAgICAgICAgLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaG9va3NcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaG9va3MuY29tcGlsZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBob29rcy5saW5rXG4gICAgICovXG4gICAgX2xvYWRQYWdlRWxlbWVudChjYWxsYmFjaywgaG9va3MpIHtcbiAgICAgIGlmICh0aGlzLmlzUGVyc2lzdGVudCgpKSB7XG4gICAgICAgIGlmICghdGhpcy5fcGFnZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9jcmVhdGVQYWdlRWxlbWVudCh0aGlzLmdldEF0dHJpYnV0ZSgncGFnZScpLCAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaG9va3MuY29tcGlsZS5ydW4oZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGhvb2tzLmxpbmsucnVuKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhZ2VFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlbGVtZW50KTtcbiAgICAgICAgICAgICAgfSwgZWxlbWVudCk7XG4gICAgICAgICAgICB9LCBlbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayh0aGlzLl9wYWdlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3BhZ2VFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3JlYXRlUGFnZUVsZW1lbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3BhZ2UnKSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBfY3JlYXRlUGFnZUVsZW1lbnQocGFnZSwgY2FsbGJhY2spIHtcbiAgICAgIG9ucy5faW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKGh0bWwgPT4ge1xuICAgICAgICBjYWxsYmFjayh1dGlsLmNyZWF0ZUVsZW1lbnQoaHRtbC50cmltKCkpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgY2FuUmVsb2FkKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmhhc0F0dHJpYnV0ZSgnbm8tcmVsb2FkJyk7XG4gICAgfVxuXG4gICAgZGV0YWNoZWRDYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2ssIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhdHRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fZW5zdXJlRWxlbWVudFBvc2l0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnYWN0aXZlJykpIHtcbiAgICAgICAgY29uc3QgdGFiYmFyID0gdGhpcy5fZmluZFRhYmJhckVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSB0aGlzLl9maW5kVGFiSW5kZXgoKTtcblxuICAgICAgICB3aW5kb3cuT25zVGFiYmFyRWxlbWVudC5yZWFkeSh0YWJiYXIsICgpID0+IHtcbiAgICAgICAgICB0YWJiYXIuc2V0QWN0aXZlVGFiKHRhYkluZGV4LCB7YW5pbWF0aW9uOiAnbm9uZSd9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2ssIGZhbHNlKTtcbiAgICB9XG5cbiAgICBfZmluZFRhYmJhckVsZW1lbnQoKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnROb2RlICYmIHRoaXMucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRhYmJhcicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlICYmIHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvbnMtdGFiYmFyJykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIF9maW5kVGFiSW5kZXgoKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZHJlbjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMgPT09IGVsZW1lbnRzW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZW5zdXJlRWxlbWVudFBvc2l0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLl9maW5kVGFiYmFyRWxlbWVudCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBvbnMtdGFiIGVsZW1lbnQgaXMgbXVzdCBiZSBjaGlsZCBvZiBvbnMtdGFiYmFyIGVsZW1lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmICh0aGlzLl9oYXNEZWZhdWx0VGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdpY29uJyB8fCBuYW1lID09PSAnbGFiZWwnKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdFRlbXBsYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1RhYkVsZW1lbnQpIHtcbiAgICB3aW5kb3cuT25zVGFiRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXRhYicsIHtcbiAgICAgIHByb3RvdHlwZTogVGFiRWxlbWVudC5wcm90b3R5cGVcbiAgICB9KTtcbiAgICBkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQoJ29ucy10YWJiYXItaXRlbScsIHtcbiAgICAgIHByb3RvdHlwZTogT2JqZWN0LmNyZWF0ZShUYWJFbGVtZW50LnByb3RvdHlwZSlcbiAgICB9KTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgc2NoZW1lID0ge1xuICAgICcudGFiLWJhcl9fY29udGVudCc6ICd0YWItYmFyLS0qX19jb250ZW50JyxcbiAgICAnLnRhYi1iYXInOiAndGFiLWJhci0tKidcbiAgfTtcblxuICB2YXIgQW5pbWF0b3JGYWN0b3J5ID0gb25zLl9pbnRlcm5hbC5BbmltYXRvckZhY3Rvcnk7XG4gIHZhciBUYWJiYXJBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuVGFiYmFyQW5pbWF0b3I7XG4gIHZhciBUYWJiYXJGYWRlQW5pbWF0b3IgPSBvbnMuX2ludGVybmFsLlRhYmJhckZhZGVBbmltYXRvcjtcbiAgdmFyIFRhYmJhck5vbmVBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuVGFiYmFyTm9uZUFuaW1hdG9yO1xuICB2YXIgVGFiYmFyU2xpZGVBbmltYXRvciA9IG9ucy5faW50ZXJuYWwuVGFiYmFyU2xpZGVBbmltYXRvcjtcblxuICB2YXIgTW9kaWZpZXJVdGlsID0gb25zLl9pbnRlcm5hbC5Nb2RpZmllclV0aWw7XG4gIHZhciB1dGlsID0gb25zLl91dGlsO1xuXG4gIHZhciBnZW5lcmF0ZUlkID0gKCgpID0+IHtcbiAgICB2YXIgaSA9IDA7XG4gICAgcmV0dXJuICgpID0+ICdvbnMtdGFiYmFyLWdlbi0nICsgKGkrKyk7XG4gIH0pKCk7XG5cbiAgY2xhc3MgVGFiYmFyRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fdGFiYmFySWQgPSBnZW5lcmF0ZUlkKCk7XG5cbiAgICAgIHRoaXMuX2FuaW1hdG9yRmFjdG9yeSA9IG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgICBhbmltYXRvcnM6IE9uc1RhYmJhckVsZW1lbnQuX2FuaW1hdG9yRGljdCxcbiAgICAgICAgYmFzZUNsYXNzOiBUYWJiYXJBbmltYXRvcixcbiAgICAgICAgYmFzZUNsYXNzTmFtZTogJ1RhYmJhckFuaW1hdG9yJyxcbiAgICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpLFxuICAgICAgICBkZWZhdWx0QW5pbWF0aW9uT3B0aW9uczogQW5pbWF0b3JGYWN0b3J5LnBhcnNlSlNPTlNhZmVseSh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgfHwge31cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX2NvbXBpbGVQYWdlSG9vayA9IG5ldyBvbnMuX2ludGVybmFsLkFzeW5jSG9vaygpO1xuICAgICAgdGhpcy5fbGlua1BhZ2VIb29rID0gbmV3IG9ucy5faW50ZXJuYWwuQXN5bmNIb29rKCk7XG4gICAgICB3aW5kb3cuT25zVGFiYmFyRWxlbWVudC5yZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xpbmtQYWdlSG9vay5mcmVlemUoKTtcbiAgICAgICAgdGhpcy5fY29tcGlsZVBhZ2VIb29rLmZyZWV6ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NvbXBpbGUoKSB7XG4gICAgICB2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnb25zLXRhYi1iYXJfX2NvbnRlbnQnKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgndGFiLWJhcl9fY29udGVudCcpO1xuXG4gICAgICB2YXIgdGFiYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0YWJiYXIuY2xhc3NMaXN0LmFkZCgndGFiLWJhcicpO1xuICAgICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ29ucy10YWItYmFyX19mb290ZXInKTtcbiAgICAgIHRhYmJhci5jbGFzc0xpc3QuYWRkKCdvbnMtdGFiYmFyLWlubmVyJyk7XG5cbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHRhYmJhcik7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgdGFiYmFyLmFwcGVuZENoaWxkKHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG5cbiAgICAgIGlmICh0aGlzLl9oYXNUb3BUYWJiYXIoKSkge1xuICAgICAgICB0aGlzLl9wcmVwYXJlRm9yVG9wVGFiYmFyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2hhc1RvcFRhYmJhcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKSA9PT0gJ3RvcCc7XG4gICAgfVxuXG4gICAgX3ByZXBhcmVGb3JUb3BUYWJiYXIoKSB7XG5cbiAgICAgIHZhciBjb250ZW50ID0gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYi1iYXJfX2NvbnRlbnQnKTtcbiAgICAgIHZhciB0YWJiYXIgPSBvbnMuX3V0aWwuZmluZENoaWxkKHRoaXMsICcudGFiLWJhcicpO1xuXG4gICAgICBjb250ZW50LnNldEF0dHJpYnV0ZSgnbm8tc3RhdHVzLWJhci1maWxsJywgJycpO1xuXG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ3RhYi1iYXItLXRvcF9fY29udGVudCcpO1xuICAgICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ3RhYi1iYXItLXRvcCcpO1xuXG4gICAgICB2YXIgcGFnZSA9IG9ucy5fdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtcGFnZScpO1xuICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgdGhpcy5zdHlsZS50b3AgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYWdlLl9nZXRDb250ZW50RWxlbWVudCgpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25zLl9pbnRlcm5hbC5zaG91bGRGaWxsU3RhdHVzQmFyKHRoaXMpKSB7XG4gICAgICAgIC8vIEFkanVzdG1lbnRzIGZvciBJT1M3XG4gICAgICAgIHZhciBmaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbGwuY2xhc3NMaXN0LmFkZCgndGFiLWJhcl9fc3RhdHVzLWJhci1maWxsJyk7XG4gICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAnMHB4JztcbiAgICAgICAgZmlsbC5zdHlsZS5oZWlnaHQgPSAnMHB4JztcblxuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShmaWxsLCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2V0VGFiYmFyRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYi1iYXInKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICAgKi9cbiAgICBsb2FkUGFnZShwYWdlLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIG9wdGlvbnMuX3JlbW92ZUVsZW1lbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuX2xvYWRQYWdlKHBhZ2UsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgICAqL1xuICAgIF9sb2FkUGFnZShwYWdlLCBvcHRpb25zKSB7XG4gICAgICBPbnNUYWJFbGVtZW50LnByb3RvdHlwZS5fY3JlYXRlUGFnZUVsZW1lbnQocGFnZSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICB0aGlzLl9sb2FkUGFnZURPTUFzeW5jKHBhZ2VFbGVtZW50LCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gcGFnZUVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAgICovXG4gICAgX2xvYWRQYWdlRE9NQXN5bmMocGFnZUVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICB0aGlzLl9jb21waWxlUGFnZUhvb2sucnVuKHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgdGhpcy5fbGlua1BhZ2VIb29rLnJ1bihwYWdlRWxlbWVudCA9PiB7XG4gICAgICAgICAgdGhpcy5fZ2V0Q29udGVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChwYWdlRWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5fc3dpdGNoUGFnZShwYWdlRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIH0sIHBhZ2VFbGVtZW50KTtcbiAgICAgIH0sIHBhZ2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VGFiYmFySWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGFiYmFySWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RWxlbWVudC9udWxsfVxuICAgICAqL1xuICAgIF9nZXRDdXJyZW50UGFnZUVsZW1lbnQoKSB7XG4gICAgICB2YXIgcGFnZXMgPSB0aGlzLl9nZXRDb250ZW50RWxlbWVudCgpLmNoaWxkcmVuO1xuICAgICAgdmFyIHBhZ2UgPSBudWxsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFnZXNbaV0uc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgcGFnZSA9IHBhZ2VzW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwYWdlICYmIHBhZ2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ29ucy1wYWdlJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGU6IHBhZ2UgZWxlbWVudCBtdXN0IGJlIGEgXCJvbnMtcGFnZVwiIGVsZW1lbnQuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuX3JlbW92ZUVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5zZWxlY3RlZFRhYkluZGV4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucHJldmlvdXNUYWJJbmRleFxuICAgICAqL1xuICAgIF9zd2l0Y2hQYWdlKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmdldEFjdGl2ZVRhYkluZGV4KCkgIT09IC0xKSB7XG4gICAgICAgIHZhciBvbGRQYWdlRWxlbWVudCA9IHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuY2hpbGRyZW4ubGVuZ3RoID4gMSA/IHRoaXMuX2dldEN1cnJlbnRQYWdlRWxlbWVudCgpIDogb25zLl9pbnRlcm5hbC5udWxsRWxlbWVudDtcbiAgICAgICAgdmFyIGFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3JGYWN0b3J5Lm5ld0FuaW1hdG9yKG9wdGlvbnMpO1xuXG4gICAgICAgIGFuaW1hdG9yLmFwcGx5KGVsZW1lbnQsIG9sZFBhZ2VFbGVtZW50LCBvcHRpb25zLnNlbGVjdGVkVGFiSW5kZXgsIG9wdGlvbnMucHJldmlvdXNUYWJJbmRleCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuX3JlbW92ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChvbGRQYWdlRWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgIG9sZFBhZ2VFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob2xkUGFnZUVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvbGRQYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgb3B0aW9ucy5jYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMua2VlcFBhZ2VdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBzdWNjZXNzIG9yIG5vdFxuICAgICAqL1xuICAgIHNldEFjdGl2ZVRhYihpbmRleCwgb3B0aW9ucykge1xuXG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgdmFyIHByZXZpb3VzVGFiID0gdGhpcy5fZ2V0QWN0aXZlVGFiRWxlbWVudCgpLFxuICAgICAgICBzZWxlY3RlZFRhYiA9IHRoaXMuX2dldFRhYkVsZW1lbnQoaW5kZXgpLFxuICAgICAgICBwcmV2aW91c1RhYkluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleCgpLFxuICAgICAgICBzZWxlY3RlZFRhYkluZGV4ID0gaW5kZXg7XG5cbiAgICAgIGlmICghc2VsZWN0ZWRUYWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHNlbGVjdGVkVGFiLmhhc0F0dHJpYnV0ZSgnbm8tcmVsb2FkJykgfHwgc2VsZWN0ZWRUYWIuaXNQZXJzaXN0ZW50KCkpICYmIGluZGV4ID09PSBwcmV2aW91c1RhYkluZGV4KSB7XG4gICAgICAgIHZhciBldmVudCA9IG5ldyBDdXN0b21FdmVudCgncmVhY3RpdmUnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIHRhYkl0ZW06IHNlbGVjdGVkVGFiXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYW5jZWxlZCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwcmVjaGFuZ2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICB0YWJJdGVtOiBzZWxlY3RlZFRhYixcbiAgICAgICAgICBjYW5jZWw6ICgpID0+IGNhbmNlbGVkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgICBzZWxlY3RlZFRhYi5zZXRJbmFjdGl2ZSgpO1xuICAgICAgICBpZiAocHJldmlvdXNUYWIpIHtcbiAgICAgICAgICBwcmV2aW91c1RhYi5zZXRBY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkVGFiLnNldEFjdGl2ZSgpO1xuXG4gICAgICB2YXIgbmVlZExvYWQgPSAhc2VsZWN0ZWRUYWIuaXNMb2FkZWQoKSAmJiAhb3B0aW9ucy5rZWVwUGFnZTtcblxuICAgICAgaWYgKG5lZWRMb2FkKSB7XG4gICAgICAgIHZhciByZW1vdmVFbGVtZW50ID0gdHJ1ZTtcblxuICAgICAgICBpZiAocHJldmlvdXNUYWIgJiYgcHJldmlvdXNUYWIuaXNQZXJzaXN0ZW50KCkpIHtcbiAgICAgICAgICByZW1vdmVFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwb3N0Y2hhbmdlJywge1xuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgdGFiSXRlbTogc2VsZWN0ZWRUYWJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZXZpb3VzVGFiSW5kZXg6IHByZXZpb3VzVGFiSW5kZXgsXG4gICAgICAgICAgc2VsZWN0ZWRUYWJJbmRleDogc2VsZWN0ZWRUYWJJbmRleCxcbiAgICAgICAgICBfcmVtb3ZlRWxlbWVudDogcmVtb3ZlRWxlbWVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIHBhcmFtcy5hbmltYXRpb24gPSBvcHRpb25zLmFuaW1hdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZFRhYi5pc1BlcnNpc3RlbnQoKSkge1xuICAgICAgICAgIHNlbGVjdGVkVGFiLl9sb2FkUGFnZUVsZW1lbnQocGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZFBlcnNpc3RlbnRQYWdlRE9NKHBhZ2VFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgICAgIH0sIHtjb21waWxlOiB0aGlzLl9jb21waWxlUGFnZUhvb2ssIGxpbms6IHRoaXMuX2xpbmtQYWdlSG9va30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2xvYWRQYWdlKHNlbGVjdGVkVGFiLmdldEF0dHJpYnV0ZSgncGFnZScpLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMuX2dldFRhYmJhckVsZW1lbnQoKS5jaGlsZHJlbikuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICAgIGlmICh0YWIgIT0gc2VsZWN0ZWRUYWIpIHtcbiAgICAgICAgICB0YWIuc2V0SW5hY3RpdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5lZWRMb2FkKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdwb3N0Y2hhbmdlJywge1xuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgdGFiSXRlbTogc2VsZWN0ZWRUYWJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuYW5pbWF0aW9uXG4gICAgICovXG4gICAgX2xvYWRQZXJzaXN0ZW50UGFnZURPTShlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICB0aGlzLl9zd2l0Y2hQYWdlKGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdmlzaWJsZVxuICAgICAqL1xuICAgIHNldFRhYmJhclZpc2liaWxpdHkodmlzaWJsZSkge1xuICAgICAgdGhpcy5fZ2V0Q29udGVudEVsZW1lbnQoKS5zdHlsZVt0aGlzLl9oYXNUb3BUYWJiYXIoKSA/ICd0b3AnIDogJ2JvdHRvbSddID0gdmlzaWJsZSA/ICcnIDogJzBweCc7XG4gICAgICB0aGlzLl9nZXRUYWJiYXJFbGVtZW50KCkuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICBfZ2V0Q29udGVudEVsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gb25zLl91dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYi1iYXJfX2NvbnRlbnQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFdoZW4gYWN0aXZlIHRhYiBpcyBub3QgZm91bmQsIHJldHVybnMgLTEuXG4gICAgICovXG4gICAgZ2V0QWN0aXZlVGFiSW5kZXgoKSB7XG4gICAgICB2YXIgdGFicyA9IHRoaXMuX2dldFRhYmJhckVsZW1lbnQoKS5jaGlsZHJlbjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0YWJzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvbnMtdGFiJyAmJiB0YWJzW2ldLmlzQWN0aXZlICYmIHRhYnNbaV0uaXNBY3RpdmUoKSkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFdoZW4gYWN0aXZlIHRhYiBpcyBub3QgZm91bmQsIHJldHVybnMgLTEuXG4gICAgICovXG4gICAgX2dldEFjdGl2ZVRhYkVsZW1lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0VGFiRWxlbWVudCh0aGlzLmdldEFjdGl2ZVRhYkluZGV4KCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAgICovXG4gICAgX2dldFRhYkVsZW1lbnQoaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRUYWJiYXJFbGVtZW50KCkuY2hpbGRyZW5baW5kZXhdO1xuICAgIH1cblxuICAgIGRldGFjaGVkQ2FsbGJhY2soKSB7IH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7IH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zVGFiYmFyRWxlbWVudCkge1xuICAgIHdpbmRvdy5PbnNUYWJiYXJFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtdGFiYmFyJywge1xuICAgICAgcHJvdG90eXBlOiBUYWJiYXJFbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuXG4gICAgd2luZG93Lk9uc1RhYmJhckVsZW1lbnQuX2FuaW1hdG9yRGljdCA9IHtcbiAgICAgICdkZWZhdWx0JzogVGFiYmFyTm9uZUFuaW1hdG9yLFxuICAgICAgJ2ZhZGUnOiBUYWJiYXJGYWRlQW5pbWF0b3IsXG4gICAgICAnc2xpZGUnOiBUYWJiYXJTbGlkZUFuaW1hdG9yLFxuICAgICAgJ25vbmUnOiBUYWJiYXJOb25lQW5pbWF0b3JcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBBbmltYXRvclxuICAgICAqL1xuICAgIHdpbmRvdy5PbnNUYWJiYXJFbGVtZW50LnJlZ2lzdGVyQW5pbWF0b3IgPSBmdW5jdGlvbihuYW1lLCBBbmltYXRvcikge1xuICAgICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgVGFiYmFyQW5pbWF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJBbmltYXRvclwiIHBhcmFtIG11c3QgaW5oZXJpdCBUYWJiYXJBbmltYXRvcicpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gICAgfTtcblxuICAgIHdpbmRvdy5PbnNUYWJiYXJFbGVtZW50LnJlYWR5ID0gZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHtcbiAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxufSkoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbigoKSA9PiB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBjbGFzcyBUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5kcyBvbnMuX0Jhc2VFbGVtZW50IHtcbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy5pbm5lckhUTUw7XG5cbiAgICAgIHdoaWxlICh0aGlzLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF0dGFjaGVkQ2FsbGJhY2soKSB7XG4gICAgICB2YXIgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ190ZW1wbGF0ZWxvYWRlZCcsIHtidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlfSk7XG4gICAgICBldmVudC50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICBldmVudC50ZW1wbGF0ZUlkID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc1RlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCgnb25zLXRlbXBsYXRlJywge1xuICAgICAgcHJvdG90eXBlOiBUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4oKCkgPT4ge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHNjaGVtZSA9IHsnJzogJ3Rvb2xiYXItYnV0dG9uLS0qJ307XG4gIHZhciBNb2RpZmllclV0aWwgPSBvbnMuX2ludGVybmFsLk1vZGlmaWVyVXRpbDtcblxuICBjbGFzcyBUb29sYmFyQnV0dG9uRWxlbWVudCBleHRlbmRzIG9ucy5fQmFzZUVsZW1lbnQge1xuXG4gICAgY3JlYXRlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCd0b29sYmFyLWJ1dHRvbicpO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLWJhcl9fbGluZS1oZWlnaHQnKTtcblxuICAgICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCF3aW5kb3cuT25zVG9vbGJhckJ1dHRvbikge1xuICAgIHdpbmRvdy5PbnNUb29sYmFyQnV0dG9uID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtdG9vbGJhci1idXR0b24nLCB7XG4gICAgICBwcm90b3R5cGU6IFRvb2xiYXJCdXR0b25FbGVtZW50LnByb3RvdHlwZVxuICAgIH0pO1xuICB9XG59KSgpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuKCgpID0+IHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBzY2hlbWUgPSB7XG4gICAgJyc6ICduYXZpZ2F0aW9uLWJhci0tKicsXG4gICAgJy5uYXZpZ2F0aW9uLWJhcl9fbGVmdCc6ICduYXZpZ2F0aW9uLWJhci0tKl9fbGVmdCcsXG4gICAgJy5uYXZpZ2F0aW9uLWJhcl9fY2VudGVyJzogJ25hdmlnYXRpb24tYmFyLS0qX19jZW50ZXInLFxuICAgICcubmF2aWdhdGlvbi1iYXJfX3JpZ2h0JzogJ25hdmlnYXRpb24tYmFyLS0qX19yaWdodCdcbiAgfTtcbiAgdmFyIE1vZGlmaWVyVXRpbCA9IG9ucy5faW50ZXJuYWwuTW9kaWZpZXJVdGlsO1xuXG4gIGNsYXNzIFRvb2xiYXJFbGVtZW50IGV4dGVuZHMgb25zLl9CYXNlRWxlbWVudCB7XG5cbiAgICBjcmVhdGVkQ2FsbGJhY2soKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICAgIHRoaXMuX3RyeVRvRW5zdXJlTm9kZVBvc2l0aW9uKCk7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fdHJ5VG9FbnN1cmVOb2RlUG9zaXRpb24oKSk7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICAgIHJldHVybiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRhY2hlZENhbGxiYWNrKCkge1xuICAgICAgdGhpcy5fdHJ5VG9FbnN1cmVOb2RlUG9zaXRpb24oKTtcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl90cnlUb0Vuc3VyZU5vZGVQb3NpdGlvbigpKTtcbiAgICB9XG5cbiAgICBfdHJ5VG9FbnN1cmVOb2RlUG9zaXRpb24oKSB7XG4gICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fCB0aGlzLmhhc0F0dHJpYnV0ZSgnaW5saW5lJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgcGFnZSA9IHBhZ2UucGFyZW50Tm9kZTtcblxuICAgICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYWdlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvbnMtcGFnZScpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwYWdlLl9yZWdpc3RlclRvb2xiYXIodGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2dldFRvb2xiYXJMZWZ0SXRlbXNFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcignLmxlZnQnKSB8fCBvbnMuX2ludGVybmFsLm51bGxFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgICAqL1xuICAgIF9nZXRUb29sYmFyQ2VudGVySXRlbXNFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcignLmNlbnRlcicpIHx8IG9ucy5faW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2dldFRvb2xiYXJSaWdodEl0ZW1zRWxlbWVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5yaWdodCcpIHx8IG9ucy5faW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAgICovXG4gICAgX2dldFRvb2xiYXJCYWNrQnV0dG9uTGFiZWxFbGVtZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcignb25zLWJhY2stYnV0dG9uIC5iYWNrLWJ1dHRvbl9fbGFiZWwnKSB8fCBvbnMuX2ludGVybmFsLm51bGxFbGVtZW50O1xuICAgIH1cblxuICAgIF9jb21waWxlKCkge1xuICAgICAgdmFyIHNob3VsZEFwcGVuZEFuZHJvaWRNb2RpZmllciA9IG9ucy5wbGF0Zm9ybS5pc0FuZHJvaWQoKSAmJiAhdGhpcy5oYXNBdHRyaWJ1dGUoJ2ZpeGVkLXN0eWxlJyk7XG4gICAgICB2YXIgaW5saW5lID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2lubGluZScpO1xuXG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ25hdmlnYXRpb24tYmFyJyk7XG5cbiAgICAgIGlmIChzaG91bGRBcHBlbmRBbmRyb2lkTW9kaWZpZXIpIHtcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLWJhci0tYW5kcm9pZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlubGluZSkge1xuICAgICAgICB0aGlzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5zdHlsZS56SW5kZXggPSAnMTAwMDAnO1xuICAgICAgICB0aGlzLnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICAgICAgdGhpcy5zdHlsZS5yaWdodCA9ICcwcHgnO1xuICAgICAgICB0aGlzLnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbnN1cmVUb29sYmFySXRlbUVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgX2Vuc3VyZVRvb2xiYXJJdGVtRWxlbWVudHMoKSB7XG5cbiAgICAgIHZhciBoYXNDZW50ZXJDbGFzc0VsZW1lbnRPbmx5ID0gdGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgdGhpcy5jaGlsZHJlblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ2NlbnRlcicpO1xuICAgICAgdmFyIGNlbnRlcjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gY2FzZSBvZiBub3QgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5jaGlsZE5vZGVzW2ldLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NlbnRlckNsYXNzRWxlbWVudE9ubHkpIHtcbiAgICAgICAgY2VudGVyID0gdGhpcy5fZW5zdXJlVG9vbGJhckl0ZW1Db250YWluZXIoJ2NlbnRlcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2VudGVyID0gdGhpcy5fZW5zdXJlVG9vbGJhckl0ZW1Db250YWluZXIoJ2NlbnRlcicpO1xuICAgICAgICB2YXIgbGVmdCA9IHRoaXMuX2Vuc3VyZVRvb2xiYXJJdGVtQ29udGFpbmVyKCdsZWZ0Jyk7XG4gICAgICAgIHZhciByaWdodCA9IHRoaXMuX2Vuc3VyZVRvb2xiYXJJdGVtQ29udGFpbmVyKCdyaWdodCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuWzBdICE9PSBsZWZ0IHx8IHRoaXMuY2hpbGRyZW5bMV0gIT09IGNlbnRlciB8fCB0aGlzLmNoaWxkcmVuWzJdICE9PSByaWdodCkge1xuICAgICAgICAgIGlmIChsZWZ0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQobGVmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjZW50ZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChjZW50ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmlnaHQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChyaWdodCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGxlZnQpO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNlbnRlcik7XG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQocmlnaHQpO1xuXG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNlbnRlci5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLWJhcl9fdGl0bGUnKTtcbiAgICB9XG5cbiAgICBfZW5zdXJlVG9vbGJhckl0ZW1Db250YWluZXIobmFtZSkge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IG9ucy5fdXRpbC5maW5kQ2hpbGQodGhpcywgJy4nICsgbmFtZSk7XG5cbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRhaW5lci5pbm5lckhUTUwudHJpbSgpID09PSAnJykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyZuYnNwOyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCduYXZpZ2F0aW9uLWJhcl9fJyArIG5hbWUpO1xuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG5cbiAgfVxuXG4gIGlmICghd2luZG93Lk9uc1Rvb2xiYXJFbGVtZW50KSB7XG4gICAgd2luZG93Lk9uc1Rvb2xiYXJFbGVtZW50ID0gZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KCdvbnMtdG9vbGJhcicsIHtcbiAgICAgIHByb3RvdHlwZTogVG9vbGJhckVsZW1lbnQucHJvdG90eXBlXG4gICAgfSk7XG4gIH1cbn0pKCk7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0= \ No newline at end of file diff --git a/core/elements/ons-carousel.es6 b/core/elements/ons-carousel.es6 index 2dd3acc194..a383506ecb 100644 --- a/core/elements/ons-carousel.es6 +++ b/core/elements/ons-carousel.es6 @@ -285,7 +285,8 @@ limitations under the License. return 0; } - for (let i = 0; i < count; i++) { + let i; + for (i = 0; i < count; i++) { if (size * i <= scroll && size * (i + 1) > scroll) { return i; } @@ -564,7 +565,8 @@ limitations under the License. * @return {Array} */ _getCarouselItemElements() { - return ons._util.arrayFrom(this.querySelectorAll('ons-carousel-item')); + return ons._util.arrayFrom(this.children) + .filter((child) => child.nodeName.toLowerCase() === 'ons-carousel-item'); } /** diff --git a/core/elements/ons-carousel.spec.es6 b/core/elements/ons-carousel.spec.es6 index 42e2e94090..baa6a3cdbc 100644 --- a/core/elements/ons-carousel.spec.es6 +++ b/core/elements/ons-carousel.spec.es6 @@ -375,6 +375,34 @@ describe('OnsCarouselElement', () => { }); }); + describe('#_getCarouselItemElements()', () => { + it('returns the carousel item elements', () => { + let rv = carousel._getCarouselItemElements(); + + expect(rv.length).to.equal(3); + + for (let i = 0; i < rv.length; i++) { + expect(rv[i]).to.be.an.instanceof(OnsCarouselItemElement); + } + }); + + it('doesn\'t return the items in child carousels (issue #844)', () => { + let carousel = ons._util.createElement(` + + + + + + + + + `); + + let rv = carousel._getCarouselItemElements(); + expect(rv.length).to.equal(1); + }); + }); + describe('#_startMomentumScroll()', () => { let ev; diff --git a/core/elements/ons-fab.es6 b/core/elements/ons-fab.es6 new file mode 100644 index 0000000000..3a95f081cc --- /dev/null +++ b/core/elements/ons-fab.es6 @@ -0,0 +1,169 @@ +/* +Copyright 2013-2015 ASIAL CORPORATION +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. +*/ + +(() => { + 'use strict'; + + const scheme = { + '': 'fab--*', + }; + const ModifierUtil = ons._internal.ModifierUtil; + + class FabElement extends ons._BaseElement { + + createdCallback() { + this._compile(); + ModifierUtil.initModifier(this, scheme); + this.classList.add('fab'); + this._updatePosition(); + this.show(); + } + + _compile() { + var content = document.createElement('span'); + content.classList.add('fab__icon'); + + const children = ons._util.arrayFrom(this.childNodes).forEach(element => content.appendChild(element)); + + this.insertBefore(content, this.firstChild); + } + + attributeChangedCallback(name, last, current) { + if (name === 'modifier') { + return ModifierUtil.onModifierChanged(last, current, this, scheme); + } + if (name === 'position') { + this._updatePosition(); + } + } + + _show() { + if (!this.isInline()) { + this.show(); + } + } + + _hide() { + if (!this.isInline()) { + this.hide(); + } + } + + _updatePosition() { + const position = this.getAttribute('position'); + this.classList.remove( + 'fab--top__left', + 'fab--bottom__right', + 'fab--bottom__left', + 'fab--top__right', + 'fab--top__center', + 'fab--bottom__center'); + switch (position) { + case 'top right': + case 'right top': + this.classList.add('fab--top__right'); + break; + case 'top left': + case 'left top': + this.classList.add('fab--top__left'); + break; + case 'bottom right': + case 'right bottom': + this.classList.add('fab--bottom__right'); + break; + case 'bottom left': + case 'left bottom': + this.classList.add('fab--bottom__left'); + break; + case 'center top': + case 'top center': + this.classList.add('fab--top__center'); + break; + case 'center bottom': + case 'bottom center': + this.classList.add('fab--bottom__center'); + break; + default: + break; + } + } + + show(options = {}) { + this.style.transform = 'scale(1)'; + this.style.webkitTransform = 'scale(1)'; + } + + hide(options = {}) { + this.style.transform = 'scale(0)'; + this.style.webkitTransform = 'scale(0)'; + } + + /** + * Disable of enable fab. + * + * @param {Boolean} + */ + setDisabled(disabled) { + if (typeof disabled !== 'boolean') { + throw new Error('Argument must be a boolean.'); + } + + if (disabled) { + this.setAttribute('disabled', ''); + } else { + this.removeAttribute('disabled'); + } + } + + /** + * True if fab is disabled. + * + * @return {Boolean} + */ + isDisabled() { + return this.hasAttribute('disabled'); + } + + /** + * True if fab is inline element. + * + * @return {Boolean} + */ + isInline() { + return this.hasAttribute('inline'); + } + + /** + * True if fab is shown + * + * @return {Boolean} + */ + isShown() { + return this.style.transform === 'scale(1)' && this.style.display !== 'none'; + } + + toggle() { + if (this.isShown()) { + this.hide(); + } else { + this.show(); + } + } + } + + if (!window.OnsFabElement) { + window.OnsFabElement = document.registerElement('ons-fab', { + prototype: FabElement.prototype + }); + } +})(); diff --git a/core/elements/ons-fab.spec.es6 b/core/elements/ons-fab.spec.es6 new file mode 100644 index 0000000000..0ef09f3c96 --- /dev/null +++ b/core/elements/ons-fab.spec.es6 @@ -0,0 +1,205 @@ +describe('OnsFabElement', () => { + let fab; + + beforeEach(() => { + fab = new OnsFabElement(); + }); + + it('exists', () => { + expect(window.OnsFabElement).to.be.ok; + }); + + it('provides modifier attribute', () => { + fab.setAttribute('modifier', 'hoge'); + expect(fab.classList.contains('fab--hoge')).to.be.true; + + fab.setAttribute('modifier', ' foo bar'); + expect(fab.classList.contains('fab--foo')).to.be.true; + expect(fab.classList.contains('fab--bar')).to.be.true; + expect(fab.classList.contains('fab--hoge')).not.to.be.true; + + fab.classList.add('fab--piyo'); + fab.setAttribute('modifier', 'fuga'); + expect(fab.classList.contains('fab--piyo')).to.be.true; + expect(fab.classList.contains('fab--fuga')).to.be.true; + }); + + describe('#_show()', () => { + it('does nothing if element is inline', () => { + let spy = chai.spy.on(fab, 'show'); + fab.setAttribute('inline', ''); + fab._show(); + expect(spy).to.not.have.been.called(); + }); + + it('calls show() if element is not inline', () => { + let spy = chai.spy.on(fab, 'show'); + fab._show(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#_hide()', () => { + it('does nothing if element is inline', () => { + let spy = chai.spy.on(fab, 'hide'); + fab.setAttribute('inline', ''); + fab._hide(); + expect(spy).to.not.have.been.called(); + }); + + it('calls hide() if element is not inline', () => { + let spy = chai.spy.on(fab, 'hide'); + fab._hide(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#_updatePosition()', () => { + it('is called when the "position" attribute changes', () => { + let spy = chai.spy.on(fab, '_updatePosition'); + + fab.setAttribute('position', 'top left'); + fab.setAttribute('position', 'bottom left'); + + expect(spy).to.have.been.called.twice; + }); + + it('adds the correct class', () => { + fab.setAttribute('position', 'top right'); + expect(fab.classList.contains('fab--top__right')).to.be.true; + + fab.setAttribute('position', 'top left'); + expect(fab.classList.contains('fab--top__left')).to.be.true; + + fab.setAttribute('position', 'bottom right'); + expect(fab.classList.contains('fab--bottom__right')).to.be.true; + + fab.setAttribute('position', 'bottom left'); + expect(fab.classList.contains('fab--bottom__left')).to.be.true; + + fab.setAttribute('position', 'top center'); + expect(fab.classList.contains('fab--top__center')).to.be.true; + + fab.setAttribute('position', 'bottom center'); + expect(fab.classList.contains('fab--bottom__center')).to.be.true; + + fab.setAttribute('position', 'right top'); + expect(fab.classList.contains('fab--top__right')).to.be.true; + + fab.setAttribute('position', 'left top'); + expect(fab.classList.contains('fab--top__left')).to.be.true; + + fab.setAttribute('position', 'right bottom'); + expect(fab.classList.contains('fab--bottom__right')).to.be.true; + + fab.setAttribute('position', 'left bottom'); + expect(fab.classList.contains('fab--bottom__left')).to.be.true; + + fab.setAttribute('position', 'center top'); + expect(fab.classList.contains('fab--top__center')).to.be.true; + + fab.setAttribute('position', 'center bottom'); + expect(fab.classList.contains('fab--bottom__center')).to.be.true; + + expect(fab.classList.contains('fab-top__left')).not.to.be.true; + expect(fab.classList.contains('fab-bottom__right')).not.to.be.true; + expect(fab.classList.contains('fab-bottom__left')).not.to.be.true; + expect(fab.classList.contains('fab-top__right')).not.to.be.true; + expect(fab.classList.contains('fab-top__center')).not.to.be.true; + }); + + it('does nothing if position "attribute" is incorrect', () => { + const oldClassList = ons._util.arrayFrom(fab.classList); + + fab.setAttribute('position', 'hoge'); + const newClassList = ons._util.arrayFrom(fab.classList); + + for (let i = 0; i < newClassList.length; i++) { + expect(oldClassList[i]).to.equal(newClassList[i]); + } + + expect(oldClassList.length).to.equal(newClassList.length); + }); + }); + + describe('#show()', () => { + it('sets scale transform to 1', () => { + fab.hide(); + expect(fab.style.transform).not.to.equal('scale(1)'); + fab.show(); + expect(fab.style.transform).to.equal('scale(1)'); + }); + }); + + describe('#hide()', () => { + it('sets scale transform to 0', () => { + expect(fab.style.transform).not.to.equal('scale(0)'); + fab.hide(); + expect(fab.style.transform).to.equal('scale(0)'); + }); + }); + + describe('#setDisabled()', () => { + it('throws an error if argument is not boolean', () => { + expect(() => fab.setDisabled('hoge')).to.throw(Error); + }); + + it('sets the disabled attribute if argument is true', () => { + expect(fab.hasAttribute('disabled')).to.be.false; + fab.setDisabled(true); + expect(fab.hasAttribute('disabled')).to.be.true; + }); + + it('removes the disabled attribute if argument is false', () => { + fab.setAttribute('disabled', ''); + fab.setDisabled(false); + expect(fab.hasAttribute('disabled')).to.be.false; + }); + }); + + describe('#isDisabled()', () => { + it('returns whether the disabled attribute is set or not', () => { + fab.setAttribute('disabled', ''); + expect(fab.isDisabled()).to.be.true; + fab.removeAttribute('disabled'); + expect(fab.isDisabled()).to.be.false; + }); + }); + + describe('#isInline()', () => { + it('returns whether the inline attribute is set or not', () => { + fab.setAttribute('inline', ''); + expect(fab.isInline()).to.be.true; + fab.removeAttribute('inline'); + expect(fab.isInline()).to.be.false; + }); + }); + + describe('#isShown()', () => { + it('returns whether the element is currently shown or not', () => { + expect(fab.isShown()).to.be.true; + fab.hide(); + expect(fab.isShown()).to.be.false; + fab.show(); + expect(fab.isShown()).to.be.true; + fab.style.display = 'none'; + expect(fab.isShown()).to.be.false; + }); + }); + + describe('#toggle()', () => { + it('calls #hide() if element is shown', () => { + let spy = chai.spy.on(fab, 'hide'); + fab.toggle(); + expect(spy).to.have.been.called.once; + }); + + it('calls #show() if element is hidden', () => { + let spy = chai.spy.on(fab, 'show'); + fab.toggle(); + expect(spy).not.to.have.been.called(); + fab.toggle(); + expect(spy).to.have.been.called.once; + }); + }); +}); diff --git a/core/elements/ons-speed-dial-item.es6 b/core/elements/ons-speed-dial-item.es6 new file mode 100644 index 0000000000..db4e233b74 --- /dev/null +++ b/core/elements/ons-speed-dial-item.es6 @@ -0,0 +1,56 @@ +/* +Copyright 2013-2015 ASIAL CORPORATION +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. +*/ + +(() => { + 'use strict'; + + const scheme = { + '': 'speed-dial__item--*', + }; + const ModifierUtil = ons._internal.ModifierUtil; + + class SpeedDialItemElement extends ons._BaseElement { + + createdCallback() { + ModifierUtil.initModifier(this, scheme); + this.classList.add('fab'); + this.classList.add('fab--mini'); + this.classList.add('speed-dial__item'); + this._boundOnClick = this._onClick.bind(this); + } + + attributeChangedCallback(name, last, current) { + if (name === 'modifier') { + return ModifierUtil.onModifierChanged(last, current, this, scheme); + } + } + + attachedCallback() { + this.addEventListener('click', this._boundOnClick, false); + } + + detachedCallback() { + this.removeEventListener('click', this._boundOnClick, false); + } + + _onClick(e) { + e.stopPropagation(); + } + } + + if (!window.OnsSpeedDialItemElement) { + window.OnsSpeedDialItemElement = document.registerElement('ons-speed-dial-item', { + prototype: SpeedDialItemElement.prototype + }); + } +})(); diff --git a/core/elements/ons-speed-dial-item.spec.es6 b/core/elements/ons-speed-dial-item.spec.es6 new file mode 100644 index 0000000000..afe58e22be --- /dev/null +++ b/core/elements/ons-speed-dial-item.spec.es6 @@ -0,0 +1,42 @@ +describe('OnsSpeedDialItemElement', () => { + let item; + + beforeEach(() => { + item = new OnsSpeedDialItemElement(); + document.body.appendChild(item); + }); + + afterEach(() => { + item.remove(); + }); + + it('exists', () => { + expect(window.OnsSpeedDialItemElement).to.be.ok; + }); + + it('provides modifier attribute', () => { + item.setAttribute('modifier', 'hoge'); + expect(item.classList.contains('speed-dial__item--hoge')).to.be.true; + + item.setAttribute('modifier', ' foo bar'); + expect(item.classList.contains('speed-dial__item--foo')).to.be.true; + expect(item.classList.contains('speed-dial__item--bar')).to.be.true; + expect(item.classList.contains('speed-dial__item--hoge')).not.to.be.true; + + item.classList.add('speed-dial__item--piyo'); + item.setAttribute('modifier', 'fuga'); + expect(item.classList.contains('speed-dial__item--piyo')).to.be.true; + expect(item.classList.contains('speed-dial__item--fuga')).to.be.true; + }); + + describe('#_onClick()', () => { + it('should stop propagation', () => { + const e = { + stopPropagation: chai.spy() + }; + + item._onClick(e); + expect(e.stopPropagation).to.have.been.called.once; + }); + }); +}); diff --git a/core/elements/ons-speed-dial.es6 b/core/elements/ons-speed-dial.es6 new file mode 100644 index 0000000000..2dbc910947 --- /dev/null +++ b/core/elements/ons-speed-dial.es6 @@ -0,0 +1,295 @@ +/* +Copyright 2013-2015 ASIAL CORPORATION +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. +*/ + +(() => { + 'use strict'; + + const scheme = { + '': 'speed-dial--*', + }; + const ModifierUtil = ons._internal.ModifierUtil; + + class SpeedDialElement extends ons._BaseElement { + + createdCallback() { + this._compile(); + this._shown = true; + this._itemShown = false; + ModifierUtil.initModifier(this, scheme); + this._boundOnClick = this._onClick.bind(this); + this.classList.add('speed__dial'); + + if (this.hasAttribute('direction')) { + this._updateDirection(this.getAttribute('direction')); + } else { + this._updateDirection('up'); + } + this._updatePosition(); + + if (this.hasAttribute('disabled')) { + this.setDisabled(true); + } + } + + _compile() { + let content = document.createElement('ons-fab'); + + const children = ons._util.arrayFrom(this.childNodes).forEach(element => (element.nodeName.toLowerCase() !== 'ons-speed-dial-item') ? content.firstChild.appendChild(element) : true); + + this.insertBefore(content, this.firstChild); + } + + attributeChangedCallback(name, last, current) { + if (name === 'modifier') { + return ModifierUtil.onModifierChanged(last, current, this, scheme); + } + else if (name === 'direction') { + this._updateDirection(current); + } + else if (name === 'position') { + this._updatePosition(); + } + else if (name === 'disabled') { + if (current !== null) { + this.setDisabled(true); + } else { + this.setDisabled(false); + } + } + } + + attachedCallback() { + this.addEventListener('click', this._boundOnClick, false); + } + + detachedCallback() { + this.removeEventListener('click', this._boundOnClick, false); + } + + get items() { + return ons._util.arrayFrom(this.querySelectorAll('ons-speed-dial-item')); + } + + _onClick(e) { + if (!this.isDisabled()) { + this.toggleItems(); + } + } + + _show() { + if (!this.isInline()) { + this.show(); + } + } + + _hide() { + if (!this.isInline()) { + this.hide(); + } + } + + _updateDirection(direction) { + const children = this.items; + for (let i = 0; i < children.length; i++) { + children[i].style.transitionDelay = 25 * i + 'ms'; + children[i].style.webkitTransitionDelay = 25 * i + 'ms'; + children[i].style.bottom = 'auto'; + children[i].style.right = 'auto'; + children[i].style.top = 'auto'; + children[i].style.left = 'auto'; + } + switch (direction) { + case 'up': + for (let i = 0; i < children.length; i++) { + children[i].style.bottom = 72 + 56 * i + 'px'; + children[i].style.right = '8px'; + } + break; + case 'down': + for (let i = 0; i < children.length; i++) { + children[i].style.top = 72 + 56 * i + 'px'; + children[i].style.left = '8px'; + } + break; + case 'left': + for (let i = 0; i < children.length; i++) { + children[i].style.top = '8px'; + children[i].style.right = 72 + 56 * i + 'px'; + } + break; + case 'right': + for (let i = 0; i < children.length; i++) { + children[i].style.top = '8px'; + children[i].style.left = 72 + 56 * i + 'px'; + } + break; + default: + throw new Error('Argument must be one of up, down, left or right.'); + } + } + + _updatePosition() { + const position = this.getAttribute('position'); + this.classList.remove( + 'fab--top__left', + 'fab--bottom__right', + 'fab--bottom__left', + 'fab--top__right', + 'fab--top__center', + 'fab--bottom__center'); + switch(position) { + case 'top right': + case 'right top': + this.classList.add('fab--top__right'); + break; + case 'top left': + case 'left top': + this.classList.add('fab--top__left'); + break; + case 'bottom right': + case 'right bottom': + this.classList.add('fab--bottom__right'); + break; + case 'bottom left': + case 'left bottom': + this.classList.add('fab--bottom__left'); + break; + case 'center top': + case 'top center': + this.classList.add('fab--top__center'); + break; + case 'center bottom': + case 'bottom center': + this.classList.add('fab--bottom__center'); + break; + default: + break; + } + } + + show(options = {}) { + this.querySelector('ons-fab').show(); + this._shown = true; + } + + hide(options = {}) { + this.hideItems(); + setTimeout(()=>{ + this.querySelector('ons-fab').hide(); + }, 200); + this._shown = false; + } + + showItems() { + if (!this._itemShown) { + const children = this.items; + for (let i = 0; i < children.length; i++) { + children[i].style.transform = 'scale(1)'; + children[i].style.webkitTransform = 'scale(1)'; + children[i].style.transitionDelay = 25 * i + 'ms'; + children[i].style.webkitTransitionDelay = 25 * i + 'ms'; + } + } + this._itemShown = true; + } + + hideItems() { + if (this._itemShown) { + const children = this.items; + for (let i = 0; i < children.length; i++) { + children[i].style.transform = 'scale(0)'; + children[i].style.webkitTransform = 'scale(0)'; + children[i].style.transitionDelay = 25 * (children.length - i) + 'ms'; + children[i].style.webkitTransitionDelay = 25 * (children.length - i) + 'ms'; + } + } + this._itemShown = false; + } + + + /** + * Disable of enable speed dial. + * + * @param {Boolean} + */ + setDisabled(disabled) { + if (typeof disabled !== 'boolean') { + throw new Error('Argument must be a boolean.'); + } + + if (disabled) { + this.hideItems(); + this.setAttribute('disabled', ''); + ons._util.arrayFrom(this.childNodes).forEach(element => (element.classList.contains('fab')) ? element.setAttribute('disabled', '') : true); + } else { + this.removeAttribute('disabled'); + ons._util.arrayFrom(this.childNodes).forEach(element => (element.classList.contains('fab')) ? element.removeAttribute('disabled') : true); + } + } + + /** + * True if speed dial is disabled. + * + * @return {Boolean} + */ + isDisabled() { + return this.hasAttribute('disabled'); + } + + /** + * True if speed dial is an inline element. + * + * @return {Boolean} + */ + isInline() { + return this.hasAttribute('inline'); + } + + /** + * True if speed dial is shown + * + * @return {Boolean} + */ + isShown() { + return this._shown && this.style.display !== 'none'; + } + + isItemShown() { + return this._itemShown; + } + + toggle() { + if (this.isShown()) { + this.hide(); + } else { + this.show(); + } + } + + toggleItems() { + if (this.isItemShown()) { + this.hideItems(); + } else { + this.showItems(); + } + } + + + } + + if (!window.OnsSpeedDialElement) { + window.OnsSpeedDialElement = document.registerElement('ons-speed-dial', { + prototype: SpeedDialElement.prototype + }); + } +})(); diff --git a/core/elements/ons-speed-dial.spec.es6 b/core/elements/ons-speed-dial.spec.es6 new file mode 100644 index 0000000000..8709c11434 --- /dev/null +++ b/core/elements/ons-speed-dial.spec.es6 @@ -0,0 +1,322 @@ +describe('OnsSpeedDialElement', () => { + let speedDial; + + beforeEach(() => { + speedDial = ons._util.createElement(` + + Item 1 + Item 2 + Item 3 + + `); + + document.body.appendChild(speedDial); + }); + + afterEach(() => { + speedDial.remove(); + }); + + it('exists', () => { + expect(window.OnsSpeedDialElement).to.be.ok; + }); + + it('provides modifier attribute', () => { + speedDial.setAttribute('modifier', 'hoge'); + expect(speedDial.classList.contains('speed-dial--hoge')).to.be.true; + + speedDial.setAttribute('modifier', ' foo bar'); + expect(speedDial.classList.contains('speed-dial--foo')).to.be.true; + expect(speedDial.classList.contains('speed-dial--bar')).to.be.true; + expect(speedDial.classList.contains('speed-dial--hoge')).not.to.be.true; + + speedDial.classList.add('speed-dial--piyo'); + speedDial.setAttribute('modifier', 'fuga'); + expect(speedDial.classList.contains('speed-dial--piyo')).to.be.true; + expect(speedDial.classList.contains('speed-dial--fuga')).to.be.true; + }); + + describe('#items', () => { + it('should be a list of OnsSpeedDialItemElement', () => { + expect(speedDial.items.length).to.equal(3); + + for (let i = 0; i < speedDial.items.length; i++) { + expect(speedDial.items[i]).to.be.an.instanceof(OnsSpeedDialItemElement); + } + }); + }); + + describe('#_onClick()', () => { + it('should call #toggleItems()', () => { + let spy = chai.spy.on(speedDial, 'toggleItems'); + speedDial._onClick(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#_show()', () => { + it('does nothing if element is inline', () => { + let spy = chai.spy.on(speedDial, 'show'); + speedDial.setAttribute('inline', ''); + speedDial._show(); + expect(spy).to.not.have.been.called(); + }); + + it('calls show() if element is not inline', () => { + let spy = chai.spy.on(speedDial, 'show'); + speedDial._show(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#_hide()', () => { + it('does nothing if element is inline', () => { + let spy = chai.spy.on(speedDial, 'hide'); + speedDial.setAttribute('inline', ''); + speedDial._hide(); + expect(spy).to.not.have.been.called(); + }); + + it('calls hide() if element is not inline', () => { + let spy = chai.spy.on(speedDial, 'hide'); + speedDial._hide(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#_updateDirection()', () => { + it('is called when element is created', () => { + let spy = chai.spy.on(OnsSpeedDialElement.prototype, '_updateDirection'), + speedDial = new OnsSpeedDialElement(); + + expect(spy).to.have.been.called.with('up'); + }); + + it('is called with the value of the direction attribute', () => { + let spy = chai.spy.on(OnsSpeedDialElement.prototype, '_updateDirection'), + speedDial = ons._util.createElement(` + + `); + + expect(spy).to.have.been.called.with('down'); + }); + + it('is called when direction changes', () => { + let spy = chai.spy.on(speedDial, '_updateDirection'); + + speedDial.setAttribute('direction', 'left'); + expect(spy).to.have.been.called.with('left'); + }); + + it('sets the position of the items', () => { + speedDial._updateDirection('left'); + speedDial._updateDirection('right'); + speedDial._updateDirection('up'); + speedDial._updateDirection('down'); + }); + + it('throws an error if the argument is incorrect', () => { + expect(() => speedDial._updateDirection('hoge')).to.throw(Error); + }); + }); + + describe('#_updatePosition()', () => { + it('is called when the "position" attribute changes', () => { + let spy = chai.spy.on(speedDial, '_updatePosition'); + + speedDial.setAttribute('position', 'top left'); + speedDial.setAttribute('position', 'bottom left'); + + expect(spy).to.have.been.called.twice; + }); + + it('adds the correct class', () => { + speedDial.setAttribute('position', 'top right'); + expect(speedDial.classList.contains('fab--top__right')).to.be.true; + + speedDial.setAttribute('position', 'top left'); + expect(speedDial.classList.contains('fab--top__left')).to.be.true; + + speedDial.setAttribute('position', 'bottom right'); + expect(speedDial.classList.contains('fab--bottom__right')).to.be.true; + + speedDial.setAttribute('position', 'bottom left'); + expect(speedDial.classList.contains('fab--bottom__left')).to.be.true; + + speedDial.setAttribute('position', 'top center'); + expect(speedDial.classList.contains('fab--top__center')).to.be.true; + + speedDial.setAttribute('position', 'bottom center'); + expect(speedDial.classList.contains('fab--bottom__center')).to.be.true; + + speedDial.setAttribute('position', 'right top'); + expect(speedDial.classList.contains('fab--top__right')).to.be.true; + + speedDial.setAttribute('position', 'left top'); + expect(speedDial.classList.contains('fab--top__left')).to.be.true; + + speedDial.setAttribute('position', 'right bottom'); + expect(speedDial.classList.contains('fab--bottom__right')).to.be.true; + + speedDial.setAttribute('position', 'left bottom'); + expect(speedDial.classList.contains('fab--bottom__left')).to.be.true; + + speedDial.setAttribute('position', 'center top'); + expect(speedDial.classList.contains('fab--top__center')).to.be.true; + + speedDial.setAttribute('position', 'center bottom'); + expect(speedDial.classList.contains('fab--bottom__center')).to.be.true; + + expect(speedDial.classList.contains('fab-top__left')).not.to.be.true; + expect(speedDial.classList.contains('fab-bottom__right')).not.to.be.true; + expect(speedDial.classList.contains('fab-bottom__left')).not.to.be.true; + expect(speedDial.classList.contains('fab-top__right')).not.to.be.true; + expect(speedDial.classList.contains('fab-top__center')).not.to.be.true; + }); + + it('does nothing if position "attribute" is incorrect', () => { + const oldClassList = ons._util.arrayFrom(speedDial.classList); + + speedDial.setAttribute('position', 'hoge'); + const newClassList = ons._util.arrayFrom(speedDial.classList); + + for (let i = 0; i < newClassList.length; i++) { + expect(oldClassList[i]).to.equal(newClassList[i]); + } + + expect(oldClassList.length).to.equal(newClassList.length); + }); + }); + + describe('#show()', () => { + it('calls #show() on the child OnsFabElement', () => { + let spy = chai.spy.on(speedDial.querySelector('ons-fab'), 'show'); + speedDial.show(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#hide()', () => { + it('calls #hideItems()', () => { + let spy = chai.spy.on(speedDial, 'hideItems'); + speedDial.hide(); + expect(spy).to.have.been.called.once; + }); + + it('eventually calls #hide() on the child OnsFabElement', (done) => { + let spy = chai.spy.on(speedDial.querySelector('ons-fab'), 'hide'); + speedDial.hide(); + setTimeout(() => { + expect(spy).to.have.been.called.once; + done(); + }, 200); + }); + }); + + describe('#showItems()', () => { + it('sets scale transform to 1 for all items', () => { + speedDial.showItems(); + + for (let i = 0; i < speedDial.items; i++) { + expect(speedDial.items[i].style.transform).to.equal('scale(1)'); + } + }); + }); + + describe('#hideItems()', () => { + it('sets scale transform to 0 for all items', () => { + speedDial.showItems(); + speedDial.hideItems(); + + for (let i = 0; i < speedDial.items; i++) { + expect(speedDial.items[i].style.transform).to.equal('scale(0)'); + } + }); + }); + + describe('#setDisabled()', () => { + it('throws an error if argument is not boolean', () => { + expect(() => speedDial.setDisabled('hoge')).to.throw(Error); + }); + + it('sets the disabled attribute if argument is true', () => { + expect(speedDial.hasAttribute('disabled')).to.be.false; + speedDial.setDisabled(true); + expect(speedDial.hasAttribute('disabled')).to.be.true; + }); + + it('removes the disabled attribute if argument is false', () => { + speedDial.setAttribute('disabled', ''); + speedDial.setDisabled(false); + expect(speedDial.hasAttribute('disabled')).to.be.false; + }); + + it('is called if the disabled attribute is present on element creation', () => { + let spy = chai.spy.on(OnsSpeedDialElement.prototype, 'setDisabled'), + speedDial = ons._util.createElement(` + + `); + expect(spy).to.have.been.called.with(true); + }); + }); + + describe('#isDisabled()', () => { + it('returns whether the disabled attribute is set or not', () => { + speedDial.setAttribute('disabled', ''); + expect(speedDial.isDisabled()).to.be.true; + speedDial.removeAttribute('disabled'); + expect(speedDial.isDisabled()).to.be.false; + }); + }); + + describe('#isInline()', () => { + it('returns whether the inline attribute is set or not', () => { + speedDial.setAttribute('inline', ''); + expect(speedDial.isInline()).to.be.true; + speedDial.removeAttribute('inline'); + expect(speedDial.isInline()).to.be.false; + }); + }); + + describe('#isShown()', () => { + it('returns whether the element is currently shown or not', () => { + expect(speedDial.isShown()).to.be.true; + speedDial.hide(); + expect(speedDial.isShown()).to.be.false; + speedDial.show(); + expect(speedDial.isShown()).to.be.true; + speedDial.style.display = 'none'; + expect(speedDial.isShown()).to.be.false; + }); + }); + + describe('#toggle()', () => { + it('calls #show() if element is hidden', () => { + let spy = chai.spy.on(speedDial, 'show'); + speedDial.hide(); + speedDial.toggle(); + expect(spy).to.have.been.called.once; + }); + + it('calls #hide() if element is shown', () => { + let spy = chai.spy.on(speedDial, 'hide'); + speedDial.toggle(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#toggleItems()', () => { + it('calls #showItems() if items are hidden', () => { + let spy = chai.spy.on(speedDial, 'showItems'); + speedDial.toggleItems(); + expect(spy).to.have.been.called.once; + }); + + it('calls #hideItems() if items are shown', () => { + let spy = chai.spy.on(speedDial, 'hideItems'); + speedDial.showItems(); + speedDial.toggleItems(); + expect(spy).to.have.been.called.once; + }); + }); +}); diff --git a/core/elements/ons-tab.es6 b/core/elements/ons-tab.es6 index 0326d4ae08..b06183d73f 100644 --- a/core/elements/ons-tab.es6 +++ b/core/elements/ons-tab.es6 @@ -128,10 +128,6 @@ limitations under the License. return this.hasAttribute('persistent'); } - _hasDefaultTemplate() { - return this.classList.contains('tab-bar__item--default'); - } - setActive() { const radio = util.findChild(this, 'input'); radio.checked = true; @@ -249,8 +245,6 @@ limitations under the License. return i; } } - - throw new Error('Invalid state: tab index is not found.'); } _ensureElementPosition() { diff --git a/core/elements/ons-tab.spec.es6 b/core/elements/ons-tab.spec.es6 new file mode 100644 index 0000000000..157b14b662 --- /dev/null +++ b/core/elements/ons-tab.spec.es6 @@ -0,0 +1,297 @@ +describe('OnsTabElement', () => { + let element; + + beforeEach(() => { + element = ons._util.createElement(` + + + `); + }); + + afterEach(() => { + element.remove(); + element = null; + }); + + it('should exist', () => { + expect(window.OnsTabElement).to.be.ok; + }); + + it('has a default template', () => { + expect(element.classList.contains('tab-bar__item')).to.be.true; + expect(element._hasDefaultTemplate).to.be.true; + }); + + describe('modifier attribute', () => { + it('modifies the classList of the tab', () => { + let parent = ons._util.createElement(` + + + `); + + document.body.appendChild(parent); + parent.appendChild(element); + + element.setAttribute('modifier', 'hoge'); + + expect(element.classList.contains('tab-bar--hoge__item')).to.be.true; + expect(element.children[1].classList.contains('tab-bar--hoge__button')).to.be.true; + + element.setAttribute('modifier', ' foo bar'); + expect(element.classList.contains('tab-bar--foo__item')).to.be.true; + expect(element.children[1].classList.contains('tab-bar--foo__button')).to.be.true; + expect(element.classList.contains('tab-bar--bar__item')).to.be.true; + expect(element.children[1].classList.contains('tab-bar--bar__button')).to.be.true; + expect(element.classList.contains('tab-bar--hoge__item')).not.to.be.true; + expect(element.children[1].classList.contains('tab-bar--hoge__button')).not.to.be.true; + + element.classList.add('tab-bar--piyo__item'); + element.children[1].classList.add('tab-bar--piyo__button'); + element.setAttribute('modifier', 'fuga'); + expect(element.classList.contains('tab-bar--piyo__item')).to.be.true; + expect(element.children[1].classList.contains('tab-bar--piyo__button')).to.be.true; + expect(element.classList.contains('tab-bar--fuga__item')).to.be.true; + expect(element.children[1].classList.contains('tab-bar--fuga__button')).to.be.true; + + document.body.removeChild(parent); + }); + }); + + describe('persistent attribute', () => { + it('adds a persistent state to the tab', function() { + let tabbar = ons._util.createElement(` + + + `); + + tabbar.appendChild(element); + document.body.appendChild(tabbar); + expect(element.isPersistent()).not.to.be.true; + + element.setAttribute('persistent', ''); + expect(element.isPersistent()).to.be.true; + + element.removeAttribute('persistent'); + expect(element.isPersistent()).not.to.be.true; + + document.body.removeChild(tabbar); + }); + }); + + describe('no-reload attribute', () => { + it('sets the tab as no-reloadable', function() { + let tabbar = ons._util.createElement(` + + + `); + + tabbar.appendChild(element); + document.body.appendChild(tabbar); + expect(element.canReload()).to.be.true; + + element.setAttribute('no-reload', ''); + expect(element.canReload()).not.to.be.true; + + element.removeAttribute('no-reload'); + expect(element.canReload()).to.be.true; + + document.body.removeChild(tabbar); + }); + }); + + describe('active attribute', () => { + it('sets whether a tab should be active or not', () => { + expect(element.hasAttribute('active')).not.to.be.true; + + let tabbar = ons._util.createElement(` + + + `); + + document.body.appendChild(tabbar); + element = ons._util.createElement(` + +
+
+ `); + tabbar.appendChild(element); + expect(element.hasAttribute('active')).to.be.true; + + document.body.removeChild(tabbar); + }); + }); + + describe('icon attribute', () => { + it('sets icon name for the tab', () => { + let tabbar = ons._util.createElement(` + + + `); + + tabbar.appendChild(element); + document.body.appendChild(tabbar); + expect(element.querySelector('ons-icon')).not.to.be.ok; + + element.setAttribute('icon', 'ion-map'); + expect(element.querySelector('ons-icon')).to.be.ok; + expect(element.querySelector('ons-icon').getAttribute('icon')).to.equal('ion-map'); + + element.setAttribute('icon', 'ion-home'); + expect(element.querySelector('ons-icon').getAttribute('icon')).to.equal('ion-home'); + expect(element.querySelector('ons-icon').getAttribute('icon')).not.to.equal('ion-map'); + + document.body.removeChild(tabbar); + }); + }); + + describe('label attribute', () => { + it('sets label name for the tab', () => { + let tabbar = ons._util.createElement(` + + + `); + + tabbar.appendChild(element); + document.body.appendChild(tabbar); + expect(document.getElementsByClassName('tab-bar__label')[0]).not.to.be.ok; + + element.setAttribute('label', 'text'); + expect(document.getElementsByClassName('tab-bar__label')[0]).to.be.ok; + expect(document.getElementsByClassName('tab-bar__label')[0].innerHTML).to.equal('text'); + + element.setAttribute('label', 'new text'); + expect(document.getElementsByClassName('tab-bar__label')[0].innerHTML).to.equal('new text'); + expect(document.getElementsByClassName('tab-bar__label')[0].innerHTML).not.to.equal('text'); + + document.body.removeChild(tabbar); + }); + }); + + describe('children', () => { + it('are, by default, two', () => { + expect(element.children[0]).to.be.ok; + expect(element.children[1]).to.be.ok; + expect(element.children[2]).not.to.be.ok; + + expect(element.children[0].nodeName).to.equal('INPUT'); + expect(element.children[0].type).to.equal('radio'); + expect(element.children[0].style.display).to.equal('none'); + + expect(element.children[1].nodeName).to.equal('BUTTON'); + expect(element.children[1].classList.contains('tab-bar__button')).to.be.true; + expect(element.children[1].classList.contains('tab-bar-inner')).to.be.true; + }); + }); + + describe('parent', () => { + it('should be an \'ons-tabbar\' element', () => { + expect(() => element._ensureElementPosition()).to.throw('This ons-tab element is must be child of ons-tabbar element.'); + + let parent = ons._util.createElement(` + + + `); + + parent.appendChild(element); + expect(() => element._ensureElementPosition()).not.to.throw('This ons-tab element is must be child of ons-tabbar element.'); + }); + }); + + describe('_hasDefaultTemplate property', () => { + it('is, by default, true', () => { + expect(element._hasDefaultTemplate).to.be.true; + }); + + it('is false when one of the tab\'s children is a ELEMENT_NODE', () => { + let tabbar = ons._util.createElement(` + + + `); + + document.body.appendChild(tabbar); + element = ons._util.createElement(` + +
+
+ `); + tabbar.appendChild(element); + expect(element._hasDefaultTemplate).not.to.be.true; + + document.body.removeChild(tabbar); + }); + }); + + describe('#_updateDefaultTemplate()', () => { + it('will return if there is not a default template', () => { + var spy = chai.spy.on(element, 'getAttribute'); + element._hasDefaultTemplate = false; + element._updateDefaultTemplate(); + expect(spy).not.to.have.been.called; + }); + }); + + describe('#_loadPage()', () => { + it('returns the current tab _pageElement, if the tab has persistent attribute and a _pageElement', (done) => { + element = ons._util.createElement(` + + + `); + + let myFunction = (value) => { + expect(value).to.equal(element._pageElement); + done(); + }; + element._pageElement = true; + element._loadPageElement(myFunction); + }); + + it('sets the tab _pageElement as null, if the tab doesn\'t has a persistent attribute', (done) => { + element.setAttribute('page', 'page1'); + + let myFunction = () => { + expect(element._pageElement).to.be.null; + done(); + }; + element._loadPageElement(myFunction); + }); + }); + + describe('#setActive()', () => { + it('will set the tab as active', () => { + let tabbar = ons._util.createElement(` + + + + `); + + let template1 = ons._util.createElement(` + + `); + + let template2 = ons._util.createElement(` + + `); + + document.body.appendChild(tabbar); + document.body.appendChild(template1); + document.body.appendChild(template2); + + let tab1 = tabbar.querySelector('#tab1'); + let tab2 = tabbar.querySelector('#tab2'); + expect(tabbar.getActiveTabIndex()).to.equal(-1); + + tab1.setActive(); + expect(tabbar.getActiveTabIndex()).not.to.equal(-1); + expect(tabbar.getActiveTabIndex()).to.equal(0); + + tab2.setActive(); + tab1.classList.remove('active'); + expect(tabbar.getActiveTabIndex()).not.to.equal(0); + expect(tabbar.getActiveTabIndex()).to.equal(1); + + document.body.removeChild(tabbar); + document.body.removeChild(template1); + document.body.removeChild(template2); + }); + }); +}); diff --git a/core/lib/device-back-button-dispatcher.es6 b/core/lib/device-back-button-dispatcher.es6 index 62f52d6c86..819d669e10 100644 --- a/core/lib/device-back-button-dispatcher.es6 +++ b/core/lib/device-back-button-dispatcher.es6 @@ -90,6 +90,10 @@ limitations under the License. }, get: function(element) { + if (!element.dataset.deviceBackButtonHandlerId) { + return undefined; + } + const id = element.dataset.deviceBackButtonHandlerId; if (!this._store[id]) { @@ -106,7 +110,7 @@ limitations under the License. } }; - class DevicebackButtonDispatcher { + class DeviceBackButtonDispatcher { constructor() { this._isEnabled = false; this._boundCallback = this._callback.bind(this); @@ -192,10 +196,8 @@ limitations under the License. _dispatchDeviceBackButtonEvent() { const tree = this._captureTree(); - //this._dumpTree(tree); const element = this._findHandlerLeafElement(tree); - //this._dumpParents(element); let handler = HandlerRepository.get(element); handler._callback(createEvent(element)); @@ -218,13 +220,6 @@ limitations under the License. } } - _dumpParents(element) { - while (element) { - console.log(element.nodeName.toLowerCase() + '.' + element.getAttribute('class')); - element = element.parentNode; - } - } - /** * @return {Object} */ @@ -264,18 +259,6 @@ limitations under the License. } } - _dumpTree(node) { - _dump(node, 0); - - function _dump(node, level) { - const pad = new Array(level + 1).join(' '); - console.log(pad + node.element.nodeName.toLowerCase()); - node.children.forEach(function(node) { - _dump(node, level + 1); - }); - } - } - /** * @param {Object} tree * @return {HTMLElement} @@ -312,7 +295,7 @@ limitations under the License. } } - ons._deviceBackButtonDispatcher = new DevicebackButtonDispatcher(); + ons._deviceBackButtonDispatcher = new DeviceBackButtonDispatcher(); window.addEventListener('DOMContentLoaded', function() { ons._deviceBackButtonDispatcher.enable(); diff --git a/core/lib/device-back-button-dispatcher.spec.es6 b/core/lib/device-back-button-dispatcher.spec.es6 new file mode 100644 index 0000000000..c9aed27f21 --- /dev/null +++ b/core/lib/device-back-button-dispatcher.spec.es6 @@ -0,0 +1,40 @@ +describe('deviceBackButtonDispatcher', () => { + describe('#createHandler()', () => { + it('throws an error if the first parameter is not an HTMLElement', () => { + expect(() => ons._deviceBackButtonDispatcher.createHandler('just a string')).to.throw(Error); + }); + + it('throws an error if the first parameter is not a function', () => { + expect(() => ons._deviceBackButtonDispatcher.createHandler(document.createElement('div'), 'just a string')).to.throw(Error); + }); + + it('disables the handler', () => { + let handler = ons._deviceBackButtonDispatcher.createHandler(document.createElement('div'), () => { return; }); + expect(handler.isEnabled()).to.be.true; + handler.disable(); + expect(handler.isEnabled()).to.be.false; + }); + }); + + describe('#_callback() default', () => { + it('exits the app', () => { + navigator.app = {}; + navigator.app.exitApp = () => { return; }; + let spy = chai.spy.on(navigator.app, 'exitApp'); + ons._deviceBackButtonDispatcher._callback(); + expect(spy).to.have.been.called.once; + }); + }); + + describe('#fireDeviceBackButtonEvent()', () => { + it('fires \'backbutton\' event', () => { + let promise = new Promise((resolve) => { + document.addEventListener('backbutton', () => { resolve(); }); + }); + + ons._deviceBackButtonDispatcher.fireDeviceBackButtonEvent(); + + return expect(promise).to.eventually.be.fulfilled; + }); + }); +}); diff --git a/core/lib/ons-internal.es6 b/core/lib/ons-internal.es6 index 1c628175d2..ceb79e17d9 100644 --- a/core/lib/ons-internal.es6 +++ b/core/lib/ons-internal.es6 @@ -131,7 +131,12 @@ limitations under the License. xhr.open('GET', page, true); xhr.onload = function(response) { const html = xhr.responseText; - resolve(html); + if (xhr.status >= 400 && xhr.status < 600) { + reject(html); + } + else { + resolve(html); + } }; xhr.onerror = function() { throw new Error(`The page is not found: ${page}`); @@ -147,7 +152,30 @@ limitations under the License. * @return {Promise} */ ons._internal.getPageHTMLAsync = function(page) { - return ons._internal.getTemplateHTMLAsync(page).then(html => ons._internal.normalizePageHTML(html)); + let pages = ons.pageAttributeExpression.evaluate(page); + + let getPage = (page) => { + if (typeof page !== 'string') { + return Promise.reject('Must specify a page.'); + } + + return ons._internal.getTemplateHTMLAsync(page) + .then( + function(html) { + return ons._internal.normalizePageHTML(html); + }, + function(error) { + if (pages.length === 0) { + return Promise.reject(error); + } + + return getPage(pages.shift()); + } + ) + .then(html => ons._internal.normalizePageHTML(html)); + }; + + return getPage(pages.shift()); }; })(window.ons = window.ons || {}); diff --git a/core/lib/ons-page-attribute-expression.es6 b/core/lib/ons-page-attribute-expression.es6 new file mode 100644 index 0000000000..abf17198ac --- /dev/null +++ b/core/lib/ons-page-attribute-expression.es6 @@ -0,0 +1,186 @@ +/* +Copyright 2013-2015 ASIAL CORPORATION + +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. + +*/ + +((ons) => { + ons.pageAttributeExpression = { + _variables: {}, + + /** + * Define a variable. + * + * @param {String} name Name of the variable + * @param {String|Function} value Value of the variable. Can be a string or a function. The function must return a string. + * @param {Boolean} overwrite If this value is false, an error will be thrown when trying to define a variable that has already been defined. + */ + defineVariable: function(name, value, overwrite=false) { + if (typeof name !== 'string') { + throw new Error('Variable name must be a string.'); + } + else if (typeof value !== 'string' && typeof value !== 'function') { + throw new Error('Variable value must be a string or a function.'); + } + else if (this._variables.hasOwnProperty(name) && !overwrite) { + throw new Error(`"${name}" is already defined.`); + } + this._variables[name] = value; + }, + + /** + * Get a variable. + * + * @param {String} name Name of the variable. + * @return {String|Function|null} + */ + getVariable: function(name) { + if (!this._variables.hasOwnProperty(name)) { + return null; + } + + return this._variables[name]; + }, + + /** + * Remove a variable. + * + * @param {String} name Name of the varaible. + */ + removeVariable: function(name) { + delete this._variables[name]; + }, + + /** + * Get all variables. + * + * @return {Object} + */ + getAllVariables: function() { + return this._variables; + }, + _parsePart: function(part) { + let c, + inInterpolation = false, + currentIndex = 0, + tokens = []; + + if (part.length === 0) { + throw new Error('Unable to parse empty string.'); + } + + for (let i = 0; i < part.length; i++) { + c = part.charAt(i); + + if (c === '$' && part.charAt(i + 1) === '{') { + if (inInterpolation) { + throw new Error('Nested interpolation not supported.'); + } + + let token = part.substring(currentIndex, i); + if (token.length > 0) { + tokens.push(part.substring(currentIndex, i)); + } + + currentIndex = i; + inInterpolation = true; + } + else if (c === '}') { + if (!inInterpolation) { + throw new Error('} must be preceeded by ${'); + } + + let token = part.substring(currentIndex, i + 1); + if (token.length > 0) { + tokens.push(part.substring(currentIndex, i + 1)); + } + + currentIndex = i + 1; + inInterpolation = false; + } + } + + if (inInterpolation) { + throw new Error('Unterminated interpolation.'); + } + + tokens.push(part.substring(currentIndex, part.length)); + + return tokens; + }, + _replaceToken: function(token) { + const re = /^\${(.*?)}$/, + match = token.match(re); + + if (match) { + let name = match[1].trim(), + variable = this.getVariable(name); + + if (variable === null) { + throw new Error(`Variable "${name}" does not exist.`); + } + else if (typeof variable === 'string') { + return variable; + } + else { + let rv = variable(); + + if (typeof rv !== 'string') { + throw new Error('Must return a string.'); + } + + return rv; + } + } + else { + return token; + } + }, + _replaceTokens: function(tokens) { + return tokens.map(this._replaceToken.bind(this)); + }, + _parseExpression: function(expression) { + return expression.split(',') + .map( + function(part) { + return part.trim(); + } + ) + .map(this._parsePart.bind(this)) + .map(this._replaceTokens.bind(this)) + .map((part) => part.join('')); + }, + + /** + * Evaluate an expression. + * + * @param {String} expression An page attribute expression. + * @return {Array} + */ + evaluate: function(expression) { + if (!expression) { + return []; + } + + return this._parseExpression(expression); + } + }; + + // Define default variables. + ons.pageAttributeExpression.defineVariable('mobileOS', ons.platform.getMobileOS()); + ons.pageAttributeExpression.defineVariable('iOSDevice', ons.platform.getIOSDevice()); + ons.pageAttributeExpression.defineVariable('runtime', () => { + return ons.platform.isWebView() ? 'cordova' : 'browser'; + }); +})(window.ons = window.ons || {}); diff --git a/core/lib/ons-page-attribute-expression.spec.es6 b/core/lib/ons-page-attribute-expression.spec.es6 new file mode 100644 index 0000000000..d2dd3d6d23 --- /dev/null +++ b/core/lib/ons-page-attribute-expression.spec.es6 @@ -0,0 +1,179 @@ +describe('ons.pageAttributeExpression', () => { + let pae = ons.pageAttributeExpression; + + describe('#defineVariable()', () => { + it('should define a variable', () => { + pae.defineVariable('hoge', 'fuga'); + expect(pae.getVariable('hoge')).to.equal('fuga'); + pae.removeVariable('hoge'); + }); + + it('must have a string as "name" argument.', () => { + expect(() => pae.defineVariable(123, 'hoge')).to.throw(Error); + }); + + it('must have a function or string as "value" argument', () => { + expect(() => pae.defineVariable('hoge', 123)).to.throw(Error); + expect(() => pae.defineVariable('hoge', () => 'fuga')).not.to.throw(Error); + pae.removeVariable('hoge'); + expect(() => pae.defineVariable('hoge', 'fuga')).not.to.throw(Error); + pae.removeVariable('hoge'); + }); + + it('can only overwrite variables if "overwrite" argument is true', () => { + pae.defineVariable('hoge', 'fuga'); + expect(() => pae.defineVariable('hoge', 'piyo')).to.throw(Error); + expect(pae.getVariable('hoge')).to.equal('fuga'); + expect(() => pae.defineVariable('hoge', 'piyo', true)).not.to.throw(Error); + expect(pae.getVariable('hoge')).to.equal('piyo'); + pae.removeVariable('hoge'); + }); + }); + + describe('#removeVariable()', () => { + it('removes a variables', () => { + pae.defineVariable('hoge', 'fuga'); + expect(pae.getVariable('hoge')).not.to.be.null; + pae.removeVariable('hoge'); + expect(pae.getVariable('hoge')).to.be.null; + }); + }); + + describe('#getAllVariables()', () => { + it('returns all variables', () => { + pae.defineVariable('hoge', 'fuga'); + pae.defineVariable('foo', 'bar'); + + let variables = pae.getAllVariables(); + expect(variables.hoge).to.equal('fuga'); + expect(variables.foo).to.equal('bar'); + pae.removeVariable('hoge'); + pae.removeVariable('foo'); + }); + }); + + describe('#_parsePart()', () => { + it('requires a string with length more than 0', () => { + expect(() => pae._parsePart('')).to.throw(Error); + }); + + it('does not support nested interpolation', () => { + expect(() => pae._parsePart('${{foo}}')).to.throw(Error); + }); + + it('requires } to be preceeded by ${', () => { + expect(() => pae._parsePart('test}.html')).to.throw(Error); + }); + + it('requires all interpolations to be terminated', () => { + expect(() => pae._parsePart('${hoge')).to.throw(Error); + }); + + it('returns an Array', () => { + expect(pae._parsePart('${hoge}.html')).to.be.an.instanceof(Array); + }); + + it('splits the string into tokens', () => { + let rv = pae._parsePart('${hoge}${foo}.html'); + expect(rv[0]).to.equal('${hoge}'); + expect(rv[1]).to.equal('${foo}'); + expect(rv[2]).to.equal('.html'); + }); + }); + + describe('#_replaceToken()', () => { + beforeEach(() => { + pae.defineVariable('hoge', 'fuga'); + pae.defineVariable('foo', () => 'bar'); + }); + + afterEach(() => { + pae.removeVariable('hoge'); + pae.removeVariable('foo'); + }); + + it('does not replace if the token is not in the form "${name}"', () => { + expect(pae._replaceToken('hoge')).to.equal('hoge'); + }); + + it('throws an error if the variable does not exist', () => { + expect(() => pae._replaceToken('${piyo}')).to.throw(Error); + }); + + it('throws an error if the variable is a function and it does not return a string.', () => { + pae.defineVariable('foobar', () => 123); + expect(() => pae._replaceToken('${foobar}')).to.throw(Error); + pae.removeVariable('foobar'); + }); + + it('replaces the token', () => { + expect(pae._replaceToken('${hoge}')).to.equal('fuga'); + expect(pae._replaceToken('${foo}')).to.equal('bar'); + }); + + it('supports leading and trailing whitespaces for the variable name', () => { + expect(pae._replaceToken('${ hoge}')).to.equal('fuga'); + expect(pae._replaceToken('${hoge }')).to.equal('fuga'); + expect(pae._replaceToken('${ hoge }')).to.equal('fuga'); + }); + }); + + describe('#evaluate()', () => { + beforeEach(() => { + pae.defineVariable('hoge', 'fuga'); + pae.defineVariable('foo', () => 'bar'); + }); + + afterEach(() => { + pae.removeVariable('hoge'); + pae.removeVariable('foo'); + }); + + it('returns an Array', () => { + expect(pae.evaluate('page1.html, page2.html')).to.be.an.instanceof(Array); + }); + + it('returns a list of pages', () => { + let rv = pae.evaluate('page1.html, page2.html'); + expect(rv.length).to.equal(2); + expect(rv[0]).to.equal('page1.html'); + expect(rv[1]).to.equal('page2.html'); + }); + + it('replaces ${hoge} with the value of "hoge"', () => { + let rv = pae.evaluate('${hoge}.html'); + expect(rv[0]).to.equal('fuga.html'); + }); + + it('replaces ${foo} with the return volue of "foo"', () => { + let rv = pae.evaluate('${foo}.html'); + expect(rv[0]).to.equal('bar.html'); + }); + + it('supports multiple interpolations in one string', () => { + let rv = pae.evaluate('${foo}${hoge}.html, ${hoge}${foo}.html'); + expect(rv[0]).to.equal('barfuga.html'); + expect(rv[1]).to.equal('fugabar.html'); + }); + + it('supports leading and trailing whitespaces', () => { + let rv = pae.evaluate(' ${foo}${hoge}.html, ${hoge}${foo}.html '); + expect(rv[0]).to.equal('barfuga.html'); + expect(rv[1]).to.equal('fugabar.html'); + }); + + it('requires a valid string', () => { + let invalidArguments = [ + ',hoge.html', + 'hoge.html,', + 'hoge.html,,fuga.html', + '${hoge.html', + '${${hoge}}' + ]; + + invalidArguments.forEach((argument) => { + expect(() => pae.evaluate(argument)).to.throw(Error); + }); + }); + }); +}); diff --git a/core/lib/ons-platform.es6 b/core/lib/ons-platform.es6 index 0fd316d46e..2167a2e947 100644 --- a/core/lib/ons-platform.es6 +++ b/core/lib/ons-platform.es6 @@ -102,6 +102,13 @@ limitations under the License. return /iPad/i.test(navigator.userAgent); }, + /** + * @return {Boolean} + */ + isIPod: function() { + return /iPod/i.test(navigator.userAgent); + }, + /** * @return {Boolean} */ @@ -177,6 +184,42 @@ limitations under the License. return (parseInt(ver.split('.')[0]) >= 7); } return false; + }, + + /** + * @return {String} + */ + getMobileOS: function() { + if (this.isAndroid()) { + return 'android'; + } + else if (this.isIOS()) { + return 'ios'; + } + else if (this.isWP()) { + return 'wp'; + } + else { + return 'other'; + } + }, + + /** + * @return {String} + */ + getIOSDevice: function() { + if (this.isIPhone()) { + return 'iphone'; + } + else if (this.isIPad()) { + return 'ipad'; + } + else if (this.isIPod()) { + return 'ipod'; + } + else { + return 'na'; + } } }; })(window.ons = window.ons || {}); diff --git a/core/lib/ons.es6 b/core/lib/ons.es6 index 6a032d2f2d..4249a096e1 100644 --- a/core/lib/ons.es6 +++ b/core/lib/ons.es6 @@ -125,12 +125,10 @@ limitations under the License. } return ons._internal.getPageHTMLAsync(page).then(html => { + html = html.match(/${html}` : `${html}`; const div = ons._util.createElement('
' + html + '
'); const popover = div.querySelector('ons-popover'); - if (!popover) { - throw new Error(` element is not provided on "${page}" page.`); - } CustomElements.upgrade(popover); document.body.appendChild(popover); @@ -167,9 +165,6 @@ limitations under the License. const div = ons._util.createElement('
' + html + '
'); const dialog = div.querySelector('ons-dialog'); - if (!dialog) { - throw new Error(` element is not provided on "${page}" page.`); - } CustomElements.upgrade(dialog); document.body.appendChild(dialog); @@ -206,9 +201,6 @@ limitations under the License. const div = ons._util.createElement('
' + html + '
'); const alertDialog = div.querySelector('ons-alert-dialog'); - if (!alertDialog) { - throw new Error(` element is not provided on "${page}" page.`); - } CustomElements.upgrade(alertDialog); document.body.appendChild(alertDialog); @@ -226,7 +218,7 @@ limitations under the License. * @param {Function} [options.link] * @return {Promise} */ - ons.createAlertDialogOriginal = ons._createAlertDialogOriginal; + ons.createAlertDialog = ons._createAlertDialogOriginal; /** * @param {String} page diff --git a/core/lib/ons.spec.es6 b/core/lib/ons.spec.es6 new file mode 100644 index 0000000000..ef60f7a070 --- /dev/null +++ b/core/lib/ons.spec.es6 @@ -0,0 +1,179 @@ +describe('ons', () => { + let template; + + beforeEach(() => { + template = ons._util.createElement(` + + + + + `); + document.body.appendChild(template); + }); + + afterEach(() => { + template.remove(); + template = null; + }); + + describe('#disableAutoStatusBarFill()', () => { + it('sets autoStatusBarFill to false', () => { + let tmp = ons.isReady; + ons.isReady = () => false; + ons.disableAutoStatusBarFill(); + expect(ons._config.autoStatusBarFill).to.be.false; + ons.isReady = tmp; + }); + + it('throws an error if ons is ready', () => { + expect(ons.isReady()).to.be.true; + expect(() => ons.enableAutoStatusBarFill()).to.throw(Error); + }); + }); + + describe('#disableDeviceBackButtonHandler()', () => { + it('disables the device back button', () => { + ons.disableDeviceBackButtonHandler(); + expect(ons._deviceBackButtonDispatcher._isEnabled).to.be.false; + }); + }); + + describe('#enableDeviceBackButtonHandler()', () => { + it('enables the device back button', () => { + ons.enableDeviceBackButtonHandler(); + expect(ons._deviceBackButtonDispatcher._isEnabled).to.be.true; + }); + }); + + describe('#setDefaultDeviceBackButtonListener()', () => { + it('changes the default callback', () => { + let tmp = ons._defaultDeviceBackButtonHandler._callback; + ons.setDefaultDeviceBackButtonListener(() => undefined); + expect(tmp).not.to.equal(ons._defaultDeviceBackButtonHandler._callback); + ons.setDefaultDeviceBackButtonListener(tmp); + }); + }); + + describe('#enableAutoStatusBarFill()', () => { + it('sets autoStatusBarFill to true', () => { + let tmp = ons.isReady; + ons.isReady = () => false; + ons.enableAutoStatusBarFill(); + expect(ons._config.autoStatusBarFill).to.be.true; + ons.isReady = tmp; + }); + + it('throws an error if ons is ready', () => { + expect(ons.isReady()).to.be.true; + expect(() => ons.disableAutoStatusBarFill()).to.throw(Error); + }); + }); + + describe('#enableAnimations()', () => { + it('enables animations', () => { + expect(ons._config.animationsDisabled).to.be.true; + ons.enableAnimations(); + expect(ons._config.animationsDisabled).to.be.false; + ons.disableAnimations(); + expect(ons._config.animationsDisabled).to.be.true; + }); + }); + + describe('#createPopover()', () => { + it('throws error when no page is provided', () => { + expect(() => ons.createPopover(null)).to.throw(Error); + }); + + it('calls the linking function', (done) => { + let options = {}; + options.link = () => { return; }; + var spy = chai.spy.on(options, 'link'); + ons.createPopover('page.html', options).then((element) => { + expect(spy).to.have.been.called.once; + element.remove(); + done(); + }); + }); + + it('returns a valid popover element', (done) => { + ons.createPopover('page.html').then((element) => { + expect(element).to.be.instanceof(OnsPopoverElement); + element.remove(); + done(); + }); + }); + }); + + describe('#createDialog()', () => { + it('throws error when no page is provided', () => { + expect(() => ons.createDialog(null)).to.throw(Error); + }); + + it('calls the linking function', (done) => { + let options = {}; + options.link = () => { return; }; + var spy = chai.spy.on(options, 'link'); + ons.createDialog('page.html', options).then((element) => { + expect(spy).to.have.been.called.once; + element.remove(); + done(); + }); + }); + + it('returns a valid dialog element', (done) => { + ons.createDialog('page.html').then((element) => { + expect(element).to.be.instanceof(OnsDialogElement); + element.remove(); + done(); + }); + }); + }); + + describe('#createAlertDialog()', () => { + it('throws error when no page is provided', () => { + expect(() => ons.createAlertDialog(null)).to.throw(Error); + }); + + it('calls the linking function', (done) => { + let options = {}; + options.link = () => { return; }; + var spy = chai.spy.on(options, 'link'); + ons.createAlertDialog('page.html', options).then((element) => { + expect(spy).to.have.been.called.once; + element.remove(); + done(); + }); + }); + + it('returns a valid alertDialog element', (done) => { + ons.createAlertDialog('page.html').then((element) => { + expect(element).to.be.instanceof(OnsAlertDialogElement); + element.remove(); + done(); + }); + }); + }); + + describe('#resolveLoadingPlaceholder()', () => { + it('resolves the placeholder', () => { + let e = document.createElement('div'); + e.setAttribute('ons-loading-placeholder', 'page.html'); + document.body.appendChild(e); + ons.resolveLoadingPlaceholder(); + expect(e.getAttribute('ons-loading-placeholder')).to.equal('undefined'); + e.remove(); + }); + }); + + describe('#_setupLoadingPlaceHolders()', () => { + it('resolves the placeholder', () => { + let e = document.createElement('div'); + e.setAttribute('ons-loading-placeholder', 'page.html'); + document.body.appendChild(e); + var spy = chai.spy.on(ons, '_resolveLoadingPlaceholder'); + ons._setupLoadingPlaceHolders(); + expect(spy).to.have.been.called.with(e, 'page.html'); + e.remove(); + }); + }); +}); diff --git a/core/test/karma.conf.js b/core/test/karma.conf.js index 0d48fc7c14..8bba7532ef 100644 --- a/core/test/karma.conf.js +++ b/core/test/karma.conf.js @@ -23,6 +23,7 @@ module.exports = function(config) { '../../core/lib/modal-animator.es6', '../../core/lib/navigator-transition-animator.es6', '../../core/lib/popover-animator.es6', + '../../core/lib/ons-platform.es6', '../../core/lib/*.{es6,js}', '../../core/*.{es6,js}', '../../core/elements/*.{es6,js}', diff --git a/css-components/components-src/stylus/components/fab.styl b/css-components/components-src/stylus/components/fab.styl new file mode 100644 index 0000000000..c78baa49a1 --- /dev/null +++ b/css-components/components-src/stylus/components/fab.styl @@ -0,0 +1,156 @@ +// NOTE: You can't use @extend that break component independent and topdoc parsing. + +// internal variables +var-fab-width = 56px +var-fab-height = 56px + +var-fab-mini-width = 40px +var-fab-mini-height = 40px + +var-fab-background-color = $highlight-color +var-fab-color = white + +/*! topdoc + name: Fab + class: fab + modifiers: + :active: Active state + :disabled: Disabled state + :focus: Focused + markup: + + +*/ + +fab--disabled() + background-color alpha(black, 0.5) + shadow-0() + disabled() + +fab() + inline-block() + reset-box-model() + reset-base() + reset-font() + reset-cursor() + width var-fab-width + height var-fab-height + text-decoration none + font-size var-font-size + line-height var-fab-height + letter-spacing var-letter-spacing + color var-fab-color + vertical-align middle + text-align center + background-color alpha(var-fab-background-color, 1) + border 0px solid currentColor + border-radius 50% + shadow-2() + transition all 0.2s ease-in-out + +fab--focus() + outline 0 + +fab--active() + shadow-4() + background-color alpha(var-fab-background-color, 1) + transition all 0.2s ease + +.fab + fab() + +.fab:hover + fab--hover() + +.fab:active + fab--active() + +.fab:focus + fab--focus() + +.fab__icon + position relative + overflow hidden + height 100% + width 100% + display block + border-radius 100% + padding 0 + z-index 100 + line-height var-fab-height + +.fab:disabled, +.fab[disabled] + fab--disabled() + + +.fab--top__right + top 20px + bottom auto + right 20px + left auto + position fixed + +.fab--bottom__right + top auto + bottom 20px + right 20px + left auto + position fixed + +.fab--top__left + top 20px + bottom auto + right auto + left 20px + position fixed + +.fab--bottom__left + top auto + bottom 20px + right auto + left 20px + position fixed + +.fab--top__center + top 20px + bottom auto + margin-left -28px + left 50% + right auto + position fixed + +.fab--bottom__center + top auto + bottom 20px + margin-left -28px + left 50% + right auto + position fixed + + +/*! topdoc + name: Fab Mini + use: Fab + modifiers: + :active: Active state + :disabled: Disabled state + :focus: Focused + markup: + + +*/ + +.fab--mini + width var-fab-mini-width + height var-fab-mini-height + line-height var-fab-mini-height + + +.fab--mini + .fab__icon + line-height var-fab-mini-height + +.speed-dial__item + position absolute + transform scale(0) diff --git a/css-components/components-src/stylus/components/index.styl b/css-components/components-src/stylus/components/index.styl index 7a814c1881..1144449684 100644 --- a/css-components/components-src/stylus/components/index.styl +++ b/css-components/components-src/stylus/components/index.styl @@ -1,5 +1,6 @@ @import './util' @import './global' +@import './material-shadow' @import './page' @import './switch' @import './range' @@ -19,3 +20,4 @@ @import './alert-dialog' @import './popover' @import './modal' +@import './fab' diff --git a/css-components/components-src/stylus/components/material-shadow.styl b/css-components/components-src/stylus/components/material-shadow.styl new file mode 100644 index 0000000000..2c501818f4 --- /dev/null +++ b/css-components/components-src/stylus/components/material-shadow.styl @@ -0,0 +1,12 @@ +shadow-0() + box-shadow none +shadow-1() + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); +shadow-2() + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.4); +shadow-3() + box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.4); +shadow-4() + box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.4); +shadow-5() + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); \ No newline at end of file diff --git a/demo/fab/index.html b/demo/fab/index.html new file mode 100644 index 0000000000..6bb940c634 --- /dev/null +++ b/demo/fab/index.html @@ -0,0 +1,85 @@ + + + + + Floating Action Button Demo | Onsen UI + + + + + + + + + + + + + + + +
Floating Action Button
+
+ +
+

+ + + + + + + + + + - + + + + + + + + + + + + + + + + + + + +
+ +
+ + + diff --git a/demo/speed_dial/index.html b/demo/speed_dial/index.html new file mode 100644 index 0000000000..78786f0b41 --- /dev/null +++ b/demo/speed_dial/index.html @@ -0,0 +1,82 @@ + + + + + Speed Dial Demo | Onsen UI + + + + + + + + + + + + + + + +
Speed Dial
+
+ +
+

+ + + + + > + > + > + + + + + + > + > + > + + + + + + > + > + > + + + + + + > + > + > + + +
+ +
+ + + diff --git a/gulpfile.js b/gulpfile.js index 5d9efdbba2..d40547975b 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -71,6 +71,7 @@ gulp.task('core', function() { 'core/lib/modal-animator.es6', 'core/lib/navigator-transition-animator.es6', 'core/lib/popover-animator.es6', + 'core/lib/ons-platform.es6', 'core/lib/*.{es6,js}', 'core/*.{es6,js}', 'core/elements/*.{es6,js}',