/*!
* ngOfficeUIFabric
* http://ngofficeuifabric.com
* AngularJS (v1.6.x+) directives for Microsoft's Office UI Fabric
* https://angularjs.org & https://dev.office.com/fabric
* v0.16.1
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("angular"));
else if(typeof define === 'function' && define.amd)
define(["angular"], factory);
else {
var a = typeof exports === 'object' ? factory(require("angular")) : factory(root["angular"]);
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 62);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_0__;
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PersonaStyleEnum;
(function (PersonaStyleEnum) {
PersonaStyleEnum[PersonaStyleEnum["round"] = 0] = "round";
PersonaStyleEnum[PersonaStyleEnum["square"] = 1] = "square";
})(PersonaStyleEnum = exports.PersonaStyleEnum || (exports.PersonaStyleEnum = {}));
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var MenuItemTypes;
(function (MenuItemTypes) {
MenuItemTypes[MenuItemTypes["link"] = 0] = "link";
MenuItemTypes[MenuItemTypes["divider"] = 1] = "divider";
MenuItemTypes[MenuItemTypes["header"] = 2] = "header";
MenuItemTypes[MenuItemTypes["subMenu"] = 3] = "subMenu";
})(MenuItemTypes || (MenuItemTypes = {}));
var ContextualMenuItemDirective = (function () {
function ContextualMenuItemDirective($log) {
var _this = this;
this.$log = $log;
this.restrict = 'E';
this.require = '^uifContextualMenu';
this.transclude = true;
this.controller = ContextualMenuItemController;
this.replace = true;
this.scope = {
isSelected: '=?uifIsSelected',
onClick: '&ngClick',
text: '=?uifText',
type: '@uifType'
};
this.templateTypes = {};
this.template = function ($element, $attrs) {
var type = $attrs.uifType;
if (angular.isUndefined(type)) {
return _this.templateTypes[MenuItemTypes.link];
}
if (MenuItemTypes[type] === undefined) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.contextualmenu - unsupported menu type:\n' +
'the type \'' + type + '\' is not supported by ng-Office UI Fabric as valid type for context menu.' +
'Supported types can be found under MenuItemTypes enum here:\n' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/contextualmenu/contextualMenu.ts');
}
return _this.templateTypes[MenuItemTypes[type]];
};
this.link = function ($scope, $element, $attrs, contextualMenuController, $transclude) {
if (typeof $scope.isSelected !== 'boolean' && $scope.isSelected !== undefined) {
contextualMenuController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.contextualmenu - ' +
'invalid attribute type: \'uif-is-selected\'.\n' +
'The type \'' + typeof $scope.isSelected + '\' is not supported as valid type for \'uif-is-selected\' attribute for ' +
'. The valid type is boolean.');
}
$attrs.$observe('disabled', function (disabled) {
$scope.isDisabled = !!disabled;
});
_this.transcludeChilds($scope, $element, $transclude);
$scope.selectItem = function ($event) {
if (!contextualMenuController.isMultiSelectionMenu()) {
contextualMenuController.deselectItems();
}
if (angular.isUndefined($scope.isSelected) && !$scope.isDisabled) {
$scope.isSelected = true;
}
else {
$scope.isSelected = !$scope.isSelected;
}
if (!$scope.hasChildMenu) {
contextualMenuController.closeSubMenus(null, true);
if (!contextualMenuController.isRootMenu()) {
contextualMenuController.deselectItems(true);
}
}
else {
contextualMenuController.closeSubMenus($scope.$id);
}
if ($scope.hasChildMenu) {
$scope.childMenuCtrl.openMenu();
}
if (!angular.isUndefined($scope.onClick)) {
$scope.onClick();
}
$event.stopPropagation();
};
$scope.$on('uif-menu-deselect', function () {
$scope.isSelected = false;
});
$scope.$on('uif-menu-close', function (event, menuItemId) {
if ($scope.hasChildMenu && $scope.$id !== menuItemId) {
$scope.childMenuCtrl.closeMenu();
}
});
};
this.templateTypes[MenuItemTypes.subMenu] =
"
";
this.templateTypes[MenuItemTypes.link] =
"";
this.templateTypes[MenuItemTypes.header] = "\n ";
this.templateTypes[MenuItemTypes.divider] = "";
}
ContextualMenuItemDirective.factory = function () {
var directive = function ($log) { return new ContextualMenuItemDirective($log); };
directive.$inject = ['$log'];
return directive;
};
ContextualMenuItemDirective.prototype.transcludeChilds = function ($scope, $element, $transclude) {
var _this = this;
$transclude(function (clone) {
var hasContent = _this.hasItemContent(clone);
if (!hasContent && !$scope.text && !$scope.hasChildMenu && $scope.type !== 'divider') {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.contextualmenu - ' +
'you need to provide a text for a contextual menu item.\n' +
'For you need to specify either \'uif-text\' as attribute or as a child directive');
}
_this.insertItemContent(clone, $scope, $element);
_this.insertSubMenu(clone, $scope, $element);
});
};
ContextualMenuItemDirective.prototype.insertItemContent = function (clone, $scope, $element) {
var elementToReplace = angular.element($element[0].querySelector('.uif-item-content'));
if (this.hasItemContent(clone)) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('uif-content')) {
elementToReplace.replaceWith(element);
break;
}
}
}
else {
elementToReplace.replaceWith(angular.element('' + $scope.text + ''));
}
};
ContextualMenuItemDirective.prototype.insertSubMenu = function (clone, $scope, $element) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('ms-ContextualMenu')) {
angular.element($element[0].querySelector('.uif-context-submenu')).replaceWith(element);
}
}
};
ContextualMenuItemDirective.prototype.hasItemContent = function (clone) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('uif-content')) {
return true;
}
}
return false;
};
return ContextualMenuItemDirective;
}());
ContextualMenuItemDirective.directiveName = 'uifContextualMenuItem';
exports.ContextualMenuItemDirective = ContextualMenuItemDirective;
var ContextualMenuItemController = (function () {
function ContextualMenuItemController($scope, $element) {
this.$scope = $scope;
this.$element = $element;
}
ContextualMenuItemController.prototype.setChildMenu = function (childMenuCtrl) {
this.$scope.hasChildMenu = true;
this.$scope.childMenuCtrl = childMenuCtrl;
};
return ContextualMenuItemController;
}());
ContextualMenuItemController.$inject = ['$scope', '$element'];
exports.ContextualMenuItemController = ContextualMenuItemController;
var ContextualMenuDirective = (function () {
function ContextualMenuDirective() {
this.restrict = 'E';
this.require = ContextualMenuDirective.directiveName;
this.transclude = true;
this.template = "";
this.replace = true;
this.controller = ContextualMenuController;
this.scope = {
closeOnClick: '@uifCloseOnClick',
isOpen: '=?uifIsOpen',
multiselect: '@uifMultiselect'
};
}
ContextualMenuDirective.factory = function () {
var directive = function () { return new ContextualMenuDirective(); };
return directive;
};
ContextualMenuDirective.prototype.link = function ($scope, $element, $attrs, contextualMenuController) {
var setCloseOnClick = function (value) {
if (angular.isUndefined(value)) {
$scope.closeOnClick = true;
}
else {
$scope.closeOnClick = value.toString().toLowerCase() === 'true';
}
};
setCloseOnClick($scope.closeOnClick);
$attrs.$observe('uifCloseOnClick', setCloseOnClick);
var parentMenuItemCtrl = $element.controller(ContextualMenuItemDirective.directiveName);
if (!angular.isUndefined(parentMenuItemCtrl)) {
parentMenuItemCtrl.setChildMenu(contextualMenuController);
}
if (!angular.isUndefined($scope.multiselect) && $scope.multiselect.toLowerCase() === 'true') {
$element.addClass('ms-ContextualMenu--multiselect');
}
};
return ContextualMenuDirective;
}());
ContextualMenuDirective.directiveName = 'uifContextualMenu';
exports.ContextualMenuDirective = ContextualMenuDirective;
var ContextualMenuController = (function () {
function ContextualMenuController($scope, $animate, $element, $log) {
var _this = this;
this.$scope = $scope;
this.$animate = $animate;
this.$element = $element;
this.$log = $log;
this.onRootMenuClosed = [];
this.isOpenClassName = 'is-open';
if (angular.isUndefined($element.controller(ContextualMenuItemDirective.directiveName))) {
$scope.isRootMenu = true;
}
$scope.$watch('isOpen', function (newValue) {
if (typeof newValue !== 'boolean' && newValue !== undefined) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.contextualmenu - invalid attribute type: \'uif-is-open\'.\n' +
'The type \'' + typeof newValue + '\' is not supported as valid type for \'uif-is-open\' attribute for ' +
'. The valid type is boolean.');
}
$animate[newValue ? 'addClass' : 'removeClass']($element, _this.isOpenClassName);
});
this.onRootMenuClosed.push(function () {
_this.closeMenu();
_this.deselectItems(true);
});
$scope.$on('uif-menu-close', function () {
if ($scope.isRootMenu && $scope.closeOnClick) {
_this.onRootMenuClosed.forEach(function (callback) {
callback();
});
}
});
}
ContextualMenuController.prototype.deselectItems = function (deselectParentMenus) {
this.$scope.$broadcast('uif-menu-deselect');
if (deselectParentMenus) {
this.$scope.$emit('uif-menu-deselect');
}
};
ContextualMenuController.prototype.closeSubMenus = function (menuItemToSkip, closeRootMenu) {
this.$scope.$broadcast('uif-menu-close', menuItemToSkip);
if (closeRootMenu) {
this.$scope.$emit('uif-menu-close');
}
};
ContextualMenuController.prototype.openMenu = function () {
this.$scope.isOpen = true;
};
ContextualMenuController.prototype.closeMenu = function () {
this.$scope.isOpen = false;
};
ContextualMenuController.prototype.isRootMenu = function () {
return this.$scope.isRootMenu;
};
ContextualMenuController.prototype.isMultiSelectionMenu = function () {
if (angular.isUndefined(this.$scope.multiselect)) {
return false;
}
return this.$scope.multiselect.toLowerCase() === 'true';
};
ContextualMenuController.prototype.isMenuOpened = function () {
return this.$element.hasClass('is-open');
};
return ContextualMenuController;
}());
ContextualMenuController.$inject = ['$scope', '$animate', '$element', '$log'];
exports.ContextualMenuController = ContextualMenuController;
exports.module = angular.module('officeuifabric.components.contextualmenu', [
'officeuifabric.components'
])
.directive(ContextualMenuDirective.directiveName, ContextualMenuDirective.factory())
.directive(ContextualMenuItemDirective.directiveName, ContextualMenuItemDirective.factory());
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var IconEnum;
(function (IconEnum) {
IconEnum[IconEnum["alert"] = 0] = "alert";
IconEnum[IconEnum["alert2"] = 1] = "alert2";
IconEnum[IconEnum["alertOutline"] = 2] = "alertOutline";
IconEnum[IconEnum["arrowDown"] = 3] = "arrowDown";
IconEnum[IconEnum["arrowDown2"] = 4] = "arrowDown2";
IconEnum[IconEnum["arrowDownLeft"] = 5] = "arrowDownLeft";
IconEnum[IconEnum["arrowDownRight"] = 6] = "arrowDownRight";
IconEnum[IconEnum["arrowLeft"] = 7] = "arrowLeft";
IconEnum[IconEnum["arrowRight"] = 8] = "arrowRight";
IconEnum[IconEnum["arrowUp"] = 9] = "arrowUp";
IconEnum[IconEnum["arrowUp2"] = 10] = "arrowUp2";
IconEnum[IconEnum["arrowUpLeft"] = 11] = "arrowUpLeft";
IconEnum[IconEnum["arrowUpRight"] = 12] = "arrowUpRight";
IconEnum[IconEnum["ascending"] = 13] = "ascending";
IconEnum[IconEnum["at"] = 14] = "at";
IconEnum[IconEnum["attachment"] = 15] = "attachment";
IconEnum[IconEnum["bag"] = 16] = "bag";
IconEnum[IconEnum["balloon"] = 17] = "balloon";
IconEnum[IconEnum["bell"] = 18] = "bell";
IconEnum[IconEnum["boards"] = 19] = "boards";
IconEnum[IconEnum["bold"] = 20] = "bold";
IconEnum[IconEnum["bookmark"] = 21] = "bookmark";
IconEnum[IconEnum["books"] = 22] = "books";
IconEnum[IconEnum["briefcase"] = 23] = "briefcase";
IconEnum[IconEnum["bundle"] = 24] = "bundle";
IconEnum[IconEnum["cake"] = 25] = "cake";
IconEnum[IconEnum["calendar"] = 26] = "calendar";
IconEnum[IconEnum["calendarDay"] = 27] = "calendarDay";
IconEnum[IconEnum["calendarPublic"] = 28] = "calendarPublic";
IconEnum[IconEnum["calendarWeek"] = 29] = "calendarWeek";
IconEnum[IconEnum["calendarWorkWeek"] = 30] = "calendarWorkWeek";
IconEnum[IconEnum["camera"] = 31] = "camera";
IconEnum[IconEnum["car"] = 32] = "car";
IconEnum[IconEnum["caretDown"] = 33] = "caretDown";
IconEnum[IconEnum["caretDownLeft"] = 34] = "caretDownLeft";
IconEnum[IconEnum["caretDownOutline"] = 35] = "caretDownOutline";
IconEnum[IconEnum["caretDownRight"] = 36] = "caretDownRight";
IconEnum[IconEnum["caretLeft"] = 37] = "caretLeft";
IconEnum[IconEnum["caretLeftOutline"] = 38] = "caretLeftOutline";
IconEnum[IconEnum["caretRight"] = 39] = "caretRight";
IconEnum[IconEnum["caretRightOutline"] = 40] = "caretRightOutline";
IconEnum[IconEnum["caretUp"] = 41] = "caretUp";
IconEnum[IconEnum["caretUpLeft"] = 42] = "caretUpLeft";
IconEnum[IconEnum["caretUpOutline"] = 43] = "caretUpOutline";
IconEnum[IconEnum["caretUpRight"] = 44] = "caretUpRight";
IconEnum[IconEnum["cart"] = 45] = "cart";
IconEnum[IconEnum["cat"] = 46] = "cat";
IconEnum[IconEnum["chart"] = 47] = "chart";
IconEnum[IconEnum["chat"] = 48] = "chat";
IconEnum[IconEnum["chatAdd"] = 49] = "chatAdd";
IconEnum[IconEnum["check"] = 50] = "check";
IconEnum[IconEnum["checkbox"] = 51] = "checkbox";
IconEnum[IconEnum["checkboxCheck"] = 52] = "checkboxCheck";
IconEnum[IconEnum["checkboxEmpty"] = 53] = "checkboxEmpty";
IconEnum[IconEnum["checkboxMixed"] = 54] = "checkboxMixed";
IconEnum[IconEnum["checkPeople"] = 55] = "checkPeople";
IconEnum[IconEnum["chevronDown"] = 56] = "chevronDown";
IconEnum[IconEnum["chevronLeft"] = 57] = "chevronLeft";
IconEnum[IconEnum["chevronRight"] = 58] = "chevronRight";
IconEnum[IconEnum["chevronsDown"] = 59] = "chevronsDown";
IconEnum[IconEnum["chevronsLeft"] = 60] = "chevronsLeft";
IconEnum[IconEnum["chevronsRight"] = 61] = "chevronsRight";
IconEnum[IconEnum["chevronsUp"] = 62] = "chevronsUp";
IconEnum[IconEnum["chevronThickDown"] = 63] = "chevronThickDown";
IconEnum[IconEnum["chevronThickLeft"] = 64] = "chevronThickLeft";
IconEnum[IconEnum["chevronThickRight"] = 65] = "chevronThickRight";
IconEnum[IconEnum["chevronThickUp"] = 66] = "chevronThickUp";
IconEnum[IconEnum["chevronThinDown"] = 67] = "chevronThinDown";
IconEnum[IconEnum["chevronThinLeft"] = 68] = "chevronThinLeft";
IconEnum[IconEnum["chevronThinRight"] = 69] = "chevronThinRight";
IconEnum[IconEnum["chevronThinUp"] = 70] = "chevronThinUp";
IconEnum[IconEnum["chevronUp"] = 71] = "chevronUp";
IconEnum[IconEnum["circleBall"] = 72] = "circleBall";
IconEnum[IconEnum["circleBalloons"] = 73] = "circleBalloons";
IconEnum[IconEnum["circleCar"] = 74] = "circleCar";
IconEnum[IconEnum["circleCat"] = 75] = "circleCat";
IconEnum[IconEnum["circleCoffee"] = 76] = "circleCoffee";
IconEnum[IconEnum["circleDog"] = 77] = "circleDog";
IconEnum[IconEnum["circleEmpty"] = 78] = "circleEmpty";
IconEnum[IconEnum["circleFill"] = 79] = "circleFill";
IconEnum[IconEnum["circleFilled"] = 80] = "circleFilled";
IconEnum[IconEnum["circleHalfFilled"] = 81] = "circleHalfFilled";
IconEnum[IconEnum["circleInfo"] = 82] = "circleInfo";
IconEnum[IconEnum["circleLightning"] = 83] = "circleLightning";
IconEnum[IconEnum["circlePill"] = 84] = "circlePill";
IconEnum[IconEnum["circlePlane"] = 85] = "circlePlane";
IconEnum[IconEnum["circlePlus"] = 86] = "circlePlus";
IconEnum[IconEnum["circlePoodle"] = 87] = "circlePoodle";
IconEnum[IconEnum["circleUnfilled"] = 88] = "circleUnfilled";
IconEnum[IconEnum["classNotebook"] = 89] = "classNotebook";
IconEnum[IconEnum["classroom"] = 90] = "classroom";
IconEnum[IconEnum["clock"] = 91] = "clock";
IconEnum[IconEnum["clutter"] = 92] = "clutter";
IconEnum[IconEnum["coffee"] = 93] = "coffee";
IconEnum[IconEnum["collapse"] = 94] = "collapse";
IconEnum[IconEnum["conflict"] = 95] = "conflict";
IconEnum[IconEnum["contact"] = 96] = "contact";
IconEnum[IconEnum["contactForm"] = 97] = "contactForm";
IconEnum[IconEnum["contactPublic"] = 98] = "contactPublic";
IconEnum[IconEnum["copy"] = 99] = "copy";
IconEnum[IconEnum["creditCard"] = 100] = "creditCard";
IconEnum[IconEnum["creditCardOutline"] = 101] = "creditCardOutline";
IconEnum[IconEnum["dashboard"] = 102] = "dashboard";
IconEnum[IconEnum["descending"] = 103] = "descending";
IconEnum[IconEnum["desktop"] = 104] = "desktop";
IconEnum[IconEnum["deviceWipe"] = 105] = "deviceWipe";
IconEnum[IconEnum["dialpad"] = 106] = "dialpad";
IconEnum[IconEnum["directions"] = 107] = "directions";
IconEnum[IconEnum["document"] = 108] = "document";
IconEnum[IconEnum["documentAdd"] = 109] = "documentAdd";
IconEnum[IconEnum["documentForward"] = 110] = "documentForward";
IconEnum[IconEnum["documentLandscape"] = 111] = "documentLandscape";
IconEnum[IconEnum["documentPDF"] = 112] = "documentPDF";
IconEnum[IconEnum["documentReply"] = 113] = "documentReply";
IconEnum[IconEnum["documents"] = 114] = "documents";
IconEnum[IconEnum["documentSearch"] = 115] = "documentSearch";
IconEnum[IconEnum["dog"] = 116] = "dog";
IconEnum[IconEnum["dogAlt"] = 117] = "dogAlt";
IconEnum[IconEnum["dot"] = 118] = "dot";
IconEnum[IconEnum["download"] = 119] = "download";
IconEnum[IconEnum["drm"] = 120] = "drm";
IconEnum[IconEnum["drop"] = 121] = "drop";
IconEnum[IconEnum["dropdown"] = 122] = "dropdown";
IconEnum[IconEnum["editBox"] = 123] = "editBox";
IconEnum[IconEnum["ellipsis"] = 124] = "ellipsis";
IconEnum[IconEnum["embed"] = 125] = "embed";
IconEnum[IconEnum["event"] = 126] = "event";
IconEnum[IconEnum["eventCancel"] = 127] = "eventCancel";
IconEnum[IconEnum["eventInfo"] = 128] = "eventInfo";
IconEnum[IconEnum["eventRecurring"] = 129] = "eventRecurring";
IconEnum[IconEnum["eventShare"] = 130] = "eventShare";
IconEnum[IconEnum["exclamation"] = 131] = "exclamation";
IconEnum[IconEnum["expand"] = 132] = "expand";
IconEnum[IconEnum["eye"] = 133] = "eye";
IconEnum[IconEnum["favorites"] = 134] = "favorites";
IconEnum[IconEnum["fax"] = 135] = "fax";
IconEnum[IconEnum["fieldMail"] = 136] = "fieldMail";
IconEnum[IconEnum["fieldNumber"] = 137] = "fieldNumber";
IconEnum[IconEnum["fieldText"] = 138] = "fieldText";
IconEnum[IconEnum["fieldTextBox"] = 139] = "fieldTextBox";
IconEnum[IconEnum["fileDocument"] = 140] = "fileDocument";
IconEnum[IconEnum["fileImage"] = 141] = "fileImage";
IconEnum[IconEnum["filePDF"] = 142] = "filePDF";
IconEnum[IconEnum["filter"] = 143] = "filter";
IconEnum[IconEnum["filterClear"] = 144] = "filterClear";
IconEnum[IconEnum["firstAid"] = 145] = "firstAid";
IconEnum[IconEnum["flag"] = 146] = "flag";
IconEnum[IconEnum["folder"] = 147] = "folder";
IconEnum[IconEnum["folderMove"] = 148] = "folderMove";
IconEnum[IconEnum["folderPublic"] = 149] = "folderPublic";
IconEnum[IconEnum["folderSearch"] = 150] = "folderSearch";
IconEnum[IconEnum["fontColor"] = 151] = "fontColor";
IconEnum[IconEnum["fontDecrease"] = 152] = "fontDecrease";
IconEnum[IconEnum["fontIncrease"] = 153] = "fontIncrease";
IconEnum[IconEnum["frowny"] = 154] = "frowny";
IconEnum[IconEnum["fullscreen"] = 155] = "fullscreen";
IconEnum[IconEnum["gear"] = 156] = "gear";
IconEnum[IconEnum["glasses"] = 157] = "glasses";
IconEnum[IconEnum["globe"] = 158] = "globe";
IconEnum[IconEnum["graph"] = 159] = "graph";
IconEnum[IconEnum["group"] = 160] = "group";
IconEnum[IconEnum["header"] = 161] = "header";
IconEnum[IconEnum["heart"] = 162] = "heart";
IconEnum[IconEnum["heartEmpty"] = 163] = "heartEmpty";
IconEnum[IconEnum["hide"] = 164] = "hide";
IconEnum[IconEnum["home"] = 165] = "home";
IconEnum[IconEnum["inboxCheck"] = 166] = "inboxCheck";
IconEnum[IconEnum["info"] = 167] = "info";
IconEnum[IconEnum["infoCircle"] = 168] = "infoCircle";
IconEnum[IconEnum["italic"] = 169] = "italic";
IconEnum[IconEnum["key"] = 170] = "key";
IconEnum[IconEnum["late"] = 171] = "late";
IconEnum[IconEnum["lifesaver"] = 172] = "lifesaver";
IconEnum[IconEnum["lifesaverLock"] = 173] = "lifesaverLock";
IconEnum[IconEnum["lightBulb"] = 174] = "lightBulb";
IconEnum[IconEnum["lightning"] = 175] = "lightning";
IconEnum[IconEnum["link"] = 176] = "link";
IconEnum[IconEnum["linkRemove"] = 177] = "linkRemove";
IconEnum[IconEnum["listBullets"] = 178] = "listBullets";
IconEnum[IconEnum["listCheck"] = 179] = "listCheck";
IconEnum[IconEnum["listCheckbox"] = 180] = "listCheckbox";
IconEnum[IconEnum["listGroup"] = 181] = "listGroup";
IconEnum[IconEnum["listGroup2"] = 182] = "listGroup2";
IconEnum[IconEnum["listNumbered"] = 183] = "listNumbered";
IconEnum[IconEnum["lock"] = 184] = "lock";
IconEnum[IconEnum["mail"] = 185] = "mail";
IconEnum[IconEnum["mailCheck"] = 186] = "mailCheck";
IconEnum[IconEnum["mailDown"] = 187] = "mailDown";
IconEnum[IconEnum["mailEdit"] = 188] = "mailEdit";
IconEnum[IconEnum["mailEmpty"] = 189] = "mailEmpty";
IconEnum[IconEnum["mailError"] = 190] = "mailError";
IconEnum[IconEnum["mailOpen"] = 191] = "mailOpen";
IconEnum[IconEnum["mailPause"] = 192] = "mailPause";
IconEnum[IconEnum["mailPublic"] = 193] = "mailPublic";
IconEnum[IconEnum["mailRead"] = 194] = "mailRead";
IconEnum[IconEnum["mailSend"] = 195] = "mailSend";
IconEnum[IconEnum["mailSync"] = 196] = "mailSync";
IconEnum[IconEnum["mailUnread"] = 197] = "mailUnread";
IconEnum[IconEnum["mapMarker"] = 198] = "mapMarker";
IconEnum[IconEnum["meal"] = 199] = "meal";
IconEnum[IconEnum["menu"] = 200] = "menu";
IconEnum[IconEnum["menu2"] = 201] = "menu2";
IconEnum[IconEnum["merge"] = 202] = "merge";
IconEnum[IconEnum["metadata"] = 203] = "metadata";
IconEnum[IconEnum["microphone"] = 204] = "microphone";
IconEnum[IconEnum["miniatures"] = 205] = "miniatures";
IconEnum[IconEnum["minus"] = 206] = "minus";
IconEnum[IconEnum["mobile"] = 207] = "mobile";
IconEnum[IconEnum["money"] = 208] = "money";
IconEnum[IconEnum["move"] = 209] = "move";
IconEnum[IconEnum["multiChoice"] = 210] = "multiChoice";
IconEnum[IconEnum["music"] = 211] = "music";
IconEnum[IconEnum["navigate"] = 212] = "navigate";
IconEnum[IconEnum["new"] = 213] = "new";
IconEnum[IconEnum["newsfeed"] = 214] = "newsfeed";
IconEnum[IconEnum["note"] = 215] = "note";
IconEnum[IconEnum["notebook"] = 216] = "notebook";
IconEnum[IconEnum["noteEdit"] = 217] = "noteEdit";
IconEnum[IconEnum["noteForward"] = 218] = "noteForward";
IconEnum[IconEnum["noteReply"] = 219] = "noteReply";
IconEnum[IconEnum["notRecurring"] = 220] = "notRecurring";
IconEnum[IconEnum["onedrive"] = 221] = "onedrive";
IconEnum[IconEnum["onlineAdd"] = 222] = "onlineAdd";
IconEnum[IconEnum["onlineJoin"] = 223] = "onlineJoin";
IconEnum[IconEnum["oofReply"] = 224] = "oofReply";
IconEnum[IconEnum["org"] = 225] = "org";
IconEnum[IconEnum["page"] = 226] = "page";
IconEnum[IconEnum["paint"] = 227] = "paint";
IconEnum[IconEnum["panel"] = 228] = "panel";
IconEnum[IconEnum["partner"] = 229] = "partner";
IconEnum[IconEnum["pause"] = 230] = "pause";
IconEnum[IconEnum["pencil"] = 231] = "pencil";
IconEnum[IconEnum["people"] = 232] = "people";
IconEnum[IconEnum["peopleAdd"] = 233] = "peopleAdd";
IconEnum[IconEnum["peopleCheck"] = 234] = "peopleCheck";
IconEnum[IconEnum["peopleError"] = 235] = "peopleError";
IconEnum[IconEnum["peoplePause"] = 236] = "peoplePause";
IconEnum[IconEnum["peopleRemove"] = 237] = "peopleRemove";
IconEnum[IconEnum["peopleSecurity"] = 238] = "peopleSecurity";
IconEnum[IconEnum["peopleSync"] = 239] = "peopleSync";
IconEnum[IconEnum["person"] = 240] = "person";
IconEnum[IconEnum["personAdd"] = 241] = "personAdd";
IconEnum[IconEnum["personRemove"] = 242] = "personRemove";
IconEnum[IconEnum["phone"] = 243] = "phone";
IconEnum[IconEnum["phoneAdd"] = 244] = "phoneAdd";
IconEnum[IconEnum["phoneTransfer"] = 245] = "phoneTransfer";
IconEnum[IconEnum["picture"] = 246] = "picture";
IconEnum[IconEnum["pictureAdd"] = 247] = "pictureAdd";
IconEnum[IconEnum["pictureEdit"] = 248] = "pictureEdit";
IconEnum[IconEnum["pictureRemove"] = 249] = "pictureRemove";
IconEnum[IconEnum["pill"] = 250] = "pill";
IconEnum[IconEnum["pinDown"] = 251] = "pinDown";
IconEnum[IconEnum["pinLeft"] = 252] = "pinLeft";
IconEnum[IconEnum["placeholder"] = 253] = "placeholder";
IconEnum[IconEnum["plane"] = 254] = "plane";
IconEnum[IconEnum["play"] = 255] = "play";
IconEnum[IconEnum["plus"] = 256] = "plus";
IconEnum[IconEnum["plus2"] = 257] = "plus2";
IconEnum[IconEnum["pointItem"] = 258] = "pointItem";
IconEnum[IconEnum["popout"] = 259] = "popout";
IconEnum[IconEnum["post"] = 260] = "post";
IconEnum[IconEnum["print"] = 261] = "print";
IconEnum[IconEnum["protectionCenter"] = 262] = "protectionCenter";
IconEnum[IconEnum["question"] = 263] = "question";
IconEnum[IconEnum["questionReverse"] = 264] = "questionReverse";
IconEnum[IconEnum["quote"] = 265] = "quote";
IconEnum[IconEnum["radioButton"] = 266] = "radioButton";
IconEnum[IconEnum["reactivate"] = 267] = "reactivate";
IconEnum[IconEnum["receiptCheck"] = 268] = "receiptCheck";
IconEnum[IconEnum["receiptForward"] = 269] = "receiptForward";
IconEnum[IconEnum["receiptReply"] = 270] = "receiptReply";
IconEnum[IconEnum["refresh"] = 271] = "refresh";
IconEnum[IconEnum["reload"] = 272] = "reload";
IconEnum[IconEnum["reply"] = 273] = "reply";
IconEnum[IconEnum["replyAll"] = 274] = "replyAll";
IconEnum[IconEnum["replyAllAlt"] = 275] = "replyAllAlt";
IconEnum[IconEnum["replyAlt"] = 276] = "replyAlt";
IconEnum[IconEnum["ribbon"] = 277] = "ribbon";
IconEnum[IconEnum["room"] = 278] = "room";
IconEnum[IconEnum["save"] = 279] = "save";
IconEnum[IconEnum["scheduling"] = 280] = "scheduling";
IconEnum[IconEnum["search"] = 281] = "search";
IconEnum[IconEnum["section"] = 282] = "section";
IconEnum[IconEnum["sections"] = 283] = "sections";
IconEnum[IconEnum["settings"] = 284] = "settings";
IconEnum[IconEnum["share"] = 285] = "share";
IconEnum[IconEnum["shield"] = 286] = "shield";
IconEnum[IconEnum["sites"] = 287] = "sites";
IconEnum[IconEnum["smiley"] = 288] = "smiley";
IconEnum[IconEnum["soccer"] = 289] = "soccer";
IconEnum[IconEnum["socialListening"] = 290] = "socialListening";
IconEnum[IconEnum["sort"] = 291] = "sort";
IconEnum[IconEnum["sortLines"] = 292] = "sortLines";
IconEnum[IconEnum["split"] = 293] = "split";
IconEnum[IconEnum["star"] = 294] = "star";
IconEnum[IconEnum["starEmpty"] = 295] = "starEmpty";
IconEnum[IconEnum["stopwatch"] = 296] = "stopwatch";
IconEnum[IconEnum["story"] = 297] = "story";
IconEnum[IconEnum["styleRemove"] = 298] = "styleRemove";
IconEnum[IconEnum["subscribe"] = 299] = "subscribe";
IconEnum[IconEnum["sun"] = 300] = "sun";
IconEnum[IconEnum["sunAdd"] = 301] = "sunAdd";
IconEnum[IconEnum["sunQuestion"] = 302] = "sunQuestion";
IconEnum[IconEnum["support"] = 303] = "support";
IconEnum[IconEnum["table"] = 304] = "table";
IconEnum[IconEnum["tablet"] = 305] = "tablet";
IconEnum[IconEnum["tag"] = 306] = "tag";
IconEnum[IconEnum["taskRecurring"] = 307] = "taskRecurring";
IconEnum[IconEnum["tasks"] = 308] = "tasks";
IconEnum[IconEnum["teamwork"] = 309] = "teamwork";
IconEnum[IconEnum["text"] = 310] = "text";
IconEnum[IconEnum["textBox"] = 311] = "textBox";
IconEnum[IconEnum["tile"] = 312] = "tile";
IconEnum[IconEnum["timeline"] = 313] = "timeline";
IconEnum[IconEnum["today"] = 314] = "today";
IconEnum[IconEnum["toggle"] = 315] = "toggle";
IconEnum[IconEnum["toggleMiddle"] = 316] = "toggleMiddle";
IconEnum[IconEnum["touch"] = 317] = "touch";
IconEnum[IconEnum["trash"] = 318] = "trash";
IconEnum[IconEnum["triangleDown"] = 319] = "triangleDown";
IconEnum[IconEnum["triangleEmptyDown"] = 320] = "triangleEmptyDown";
IconEnum[IconEnum["triangleEmptyLeft"] = 321] = "triangleEmptyLeft";
IconEnum[IconEnum["triangleEmptyRight"] = 322] = "triangleEmptyRight";
IconEnum[IconEnum["triangleEmptyUp"] = 323] = "triangleEmptyUp";
IconEnum[IconEnum["triangleLeft"] = 324] = "triangleLeft";
IconEnum[IconEnum["triangleRight"] = 325] = "triangleRight";
IconEnum[IconEnum["triangleUp"] = 326] = "triangleUp";
IconEnum[IconEnum["trophy"] = 327] = "trophy";
IconEnum[IconEnum["underline"] = 328] = "underline";
IconEnum[IconEnum["unsubscribe"] = 329] = "unsubscribe";
IconEnum[IconEnum["upload"] = 330] = "upload";
IconEnum[IconEnum["video"] = 331] = "video";
IconEnum[IconEnum["voicemail"] = 332] = "voicemail";
IconEnum[IconEnum["voicemailForward"] = 333] = "voicemailForward";
IconEnum[IconEnum["voicemailReply"] = 334] = "voicemailReply";
IconEnum[IconEnum["waffle"] = 335] = "waffle";
IconEnum[IconEnum["work"] = 336] = "work";
IconEnum[IconEnum["wrench"] = 337] = "wrench";
IconEnum[IconEnum["x"] = 338] = "x";
IconEnum[IconEnum["xCircle"] = 339] = "xCircle";
})(IconEnum = exports.IconEnum || (exports.IconEnum = {}));
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PersonaSize;
(function (PersonaSize) {
PersonaSize[PersonaSize["tiny"] = 0] = "tiny";
PersonaSize[PersonaSize["xsmall"] = 1] = "xsmall";
PersonaSize[PersonaSize["small"] = 2] = "small";
PersonaSize[PersonaSize["medium"] = 3] = "medium";
PersonaSize[PersonaSize["large"] = 4] = "large";
PersonaSize[PersonaSize["xlarge"] = 5] = "xlarge";
})(PersonaSize = exports.PersonaSize || (exports.PersonaSize = {}));
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PresenceEnum;
(function (PresenceEnum) {
PresenceEnum[PresenceEnum["available"] = 0] = "available";
PresenceEnum[PresenceEnum["away"] = 1] = "away";
PresenceEnum[PresenceEnum["blocked"] = 2] = "blocked";
PresenceEnum[PresenceEnum["busy"] = 3] = "busy";
PresenceEnum[PresenceEnum["dnd"] = 4] = "dnd";
PresenceEnum[PresenceEnum["offline"] = 5] = "offline";
})(PresenceEnum = exports.PresenceEnum || (exports.PresenceEnum = {}));
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var breadcrumbModule = __webpack_require__(8);
var buttonModule = __webpack_require__(9);
var calloutModule = __webpack_require__(13);
var choicefieldModule = __webpack_require__(15);
var commandBarModule = __webpack_require__(17);
var contentModule = __webpack_require__(18);
var contextualMenuModule = __webpack_require__(2);
var datepickerModule = __webpack_require__(19);
var dialogModule = __webpack_require__(20);
var dropdownModule = __webpack_require__(22);
var facepileModule = __webpack_require__(23);
var iconModule = __webpack_require__(24);
var labelModule = __webpack_require__(25);
var linkModule = __webpack_require__(26);
var listModule = __webpack_require__(27);
var messageBannerModule = __webpack_require__(31);
var messageBarModule = __webpack_require__(32);
var navBarModule = __webpack_require__(34);
var orgChartModule = __webpack_require__(35);
var overlayModule = __webpack_require__(39);
var panelModule = __webpack_require__(41);
var peoplePickerModule = __webpack_require__(43);
var personacardModule = __webpack_require__(45);
var personaModule = __webpack_require__(44);
var pivotModule = __webpack_require__(48);
var progressIndicatorModule = __webpack_require__(51);
var searchboxModule = __webpack_require__(52);
var spinnerModule = __webpack_require__(53);
var tableModule = __webpack_require__(55);
var textFieldModule = __webpack_require__(58);
var toggleModule = __webpack_require__(60);
exports.module = angular.module('officeuifabric.components', [
breadcrumbModule.module.name,
buttonModule.module.name,
calloutModule.module.name,
choicefieldModule.module.name,
commandBarModule.module.name,
contentModule.module.name,
contextualMenuModule.module.name,
datepickerModule.module.name,
dialogModule.module.name,
dropdownModule.module.name,
facepileModule.module.name,
iconModule.module.name,
labelModule.module.name,
linkModule.module.name,
listModule.module.name,
messageBannerModule.module.name,
messageBarModule.module.name,
navBarModule.module.name,
orgChartModule.module.name,
overlayModule.module.name,
panelModule.module.name,
peoplePickerModule.module.name,
personacardModule.module.name,
personaModule.module.name,
pivotModule.module.name,
progressIndicatorModule.module.name,
searchboxModule.module.name,
spinnerModule.module.name,
tableModule.module.name,
textFieldModule.module.name,
toggleModule.module.name
]);
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
exports.module = angular.module('officeuifabric.core', []);
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var BreadcrumbLinkDirective = (function () {
function BreadcrumbLinkDirective() {
this.restrict = 'E';
this.require = '^uifBreadcrumb';
this.transclude = true;
this.replace = true;
this.template = "\n \n \n \n ";
this.scope = {
ngHref: '@'
};
}
BreadcrumbLinkDirective.factory = function () {
var directive = function () { return new BreadcrumbLinkDirective(); };
return directive;
};
BreadcrumbLinkDirective.prototype.link = function (scope, instanceElement, attributes, ctrl, transclude) {
var tabindex = Array.prototype.indexOf.call(instanceElement.parent().children(), instanceElement[0]) + 2;
scope.uifTabindex = tabindex;
};
return BreadcrumbLinkDirective;
}());
exports.BreadcrumbLinkDirective = BreadcrumbLinkDirective;
var BreadcrumbLink = (function () {
function BreadcrumbLink(href, linkText) {
this.href = href;
this.linkText = linkText;
}
return BreadcrumbLink;
}());
exports.BreadcrumbLink = BreadcrumbLink;
var BreadcrumbController = (function () {
function BreadcrumbController($scope, $document, $window) {
this.$scope = $scope;
this.$document = $document;
this.$window = $window;
}
return BreadcrumbController;
}());
BreadcrumbController.$inject = ['$scope', '$document', '$window'];
exports.BreadcrumbController = BreadcrumbController;
var BreadcrumbDirective = (function () {
function BreadcrumbDirective() {
var _this = this;
this.restrict = 'E';
this.replace = true;
this.template = "\n ";
this.controller = BreadcrumbController;
this.require = 'uifBreadcrumb';
this.scope = {
'uifBreadcrumbLinks': '='
};
this.SMALL_BREAK_POINT = 639;
this.link = function ($scope, $instanceElement, $attrs, $breadcrumbController) {
$scope.visibleElements = 4;
$scope.overflowMenuOpen = false;
$scope.isOverflow = function () {
var overflow = false;
overflow = angular.isDefined($scope.uifBreadcrumbLinks) && $scope.uifBreadcrumbLinks.length > $scope.visibleElements;
return overflow;
};
$scope.overflowElements = function () {
return $scope.isOverflow() ? $scope.uifBreadcrumbLinks.length - $scope.visibleElements : 0;
};
$scope.openOverflow = function (event) {
event.stopPropagation();
$scope.overflowMenuOpen = true;
};
angular.element($breadcrumbController.$window).bind('resize', function () {
$scope.onResize();
$scope.$digest();
});
$breadcrumbController.$document.find('html').on('click', function (event) {
$scope.overflowMenuOpen = false;
$scope.$apply();
});
$scope.onResize = function (innerWidth) {
if (innerWidth === undefined) {
innerWidth = window.innerWidth;
}
var elementsToShow = (innerWidth > _this.SMALL_BREAK_POINT) ? 4 : 2;
if (elementsToShow !== $scope.visibleElements) {
$scope.visibleElements = elementsToShow;
$scope.$apply();
}
};
$scope.onResize();
};
}
BreadcrumbDirective.factory = function () {
var directive = function () { return new BreadcrumbDirective(); };
return directive;
};
return BreadcrumbDirective;
}());
exports.BreadcrumbDirective = BreadcrumbDirective;
exports.module = angular.module('officeuifabric.components.breadcrumb', ['officeuifabric.components'])
.directive('uifBreadcrumb', BreadcrumbDirective.factory())
.directive('uifBreadcrumbLink', BreadcrumbLinkDirective.factory());
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var buttonTypeEnum_1 = __webpack_require__(11);
var buttonTemplateType_1 = __webpack_require__(10);
var ButtonController = (function () {
function ButtonController($log) {
this.$log = $log;
}
return ButtonController;
}());
ButtonController.$inject = ['$log'];
var ButtonDirective = (function () {
function ButtonDirective($log) {
var _this = this;
this.$log = $log;
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.scope = {};
this.controller = ButtonController;
this.controllerAs = 'button';
this.templateOptions = {};
this.template = function ($element, $attrs) {
if (!angular.isUndefined($attrs.uifType) && angular.isUndefined(buttonTypeEnum_1.ButtonTypeEnum[$attrs.uifType])) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.button - Unsupported button: ' +
'The button (\'' + $attrs.uifType + '\') is not supported by the Office UI Fabric. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/button/buttonTypeEnum.ts');
}
switch ($attrs.uifType) {
case buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.primary]:
return angular.isUndefined($attrs.ngHref)
? _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.primaryButton]
: _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.primaryLink];
case buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.command]:
return angular.isUndefined($attrs.ngHref)
? _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.commandButton]
: _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.commandLink];
case buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.compound]:
return angular.isUndefined($attrs.ngHref)
? _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.compoundButton]
: _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.compoundLink];
case buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.hero]:
return angular.isUndefined($attrs.ngHref)
? _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.heroButton]
: _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.heroLink];
default:
return angular.isUndefined($attrs.ngHref)
? _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.actionButton]
: _this.templateOptions[buttonTemplateType_1.ButtonTemplateType.actionLink];
}
};
this._populateHtmlTemplates();
}
ButtonDirective.factory = function () {
var directive = function ($log) { return new ButtonDirective($log); };
directive.$inject = ['$log'];
return directive;
};
ButtonDirective.prototype.compile = function (element, attrs, transclude) {
return {
post: this.postLink,
pre: this.preLink
};
};
ButtonDirective.prototype.preLink = function (scope, element, attrs, controllers, transclude) {
attrs.$observe('disabled', function (isDisabled) {
scope.disabled = !!isDisabled;
});
element.on('click', function (e) {
if (scope.disabled) {
e.preventDefault();
}
});
};
ButtonDirective.prototype.postLink = function (scope, element, attrs, controllers, transclude) {
var _this = this;
if (angular.isUndefined(attrs.uifType) ||
attrs.uifType === buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.primary] ||
attrs.uifType === buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.compound]) {
var iconElement = element.find('uif-icon');
if (iconElement.length !== 0) {
iconElement.remove();
controllers.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.button - ' +
'Icon not allowed in primary or compound buttons: ' +
'The primary & compound button does not support including icons in the body. ' +
'The icon has been removed but may cause rendering errors. Consider buttons that support icons such as command or hero.');
}
}
transclude(function (clone) {
var wrapper;
switch (attrs.uifType) {
case buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.command]:
for (var i = 0; i < clone.length; i++) {
if (_this._isValidLabel(clone[i])) {
wrapper = angular.element('');
wrapper.addClass('ms-Button-label').append(clone[i]);
element.append(wrapper);
}
if (clone[i].tagName === 'UIF-ICON') {
wrapper = angular.element('');
wrapper.addClass('ms-Button-icon').append(clone[i]);
element.append(wrapper);
}
}
break;
case buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.compound]:
for (var i = 0; i < clone.length; i++) {
if (clone[i].tagName === 'UIF-ICON') {
continue;
}
if (_this._isValidLabel(clone[i])) {
wrapper = angular.element('');
wrapper.addClass('ms-Button-label').append(clone[i]);
element.append(wrapper);
}
else {
element.append(clone[i]);
}
}
break;
case buttonTypeEnum_1.ButtonTypeEnum[buttonTypeEnum_1.ButtonTypeEnum.hero]:
for (var i = 0; i < clone.length; i++) {
if (_this._isValidLabel(clone[i])) {
wrapper = angular.element('');
wrapper.addClass('ms-Button-label').append(clone[i]);
element.append(wrapper);
}
if (clone[i].tagName === 'UIF-ICON') {
wrapper = angular.element('');
wrapper.addClass('ms-Button-icon').append(clone[i]);
element.append(wrapper);
}
}
break;
default:
break;
}
});
};
ButtonDirective.prototype._isValidLabel = function (clone) {
return clone.nodeType === Node.TEXT_NODE && clone.nodeValue.trim().length > 0;
};
ButtonDirective.prototype._populateHtmlTemplates = function () {
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.actionButton] =
"";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.actionLink] =
"\n \n ";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.primaryButton] =
"";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.primaryLink] =
"\n \n ";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.commandButton] =
"";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.commandLink] =
"";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.compoundButton] =
"";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.compoundLink] =
"";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.heroButton] =
"";
this.templateOptions[buttonTemplateType_1.ButtonTemplateType.heroLink] =
"";
};
return ButtonDirective;
}());
exports.ButtonDirective = ButtonDirective;
var ButtonDescriptionDirective = (function () {
function ButtonDescriptionDirective() {
this.restrict = 'E';
this.require = '^uifButton';
this.transclude = true;
this.replace = true;
this.scope = false;
this.template = '';
}
ButtonDescriptionDirective.factory = function () {
var directive = function () { return new ButtonDescriptionDirective(); };
return directive;
};
return ButtonDescriptionDirective;
}());
exports.ButtonDescriptionDirective = ButtonDescriptionDirective;
exports.module = angular.module('officeuifabric.components.button', [
'officeuifabric.components'
])
.directive('uifButton', ButtonDirective.factory())
.directive('uifButtonDescription', ButtonDescriptionDirective.factory());
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ButtonTemplateType;
(function (ButtonTemplateType) {
ButtonTemplateType[ButtonTemplateType["actionButton"] = 0] = "actionButton";
ButtonTemplateType[ButtonTemplateType["actionLink"] = 1] = "actionLink";
ButtonTemplateType[ButtonTemplateType["primaryButton"] = 2] = "primaryButton";
ButtonTemplateType[ButtonTemplateType["primaryLink"] = 3] = "primaryLink";
ButtonTemplateType[ButtonTemplateType["commandButton"] = 4] = "commandButton";
ButtonTemplateType[ButtonTemplateType["commandLink"] = 5] = "commandLink";
ButtonTemplateType[ButtonTemplateType["compoundButton"] = 6] = "compoundButton";
ButtonTemplateType[ButtonTemplateType["compoundLink"] = 7] = "compoundLink";
ButtonTemplateType[ButtonTemplateType["heroButton"] = 8] = "heroButton";
ButtonTemplateType[ButtonTemplateType["heroLink"] = 9] = "heroLink";
})(ButtonTemplateType = exports.ButtonTemplateType || (exports.ButtonTemplateType = {}));
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ButtonTypeEnum;
(function (ButtonTypeEnum) {
ButtonTypeEnum[ButtonTypeEnum["primary"] = 0] = "primary";
ButtonTypeEnum[ButtonTypeEnum["command"] = 1] = "command";
ButtonTypeEnum[ButtonTypeEnum["compound"] = 2] = "compound";
ButtonTypeEnum[ButtonTypeEnum["hero"] = 3] = "hero";
})(ButtonTypeEnum = exports.ButtonTypeEnum || (exports.ButtonTypeEnum = {}));
/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var CalloutArrow;
(function (CalloutArrow) {
CalloutArrow[CalloutArrow["left"] = 0] = "left";
CalloutArrow[CalloutArrow["right"] = 1] = "right";
CalloutArrow[CalloutArrow["top"] = 2] = "top";
CalloutArrow[CalloutArrow["bottom"] = 3] = "bottom";
})(CalloutArrow = exports.CalloutArrow || (exports.CalloutArrow = {}));
/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var calloutTypeEnum_1 = __webpack_require__(14);
var calloutArrowEnum_1 = __webpack_require__(12);
var CalloutController = (function () {
function CalloutController($scope, $log) {
this.$scope = $scope;
this.$log = $log;
}
return CalloutController;
}());
CalloutController.$inject = ['$scope', '$log'];
exports.CalloutController = CalloutController;
var CalloutHeaderDirective = (function () {
function CalloutHeaderDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.scope = false;
this.template = '';
}
CalloutHeaderDirective.factory = function () {
var directive = function () { return new CalloutHeaderDirective(); };
return directive;
};
CalloutHeaderDirective.prototype.link = function (scope, instanceElement, attrs, ctrls) {
var mainWrapper = instanceElement.parent().parent();
if (!angular.isUndefined(mainWrapper) && mainWrapper.hasClass('ms-Callout-main')) {
var detachedHeader = instanceElement.detach();
mainWrapper.prepend(detachedHeader);
}
};
return CalloutHeaderDirective;
}());
exports.CalloutHeaderDirective = CalloutHeaderDirective;
var CalloutContentDirective = (function () {
function CalloutContentDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.scope = false;
this.template = '';
}
CalloutContentDirective.factory = function () {
var directive = function () { return new CalloutContentDirective(); };
return directive;
};
return CalloutContentDirective;
}());
exports.CalloutContentDirective = CalloutContentDirective;
var CalloutActionsDirective = (function () {
function CalloutActionsDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.scope = false;
this.template = '';
this.require = '^?uifCallout';
}
CalloutActionsDirective.factory = function () {
var directive = function () { return new CalloutActionsDirective(); };
return directive;
};
CalloutActionsDirective.prototype.link = function (scope, instanceElement, attrs, calloutController) {
if (angular.isObject(calloutController)) {
calloutController.$scope.$watch('hasSeparator', function (hasSeparator) {
if (hasSeparator) {
var actionChildren = instanceElement.children().eq(0).children();
for (var buttonIndex = 0; buttonIndex < actionChildren.length; buttonIndex++) {
var action = actionChildren.eq(buttonIndex);
action.addClass('ms-Callout-action');
var actionSpans = action.find('span');
for (var spanIndex = 0; spanIndex < actionSpans.length; spanIndex++) {
var actionSpan = actionSpans.eq(spanIndex);
if (actionSpan.hasClass('ms-Button-label') || actionSpan.hasClass('ms-Button-icon')) {
actionSpan.addClass('ms-Callout-actionText');
}
}
}
}
});
}
};
return CalloutActionsDirective;
}());
exports.CalloutActionsDirective = CalloutActionsDirective;
var CalloutDirective = (function () {
function CalloutDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.template = '';
this.require = ['uifCallout'];
this.scope = {
ngShow: '=?',
uifType: '@'
};
this.controller = CalloutController;
this.uifArrowClasses = (_a = {},
_a[calloutArrowEnum_1.CalloutArrow.bottom] = 'ms-Callout--arrowBottom',
_a[calloutArrowEnum_1.CalloutArrow.left] = 'ms-Callout--arrowLeft',
_a[calloutArrowEnum_1.CalloutArrow.right] = 'ms-Callout--arrowRight',
_a[calloutArrowEnum_1.CalloutArrow.top] = 'ms-Callout--arrowTop',
_a);
this.uifTypeClasses = (_b = {},
_b[calloutTypeEnum_1.CalloutType.oobe] = 'ms-Callout--OOBE',
_b[calloutTypeEnum_1.CalloutType.peek] = 'ms-Callout--Peek',
_b);
var _a, _b;
}
CalloutDirective.factory = function () {
var directive = function () { return new CalloutDirective(); };
return directive;
};
CalloutDirective.prototype.link = function (scope, instanceElement, attrs, ctrls) {
var _this = this;
var calloutController = ctrls[0];
attrs.$observe('uifType', function (calloutType) {
if (angular.isUndefined(calloutTypeEnum_1.CalloutType[calloutType])) {
calloutController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.callout - "' +
calloutType + '" is not a valid value for uifType. It should be oobe or peek');
}
});
attrs.$observe('uifArrow', function (attrArrowDirection) {
if (angular.isDefined(attrArrowDirection) && angular.isUndefined(calloutArrowEnum_1.CalloutArrow[attrArrowDirection])) {
calloutController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.callout - "' +
attrArrowDirection + '" is not a valid value for uifArrow. It should be left, right, top, bottom.');
return;
}
scope.arrowDirection = attrArrowDirection;
});
scope.hasSeparator = (!angular.isUndefined(attrs.uifActionText) || !angular.isUndefined(attrs.uifSeparator));
if (!angular.isUndefined(attrs.uifClose)) {
scope.closeButton = true;
var closeButtonElement = angular.element('');
var calloutDiv = instanceElement.find('div').eq(0);
calloutDiv.append(closeButtonElement);
closeButtonElement.bind('click', function (eventObject) {
scope.ngShow = false;
scope.closeButtonClicked = true;
scope.$apply();
});
}
instanceElement.bind('mouseenter', function (eventObject) {
scope.isMouseOver = true;
scope.$apply();
});
instanceElement.bind('mouseleave', function (eventObject) {
scope.isMouseOver = false;
scope.$apply();
});
scope.$watch('ngShow', function (newValue, oldValue) {
var isClosingByButtonClick = !newValue && scope.closeButtonClicked;
if (isClosingByButtonClick) {
scope.ngShow = scope.closeButtonClicked = false;
return;
}
if (!newValue && angular.isUndefined(attrs.uifClose)) {
scope.ngShow = scope.isMouseOver;
}
else {
scope.ngShow = newValue;
}
});
scope.$watch('isMouseOver', function (newVal, oldVal) {
if (!newVal && oldVal) {
if (!scope.closeButton) {
scope.ngShow = false;
}
}
});
scope.getCalloutClasses = function () {
var calloutClasses = [];
var calloutType = calloutTypeEnum_1.CalloutType[scope.uifType];
var calloutArrow = angular.isDefined(scope.arrowDirection) ? calloutArrowEnum_1.CalloutArrow[scope.arrowDirection] : undefined;
if (angular.isDefined(calloutType)) {
calloutClasses.push(_this.uifTypeClasses[calloutType]);
}
if (angular.isDefined(calloutArrow)) {
calloutClasses.push(_this.uifArrowClasses[calloutArrow]);
}
if (scope.closeButton) {
calloutClasses.push('ms-Callout--close');
}
if (scope.hasSeparator) {
calloutClasses.push('ms-Callout--actionText');
}
return calloutClasses.join(' ');
};
};
return CalloutDirective;
}());
exports.CalloutDirective = CalloutDirective;
exports.module = angular.module('officeuifabric.components.callout', ['officeuifabric.components'])
.directive('uifCallout', CalloutDirective.factory())
.directive('uifCalloutHeader', CalloutHeaderDirective.factory())
.directive('uifCalloutContent', CalloutContentDirective.factory())
.directive('uifCalloutActions', CalloutActionsDirective.factory());
/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var CalloutType;
(function (CalloutType) {
CalloutType[CalloutType["oobe"] = 0] = "oobe";
CalloutType[CalloutType["peek"] = 1] = "peek";
})(CalloutType = exports.CalloutType || (exports.CalloutType = {}));
/***/ }),
/* 15 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var choicefieldTypeEnum_1 = __webpack_require__(16);
var ChoicefieldOptionController = (function () {
function ChoicefieldOptionController($log) {
this.$log = $log;
}
return ChoicefieldOptionController;
}());
ChoicefieldOptionController.$inject = ['$log'];
exports.ChoicefieldOptionController = ChoicefieldOptionController;
var ChoicefieldOptionDirective = (function () {
function ChoicefieldOptionDirective() {
this.template = '' +
'' +
'' +
'
';
this.restrict = 'E';
this.require = ['uifChoicefieldOption', '^?uifChoicefieldGroup'];
this.replace = true;
this.transclude = true;
this.scope = {
ngFalseValue: '@',
ngModel: '=',
ngTrueValue: '@',
uifType: '@',
value: '@'
};
this.controller = ChoicefieldOptionController;
}
ChoicefieldOptionDirective.factory = function () {
var directive = function () {
return new ChoicefieldOptionDirective();
};
return directive;
};
ChoicefieldOptionDirective.prototype.compile = function (templateElement, templateAttributes, transclude) {
var input = templateElement.find('input');
if (!('ngModel' in templateAttributes)) {
input.removeAttr('ng-model');
}
return {
pre: this.preLink
};
};
ChoicefieldOptionDirective.prototype.preLink = function (scope, instanceElement, attrs, ctrls, transclude) {
var choicefieldOptionController = ctrls[0];
var choicefieldGroupController = ctrls[1];
scope.$watch('uifType', function (newValue, oldValue) {
if (choicefieldTypeEnum_1.ChoicefieldType[newValue] === undefined) {
choicefieldOptionController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.choicefield - "' +
newValue + '" is not a valid value for uifType. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/choicefield/choicefieldTypeEnum.ts');
}
});
if (choicefieldGroupController != null) {
var render_1 = function () {
var checked = (choicefieldGroupController.getViewValue() === attrs.value);
instanceElement.find('input').prop('checked', checked);
};
choicefieldGroupController.addRender(render_1);
attrs.$observe('value', render_1);
instanceElement
.on('$destroy', function () {
choicefieldGroupController.removeRender(render_1);
});
}
var parentScope = scope.$parent.$parent;
var checkDisabled = function () {
scope.disabled = 'disabled' in attrs && attrs.disabled;
scope.disabled = scope.disabled || (parentScope != null && parentScope.disabled);
};
scope.$watch(function () { return instanceElement.attr('disabled'); }, (function (newValue) {
checkDisabled();
}));
scope.$watch(function () { return parentScope == null ? '' : parentScope.disabled; }, (function (newValue) { checkDisabled(); }));
checkDisabled();
instanceElement
.on('click', function (ev) {
if (scope.disabled) {
return;
}
if (choicefieldGroupController != null) {
choicefieldGroupController.setTouched();
}
scope.$apply(function () {
if (choicefieldGroupController != null) {
choicefieldGroupController.setViewValue(attrs.value, ev);
}
});
});
};
return ChoicefieldOptionDirective;
}());
exports.ChoicefieldOptionDirective = ChoicefieldOptionDirective;
var ChoicefieldGroupTitleDirective = (function () {
function ChoicefieldGroupTitleDirective() {
this.template = '
';
this.transclude = true;
}
ChoicefieldGroupTitleDirective.factory = function () {
var directive = function () { return new ChoicefieldGroupTitleDirective(); };
return directive;
};
return ChoicefieldGroupTitleDirective;
}());
exports.ChoicefieldGroupTitleDirective = ChoicefieldGroupTitleDirective;
var ChoicefieldGroupController = (function () {
function ChoicefieldGroupController($element, $scope) {
this.$element = $element;
this.$scope = $scope;
this.renderFns = [];
}
ChoicefieldGroupController.prototype.init = function () {
var _this = this;
if (typeof this.$scope.ngModel !== 'undefined' && this.$scope.ngModel != null) {
this.$scope.ngModel.$render = function () {
_this.render();
};
this.render();
}
};
ChoicefieldGroupController.prototype.addRender = function (fn) {
this.renderFns.push(fn);
};
ChoicefieldGroupController.prototype.removeRender = function (fn) {
this.renderFns.splice(this.renderFns.indexOf(fn));
};
ChoicefieldGroupController.prototype.setViewValue = function (value, eventType) {
if (typeof this.$scope.ngModel !== 'undefined' && this.$scope.ngModel != null) {
if (this.getViewValue() !== value) {
this.$scope.ngModel.$setDirty();
}
this.$scope.ngModel.$setViewValue(value, eventType);
this.render();
}
};
ChoicefieldGroupController.prototype.setTouched = function () {
if (typeof this.$scope.ngModel !== 'undefined' && this.$scope.ngModel != null) {
this.$scope.ngModel.$setTouched();
}
};
ChoicefieldGroupController.prototype.getViewValue = function () {
if (typeof this.$scope.ngModel !== 'undefined' && this.$scope.ngModel != null) {
return this.$scope.ngModel.$viewValue;
}
};
ChoicefieldGroupController.prototype.render = function () {
for (var i = 0; i < this.renderFns.length; i++) {
this.renderFns[i]();
}
};
return ChoicefieldGroupController;
}());
ChoicefieldGroupController.$inject = ['$element', '$scope'];
exports.ChoicefieldGroupController = ChoicefieldGroupController;
var ChoicefieldGroupDirective = (function () {
function ChoicefieldGroupDirective() {
this.template = '' +
'' +
'
';
this.restrict = 'E';
this.transclude = true;
this.require = ['uifChoicefieldGroup', '?ngModel'];
this.controller = ChoicefieldGroupController;
this.scope = {};
}
ChoicefieldGroupDirective.factory = function () {
var directive = function () { return new ChoicefieldGroupDirective(); };
return directive;
};
ChoicefieldGroupDirective.prototype.compile = function (templateElement, templateAttributes, transclude) {
return {
pre: this.preLink
};
};
ChoicefieldGroupDirective.prototype.preLink = function (scope, instanceElement, instanceAttributes, ctrls) {
var choicefieldGroupController = ctrls[0];
var modelController = ctrls[1];
scope.ngModel = modelController;
choicefieldGroupController.init();
scope.$watch(function () { return instanceElement.attr('disabled'); }, (function (newValue) { scope.disabled = typeof newValue !== 'undefined'; }));
scope.disabled = 'disabled' in instanceAttributes;
};
return ChoicefieldGroupDirective;
}());
exports.ChoicefieldGroupDirective = ChoicefieldGroupDirective;
exports.module = angular.module('officeuifabric.components.choicefield', [
'officeuifabric.components'
])
.directive('uifChoicefieldOption', ChoicefieldOptionDirective.factory())
.directive('uifChoicefieldGroup', ChoicefieldGroupDirective.factory())
.directive('uifChoicefieldGroupTitle', ChoicefieldGroupTitleDirective.factory());
/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ChoicefieldType;
(function (ChoicefieldType) {
ChoicefieldType[ChoicefieldType["radio"] = 0] = "radio";
ChoicefieldType[ChoicefieldType["checkbox"] = 1] = "checkbox";
})(ChoicefieldType = exports.ChoicefieldType || (exports.ChoicefieldType = {}));
/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var CommandBarDirective = (function () {
function CommandBarDirective() {
this.restrict = 'E';
this.template = '';
this.transclude = true;
this.replace = true;
this.scope = {
placeholder: '@',
uifSearchTerm: '='
};
}
CommandBarDirective.factory = function () {
var directive = function () { return new CommandBarDirective(); };
return directive;
};
CommandBarDirective.prototype.link = function (scope, elem, attrs) {
{
scope.focusSearchInput = function () {
scope.isSearchActive = true;
angular.element(elem[0].querySelector('.ms-CommandBarSearch-input'))[0].focus();
};
scope.clearSearchTerm = function () {
scope.uifSearchTerm = null;
scope.isSearchActive = false;
};
}
};
return CommandBarDirective;
}());
exports.CommandBarDirective = CommandBarDirective;
var CommandBarSearchDirective = (function () {
function CommandBarSearchDirective() {
this.restrict = 'E';
this.replace = true;
this.transclude = true;
this.template = "";
}
CommandBarSearchDirective.factory = function () {
var directive = function () { return new CommandBarSearchDirective(); };
return directive;
};
return CommandBarSearchDirective;
}());
exports.CommandBarSearchDirective = CommandBarSearchDirective;
var CommandBarSideDirective = (function () {
function CommandBarSideDirective() {
this.restrict = 'E';
this.template = '';
this.replace = true;
this.transclude = true;
}
CommandBarSideDirective.factory = function () {
var directive = function () { return new CommandBarSideDirective(); };
return directive;
};
return CommandBarSideDirective;
}());
exports.CommandBarSideDirective = CommandBarSideDirective;
var CommandBarMainDirective = (function () {
function CommandBarMainDirective($timeout) {
this.$timeout = $timeout;
this.restrict = 'E';
this.template = "";
this.replace = true;
this.transclude = true;
this.controller = CommandBarMainController;
this.scope = {
uifShowOverflow: '='
};
}
CommandBarMainDirective.factory = function () {
var directive = function ($timeout) { return new CommandBarMainDirective($timeout); };
directive.$inject = ['$timeout'];
return directive;
};
CommandBarMainDirective.prototype.compile = function (element, attrs, transclude) {
return {
post: this.postLink
};
};
CommandBarMainDirective.prototype.postLink = function (scope, elem, attrs, ctrl) {
scope.openOverflowMenu = function () {
scope.overflowMenuOpen = !scope.overflowMenuOpen;
var contextualMenu;
contextualMenu = " ";
angular.element(elem[0].querySelector('.ms-CommandBarItem-overflow .ms-CommandBarItem-linkWrapper ul')).remove();
angular.forEach(scope.hiddenItems, function (menuitem) {
if (menuitem.submenu) {
contextualMenu += "\n \n \n \n ";
}
else {
contextualMenu += "\n ";
}
});
contextualMenu += '';
var menu;
menu = elem[0].querySelector('.ms-CommandBarItem-overflow .ms-CommandBarItem-linkWrapper');
angular.element(menu).append(ctrl.$compile(contextualMenu)(scope));
};
scope.loadMenuItems = function (commandItems) {
var commandItemWidth = 0;
var commandItemIndex = 0;
scope.commandItems = [];
angular.forEach(commandItems, function (element) {
if (angular.element(element).hasClass('ms-CommandBarItem-overflow') !== true) {
commandItemWidth += element.offsetWidth;
scope.commandItems.push({ index: commandItemIndex, offset: commandItemWidth });
commandItemIndex++;
}
});
};
scope.openOverflowItem = function (item) {
if (item.submenu) {
item.submenuitems = [];
angular.forEach(item.submenu.children, function (element) {
var submenuitem;
submenuitem = {};
submenuitem.text = element.innerText;
submenuitem.menuType = 'item';
submenuitem.childitem = true;
submenuitem.i = item.submenuitems.length;
submenuitem.parent = item.i;
item.submenuitems.push(submenuitem);
});
}
else {
ctrl.$timeout(function () {
if (item.childitem === true) {
var m = void 0;
m = elem[0].querySelectorAll('.ms-CommandBarItem')[item.parent].querySelectorAll('.ms-ContextualMenu-item')[item.i];
angular.element(m).triggerHandler('click');
}
else {
angular.element(elem[0].querySelectorAll('.ms-CommandBarItem')[item.i]).triggerHandler('click');
}
}, 1);
}
};
scope.toggleItemVisibility = function () {
var commandBarItems;
commandBarItems = angular.element(elem[0].querySelectorAll('.ms-CommandBar-mainArea .ms-CommandBarItem'));
if (window.innerWidth < 640 && scope.mobileSwitch === false) {
scope.loadMenuItems(commandBarItems);
scope.mobileSwitch = true;
}
else if (window.innerWidth >= 640 && scope.mobileSwitch === true) {
scope.loadMenuItems(commandBarItems);
scope.mobileSwitch = false;
}
angular.forEach(scope.commandItems, function (element) {
if (element.offset >= elem.prop('offsetWidth') - 200) {
angular.element(elem[0].querySelectorAll('.ms-CommandBarItem')[element.index]).addClass('is-hidden');
scope.hiddenItems[element.index].visible = true;
scope.overflowVisible = true;
}
else {
angular.element(elem[0].querySelectorAll('.ms-CommandBarItem')[element.index]).removeClass('is-hidden');
scope.hiddenItems[element.index].visible = false;
scope.overflowVisible = false;
}
});
ctrl.$timeout(function () {
scope.$apply();
}, 1);
};
scope.$on('uif-command-bar-resize', function () {
scope.overflowMenuOpen = false;
scope.toggleItemVisibility();
});
angular.element(window).bind('resize', function () {
scope.$broadcast('uif-command-bar-resize');
});
angular.element(document).ready(function () {
scope.loadMenuItems(angular.element(elem[0].querySelectorAll('.ms-CommandBarItem')));
scope.toggleItemVisibility();
});
};
return CommandBarMainDirective;
}());
exports.CommandBarMainDirective = CommandBarMainDirective;
var CommandBarMainController = (function () {
function CommandBarMainController($scope, $element, $compile, $timeout) {
this.$scope = $scope;
this.$element = $element;
this.$compile = $compile;
this.$timeout = $timeout;
}
CommandBarMainController.prototype.addOverflowItem = function (item) {
if (this.$scope.hiddenItems == null) {
this.$scope.hiddenItems = [];
}
item.i = this.$scope.hiddenItems.length;
this.$scope.hiddenItems.push(item);
};
return CommandBarMainController;
}());
CommandBarMainController.$inject = ['$scope', '$element', '$compile', '$timeout'];
exports.CommandBarMainController = CommandBarMainController;
var CommandBarItemDirective = (function () {
function CommandBarItemDirective() {
this.restrict = 'E';
this.template = '';
this.transclude = true;
this.replace = true;
this.controller = CommandBarMainController;
this.require = '^?uifCommandBarMain';
}
CommandBarItemDirective.factory = function () {
var directive = function () { return new CommandBarItemDirective(); };
return directive;
};
CommandBarItemDirective.prototype.compile = function (element, attrs, transclude) {
return {
post: this.postLink
};
};
CommandBarItemDirective.prototype.postLink = function (scope, elem, attrs, ctrl, transclude) {
transclude(function (clone) {
var hiddenItem;
hiddenItem = {};
for (var i = 0; i < clone.length; i++) {
if (clone[i].tagName === 'UIF-ICON') {
angular.element(elem[0].querySelector('a.ms-CommandBarItem-link')).append(clone[i]);
}
if (clone[i].tagName === 'SPAN') {
if (!clone[i].classList.contains('ms-CommandBarItem-commandText')) {
clone[i].classList.add('ms-CommandBarItem-commandText');
}
if (clone[i].className.indexOf('ms-font-') === -1) {
clone[i].classList.add('ms-font-m');
}
angular.element(elem[0].querySelector('a.ms-CommandBarItem-link')).append(clone[i]);
hiddenItem.text = clone[i].innerText;
}
if (clone[i].tagName === 'UL' && clone[i].classList.contains('ms-ContextualMenu')) {
angular.element(elem).append(clone[i]);
hiddenItem.submenu = clone[i];
}
}
if (ctrl !== null) {
if (hiddenItem.submenu == null) {
hiddenItem.menuType = 'link';
}
else {
hiddenItem.menuType = 'subMenu';
}
ctrl.addOverflowItem(hiddenItem);
}
});
if (angular.element(elem[0].querySelector('.ms-CommandBarItem-link > uif-icon')).length === 0) {
angular.element(elem[0].querySelector('.ms-CommandBarItem')).addClass('ms-CommandBarItem-hasTextOnly');
}
};
return CommandBarItemDirective;
}());
exports.CommandBarItemDirective = CommandBarItemDirective;
exports.module = angular.module('officeuifabric.components.commandbar', [
'officeuifabric.components'
])
.directive('uifCommandBar', CommandBarDirective.factory())
.directive('uifCommandBarSearch', CommandBarSearchDirective.factory())
.directive('uifCommandBarItem', CommandBarItemDirective.factory())
.directive('uifCommandBarMain', CommandBarMainDirective.factory())
.directive('uifCommandBarSide', CommandBarSideDirective.factory());
/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var ContentDirective = (function () {
function ContentDirective() {
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.scope = true;
this.template = "";
}
ContentDirective.factory = function () {
var directive = function () { return new ContentDirective(); };
return directive;
};
return ContentDirective;
}());
ContentDirective.directiveName = 'uifContent';
exports.ContentDirective = ContentDirective;
exports.module = angular.module('officeuifabric.components.content', [
'officeuifabric.components'
])
.directive(ContentDirective.directiveName, ContentDirective.factory());
/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var DatepickerController = (function () {
function DatepickerController($element, $scope) {
this.$scope = $scope;
this.isPickingYears = false;
this.isPickingMonths = false;
this.displayDateFormat = 'd mmmm, yyyy';
this.jElement = $($element[0]);
this.displayDateFormat = $scope.uifDateFormat;
$scope.ctrl = this;
}
DatepickerController.prototype.range = function (min, max, step) {
step = step || 1;
var input = [];
for (var i = min; i <= max; i += step) {
input.push(i);
}
return input;
};
DatepickerController.prototype.getPicker = function () {
return this.jElement.find('.ms-TextField-field').pickadate('picker');
};
DatepickerController.prototype.setValue = function (value) {
this.getPicker().set('select', value);
this.changeHighlightedDate(value.getFullYear(), value.getMonth(), value.getDate());
};
DatepickerController.prototype.initDatepicker = function (ngModel) {
var self = this;
this.jElement.find('.ms-TextField-field').pickadate({
clear: '',
close: '',
format: self.displayDateFormat,
klass: {
active: 'ms-DatePicker-input--active',
box: 'ms-DatePicker-dayPicker',
day: 'ms-DatePicker-day',
disabled: 'ms-DatePicker-day--disabled',
focused: 'ms-DatePicker-picker--focused',
frame: 'ms-DatePicker-frame',
header: 'ms-DatePicker-header',
holder: 'ms-DatePicker-holder',
infocus: 'ms-DatePicker-day--infocus',
input: 'ms-DatePicker-input',
month: 'ms-DatePicker-month',
now: 'ms-DatePicker-day--today',
opened: 'ms-DatePicker-picker--opened',
outfocus: 'ms-DatePicker-day--outfocus',
picker: 'ms-DatePicker-picker',
selected: 'ms-DatePicker-day--selected',
table: 'ms-DatePicker-table',
weekdays: 'ms-DatePicker-weekday',
wrap: 'ms-DatePicker-wrap',
year: 'ms-DatePicker-year'
},
onStart: function () {
self.initCustomView();
},
today: '',
weekdaysShort: ['S', 'M', 'T', 'W', 'T', 'F', 'S']
});
var picker = this.getPicker();
picker.on({
open: function () {
self.scrollUp();
if (angular.isDefined(ngModel) && ngModel !== null) {
ngModel.$setTouched();
}
self.$scope.$apply();
},
set: function (value) {
var formattedValue = picker.get('select', 'yyyy-mm-dd');
if (angular.isDefined(ngModel) && ngModel !== null) {
ngModel.$setViewValue(formattedValue);
}
}
});
};
DatepickerController.prototype.initCustomView = function () {
var $monthControls = this.jElement.find('.ms-DatePicker-monthComponents');
var $goToday = this.jElement.find('.ms-DatePicker-goToday');
var $monthPicker = this.jElement.find('.ms-DatePicker-monthPicker');
var $yearPicker = this.jElement.find('.ms-DatePicker-yearPicker');
var $pickerWrapper = this.jElement.find('.ms-DatePicker-wrap');
var $picker = this.getPicker();
var self = this;
$monthControls.appendTo($pickerWrapper);
$goToday.appendTo($pickerWrapper);
$monthPicker.appendTo($pickerWrapper);
$yearPicker.appendTo($pickerWrapper);
$monthControls.on('click', '.js-prevMonth', function (event) {
event.preventDefault();
var newMonth = $picker.get('highlight').month - 1;
self.changeHighlightedDate(null, newMonth, null);
self.$scope.$apply();
});
$monthControls.on('click', '.js-nextMonth', function (event) {
event.preventDefault();
var newMonth = $picker.get('highlight').month + 1;
self.changeHighlightedDate(null, newMonth, null);
self.$scope.$apply();
});
$monthPicker.on('click', '.js-prevYear', function (event) {
event.preventDefault();
var newYear = $picker.get('highlight').year - 1;
self.changeHighlightedDate(newYear, null, null);
self.$scope.$apply();
});
$monthPicker.on('click', '.js-nextYear', function (event) {
event.preventDefault();
var newYear = $picker.get('highlight').year + 1;
self.changeHighlightedDate(newYear, null, null);
self.$scope.$apply();
});
$yearPicker.on('click', '.js-prevDecade', function (event) {
event.preventDefault();
var newYear = $picker.get('highlight').year - 10;
self.changeHighlightedDate(newYear, null, null);
self.$scope.$apply();
});
$yearPicker.on('click', '.js-nextDecade', function (event) {
event.preventDefault();
var newYear = $picker.get('highlight').year + 10;
self.changeHighlightedDate(newYear, null, null);
self.$scope.$apply();
});
$goToday.on('click', function (event) {
event.preventDefault();
var now = new Date();
$picker.set('select', now);
self.jElement.removeClass('is-pickingMonths').removeClass('is-pickingYears');
self.$scope.$apply();
});
$monthPicker.on('click', '.js-changeDate', function (event) {
event.preventDefault();
var currentDate = $picker.get('highlight');
var newYear = currentDate.year;
var newMonth = +$(this).attr('data-month');
var newDay = currentDate.date;
self.changeHighlightedDate(newYear, newMonth, newDay);
if (self.jElement.hasClass('is-pickingMonths')) {
self.jElement.removeClass('is-pickingMonths');
}
self.$scope.$apply();
});
$yearPicker.on('click', '.js-changeDate', function (event) {
event.preventDefault();
var currentDate = $picker.get('highlight');
var newYear = +$(this).attr('data-year');
var newMonth = currentDate.month;
var newDay = currentDate.date;
self.changeHighlightedDate(newYear, newMonth, newDay);
if (self.jElement.hasClass('is-pickingYears')) {
self.jElement.removeClass('is-pickingYears');
}
self.$scope.$apply();
});
$monthControls.on('click', '.js-showMonthPicker', function (event) {
self.isPickingMonths = !self.isPickingMonths;
self.$scope.$apply();
});
$monthPicker.on('click', '.js-showYearPicker', function (event) {
self.isPickingYears = !self.isPickingYears;
self.$scope.$apply();
});
self.$scope.highlightedValue = $picker.get('highlight');
};
DatepickerController.prototype.scrollUp = function () {
$('html, body').animate({ scrollTop: this.jElement.offset().top }, 367);
};
DatepickerController.prototype.changeHighlightedDate = function (newYear, newMonth, newDay) {
var picker = this.getPicker();
if (newYear == null) {
newYear = picker.get('highlight').year;
}
if (newMonth == null) {
newMonth = picker.get('highlight').month;
}
if (newDay == null) {
newDay = picker.get('highlight').date;
}
picker.set('highlight', [newYear, newMonth, newDay]);
this.$scope.highlightedValue = picker.get('highlight');
};
return DatepickerController;
}());
DatepickerController.$inject = ['$element', '$scope'];
exports.DatepickerController = DatepickerController;
var DatepickerDirective = (function () {
function DatepickerDirective() {
this.template = '' +
'
' +
'' +
'' +
'
' +
'
' +
'' +
'' +
'' +
'
' +
'
Go to today' +
'
' +
'' +
'
' +
'' +
'{{month}}' +
'
' +
'
' +
'
' +
'
' +
'' +
'' +
'
' +
'
{{highlightedValue.year - 10}} - {{highlightedValue.year}}
' +
'
' +
'{{year}}' +
'
' +
'
' +
'
';
this.controller = DatepickerController;
this.restrict = 'E';
this.replace = true;
this.scope = {
placeholder: '@',
uifDateFormat: '@',
uifMonths: '@'
};
this.require = ['uifDatepicker', '?ngModel'];
}
DatepickerDirective.factory = function () {
var directive = function () { return new DatepickerDirective(); };
return directive;
};
DatepickerDirective.prototype.compile = function (templateElement, templateAttributes, transclude) {
return {
post: this.postLink,
pre: this.preLink
};
};
DatepickerDirective.prototype.preLink = function ($scope, instanceElement, instanceAttributes, ctrls) {
if (!$scope.uifMonths) {
$scope.uifMonths = 'Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec';
}
if (!$scope.placeholder) {
$scope.placeholder = 'Select a date';
}
if (!$scope.uifDateFormat) {
$scope.uifDateFormat = 'd mmmm, yyyy';
}
$scope.monthsArray = $scope.uifMonths.split(',');
if ($scope.monthsArray.length !== 12) {
throw 'Months setting should have 12 months, separated by a comma';
}
instanceAttributes.$observe('disabled', function (disabled) {
$scope.isDisabled = !!disabled;
});
};
DatepickerDirective.prototype.postLink = function ($scope, $element, attrs, ctrls) {
var datepickerController = ctrls[0];
var ngModel = ctrls[1];
datepickerController.initDatepicker(ngModel);
if (angular.isDefined(ngModel) && ngModel !== null) {
ngModel.$render = function () {
if (ngModel.$modelValue !== null
&& ngModel.$modelValue !== ''
&& typeof ngModel.$modelValue !== 'undefined') {
if (typeof ngModel.$modelValue === 'string') {
var date = new Date(ngModel.$modelValue);
datepickerController.setValue(date);
}
else {
datepickerController.setValue(ngModel.$modelValue);
}
ngModel.$setPristine();
}
};
}
};
return DatepickerDirective;
}());
exports.DatepickerDirective = DatepickerDirective;
exports.module = angular.module('officeuifabric.components.datepicker', [
'officeuifabric.components'
])
.directive('uifDatepicker', DatepickerDirective.factory());
/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var dialogEnums_1 = __webpack_require__(21);
var DialogController = (function () {
function DialogController($log) {
this.$log = $log;
}
return DialogController;
}());
DialogController.$inject = ['$log'];
exports.DialogController = DialogController;
var DialogDirective = (function () {
function DialogDirective() {
this.restrict = 'E';
this.controller = DialogController;
this.replace = true;
this.transclude = true;
this.template = '';
this.scope = {
uifClose: '@',
uifOverlay: '@',
uifType: '@'
};
}
DialogDirective.factory = function () {
var directive = function () { return new DialogDirective(); };
return directive;
};
DialogDirective.prototype.link = function (scope, element, attrs, controller) {
scope.$watch('uifType', function (newValue, oldValue) {
if (typeof (newValue) !== 'undefined') {
if (dialogEnums_1.DialogTypeEnum[newValue] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.dialog - Unsupported type:' +
'The type (\'' + scope.uifType + '\') is not supported by the Office UI Fabric.' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/dialog/dialogEnums.ts');
}
}
});
};
return DialogDirective;
}());
exports.DialogDirective = DialogDirective;
var DialogHeaderDirective = (function () {
function DialogHeaderDirective() {
this.restrict = 'E';
this.replace = true;
this.transclude = true;
this.require = '^^uifDialog';
this.template = '';
}
DialogHeaderDirective.factory = function () {
var directive = function () { return new DialogHeaderDirective(); };
return directive;
};
return DialogHeaderDirective;
}());
exports.DialogHeaderDirective = DialogHeaderDirective;
var DialogContentDirective = (function () {
function DialogContentDirective() {
this.restrict = 'E';
this.replace = true;
this.transclude = true;
this.template = '';
}
DialogContentDirective.factory = function () {
var directive = function () { return new DialogContentDirective(); };
return directive;
};
return DialogContentDirective;
}());
exports.DialogContentDirective = DialogContentDirective;
var DialogInnerDirective = (function () {
function DialogInnerDirective() {
this.restrict = 'E';
this.replace = true;
this.transclude = true;
this.template = '';
}
DialogInnerDirective.factory = function () {
var directive = function () { return new DialogInnerDirective(); };
return directive;
};
return DialogInnerDirective;
}());
exports.DialogInnerDirective = DialogInnerDirective;
var DialogSubtextDirective = (function () {
function DialogSubtextDirective() {
this.restrict = 'E';
this.replace = true;
this.transclude = true;
this.template = '';
}
DialogSubtextDirective.factory = function () {
var directive = function () { return new DialogSubtextDirective(); };
return directive;
};
return DialogSubtextDirective;
}());
exports.DialogSubtextDirective = DialogSubtextDirective;
var DialogActionsController = (function () {
function DialogActionsController($log) {
this.$log = $log;
}
return DialogActionsController;
}());
DialogActionsController.$inject = ['$log'];
exports.DialogActionsController = DialogActionsController;
var DialogActionsDirective = (function () {
function DialogActionsDirective() {
this.restrict = 'E';
this.replace = true;
this.transclude = true;
this.controller = DialogActionsController;
this.template = '';
this.scope = {
uifPosition: '@'
};
}
DialogActionsDirective.factory = function () {
var directive = function () { return new DialogActionsDirective(); };
return directive;
};
DialogActionsDirective.prototype.link = function (scope, element, attrs, controller) {
scope.$watch('uifPosition', function (newValue, oldValue) {
if (typeof (newValue) !== 'undefined') {
if (dialogEnums_1.DialogActionsPositionEnum[newValue] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.dialog - Unsupported type:' +
'The type (\'' + scope.uifPosition + '\') is not supported by the Office UI Fabric.' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/dialog/dialogEnums.ts');
}
}
});
};
return DialogActionsDirective;
}());
exports.DialogActionsDirective = DialogActionsDirective;
exports.module = angular.module('officeuifabric.components.dialog', ['officeuifabric.components'])
.directive('uifDialog', DialogDirective.factory())
.directive('uifDialogHeader', DialogHeaderDirective.factory())
.directive('uifDialogContent', DialogContentDirective.factory())
.directive('uifDialogInner', DialogInnerDirective.factory())
.directive('uifDialogSubtext', DialogSubtextDirective.factory())
.directive('uifDialogActions', DialogActionsDirective.factory());
/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var DialogTypeEnum;
(function (DialogTypeEnum) {
DialogTypeEnum[DialogTypeEnum["none"] = 0] = "none";
DialogTypeEnum[DialogTypeEnum["header"] = 1] = "header";
DialogTypeEnum[DialogTypeEnum["multiline"] = 2] = "multiline";
})(DialogTypeEnum = exports.DialogTypeEnum || (exports.DialogTypeEnum = {}));
var DialogActionsPositionEnum;
(function (DialogActionsPositionEnum) {
DialogActionsPositionEnum[DialogActionsPositionEnum["none"] = 0] = "none";
DialogActionsPositionEnum[DialogActionsPositionEnum["left"] = 1] = "left";
DialogActionsPositionEnum[DialogActionsPositionEnum["right"] = 2] = "right";
})(DialogActionsPositionEnum = exports.DialogActionsPositionEnum || (exports.DialogActionsPositionEnum = {}));
/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var DropdownOptionDirective = (function () {
function DropdownOptionDirective() {
this.template = '';
this.restrict = 'E';
this.require = '^uifDropdown';
this.replace = true;
this.transclude = true;
}
DropdownOptionDirective.factory = function () {
var directive = function () { return new DropdownOptionDirective(); };
return directive;
};
DropdownOptionDirective.prototype.compile = function (templateElement, templateAttributes, transclude) {
return {
post: this.postLink
};
};
DropdownOptionDirective.prototype.postLink = function (scope, instanceElement, attrs, dropdownController, transclude) {
if (!dropdownController) {
throw 'Dropdown controller not found!';
}
instanceElement
.on('click', function (ev) {
scope.$apply(function () {
dropdownController.setViewValue(instanceElement.text(), attrs.value, ev);
});
});
var value = '' + dropdownController.getViewValue();
if (value && value === attrs.value) {
dropdownController.setViewValue(attrs.title, attrs.value, null);
}
};
return DropdownOptionDirective;
}());
exports.DropdownOptionDirective = DropdownOptionDirective;
var DropdownController = (function () {
function DropdownController($element, $scope, $document) {
this.$element = $element;
this.$scope = $scope;
this.$document = $document;
}
DropdownController.prototype.init = function () {
var self = this;
this.$element.on('click', function (e) {
if (!self.$scope.disabled) {
self.$scope.isOpen = !self.$scope.isOpen;
self.$scope.$apply();
var dropdownWidth = angular.element(this.querySelector('.ms-Dropdown'))[0].clientWidth;
angular.element(this.querySelector('.ms-Dropdown-items'))[0].style.width = dropdownWidth + 'px';
e.stopPropagation();
if (self.$scope.isOpen) {
var documentClickHandler_1 = function () {
self.$scope.isOpen = false;
self.$scope.$apply();
self.$document.off('click', documentClickHandler_1);
};
self.$document.on('click', documentClickHandler_1);
self.$scope.$on('$destroy', function () {
self.$document.off('click', documentClickHandler_1);
});
}
if (self.$scope.ngModel !== undefined && self.$scope.ngModel != null) {
self.$scope.ngModel.$setTouched();
}
}
});
if (typeof this.$scope.ngModel !== 'undefined' && this.$scope.ngModel != null) {
this.$scope.ngModel.$render = function () {
var found = false;
var options = self.$element.find('li');
for (var i = 0; i < options.length; i++) {
var option = options[i];
var value = option.getAttribute('value');
if (value === self.$scope.ngModel.$viewValue) {
self.$scope.selectedTitle = angular.element(option).text();
found = true;
break;
}
}
if (!found) {
self.$scope.selectedTitle = '';
}
};
}
};
DropdownController.prototype.setViewValue = function (title, value, eventType) {
this.$scope.selectedTitle = title;
this.$scope.ngModel.$setViewValue(value, eventType);
};
DropdownController.prototype.getViewValue = function () {
if (typeof this.$scope.ngModel !== 'undefined' && this.$scope.ngModel != null) {
return this.$scope.ngModel.$viewValue;
}
};
return DropdownController;
}());
DropdownController.$inject = ['$element', '$scope', '$document'];
exports.DropdownController = DropdownController;
var DropdownDirective = (function () {
function DropdownDirective() {
this.template = '' +
'
' +
'
{{selectedTitle}} ';
this.restrict = 'E';
this.transclude = true;
this.require = ['uifDropdown', '?ngModel'];
this.scope = {};
this.controller = DropdownController;
}
DropdownDirective.factory = function () {
var directive = function () { return new DropdownDirective(); };
return directive;
};
DropdownDirective.prototype.compile = function (templateElement, templateAttributes, transclude) {
return {
pre: this.preLink
};
};
DropdownDirective.prototype.preLink = function (scope, instanceElement, instanceAttributes, ctrls) {
var dropdownController = ctrls[0];
var modelController = ctrls[1];
scope.ngModel = modelController;
dropdownController.init();
scope.$watch(function () { return instanceElement.attr('disabled'); }, (function (newValue) { scope.disabled = typeof newValue !== 'undefined'; }));
scope.disabled = 'disabled' in instanceAttributes;
};
return DropdownDirective;
}());
exports.DropdownDirective = DropdownDirective;
exports.module = angular.module('officeuifabric.components.dropdown', [
'officeuifabric.components'
])
.directive('uifDropdownOption', DropdownOptionDirective.factory())
.directive('uifDropdown', DropdownDirective.factory());
/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var FacepileDirective = (function () {
function FacepileDirective() {
this.transclude = true;
this.replace = true;
this.restrict = 'E';
this.template = "\n
\n
\n
\n \n {{member.initials}}\n \n
\n
\n
\n {{members.length}} {{uifFacepileName}}\n \n \n \n {{member.initials}}\n {{member.primaryText}}\n {{member.secondaryText}}\n \n
\n \n \n
";
this.scope = {
members: '=ngModel',
uifFacepileName: '@uifFacepileName',
uifOverflowLimit: '@'
};
}
FacepileDirective.factory = function () {
var directive = function () { return new FacepileDirective(); };
return directive;
};
return FacepileDirective;
}());
exports.FacepileDirective = FacepileDirective;
var FacepileAddIconDirective = (function () {
function FacepileAddIconDirective() {
this.transclude = true;
this.restrict = 'E';
this.template = "\n \n {{peoplePickerPlaceholder}}\n \n \n \n {{selectedFacePilePeople.length}} selected person(s)\n \n \n \n Search organization people\n \n \n \n \n ";
this.scope = {
onFacePileSearch: '=uifPeople',
peoplePickerPlaceholder: '@placeholder'
};
}
FacepileAddIconDirective.factory = function () {
var directive = function () { return new FacepileAddIconDirective(); };
return directive;
};
FacepileAddIconDirective.prototype.link = function (scope, elem, attrs) {
{
scope.parentScope = scope.$parent.$parent;
}
};
return FacepileAddIconDirective;
}());
exports.FacepileAddIconDirective = FacepileAddIconDirective;
exports.module = angular.module('officeuifabric.components.facepile', [
'officeuifabric.components'
])
.directive('uifFacepile', FacepileDirective.factory())
.directive('uifFacepileAddIcon', FacepileAddIconDirective.factory());
/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var iconEnum_1 = __webpack_require__(3);
var IconController = (function () {
function IconController($log) {
this.$log = $log;
}
return IconController;
}());
IconController.$inject = ['$log'];
var IconDirective = (function () {
function IconDirective() {
this.restrict = 'E';
this.template = '';
this.scope = {
uifType: '@'
};
this.transclude = true;
this.controller = IconController;
this.controllerAs = 'icon';
}
IconDirective.factory = function () {
var directive = function () { return new IconDirective(); };
return directive;
};
IconDirective.prototype.link = function (scope, instanceElement, attrs, controller) {
scope.$watch('uifType', function (newValue, oldValue) {
if (iconEnum_1.IconEnum[newValue] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.icon - Unsupported icon: ' +
'The icon (\'' + scope.uifType + '\') is not supported by the Office UI Fabric. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/icon/iconEnum.ts');
}
});
};
return IconDirective;
}());
exports.IconDirective = IconDirective;
exports.module = angular.module('officeuifabric.components.icon', [
'officeuifabric.components'
])
.directive('uifIcon', IconDirective.factory());
/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var LabelDirective = (function () {
function LabelDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.scope = {
ngRequired: ''
};
this.template = '';
}
LabelDirective.factory = function () {
var directive = function () { return new LabelDirective(); };
return directive;
};
LabelDirective.prototype.link = function (scope, instanceElement, attributes) {
var label = instanceElement.find('label').eq(0);
if (angular.isDefined(attributes.disabled)) {
label.addClass('is-disabled');
}
if (angular.isDefined(attributes.required)) {
label.addClass('is-required');
}
scope.$watch('ngRequired', function (newValue, oldValue) {
if (newValue) {
label.addClass('is-required');
}
else if (newValue !== undefined && !newValue) {
label.removeClass('is-required');
}
});
};
return LabelDirective;
}());
exports.LabelDirective = LabelDirective;
exports.module = angular.module('officeuifabric.components.label', ['officeuifabric.components'])
.directive('uifLabel', LabelDirective.factory());
/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var LinkDirective = (function () {
function LinkDirective() {
this.restrict = 'E';
this.template = '';
this.scope = {
ngHref: '@'
};
this.transclude = true;
this.replace = true;
}
LinkDirective.factory = function () {
var directive = function () { return new LinkDirective(); };
return directive;
};
return LinkDirective;
}());
exports.LinkDirective = LinkDirective;
exports.module = angular.module('officeuifabric.components.link', [
'officeuifabric.components'
])
.directive('uifLink', LinkDirective.factory());
/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var listItemSelectModeEnum_1 = __webpack_require__(28);
var listItemTypeEnum_1 = __webpack_require__(29);
var listLayoutEnum_1 = __webpack_require__(30);
var ListController = (function () {
function ListController($scope, $log) {
this.$scope = $scope;
this.$log = $log;
this.$scope.items = [];
if (!this.$scope.selectedItems) {
this.$scope.selectedItems = [];
}
}
Object.defineProperty(ListController.prototype, "itemSelectMode", {
get: function () {
return this.$scope.itemSelectMode;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ListController.prototype, "selectedItems", {
get: function () {
return this.$scope.selectedItems;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ListController.prototype, "items", {
get: function () {
return this.$scope.items;
},
enumerable: true,
configurable: true
});
return ListController;
}());
ListController.$inject = ['$scope', '$log'];
var ListDirective = (function () {
function ListDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.template = '';
this.controller = ListController;
this.controllerAs = 'list';
this.scope = {
selectedItems: '=?uifSelectedItems',
uifItemSelectMode: '@?',
uifLayout: '@?'
};
}
ListDirective.factory = function () {
var directive = function () { return new ListDirective(); };
return directive;
};
ListDirective.prototype.link = function (scope, instanceElement, attrs, controller) {
scope.$watch('uifLayout', function (newValue, oldValue) {
if (newValue !== undefined && newValue !== null) {
if (listLayoutEnum_1.ListLayoutEnum[newValue] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
'The layout (\'' + newValue + '\') is not a valid option for \'uif-layout\'. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/list/listLayoutEnum.ts');
}
else {
scope.layout = newValue;
}
}
if (scope.layout === undefined) {
scope.layout = listLayoutEnum_1.ListLayoutEnum[listLayoutEnum_1.ListLayoutEnum.list];
}
if (scope.layout === listLayoutEnum_1.ListLayoutEnum[listLayoutEnum_1.ListLayoutEnum.grid]) {
instanceElement.children().eq(0).addClass('ms-List--grid');
}
else {
instanceElement.children().eq(0).removeClass('ms-List--grid');
}
});
scope.$watch('uifItemSelectMode', function (newValue, oldValue) {
if (newValue !== undefined && newValue !== null) {
if (listItemSelectModeEnum_1.ListItemSelectModeEnum[newValue] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
' The selection mode (\'' + newValue + '\') is not a valid option for \'uif-item-select-mode\'. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/list/listItemSelectModeEnum.ts');
}
else {
scope.itemSelectMode = attrs.uifItemSelectMode;
}
}
if (scope.itemSelectMode === undefined) {
scope.itemSelectMode = listItemSelectModeEnum_1.ListItemSelectModeEnum[listItemSelectModeEnum_1.ListItemSelectModeEnum.none];
}
if (newValue !== oldValue) {
for (var i = 0; i < controller.items.length; i++) {
controller.items[i].selected = false;
}
scope.$broadcast('list-item-select-mode-changed', newValue);
}
});
};
return ListDirective;
}());
exports.ListDirective = ListDirective;
var ListItemController = (function () {
function ListItemController($scope, $log) {
this.$scope = $scope;
this.$log = $log;
}
return ListItemController;
}());
ListItemController.$inject = ['$scope', '$log'];
var ListItemDirective = (function () {
function ListItemDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.template = '';
this.require = '^uifList';
this.scope = {
item: '=uifItem',
uifType: '@?'
};
this.controller = ListItemController;
}
ListItemDirective.factory = function () {
var directive = function () { return new ListItemDirective(); };
return directive;
};
ListItemDirective.prototype.link = function (scope, instanceElement, attrs, list) {
if (attrs.uifSelected !== undefined && attrs.uifSelected !== null) {
var selectedString = attrs.uifSelected.toLowerCase();
if (selectedString !== 'true' && selectedString !== 'false') {
list.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
'\'' + attrs.uifSelected + '\' is not a valid boolean value. ' +
'Valid options are true|false.');
}
else {
if (selectedString === 'true') {
scope.selected = true;
}
}
}
if (scope.item && list.selectedItems.length > 0) {
for (var i = 0; i < list.selectedItems.length; i++) {
if (list.selectedItems[i] === scope.item) {
scope.selected = true;
}
}
}
scope.$watch('uifType', function (newValue, oldValue) {
if (newValue !== undefined && newValue !== null) {
if (listItemTypeEnum_1.ListItemTypeEnum[newValue] === undefined) {
list.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
'The list item type (\'' + newValue + '\') is not a valid option for \'uif-type\'. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/list/listItemTypeEnum.ts');
}
}
instanceElement.children().eq(0).removeClass('ms-ListItem--image');
instanceElement.children().eq(0).removeClass('ms-ListItem--document');
switch (listItemTypeEnum_1.ListItemTypeEnum[attrs.uifType]) {
case listItemTypeEnum_1.ListItemTypeEnum.itemWithIcon:
instanceElement.children().eq(0).addClass('ms-ListItem--document');
break;
case listItemTypeEnum_1.ListItemTypeEnum.itemWithImage:
instanceElement.children().eq(0).addClass('ms-ListItem--image');
break;
default:
break;
}
scope.$evalAsync(function () {
switch (listItemTypeEnum_1.ListItemTypeEnum[attrs.uifType]) {
case listItemTypeEnum_1.ListItemTypeEnum.itemWithIcon:
if (instanceElement.children().find('uif-list-item-icon').length === 0) {
list.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
'List item type `itemWithIcon` requires the `uif-list-item-icon` directive. Without this the icon will not appear.');
}
break;
case listItemTypeEnum_1.ListItemTypeEnum.itemWithImage:
if (instanceElement.children().find('uif-list-item-image').length === 0) {
list.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
'List item type `itemWithImage` requires the `uif-list-item-image` directive. Without this the image will not appear.');
}
break;
default:
break;
}
});
});
if (attrs.uifUnread !== undefined &&
attrs.uifUnread !== null) {
var unreadString = attrs.uifUnread.toLowerCase();
if (unreadString !== 'true' && unreadString !== 'false') {
list.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
'\'' + attrs.uifUnread + '\' is not a valid boolean value. ' +
'Valid options are true|false.');
}
else {
if (unreadString === 'true') {
scope.unread = true;
}
}
}
if (attrs.uifUnseen !== undefined &&
attrs.uifUnseen !== null) {
var unseenString = attrs.uifUnseen.toLowerCase();
if (unseenString !== 'true' && unseenString !== 'false') {
list.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.list. ' +
'\'' + attrs.uifUnseen + '\' is not a valid boolean value. ' +
'Valid options are true|false.');
}
else {
if (unseenString === 'true') {
scope.unseen = true;
}
}
}
if (scope.item !== undefined) {
list.items.push(scope);
}
scope.itemClick = function (ev) {
scope.selected = !scope.selected;
scope.$apply();
};
scope.$watch('selected', function (newValue, oldValue, listItemScope) {
if (newValue === true) {
if (list.itemSelectMode === listItemSelectModeEnum_1.ListItemSelectModeEnum[listItemSelectModeEnum_1.ListItemSelectModeEnum.single]) {
list.selectedItems.length = 0;
if (list.items) {
for (var i = 0; i < list.items.length; i++) {
if (list.items[i] !== listItemScope) {
list.items[i].selected = false;
}
}
}
}
var itemAlreadySelected = false;
for (var i = 0; i < list.selectedItems.length; i++) {
if (list.selectedItems[i] === listItemScope.item) {
itemAlreadySelected = true;
break;
}
}
if (!itemAlreadySelected) {
list.selectedItems.push(listItemScope.item);
}
instanceElement.children().eq(0).addClass('is-selected');
}
else {
for (var i = 0; i < list.selectedItems.length; i++) {
if (list.selectedItems[i] === listItemScope.item) {
list.selectedItems.splice(i, 1);
break;
}
}
instanceElement.children().eq(0).removeClass('is-selected');
}
});
scope.$watch('unread', function (newValue, oldValue, listItemScope) {
if (newValue === true) {
instanceElement.children().eq(0).addClass('is-unread');
}
else {
instanceElement.children().eq(0).removeClass('is-unread');
}
});
scope.$watch('unseen', function (newValue, oldValue, listItemScope) {
if (newValue === true) {
instanceElement.children().eq(0).addClass('is-unseen');
}
else {
instanceElement.children().eq(0).removeClass('is-unseen');
}
});
if (list.itemSelectMode !== listItemSelectModeEnum_1.ListItemSelectModeEnum[listItemSelectModeEnum_1.ListItemSelectModeEnum.none]) {
updateItemSelectionModeDecoration(list.itemSelectMode);
}
scope.$on('list-item-select-mode-changed', function (event, selectionMode) {
updateItemSelectionModeDecoration(selectionMode);
});
function updateItemSelectionModeDecoration(selectionMode) {
if (selectionMode === 'none') {
instanceElement.children().eq(0).removeClass('is-selectable');
}
else if (!instanceElement.children().eq(0).hasClass('is-selectable')) {
instanceElement.on('click', scope.itemClick);
instanceElement.children().eq(0).addClass('is-selectable');
}
}
};
return ListItemDirective;
}());
exports.ListItemDirective = ListItemDirective;
var ListItemPrimaryTextDirective = (function () {
function ListItemPrimaryTextDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemPrimaryTextDirective.factory = function () {
var directive = function () { return new ListItemPrimaryTextDirective(); };
return directive;
};
return ListItemPrimaryTextDirective;
}());
exports.ListItemPrimaryTextDirective = ListItemPrimaryTextDirective;
var ListItemSecondaryTextDirective = (function () {
function ListItemSecondaryTextDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemSecondaryTextDirective.factory = function () {
var directive = function () { return new ListItemSecondaryTextDirective(); };
return directive;
};
return ListItemSecondaryTextDirective;
}());
exports.ListItemSecondaryTextDirective = ListItemSecondaryTextDirective;
var ListItemTertiaryTextDirective = (function () {
function ListItemTertiaryTextDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemTertiaryTextDirective.factory = function () {
var directive = function () { return new ListItemTertiaryTextDirective(); };
return directive;
};
return ListItemTertiaryTextDirective;
}());
exports.ListItemTertiaryTextDirective = ListItemTertiaryTextDirective;
var ListItemMetaTextDirective = (function () {
function ListItemMetaTextDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemMetaTextDirective.factory = function () {
var directive = function () { return new ListItemMetaTextDirective(); };
return directive;
};
return ListItemMetaTextDirective;
}());
exports.ListItemMetaTextDirective = ListItemMetaTextDirective;
var ListItemImageDirective = (function () {
function ListItemImageDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemImageDirective.factory = function () {
var directive = function () { return new ListItemImageDirective(); };
return directive;
};
return ListItemImageDirective;
}());
exports.ListItemImageDirective = ListItemImageDirective;
var ListItemIconDirective = (function () {
function ListItemIconDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemIconDirective.factory = function () {
var directive = function () { return new ListItemIconDirective(); };
return directive;
};
return ListItemIconDirective;
}());
exports.ListItemIconDirective = ListItemIconDirective;
var ListItemSelectionTargetDirective = (function () {
function ListItemSelectionTargetDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemSelectionTargetDirective.factory = function () {
var directive = function () { return new ListItemSelectionTargetDirective(); };
return directive;
};
return ListItemSelectionTargetDirective;
}());
exports.ListItemSelectionTargetDirective = ListItemSelectionTargetDirective;
var ListItemActionsDirective = (function () {
function ListItemActionsDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemActionsDirective.factory = function () {
var directive = function () { return new ListItemActionsDirective(); };
return directive;
};
return ListItemActionsDirective;
}());
exports.ListItemActionsDirective = ListItemActionsDirective;
var ListItemActionDirective = (function () {
function ListItemActionDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = false;
}
ListItemActionDirective.factory = function () {
var directive = function () { return new ListItemActionDirective(); };
return directive;
};
return ListItemActionDirective;
}());
exports.ListItemActionDirective = ListItemActionDirective;
exports.module = angular.module('officeuifabric.components.list', ['officeuifabric.components'])
.directive('uifList', ListDirective.factory())
.directive('uifListItem', ListItemDirective.factory())
.directive('uifListItemPrimaryText', ListItemPrimaryTextDirective.factory())
.directive('uifListItemSecondaryText', ListItemSecondaryTextDirective.factory())
.directive('uifListItemTertiaryText', ListItemTertiaryTextDirective.factory())
.directive('uifListItemMetaText', ListItemMetaTextDirective.factory())
.directive('uifListItemImage', ListItemImageDirective.factory())
.directive('uifListItemIcon', ListItemIconDirective.factory())
.directive('uifListItemSelectionTarget', ListItemSelectionTargetDirective.factory())
.directive('uifListItemActions', ListItemActionsDirective.factory())
.directive('uifListItemAction', ListItemActionDirective.factory());
/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ListItemSelectModeEnum;
(function (ListItemSelectModeEnum) {
ListItemSelectModeEnum[ListItemSelectModeEnum["none"] = 0] = "none";
ListItemSelectModeEnum[ListItemSelectModeEnum["single"] = 1] = "single";
ListItemSelectModeEnum[ListItemSelectModeEnum["multiple"] = 2] = "multiple";
})(ListItemSelectModeEnum = exports.ListItemSelectModeEnum || (exports.ListItemSelectModeEnum = {}));
/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ListItemTypeEnum;
(function (ListItemTypeEnum) {
ListItemTypeEnum[ListItemTypeEnum["item"] = 0] = "item";
ListItemTypeEnum[ListItemTypeEnum["itemWithImage"] = 1] = "itemWithImage";
ListItemTypeEnum[ListItemTypeEnum["itemWithIcon"] = 2] = "itemWithIcon";
})(ListItemTypeEnum = exports.ListItemTypeEnum || (exports.ListItemTypeEnum = {}));
/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ListLayoutEnum;
(function (ListLayoutEnum) {
ListLayoutEnum[ListLayoutEnum["list"] = 0] = "list";
ListLayoutEnum[ListLayoutEnum["grid"] = 1] = "grid";
})(ListLayoutEnum = exports.ListLayoutEnum || (exports.ListLayoutEnum = {}));
/***/ }),
/* 31 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var MessageBannerController = (function () {
function MessageBannerController($scope, $log, $window) {
this.$scope = $scope;
this.$log = $log;
this.$window = $window;
}
return MessageBannerController;
}());
MessageBannerController.$inject = ['$scope', '$log', '$window'];
exports.MessageBannerController = MessageBannerController;
var MessageBannerDirective = (function () {
function MessageBannerDirective($log, $timeout) {
var _this = this;
this.$log = $log;
this.$timeout = $timeout;
this.controller = MessageBannerController;
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.require = 'uifMessageBanner';
this.isExpanded = false;
this.template = "\n \n
\n
\n
\n \n \n \n
\n {{ uifActionLabel }}\n
\n
\n
\n \n \n
";
this.scope = {
uifAction: '&',
uifActionLabel: '@',
uifIsVisible: '=?',
uifOnClose: '&?'
};
this._textContainerMaxWidth = 700;
this._bufferElementsWidth = 88;
this._bufferElementsWidthSmall = 35;
this.SMALL_BREAK_POINT = 480;
this.link = function ($scope, $elem, $attrs, $controller, $transclude) {
$scope.uifActionLabel = $attrs.uifActionLabel;
$scope.isExpanded = false;
$scope.onResize = function (innerWidth) {
if (innerWidth === undefined) {
innerWidth = window.innerWidth;
}
_this._clientWidth = _this._messageBanner[0].offsetWidth;
if (innerWidth >= _this.SMALL_BREAK_POINT) {
_this._resizeRegular();
}
else {
_this._resizeSmall();
}
};
_this._initLocals($elem);
_this.transcludeChilds($scope, $elem, $transclude);
_this._initTextWidth = (_this._clipper.children().eq(0))[0].offsetWidth;
angular.element($controller.$window).bind('resize', function () {
$scope.onResize();
$scope.$digest();
});
angular.element(_this._chevronButton).bind('click', function () {
_this._toggleExpansion($scope);
});
angular.element(_this._closeButton).bind('click', function () {
_this._hideBanner($scope);
});
$scope.onResize();
};
}
MessageBannerDirective.factory = function () {
var directive = function ($log, $timeout) {
return new MessageBannerDirective($log, $timeout);
};
directive.$inject = ['$log', '$timeout'];
return directive;
};
MessageBannerDirective.prototype.transcludeChilds = function ($scope, $element, $transclude) {
var _this = this;
$transclude(function (clone) {
var hasContent = _this.hasItemContent(clone);
if (!hasContent) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.messagebanner - ' +
'you need to provide a text for the message banner.\n' +
'For you need to specify' +
' as a child directive');
}
_this.insertItemContent(clone, $scope, $element);
});
};
MessageBannerDirective.prototype.insertItemContent = function (clone, $scope, $element) {
var contentElement = angular.element($element[0].querySelector('.ms-MessageBanner-clipper'));
if (this.hasItemContent(clone)) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('uif-content')) {
contentElement.append(element);
break;
}
}
}
};
MessageBannerDirective.prototype.hasItemContent = function (clone) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('uif-content')) {
return true;
}
}
return false;
};
MessageBannerDirective.prototype._initLocals = function ($elem) {
this._messageBanner = angular.element($elem[0].querySelector('.ms-MessageBanner'));
this._clipper = angular.element($elem[0].querySelector('.ms-MessageBanner-clipper'));
this._chevronButton = angular.element($elem[0].querySelectorAll('.ms-MessageBanner-expand'));
this._actionButton = angular.element($elem[0].querySelector('.ms-MessageBanner-action'));
this._bufferSize = this._actionButton[0].offsetWidth + this._bufferElementsWidth;
this._closeButton = angular.element($elem[0].querySelector('.ms-MessageBanner-close'));
};
MessageBannerDirective.prototype._resizeRegular = function () {
if ((this._clientWidth - this._bufferSize) > this._initTextWidth && this._initTextWidth < this._textContainerMaxWidth) {
this._textWidth = 'auto';
this._chevronButton[0].className = 'ms-MessageBanner-expand';
}
else {
this._textWidth = Math.min((this._clientWidth - this._bufferSize), this._textContainerMaxWidth) + 'px';
if (!this._chevronButton.hasClass('is-visible')) {
this._chevronButton[0].className += ' is-visible';
}
}
this._clipper[0].style.width = this._textWidth;
this._chevronButton[0].style.height = '52px';
};
MessageBannerDirective.prototype._resizeSmall = function () {
if (this._clientWidth - (this._bufferElementsWidthSmall + this._closeButton[0].offsetWidth) > this._initTextWidth) {
this._textWidth = 'auto';
}
else {
this._textWidth = (this._clientWidth - (this._bufferElementsWidthSmall + this._closeButton[0].offsetWidth)) + 'px';
}
this._clipper[0].style.width = this._textWidth;
this._chevronButton[0].style.height = '85px';
};
MessageBannerDirective.prototype._toggleExpansion = function ($scope) {
$scope.isExpanded = !$scope.isExpanded;
$scope.$digest();
this._messageBanner.toggleClass('is-expanded');
};
MessageBannerDirective.prototype._hideBanner = function ($scope) {
var _this = this;
if ($scope.uifIsVisible) {
this._messageBanner.addClass('hide');
this.$timeout(function () {
$scope.uifIsVisible = false;
$scope.$apply();
_this._messageBanner.removeClass('hide');
}, 500);
}
};
return MessageBannerDirective;
}());
exports.MessageBannerDirective = MessageBannerDirective;
exports.module = angular.module('officeuifabric.components.messagebanner', ['officeuifabric.components'])
.directive('uifMessageBanner', MessageBannerDirective.factory());
/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var messageBarTypeEnum_1 = __webpack_require__(33);
var MessageBarController = (function () {
function MessageBarController($scope, $log) {
this.$scope = $scope;
this.$log = $log;
}
return MessageBarController;
}());
MessageBarController.$inject = ['$scope', '$log'];
exports.MessageBarController = MessageBarController;
var MessageBarDirective = (function () {
function MessageBarDirective($log, $timeout) {
var _this = this;
this.$log = $log;
this.$timeout = $timeout;
this.controller = MessageBarController;
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.require = 'uifMessageBar';
this.template = '' +
'' +
'
' +
'
' +
'' +
'
' +
'
' +
'
' +
'
';
this.scope = {
uifType: '@'
};
this.link = function ($scope, $element, $attrs, $controller, $transclude) {
$scope.iconType = 'ms-Icon--infoCircle';
$scope.classType = '';
$scope.uifType = $attrs.uifType;
$scope.$watch('uifType', function (newValue, oldValue) {
if (typeof newValue !== 'undefined') {
if (messageBarTypeEnum_1.MessageBarTypeEnum[newValue] === undefined) {
$controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.messagebar - Unsupported type: ' +
'The type (\'' + $scope.uifType + '\') is not supported by the Office UI Fabric. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/messagebar/' +
'messageBarTypeEnum.ts');
}
else {
var className = ' ms-MessageBar--';
$scope.classType = className + newValue;
switch (messageBarTypeEnum_1.MessageBarTypeEnum[newValue]) {
case messageBarTypeEnum_1.MessageBarTypeEnum.error:
$scope.iconType = 'ms-Icon--xCircle';
break;
case messageBarTypeEnum_1.MessageBarTypeEnum.remove:
$scope.iconType = 'ms-Icon--minus ms-Icon--circle';
break;
case messageBarTypeEnum_1.MessageBarTypeEnum.severewarning:
$scope.iconType = 'ms-Icon--alert';
break;
case messageBarTypeEnum_1.MessageBarTypeEnum.success:
$scope.iconType = 'ms-Icon--checkboxCheck ms-Icon--circle';
break;
default:
break;
}
}
}
});
_this.transcludeChilds($scope, $element, $transclude);
};
}
MessageBarDirective.factory = function () {
var directive = function ($log, $timeout) {
return new MessageBarDirective($log, $timeout);
};
directive.$inject = ['$log', '$timeout'];
return directive;
};
MessageBarDirective.prototype.transcludeChilds = function ($scope, $element, $transclude) {
var _this = this;
$transclude(function (clone) {
var hasContent = _this.hasItemContent(clone, 'uif-content');
if (!hasContent) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.MessageBar - ' +
'you need to provide a text for the message bar.\n' +
'For you need to specify' +
' as a child directive');
}
_this.insertItemContent(clone, $scope, $element);
});
};
MessageBarDirective.prototype.insertItemContent = function (clone, $scope, $element) {
var contentElement = angular.element($element[0].querySelector('.ms-MessageBar-text'));
if (this.hasItemContent(clone, 'uif-content')) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('uif-content')) {
contentElement.append(element);
break;
}
}
}
if (this.hasItemContent(clone, 'ms-Link')) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('ms-Link')) {
contentElement.append(angular.element('
'));
contentElement.append(element);
break;
}
}
}
};
MessageBarDirective.prototype.hasItemContent = function (clone, selector) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass(selector)) {
return true;
}
}
return false;
};
return MessageBarDirective;
}());
exports.MessageBarDirective = MessageBarDirective;
exports.module = angular.module('officeuifabric.components.messagebar', ['officeuifabric.components'])
.directive('uifMessageBar', MessageBarDirective.factory());
/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var MessageBarTypeEnum;
(function (MessageBarTypeEnum) {
MessageBarTypeEnum[MessageBarTypeEnum["error"] = 0] = "error";
MessageBarTypeEnum[MessageBarTypeEnum["remove"] = 1] = "remove";
MessageBarTypeEnum[MessageBarTypeEnum["severewarning"] = 2] = "severewarning";
MessageBarTypeEnum[MessageBarTypeEnum["success"] = 3] = "success";
MessageBarTypeEnum[MessageBarTypeEnum["warning"] = 4] = "warning";
})(MessageBarTypeEnum = exports.MessageBarTypeEnum || (exports.MessageBarTypeEnum = {}));
/***/ }),
/* 34 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var contextualMenu_1 = __webpack_require__(2);
var NavBarController = (function () {
function NavBarController($scope, $animate, $element, $log) {
this.$scope = $scope;
this.$animate = $animate;
this.$element = $element;
this.$log = $log;
}
NavBarController.prototype.openMobileMenu = function () {
var menuVisible = this.$element.hasClass('is-open');
this.$animate[menuVisible ? 'removeClass' : 'addClass'](this.$element, 'is-open');
};
NavBarController.prototype.closeMobileMenu = function () {
if (this.$element.hasClass('is-open')) {
this.$animate.removeClass(this.$element, 'is-open');
}
};
NavBarController.prototype.closeAllContextMenus = function () {
var navBarItems = this.$element[0].querySelectorAll('.ms-NavBar-item');
for (var i = 0; i < navBarItems.length; i++) {
var ngElement = angular.element(navBarItems[i]);
var navBarItemCtrl = ngElement.controller(NavBarItemDirective.directiveName);
if (navBarItemCtrl) {
navBarItemCtrl.closeContextualMenu();
navBarItemCtrl.deselectItem();
}
}
};
NavBarController.prototype.hideSearchTextBox = function () {
var navBarItems = this.$element[0].querySelectorAll('.ms-NavBar-item--search');
for (var i = 0; i < navBarItems.length; i++) {
var ngElement = angular.element(navBarItems[i]);
var navSearchCtrl = ngElement.controller(NavBarSearch.directiveName);
if (navSearchCtrl) {
navSearchCtrl.closeSearch();
}
}
};
return NavBarController;
}());
NavBarController.$inject = ['$scope', '$animate', '$element', '$log'];
exports.NavBarController = NavBarController;
var NavBarDirective = (function () {
function NavBarDirective($log, $animate, $document) {
var _this = this;
this.$log = $log;
this.$animate = $animate;
this.$document = $document;
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.controller = NavBarController;
this.controllerAs = 'nav';
this.template = "\n ";
this.scope = {
overlay: '@?uifOverlay'
};
this.link = function ($scope, $element, $attrs, navBarController, $transclude) {
_this.$document.on('click', function () {
navBarController.closeAllContextMenus();
navBarController.hideSearchTextBox();
});
$transclude(function (clone) {
var elementToReplace = angular.element($element[0].querySelector('.uif-nav-items'));
elementToReplace.replaceWith(clone);
});
};
}
NavBarDirective.factory = function () {
var directive = function ($log, $animate, $document) { return new NavBarDirective($log, $animate, $document); };
directive.$inject = ['$log', '$animate', '$document'];
return directive;
};
return NavBarDirective;
}());
NavBarDirective.directiveName = 'uifNavBar';
NavBarDirective.overlayValues = ['light', 'dark'];
exports.NavBarDirective = NavBarDirective;
var NavBarItemTypes;
(function (NavBarItemTypes) {
NavBarItemTypes[NavBarItemTypes["link"] = 0] = "link";
NavBarItemTypes[NavBarItemTypes["menu"] = 1] = "menu";
})(NavBarItemTypes || (NavBarItemTypes = {}));
var NavBarItemController = (function () {
function NavBarItemController($scope, $element) {
this.$scope = $scope;
this.$element = $element;
}
NavBarItemController.prototype.closeContextualMenu = function () {
if (this.$scope.hasChildMenu) {
this.$scope.contextMenuCtrl.closeMenu();
}
};
NavBarItemController.prototype.deselectItem = function () {
this.$element.removeClass('is-selected');
};
return NavBarItemController;
}());
NavBarItemController.$inject = ['$scope', '$element'];
exports.NavBarItemController = NavBarItemController;
var NavBarItemDirective = (function () {
function NavBarItemDirective($log) {
var _this = this;
this.$log = $log;
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.controller = NavBarItemController;
this.require = "^" + NavBarDirective.directiveName;
this.scope = {
isDisabled: '@?disabled',
position: '@?uifPosition',
text: '=?uifText',
type: '@?uifType'
};
this.templateTypes = {};
this.template = function ($element, $attrs) {
var type = $attrs.uifType;
if (angular.isUndefined(type)) {
return _this.templateTypes[NavBarItemTypes.link];
}
if (NavBarItemTypes[type] === undefined) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.navbar - unsupported nav bar item type:\n' +
'the type \'' + type + '\' is not supported by ng-Office UI Fabric as valid type for nav bar item.' +
'Supported types can be found under NavBarItemTypes enum here:\n' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/navbar/navbarDirective.ts');
return '';
}
return _this.templateTypes[NavBarItemTypes[type]];
};
this.link = function ($scope, $element, $attrs, navBarController, $transclude) {
if ($scope.isDisabled) {
var navBarLinkEelement = angular.element($element[0].querySelector('.ms-NavBar-link'));
navBarLinkEelement.removeAttr('href');
}
if (angular.isUndefined($scope.type)) {
$scope.type = NavBarItemTypes[NavBarItemTypes.link];
}
$scope.selectItem = function ($event) {
$event.stopPropagation();
if ($element.hasClass('is-disabled')) {
return;
}
$element.parent().find('li').removeClass('is-selected');
navBarController.closeAllContextMenus();
navBarController.hideSearchTextBox();
$element.toggleClass('is-selected');
if ($scope.hasChildMenu && $scope.contextMenuCtrl.isMenuOpened()) {
$scope.contextMenuCtrl.closeMenu();
$element.removeClass('is-selected');
}
else if ($scope.hasChildMenu && !$scope.contextMenuCtrl.isMenuOpened()) {
$scope.contextMenuCtrl.openMenu();
$element.addClass('is-selected');
}
else if (!$scope.hasChildMenu) {
navBarController.closeMobileMenu();
}
$scope.$apply();
};
$element.on('click', $scope.selectItem);
_this.transcludeChilds($scope, $element, $transclude);
var contextMenuCtrl = angular.element($element[0].querySelector('.ms-ContextualMenu'))
.controller(contextualMenu_1.ContextualMenuDirective.directiveName);
if (contextMenuCtrl) {
$scope.hasChildMenu = true;
$scope.contextMenuCtrl = contextMenuCtrl;
$scope.contextMenuCtrl.onRootMenuClosed.push(function () {
navBarController.closeMobileMenu();
$element.removeClass('is-selected');
});
}
};
this.templateTypes[NavBarItemTypes.link] = "\n \n \n ";
this.templateTypes[NavBarItemTypes.menu] = "\n \n \n \n \n ";
}
NavBarItemDirective.factory = function () {
var directive = function ($log) { return new NavBarItemDirective($log); };
directive.$inject = ['$log'];
return directive;
};
NavBarItemDirective.prototype.transcludeChilds = function ($scope, $element, $transclude) {
var _this = this;
$transclude(function (clone) {
var hasContent = _this.hasItemContent(clone);
if (!hasContent && !$scope.text) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.navbar - ' +
'you need to provide a text for a nav bar menu item.\n' +
'For you need to specify either \'uif-text\' as attribute or as a child directive');
}
_this.insertLink(clone, $scope, $element);
_this.insertMenu(clone, $scope, $element);
});
};
NavBarItemDirective.prototype.insertLink = function (clone, $scope, $element) {
var elementToReplace = angular.element($element[0].querySelector('.uif-nav-item-content'));
if (this.hasItemContent(clone)) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('uif-content')) {
elementToReplace.replaceWith(element);
break;
}
}
}
else {
elementToReplace.replaceWith(angular.element('' + $scope.text + ''));
}
};
NavBarItemDirective.prototype.insertMenu = function (clone, $scope, $element) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('ms-ContextualMenu')) {
angular.element($element[0].querySelector('.uif-submenu')).replaceWith(element);
}
}
};
NavBarItemDirective.prototype.hasItemContent = function (clone) {
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('uif-content')) {
return true;
}
}
return false;
};
return NavBarItemDirective;
}());
NavBarItemDirective.directiveName = 'uifNavBarItem';
exports.NavBarItemDirective = NavBarItemDirective;
var NavBarSearchController = (function () {
function NavBarSearchController($scope, $element, $document, $animate, $timeout) {
this.$scope = $scope;
this.$element = $element;
this.$document = $document;
this.$animate = $animate;
this.$timeout = $timeout;
}
NavBarSearchController.prototype.closeSearch = function () {
var _this = this;
this.$timeout(function () {
if (!_this.$scope.searchText) {
_this.$animate.removeClass(_this.$element, 'is-open');
}
_this.$animate.removeClass(_this.$element, 'is-selected');
});
};
return NavBarSearchController;
}());
NavBarSearchController.$inject = ['$scope', '$element', '$document', '$animate', '$timeout'];
exports.NavBarSearchController = NavBarSearchController;
var NavBarSearch = (function () {
function NavBarSearch($document, $animate, $timeout) {
var _this = this;
this.$document = $document;
this.$animate = $animate;
this.$timeout = $timeout;
this.replace = true;
this.restrict = 'E';
this.controller = NavBarSearchController;
this.require = ["^" + NavBarDirective.directiveName, "" + NavBarSearch.directiveName];
this.transclude = true;
this.scope = {
onSearchCallback: '&?uifOnSearch',
placeholder: '@?placeholder'
};
this.template = "\n \n \n \n
\n ";
this.link = function ($scope, $element, $attrs, ctrls, $transclude) {
_this.$document.on('click', function () {
ctrls[1].closeSearch();
});
$scope.skipOnClick = function ($event) {
_this.applyCssClasses($element);
$event.stopPropagation();
};
$scope.onSearch = function ($event) {
ctrls[0].closeAllContextMenus();
if ($event instanceof KeyboardEvent && $event.which === 13 && $scope.onSearchCallback) {
$scope.onSearchCallback({ search: $scope.searchText });
}
else if ($event instanceof MouseEvent && $element.hasClass('is-open') && $scope.onSearchCallback) {
$scope.onSearchCallback({ search: $scope.searchText });
}
_this.applyCssClasses($element);
$event.stopPropagation();
};
};
}
NavBarSearch.factory = function () {
var directive = function ($document, $animate, $timeout) {
return new NavBarSearch($document, $animate, $timeout);
};
directive.$inject = ['$document', '$animate', '$timeout'];
return directive;
};
NavBarSearch.prototype.applyCssClasses = function ($element) {
if (!$element.hasClass('is-open')) {
this.$animate.addClass($element, 'is-open');
this.$timeout(function () {
angular.element($element[0].querySelector('.ms-TextField-field'))[0].focus();
}, 1);
}
$element.parent().find('li').removeClass('is-selected');
this.$animate.addClass($element, 'is-selected');
};
return NavBarSearch;
}());
NavBarSearch.directiveName = 'uifNavBarSearch';
exports.NavBarSearch = NavBarSearch;
exports.module = angular.module('officeuifabric.components.navbar', [
'officeuifabric.components'
])
.directive(NavBarDirective.directiveName, NavBarDirective.factory())
.directive(NavBarItemDirective.directiveName, NavBarItemDirective.factory())
.directive(NavBarSearch.directiveName, NavBarSearch.factory());
/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var orgChartPresenceEnum_1 = __webpack_require__(36);
var orgChartStyleEnum_1 = __webpack_require__(38);
var orgChartSelectModeEnum_1 = __webpack_require__(37);
var OrgChartController = (function () {
function OrgChartController($scope, $log) {
this.$scope = $scope;
this.$log = $log;
this.$scope.selectMode = null;
this.$scope.items = [];
}
Object.defineProperty(OrgChartController.prototype, "items", {
get: function () {
return this.$scope.items;
},
set: function (items) {
this.$scope.items = items;
},
enumerable: true,
configurable: true
});
Object.defineProperty(OrgChartController.prototype, "selectedItems", {
get: function () {
return this.$scope.selectedItems;
},
set: function (selectedItems) {
this.$scope.selectedItems = selectedItems;
},
enumerable: true,
configurable: true
});
return OrgChartController;
}());
OrgChartController.$inject = ['$scope', '$log'];
var OrgChartDirective = (function () {
function OrgChartDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
this.controller = OrgChartController;
this.scope = {
selectedItems: '=?uifSelectedItems'
};
}
OrgChartDirective.factory = function () {
var directive = function () { return new OrgChartDirective(); };
return directive;
};
OrgChartDirective.prototype.link = function (scope, elem, attrs, ctrl) {
if (attrs.uifSelectMode) {
switch (orgChartSelectModeEnum_1.OrgChartSelectModeEnum[attrs.uifSelectMode]) {
case orgChartSelectModeEnum_1.OrgChartSelectModeEnum.single:
case orgChartSelectModeEnum_1.OrgChartSelectModeEnum.multiple:
ctrl.selectMode = orgChartSelectModeEnum_1.OrgChartSelectModeEnum[attrs.uifSelectMode];
break;
default:
ctrl.$log.error('Error [ngOfficeUIFabric] officeuifabric.components.orgchart - Unsupported select-mode: ' +
'The select-mode (\'' + attrs.uifSelectMode + '\) is not supperted. ' +
'Supported options are: single, multiple');
break;
}
}
};
return OrgChartDirective;
}());
exports.OrgChartDirective = OrgChartDirective;
var OrgChartGroupDirective = (function () {
function OrgChartGroupDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
}
OrgChartGroupDirective.factory = function () {
var directive = function () { return new OrgChartGroupDirective(); };
return directive;
};
return OrgChartGroupDirective;
}());
exports.OrgChartGroupDirective = OrgChartGroupDirective;
var OrgChartGroupTitleDirective = (function () {
function OrgChartGroupTitleDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
}
OrgChartGroupTitleDirective.factory = function () {
var directive = function () { return new OrgChartGroupTitleDirective(); };
return directive;
};
return OrgChartGroupTitleDirective;
}());
exports.OrgChartGroupTitleDirective = OrgChartGroupTitleDirective;
var OrgChartListDirective = (function () {
function OrgChartListDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
}
OrgChartListDirective.factory = function () {
var directive = function () { return new OrgChartListDirective(); };
return directive;
};
return OrgChartListDirective;
}());
exports.OrgChartListDirective = OrgChartListDirective;
var OrgChartPersonaDirective = (function () {
function OrgChartPersonaDirective($log) {
this.$log = $log;
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
this.require = '^uifOrgChart';
this.scope = {
item: '=?uifItem',
presence: '=?uifPresence',
selected: '=?uifSelected'
};
}
OrgChartPersonaDirective.factory = function () {
var directive = function ($log) { return new OrgChartPersonaDirective($log); };
directive.$inject = ['$log'];
return directive;
};
OrgChartPersonaDirective.prototype.compile = function (elem, attrs, transclude) {
return {
post: this.postLink
};
};
OrgChartPersonaDirective.prototype.postLink = function (scope, elem, attrs, ctrl, transclude) {
if (scope.selected === undefined) {
scope.selected = false;
}
if (scope.presence) {
switch (orgChartPresenceEnum_1.OrgChartPresenceEnum[scope.presence]) {
case orgChartPresenceEnum_1.OrgChartPresenceEnum.available:
elem.children().eq(0).addClass('ms-Persona--available');
break;
case orgChartPresenceEnum_1.OrgChartPresenceEnum.busy:
elem.children().eq(0).addClass('ms-Persona--busy');
break;
case orgChartPresenceEnum_1.OrgChartPresenceEnum.away:
elem.children().eq(0).addClass('ms-Persona--away');
break;
case orgChartPresenceEnum_1.OrgChartPresenceEnum.blocked:
elem.children().eq(0).addClass('ms-Persona--blocked');
break;
case orgChartPresenceEnum_1.OrgChartPresenceEnum.dnd:
elem.children().eq(0).addClass('ms-Persona--dnd');
break;
case orgChartPresenceEnum_1.OrgChartPresenceEnum.offline:
elem.children().eq(0).addClass('ms-Persona--offline');
break;
default:
ctrl.$log.error('Error [ngOfficeUIFabric] officeuifabric.components.orgchart - Unsupported presence: ' +
'The presence (\'' + scope.presence + '\') is not supperted by the Office UI Fabric. ' +
'Supported options are: available, busy, away, blocked, dnd, offline.');
break;
}
}
if (attrs.uifStyle) {
switch (orgChartStyleEnum_1.OrgChartStyleEnum[attrs.uifStyle]) {
case orgChartStyleEnum_1.OrgChartStyleEnum.square:
elem.children().eq(0).addClass('ms-Persona--square');
break;
case orgChartStyleEnum_1.OrgChartStyleEnum.standard: break;
default:
ctrl.$log.error('Error [ngOfficeUIFabric] officeuifabric.components.orgchart - Unsupported style: ' +
'The style (\'' + attrs.uifStyle + '\) is not supperted by the Office UI Fabric. ' +
'Supported options are: standard(default), square');
break;
}
}
if (ctrl.selectMode !== undefined) {
elem.children().eq(0).addClass('ms-Persona--selectable');
}
scope.$watch('selected', function (newValue, oldValue) {
if (ctrl.selectMode !== undefined) {
if (newValue === true) {
elem.children().eq(0).addClass('is-selected');
}
else {
elem.children().eq(0).removeClass('is-selected');
}
}
});
if (scope.item) {
ctrl.items.push(scope);
}
if (ctrl.selectMode === orgChartSelectModeEnum_1.OrgChartSelectModeEnum.single || ctrl.selectMode === orgChartSelectModeEnum_1.OrgChartSelectModeEnum.multiple) {
if (scope.selected) {
if (ctrl.selectMode === orgChartSelectModeEnum_1.OrgChartSelectModeEnum.single) {
if (ctrl.selectedItems) {
ctrl.selectedItems = [];
}
for (var i = 0; i < ctrl.items.length; i++) {
if (ctrl.items[i] !== scope) {
ctrl.items[i].selected = false;
}
}
}
elem.children().eq(0).addClass('is-selected');
if (ctrl.selectedItems) {
ctrl.selectedItems.push(scope.item);
}
}
}
scope.personaClick = function (event) {
scope.selected = !scope.selected;
if (scope.selected) {
if (ctrl.selectMode === orgChartSelectModeEnum_1.OrgChartSelectModeEnum.single) {
if (ctrl.items) {
for (var i = 0; i < ctrl.items.length; i++) {
if (ctrl.items[i] !== scope) {
ctrl.items[i].selected = false;
}
}
}
elem.children().eq(0).addClass('is-selected');
ctrl.selectedItems = [];
ctrl.selectedItems.push(scope.item);
}
if (ctrl.selectMode === orgChartSelectModeEnum_1.OrgChartSelectModeEnum.multiple) {
elem.children().eq(0).addClass('is-selected');
if (ctrl.selectedItems) {
ctrl.selectedItems.push(scope.item);
}
}
}
else {
elem.children().eq(0).removeClass('is-selected');
if (ctrl.selectedItems) {
var index = ctrl.selectedItems.indexOf(scope.item);
if (index > -1) {
ctrl.selectedItems.splice(index, 1);
}
}
}
scope.$apply();
};
if ((ctrl.selectMode === orgChartSelectModeEnum_1.OrgChartSelectModeEnum.single || ctrl.selectMode === orgChartSelectModeEnum_1.OrgChartSelectModeEnum.multiple) && scope.item) {
elem.children().eq(0).on('click', scope.personaClick);
}
};
return OrgChartPersonaDirective;
}());
exports.OrgChartPersonaDirective = OrgChartPersonaDirective;
var OrgChartImageDirective = (function () {
function OrgChartImageDirective() {
this.restrict = 'E';
this.replace = true;
this.template = "\n \n
\n
\n
\n ";
this.scope = {
ngSrc: '='
};
}
OrgChartImageDirective.factory = function () {
var directive = function () { return new OrgChartImageDirective(); };
return directive;
};
return OrgChartImageDirective;
}());
exports.OrgChartImageDirective = OrgChartImageDirective;
var OrgChartPresenceDirective = (function () {
function OrgChartPresenceDirective() {
this.restrict = 'E';
this.replace = true;
this.template = '';
}
OrgChartPresenceDirective.factory = function () {
var directive = function () { return new OrgChartPresenceDirective(); };
return directive;
};
OrgChartPresenceDirective.prototype.link = function (scope, elem, attrs, ctrl) {
if (!scope.$parent.presence) {
elem.css('display', 'none');
}
};
return OrgChartPresenceDirective;
}());
exports.OrgChartPresenceDirective = OrgChartPresenceDirective;
var OrgChartDetailsDirective = (function () {
function OrgChartDetailsDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
}
OrgChartDetailsDirective.factory = function () {
var directive = function () { return new OrgChartDetailsDirective(); };
return directive;
};
return OrgChartDetailsDirective;
}());
exports.OrgChartDetailsDirective = OrgChartDetailsDirective;
var OrgChartPrimaryTextDirective = (function () {
function OrgChartPrimaryTextDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
}
OrgChartPrimaryTextDirective.factory = function () {
var directive = function () { return new OrgChartPrimaryTextDirective(); };
return directive;
};
return OrgChartPrimaryTextDirective;
}());
exports.OrgChartPrimaryTextDirective = OrgChartPrimaryTextDirective;
var OrgChartSecondaryTextDirective = (function () {
function OrgChartSecondaryTextDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
}
OrgChartSecondaryTextDirective.factory = function () {
var directive = function () { return new OrgChartSecondaryTextDirective(); };
return directive;
};
return OrgChartSecondaryTextDirective;
}());
exports.OrgChartSecondaryTextDirective = OrgChartSecondaryTextDirective;
var OrgChartGroupByFilter = (function () {
function OrgChartGroupByFilter() {
}
OrgChartGroupByFilter.factory = function () {
return function (collection, key) {
var result = [];
if (!collection) {
return;
}
for (var i = 0; i < collection.length; i++) {
var value = collection[i][key];
if (result.indexOf(value) === -1) {
result.push(value);
}
}
return result;
};
};
return OrgChartGroupByFilter;
}());
exports.OrgChartGroupByFilter = OrgChartGroupByFilter;
exports.module = angular.module('officeuifabric.components.orgchart', [
'officeuifabric.components'
])
.directive('uifOrgChart', OrgChartDirective.factory())
.directive('uifOrgChartGroup', OrgChartGroupDirective.factory())
.directive('uifOrgChartGroupTitle', OrgChartGroupTitleDirective.factory())
.directive('uifOrgChartList', OrgChartListDirective.factory())
.directive('uifOrgChartPersona', OrgChartPersonaDirective.factory())
.directive('uifOrgChartImage', OrgChartImageDirective.factory())
.directive('uifOrgChartPresence', OrgChartPresenceDirective.factory())
.directive('uifOrgChartDetails', OrgChartDetailsDirective.factory())
.directive('uifOrgChartPrimaryText', OrgChartPrimaryTextDirective.factory())
.directive('uifOrgChartSecondaryText', OrgChartSecondaryTextDirective.factory())
.filter('uifOrgChartGroupBy', OrgChartGroupByFilter.factory);
/***/ }),
/* 36 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var OrgChartPresenceEnum;
(function (OrgChartPresenceEnum) {
OrgChartPresenceEnum[OrgChartPresenceEnum["available"] = 0] = "available";
OrgChartPresenceEnum[OrgChartPresenceEnum["busy"] = 1] = "busy";
OrgChartPresenceEnum[OrgChartPresenceEnum["away"] = 2] = "away";
OrgChartPresenceEnum[OrgChartPresenceEnum["blocked"] = 3] = "blocked";
OrgChartPresenceEnum[OrgChartPresenceEnum["dnd"] = 4] = "dnd";
OrgChartPresenceEnum[OrgChartPresenceEnum["offline"] = 5] = "offline";
})(OrgChartPresenceEnum = exports.OrgChartPresenceEnum || (exports.OrgChartPresenceEnum = {}));
/***/ }),
/* 37 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var OrgChartSelectModeEnum;
(function (OrgChartSelectModeEnum) {
OrgChartSelectModeEnum[OrgChartSelectModeEnum["single"] = 0] = "single";
OrgChartSelectModeEnum[OrgChartSelectModeEnum["multiple"] = 1] = "multiple";
})(OrgChartSelectModeEnum = exports.OrgChartSelectModeEnum || (exports.OrgChartSelectModeEnum = {}));
/***/ }),
/* 38 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var OrgChartStyleEnum;
(function (OrgChartStyleEnum) {
OrgChartStyleEnum[OrgChartStyleEnum["standard"] = 0] = "standard";
OrgChartStyleEnum[OrgChartStyleEnum["square"] = 1] = "square";
})(OrgChartStyleEnum = exports.OrgChartStyleEnum || (exports.OrgChartStyleEnum = {}));
/***/ }),
/* 39 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var overlayModeEnum_1 = __webpack_require__(40);
var OverlayController = (function () {
function OverlayController(log) {
this.log = log;
}
return OverlayController;
}());
OverlayController.$inject = ['$log'];
var OverlayDirective = (function () {
function OverlayDirective(log) {
this.log = log;
this.restrict = 'E';
this.template = '';
this.scope = {
uifMode: '@'
};
this.transclude = true;
OverlayDirective.log = log;
}
OverlayDirective.factory = function () {
var directive = function (log) { return new OverlayDirective(log); };
directive.$inject = ['$log'];
return directive;
};
OverlayDirective.prototype.link = function (scope) {
scope.$watch('uifMode', function (newValue, oldValue) {
if (overlayModeEnum_1.OverlayMode[newValue] === undefined) {
OverlayDirective.log.error('Error [ngOfficeUiFabric] officeuifabric.components.overlay - Unsupported overlay mode: ' +
'The overlay mode (\'' + scope.uifMode + '\') is not supported by the Office UI Fabric. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/overlay/overlayModeEnum.ts');
}
});
};
return OverlayDirective;
}());
exports.OverlayDirective = OverlayDirective;
exports.module = angular.module('officeuifabric.components.overlay', [
'officeuifabric.components'
])
.directive('uifOverlay', OverlayDirective.factory());
/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var OverlayMode;
(function (OverlayMode) {
OverlayMode[OverlayMode["light"] = 0] = "light";
OverlayMode[OverlayMode["dark"] = 1] = "dark";
})(OverlayMode = exports.OverlayMode || (exports.OverlayMode = {}));
/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var panelDirectiveEnum_1 = __webpack_require__(42);
var PanelDirective = (function () {
function PanelDirective($log, $animate, $timeout) {
this.$log = $log;
this.$animate = $animate;
this.$timeout = $timeout;
this.restrict = 'E';
this.template = "";
this.transclude = true;
this.replace = true;
this.controller = PanelController;
this.scope = {
uifIsLightDismiss: '=',
uifIsOpen: '=',
uifShowClose: '=',
uifShowOverlay: '=',
uifType: '@'
};
}
PanelDirective.factory = function () {
var directive = function ($log, $animate, $timeout) { return new PanelDirective($log, $animate, $timeout); };
directive.$inject = ['$log', '$animate', '$timeout'];
return directive;
};
PanelDirective.prototype.compile = function (element, attrs, transclude) {
return {
pre: this.preLink
};
};
PanelDirective.prototype.preLink = function (scope, elem, attrs, ctrl, transclude) {
transclude(function (clone) {
for (var i = 0; i < clone.length; i++) {
if (angular.element(clone[i]).hasClass('ms-CommandBar')) {
angular.element(elem[0].querySelector('div.ms-Panel-commands')).prepend(clone[i]);
}
else if (scope.uifType === 'left') {
angular.element(elem[0].querySelector('div.ms-Panel-main')).append(clone[i]);
}
else {
angular.element(elem[0].querySelector('div.ms-Panel-contentInner')).append(clone[i]);
}
}
});
scope.closePanel = function () {
scope.uifIsOpen = false;
};
};
return PanelDirective;
}());
exports.PanelDirective = PanelDirective;
var PanelController = (function () {
function PanelController($scope, $animate, $element, $log, $timeout) {
var _this = this;
this.$scope = $scope;
this.$animate = $animate;
this.$element = $element;
this.$log = $log;
this.$timeout = $timeout;
this.uifPanelSizeClasses = (_a = {},
_a[panelDirectiveEnum_1.PanelTypes.small] = 'ms-Panel--sm',
_a[panelDirectiveEnum_1.PanelTypes.medium] = 'ms-Panel--md',
_a[panelDirectiveEnum_1.PanelTypes.large] = 'ms-Panel--lg',
_a[panelDirectiveEnum_1.PanelTypes.extralarge] = 'ms-Panel--xl',
_a[panelDirectiveEnum_1.PanelTypes.extraextralarge] = 'ms-Panel--xxl',
_a[panelDirectiveEnum_1.PanelTypes.left] = 'ms-Panel--left',
_a);
if (!$scope.uifType) {
$scope.uifType = 'medium';
}
if (panelDirectiveEnum_1.PanelTypes[$scope.uifType] === undefined) {
this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.panel - unsupported panel type:\n' +
'the type \'' + $scope.uifType + '\' is not supported by ng-Office UI Fabric as valid type for panels.' +
'Supported types can be found under PanelTypes enum here:\n' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/panel/panel.ts');
$scope.uifType = 'medium';
}
var size = panelDirectiveEnum_1.PanelTypes[$scope.uifType];
$element.addClass(this.uifPanelSizeClasses[size]);
$scope.$watch('uifIsOpen', function (newValue) {
if (typeof newValue !== 'boolean' && newValue !== undefined) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.panel - invalid attribute type: \'uif-is-open\'.\n' +
'The type \'' + typeof newValue + '\' is not supported as valid type for \'uif-is-open\' attribute for ' +
'. The valid type is boolean.');
}
else {
if (newValue === true) {
$animate.addClass(_this.$element, 'ms-Panel-animateIn');
$element.addClass('is-open');
if ($element[0].querySelector('.ms-CommandBar')) {
angular.element($element[0].querySelector('.ms-CommandBar')).scope().$broadcast('uif-command-bar-resize');
}
}
else {
$animate.addClass(_this.$element, 'ms-Panel-animateOut');
$timeout(function () {
$element.removeClass('ms-Panel-animateIn ms-Panel-animateOut');
$element.removeClass('is-open');
$scope.uifIsOpen = false;
}, 500);
}
}
});
var _a;
}
return PanelController;
}());
PanelController.$inject = ['$scope', '$animate', '$element', '$log', '$timeout'];
exports.PanelController = PanelController;
var PanelHeaderDirective = (function () {
function PanelHeaderDirective() {
this.restrict = 'E';
this.template = '\n
\n
\n \n {{person.initials}}\n {{person.primaryText}}\n \n \n
\n
\n
\n
\n
\n
\n
{{groupData.group.name}}
\n
\n
\n
\n
\n
\n
";
this.templateTypes[PeoplePickerTypes.compact] =
"\n
\n
\n \n {{person.initials}}\n {{person.primaryText}}\n \n \n
\n
\n
\n
\n
\n
\n
{{groupData.group.name}}
\n
\n
\n
\n
\n
\n
";
this.templateTypes[PeoplePickerTypes.memberList] = "\n ";
this.templateTypes[PeoplePickerTypes.facePile] = "\n \n
\n \n
\n
\n
\n \n \n\n
";
}
PeoplePickerDirective.factory = function () {
var directive = function ($document, $timeout, $log, $window) {
return new PeoplePickerDirective($document, $timeout, $log, $window);
};
directive.$inject = ['$document', '$timeout', '$log', '$window'];
return directive;
};
PeoplePickerDirective.prototype.initDisabledState = function ($element, $scope, $attrs) {
var $searchField = angular.element($element[0].querySelector('.ms-PeoplePicker-searchField'));
$attrs.$observe('disabled', function (disabled) {
if (disabled) {
$searchField.attr('disabled', 'disabled');
}
else {
$searchField.removeAttr('disabled');
}
});
};
PeoplePickerDirective.prototype.animateSelectedPeople = function ($element) {
var $selectedPeople = angular.element($element[0].querySelector('.ms-PeoplePicker-selectedPeople'));
$selectedPeople.addClass('ms-u-slideDownIn20');
setTimeout(function () { $selectedPeople.removeClass('ms-u-slideDownIn20'); }, 1000);
};
PeoplePickerDirective.prototype.currentYPosition = function () {
if (this.$window.pageYOffset) {
return this.$window.pageYOffset;
}
var body = angular.element(this.$document[0]).find('body')[0];
if (body.scrollTop) {
return body.scrollTop;
}
return 0;
};
PeoplePickerDirective.prototype.elmYPosition = function (element) {
var y = element.offsetTop;
var node = element;
while (node.offsetParent && node.offsetParent !== document.body) {
node = (node.offsetParent);
y += node.offsetTop;
}
return y;
};
PeoplePickerDirective.prototype.smoothScrollTo = function (element) {
var startY = this.currentYPosition();
var stopY = this.elmYPosition(element);
var distance = stopY > startY ? stopY - startY : startY - stopY;
if (distance < 100) {
window.scrollTo(0, stopY);
return;
}
var speed = Math.round(distance / 30);
if (speed >= 20) {
speed = 20;
}
var step = Math.round(distance / 25);
var leapY = stopY > startY ? startY + step : startY - step;
var timer = 0;
if (stopY > startY) {
for (var i = startY; i < stopY; i += step) {
(function (lY, t) {
setTimeout(function () {
window.scrollTo(0, lY);
}, t * speed);
})(leapY, timer);
leapY += step;
if (leapY > stopY) {
leapY = stopY;
}
timer++;
}
return;
}
for (var i = startY; i > stopY; i -= step) {
(function (lY, t) {
setTimeout(function () {
window.scrollTo(0, lY);
}, t * speed);
})(leapY, timer);
leapY -= step;
if (leapY < stopY) {
leapY = stopY;
}
timer++;
}
};
PeoplePickerDirective.prototype.insertFacePileHeader = function (clone, $scope, $element) {
var elementToReplace = angular.element($element[0].querySelector('.uif-people-header'));
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('ms-PeoplePicker-selectedCount')) {
elementToReplace.replaceWith(element);
break;
}
}
};
PeoplePickerDirective.prototype.insertFacePileSearchMore = function (clone, $scope, $element) {
var elementToReplace = angular.element($element[0].querySelector('.uif-search-more'));
for (var i = 0; i < clone.length; i++) {
var element = angular.element(clone[i]);
if (element.hasClass('ms-PeoplePicker-searchMore')) {
elementToReplace.replaceWith(element);
break;
}
}
};
PeoplePickerDirective.prototype.resizeSearchField = function ($peoplePicker) {
var $searchBox = angular.element($peoplePicker[0].querySelector('.ms-PeoplePicker-searchBox'));
var $searchField = angular.element($peoplePicker[0].querySelector('.ms-PeoplePicker-searchField'));
var searchBoxLeftEdge = $searchBox.prop('offsetLeft');
var searchBoxWidth = $searchBox[0].clientWidth;
var searchBoxRightEdge = searchBoxLeftEdge + searchBoxWidth;
var $personaNodes = $searchBox[0].querySelectorAll('.ms-PeoplePicker-persona');
if ($personaNodes.length === 0) {
$searchField[0].style.width = '100%';
return;
}
var $lastPersona = angular.element($personaNodes[$personaNodes.length - 1]);
var lastPersonaLeftEdge = $lastPersona.prop('offsetLeft');
var lastPersonaWidth = $lastPersona[0].clientWidth;
var lastPersonaRightEdge = lastPersonaLeftEdge + lastPersonaWidth;
var newFieldWidth = searchBoxRightEdge - lastPersonaRightEdge - 5;
if (newFieldWidth < 100) {
newFieldWidth = '100%';
$searchField[0].style.width = '100%';
}
else {
$searchField[0].style.width = newFieldWidth + 'px';
}
};
return PeoplePickerDirective;
}());
PeoplePickerDirective.directiveName = 'uifPeoplePicker';
exports.PeoplePickerDirective = PeoplePickerDirective;
var PeoplePickerResultListDirective = (function () {
function PeoplePickerResultListDirective() {
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.template = "\n ";
this.scope = {
onPersonClick: '&uifPersonClick',
onPersonCloseClick: '&uifPersonCloseClick',
people: '=ngModel',
personSize: '@uifSize',
personStyle: '@uifStyle',
pickerType: '@uifPickerType'
};
this.link = function ($scope, $element, $attrs, peoplePickerCtrl, $transclude) {
$scope.expandAdditionalData = function ($event) {
$event.stopPropagation();
var $button = angular.element($event.target);
for (var i = 0; i < 10; i++) {
var $parent = $button.parent();
if ($parent.hasClass('ms-PeoplePicker-result')) {
$parent.toggleClass('is-expanded');
break;
}
$button = $parent;
}
};
};
}
PeoplePickerResultListDirective.factory = function () {
var directive = function () { return new PeoplePickerResultListDirective(); };
return directive;
};
return PeoplePickerResultListDirective;
}());
PeoplePickerResultListDirective.directiveName = 'uifPeoplePickerResultList';
exports.PeoplePickerResultListDirective = PeoplePickerResultListDirective;
var PeopleSearchMoreController = (function () {
function PeopleSearchMoreController($scope, $element) {
this.$scope = $scope;
this.$element = $element;
this.searchCallbacks = [];
}
PeopleSearchMoreController.prototype.isSearching = function (searching) {
this.$scope.processing = searching;
searching ? this.$element.addClass('is-searching') : this.$element.removeClass('is-searching');
};
return PeopleSearchMoreController;
}());
PeopleSearchMoreController.$inject = ['$scope', '$element'];
exports.PeopleSearchMoreController = PeopleSearchMoreController;
var PeopleSearchMoreDirective = (function () {
function PeopleSearchMoreDirective() {
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.require = "^^" + PeoplePickerDirective.directiveName;
this.controller = PeopleSearchMoreController;
this.template = "\n \n
\n
\n
\n
\n
\n
";
this.scope = {
disconnected: '=uifDisconnected'
};
this.link = function ($scope, $element, $attrs, peoplePickerCtrl, $transclude) {
$scope.pickerType = peoplePickerCtrl.pickerType();
$scope.onSearch = function ($event) {
$event.stopPropagation();
peoplePickerCtrl.search();
$scope.$broadcast(peopleSearchEventName, peoplePickerCtrl.searchQuery());
};
};
}
PeopleSearchMoreDirective.factory = function () {
var directive = function () { return new PeopleSearchMoreDirective(); };
return directive;
};
return PeopleSearchMoreDirective;
}());
PeopleSearchMoreDirective.directiveName = 'uifPeopleSearchMore';
exports.PeopleSearchMoreDirective = PeopleSearchMoreDirective;
var PrimaryTextController = (function () {
function PrimaryTextController($scope) {
var _this = this;
this.$scope = $scope;
this.$scope.$on(peopleSearchEventName, function ($event, query) {
_this.$scope.searchQuery = query;
});
}
return PrimaryTextController;
}());
PrimaryTextController.$inject = ['$scope'];
exports.PrimaryTextController = PrimaryTextController;
var PrimaryTextDirective = (function () {
function PrimaryTextDirective() {
this.replace = true;
this.restrict = 'E';
this.require = ["^^" + PeopleSearchMoreDirective.directiveName, "^^" + PeoplePickerDirective.directiveName];
this.transclude = true;
this.controller = PrimaryTextController;
this.template = "\n \n
{{searchingForText}} {{searchQuery}}
\n
\n
";
this.scope = {
searchingForText: '@?uifSearchForText'
};
this.link = function ($scope, $element, $attrs, ctrls, $transclude) {
$scope.searchingForText = $scope.searchingForText || 'Searching for';
};
}
PrimaryTextDirective.factory = function () {
var directive = function () { return new PrimaryTextDirective(); };
return directive;
};
return PrimaryTextDirective;
}());
PrimaryTextDirective.directiveName = 'uifPrimaryText';
exports.PrimaryTextDirective = PrimaryTextDirective;
var SecondaryTextDirective = (function () {
function SecondaryTextDirective() {
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.template = "\n \n \n
";
this.scope = true;
}
SecondaryTextDirective.factory = function () {
var directive = function () { return new SecondaryTextDirective(); };
return directive;
};
return SecondaryTextDirective;
}());
SecondaryTextDirective.directiveName = 'uifSecondaryText';
exports.SecondaryTextDirective = SecondaryTextDirective;
var DisconnectedTextDirective = (function () {
function DisconnectedTextDirective() {
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.template = "\n \n \n
";
this.scope = true;
}
DisconnectedTextDirective.factory = function () {
var directive = function () { return new DisconnectedTextDirective(); };
return directive;
};
return DisconnectedTextDirective;
}());
DisconnectedTextDirective.directiveName = 'uifDisconnectedText';
exports.DisconnectedTextDirective = DisconnectedTextDirective;
var PeoplePickerSelectedDirective = (function () {
function PeoplePickerSelectedDirective() {
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.template = "\n 0}\">\n \n
\n - \n \n {{person.initials}}\n {{person.primaryText}}\n {{person.secondaryText}}\n \n \n
\n
\n
";
this.scope = {
onSelectedPersonClick: '&?uifSelectedPersonClick',
removePersonFromSelectedPeople: '&uifPersonClose',
selectedPeople: '=ngModel'
};
}
PeoplePickerSelectedDirective.factory = function () {
var directive = function () { return new PeoplePickerSelectedDirective(); };
return directive;
};
return PeoplePickerSelectedDirective;
}());
PeoplePickerSelectedDirective.directiveName = 'uifPeoplePickerSelected';
exports.PeoplePickerSelectedDirective = PeoplePickerSelectedDirective;
var SelectedPeopleHeaderDirective = (function () {
function SelectedPeopleHeaderDirective() {
this.require = "^^" + PeoplePickerDirective.directiveName;
this.replace = true;
this.restrict = 'E';
this.transclude = true;
this.scope = true;
this.template = "";
this.link = function ($scope, $element, $attrs, peoplePickerCtrl, $transclude) {
$scope.selectedPersons = peoplePickerCtrl.getSelectedPersons();
};
}
SelectedPeopleHeaderDirective.factory = function () {
var directive = function () { return new SelectedPeopleHeaderDirective(); };
return directive;
};
return SelectedPeopleHeaderDirective;
}());
SelectedPeopleHeaderDirective.directiveName = 'uifSelectedPeopleHeader';
exports.SelectedPeopleHeaderDirective = SelectedPeopleHeaderDirective;
exports.module = angular.module('officeuifabric.components.peoplepicker', [
'officeuifabric.components'
])
.directive(PeoplePickerDirective.directiveName, PeoplePickerDirective.factory())
.directive(PrimaryTextDirective.directiveName, PrimaryTextDirective.factory())
.directive(SecondaryTextDirective.directiveName, SecondaryTextDirective.factory())
.directive(PeoplePickerResultListDirective.directiveName, PeoplePickerResultListDirective.factory())
.directive(DisconnectedTextDirective.directiveName, DisconnectedTextDirective.factory())
.directive(PeoplePickerSelectedDirective.directiveName, PeoplePickerSelectedDirective.factory())
.directive(SelectedPeopleHeaderDirective.directiveName, SelectedPeopleHeaderDirective.factory())
.directive(PeopleSearchMoreDirective.directiveName, PeopleSearchMoreDirective.factory());
/***/ }),
/* 44 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var personaStyleEnum_1 = __webpack_require__(1);
var personaPresenceEnum_1 = __webpack_require__(5);
var personaInitialsColorEnum_1 = __webpack_require__(61);
var sizeEnum_1 = __webpack_require__(4);
var PersonaTextDirective = (function () {
function PersonaTextDirective(directiveType) {
var _this = this;
this.directiveType = directiveType;
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.scope = false;
this.availableClasses = {
'optional': 'ms-Persona-optionalText',
'primary': 'ms-Persona-primaryText',
'secondary': 'ms-Persona-secondaryText',
'tertiary': 'ms-Persona-tertiaryText'
};
this.template = function ($element, $attrs) {
var directiveTemplate = '';
return directiveTemplate;
};
if (angular.isUndefined(this.availableClasses[this.directiveType])) {
this.directiveType = 'optional';
}
}
PersonaTextDirective.factory = function (type) {
var directive = function () { return new PersonaTextDirective(type); };
return directive;
};
return PersonaTextDirective;
}());
exports.PersonaTextDirective = PersonaTextDirective;
var PersonaInitialsDirective = (function () {
function PersonaInitialsDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.require = ['^uifPersona'];
this.scope = {
'uifColor': '@'
};
this.template = ' ';
this.link = function (scope, element, attrs, ctrls) {
var personaController = ctrls[0];
if (angular.isUndefined(attrs.uifColor)) {
scope.uifColor = personaInitialsColorEnum_1.PersonaInitialsColor[personaInitialsColorEnum_1.PersonaInitialsColor.blue];
}
scope.$watch('uifColor', function (newColor) {
if (angular.isUndefined(personaInitialsColorEnum_1.PersonaInitialsColor[newColor])) {
personaController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.persona - "' + newColor + '"' +
' is not a valid value for uifColor.' +
' It should be lightBlue, blue, darkBlue, teal, lightGreen, green,' +
' darkGreen, lightPink, pink, magenta, purple, black, orange, red or darkRed.');
}
});
};
}
PersonaInitialsDirective.factory = function () {
var directive = function () { return new PersonaInitialsDirective(); };
return directive;
};
return PersonaInitialsDirective;
}());
exports.PersonaInitialsDirective = PersonaInitialsDirective;
var PersonaDirective = (function () {
function PersonaDirective() {
var _this = this;
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.require = ['uifPersona'];
this.controller = PersonaController;
this.scope = {
'uifImageUrl': '@',
'uifPresence': '@',
'uifSize': '@'
};
this.template = '' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
';
this.uifSizeClasses = (_a = {},
_a[sizeEnum_1.PersonaSize.tiny] = 'ms-Persona--tiny',
_a[sizeEnum_1.PersonaSize.xsmall] = 'ms-Persona--xs',
_a[sizeEnum_1.PersonaSize.small] = 'ms-Persona--sm',
_a[sizeEnum_1.PersonaSize.large] = 'ms-Persona--lg',
_a[sizeEnum_1.PersonaSize.xlarge] = 'ms-Persona--xl',
_a);
this.uifPresenceClasses = (_b = {},
_b[personaPresenceEnum_1.PresenceEnum.available] = 'ms-Persona--available',
_b[personaPresenceEnum_1.PresenceEnum.away] = 'ms-Persona--away',
_b[personaPresenceEnum_1.PresenceEnum.blocked] = 'ms-Persona--blocked',
_b[personaPresenceEnum_1.PresenceEnum.busy] = 'ms-Persona--busy',
_b[personaPresenceEnum_1.PresenceEnum.dnd] = 'ms-Persona--dnd',
_b[personaPresenceEnum_1.PresenceEnum.offline] = 'ms-Persona--offline',
_b);
this.link = function (scope, element, attrs, controllers, transclude) {
var personaController = controllers[0];
if (angular.isDefined(attrs.uifSize) && angular.isUndefined(sizeEnum_1.PersonaSize[attrs.uifSize])) {
personaController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.persona - "' +
attrs.uifSize + '" is not a valid value for uifSize. It should be tiny, xsmall, small, medium, large, xlarge.');
return;
}
if (angular.isDefined(attrs.uifStyle) && angular.isUndefined(personaStyleEnum_1.PersonaStyleEnum[attrs.uifStyle])) {
personaController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.persona - "' +
attrs.uifStyle + '" is not a valid value for uifStyle. It should be round or square.');
return;
}
if (angular.isDefined(attrs.uifPresence) && angular.isUndefined(personaPresenceEnum_1.PresenceEnum[attrs.uifPresence])) {
personaController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.persona - "' +
attrs.uifPresence + '" is not a valid value for uifPresence. It should be available, away, blocked, busy, dnd or offline.');
return;
}
scope.getImageAreaVisibility = function () {
return (sizeEnum_1.PersonaSize[attrs.uifSize] !== sizeEnum_1.PersonaSize.tiny);
};
scope.getPersonaClasses = function () {
var personaClasses = [];
var size = sizeEnum_1.PersonaSize[attrs.uifSize];
var presence = angular.isDefined(attrs.uifPresence) ? personaPresenceEnum_1.PresenceEnum[attrs.uifPresence] : personaPresenceEnum_1.PresenceEnum.offline;
if (personaStyleEnum_1.PersonaStyleEnum[attrs.uifStyle] === personaStyleEnum_1.PersonaStyleEnum.square) {
personaClasses.push('ms-Persona--square');
}
var sizeClass = _this.uifSizeClasses[size];
if (angular.isDefined(sizeClass)) {
personaClasses.push(sizeClass);
}
personaClasses.push(_this.uifPresenceClasses[presence]);
return personaClasses.join(' ');
};
transclude(function (clone) {
var detailsWrapper = angular.element(element[0].getElementsByClassName('ms-Persona-details'));
var imageArea = angular.element(element[0].getElementsByClassName('ms-Persona-imageArea'));
for (var i = 0; i < clone.length; i++) {
var tagName = clone[i].tagName;
switch (tagName) {
case 'UIF-PERSONA-PRIMARY-TEXT':
case 'UIF-PERSONA-SECONDARY-TEXT':
case 'UIF-PERSONA-TERTIARY-TEXT':
case 'UIF-PERSONA-OPTIONAL-TEXT':
detailsWrapper.append(clone[i]);
break;
case 'UIF-PERSONA-INITIALS':
imageArea.prepend(clone[i]);
break;
default:
break;
}
}
});
};
var _a, _b;
}
PersonaDirective.factory = function () {
var directive = function () { return new PersonaDirective(); };
return directive;
};
return PersonaDirective;
}());
exports.PersonaDirective = PersonaDirective;
var PersonaController = (function () {
function PersonaController($log) {
this.$log = $log;
}
return PersonaController;
}());
PersonaController.$inject = ['$log'];
exports.PersonaController = PersonaController;
exports.module = angular.module('officeuifabric.components.persona', ['officeuifabric.components'])
.directive('uifPersona', PersonaDirective.factory())
.directive('uifPersonaInitials', PersonaInitialsDirective.factory())
.directive('uifPersonaPrimaryText', PersonaTextDirective.factory('primary'))
.directive('uifPersonaSecondaryText', PersonaTextDirective.factory('secondary'))
.directive('uifPersonaTertiaryText', PersonaTextDirective.factory('tertiary'))
.directive('uifPersonaOptionalText', PersonaTextDirective.factory(''));
/***/ }),
/* 45 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var sizeEnum_1 = __webpack_require__(47);
var placeholderEnum_1 = __webpack_require__(46);
var personaStyleEnum_1 = __webpack_require__(1);
var personaPresenceEnum_1 = __webpack_require__(5);
var PersonaCardDirective = (function () {
function PersonaCardDirective() {
var _this = this;
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.require = ['uifPersonaCard'];
this.controller = PersonaCardController;
this.scope = {
'uifImageUrl': '@',
'uifPresence': '@',
'uifSize': '@'
};
this.template = '' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
' +
'
';
this.link = function (scope, element, attrs, controllers, transclude) {
var personaCardController = controllers[0];
var icon = element.find('uif-icon');
icon.addClass('ms-Persona-placeholder');
if (angular.isDefined(attrs.uifSize) && angular.isUndefined(sizeEnum_1.PersonaSize[attrs.uifSize])) {
personaCardController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.personacard - "' +
attrs.uifSize + '" is not a valid value for uifSize. It should be xsmall, small, medium, large, xlarge.');
return;
}
if (angular.isDefined(attrs.uifStyle) && angular.isUndefined(personaStyleEnum_1.PersonaStyleEnum[attrs.uifStyle])) {
personaCardController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.personacard - "' +
attrs.uifStyle + '" is not a valid value for uifStyle. It should be round or square.');
return;
}
if (angular.isDefined(attrs.uifPresence) && angular.isUndefined(personaPresenceEnum_1.PresenceEnum[attrs.uifPresence])) {
personaCardController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.personacard - "' +
attrs.uifPresence + '" is not a valid value for uifPresence. It should be available, away, blocked, busy, dnd or offline.');
return;
}
scope.getActionClasses = function (action) {
var actionClasses = [];
var placeholder = placeholderEnum_1.PlaceholderEnum[action.placeholder];
switch (placeholder) {
case placeholderEnum_1.PlaceholderEnum.topright:
actionClasses.push('ms-PersonaCard-action');
actionClasses.push('ms-PersonaCard-orgChart');
break;
case placeholderEnum_1.PlaceholderEnum.regular:
actionClasses.push('ms-PersonaCard-action');
break;
default:
break;
}
if (action.isActive) {
actionClasses.push('is-active');
}
return actionClasses.join(' ');
};
scope.getPersonaClasses = function () {
var personaClasses = [];
if (personaStyleEnum_1.PersonaStyleEnum[attrs.uifStyle] === personaStyleEnum_1.PersonaStyleEnum.square) {
personaClasses.push('ms-Persona--square');
}
switch (sizeEnum_1.PersonaSize[attrs.uifSize]) {
case sizeEnum_1.PersonaSize.xsmall:
personaClasses.push('ms-Persona--xs');
break;
case sizeEnum_1.PersonaSize.small:
personaClasses.push('ms-Persona--sm');
break;
case sizeEnum_1.PersonaSize.large:
personaClasses.push('ms-Persona--lg');
break;
case sizeEnum_1.PersonaSize.xlarge:
personaClasses.push('ms-Persona--xl');
break;
default:
break;
}
switch (personaPresenceEnum_1.PresenceEnum[attrs.uifPresence]) {
case personaPresenceEnum_1.PresenceEnum.available:
personaClasses.push('ms-Persona--available');
break;
case personaPresenceEnum_1.PresenceEnum.away:
personaClasses.push('ms-Persona--away');
break;
case personaPresenceEnum_1.PresenceEnum.blocked:
personaClasses.push('ms-Persona--blocked');
break;
case personaPresenceEnum_1.PresenceEnum.busy:
personaClasses.push('ms-Persona--busy');
break;
case personaPresenceEnum_1.PresenceEnum.dnd:
personaClasses.push('ms-Persona--dnd');
break;
default:
personaClasses.push('ms-Persona--offline');
break;
}
return personaClasses.join(' ');
};
scope.getPersonaCardClasses = function () {
return personaStyleEnum_1.PersonaStyleEnum[attrs.uifStyle] === personaStyleEnum_1.PersonaStyleEnum.square ? 'ms-PersonaCard--square' : '';
};
transclude(function (clone) {
var detailsWrapper = angular.element(element[0].getElementsByClassName('ms-Persona-details'));
var actionDetailsBoxList = angular.element(element[0].getElementsByClassName('ms-PersonaCard-actionDetailBox'))
.find('ul').eq(0);
var actionsList = angular.element(element[0].getElementsByClassName('ms-PersonaCard-actions'));
for (var i = 0; i < clone.length; i++) {
var tagName = clone[i].tagName;
switch (tagName) {
case 'UIF-PERSONA-CARD-PRIMARY-TEXT':
case 'UIF-PERSONA-CARD-SECONDARY-TEXT':
case 'UIF-PERSONA-CARD-TERTIARY-TEXT':
case 'UIF-PERSONA-CARD-OPTIONAL-TEXT':
detailsWrapper.append(clone[i]);
break;
case 'UIF-PERSONA-CARD-ACTION':
var wrappedAction = angular.element(clone[i]);
var placeholder = wrappedAction.attr('uif-placeholder');
if (placeholderEnum_1.PlaceholderEnum[placeholder] === placeholderEnum_1.PlaceholderEnum.overflow) {
actionsList.append(wrappedAction);
}
else {
actionDetailsBoxList.append(_this.processAction(wrappedAction, scope, personaCardController));
}
break;
default:
break;
}
}
});
};
}
PersonaCardDirective.factory = function () {
var directive = function () { return new PersonaCardDirective(); };
return directive;
};
PersonaCardDirective.prototype.processAction = function (clone, scope, personaCardController) {
var classToAdd = '';
var placeholder = clone.attr('uif-placeholder');
var icon = clone.attr('uif-icon');
var actionToAdd = new PersonaCardAction(icon, placeholder);
switch (placeholder) {
case placeholderEnum_1.PlaceholderEnum[placeholderEnum_1.PlaceholderEnum.regular]:
classToAdd = 'detail-' + (++scope.regularActionsCount);
break;
case placeholderEnum_1.PlaceholderEnum[placeholderEnum_1.PlaceholderEnum.topright]:
classToAdd = 'detail-5';
break;
default:
break;
}
clone.find('li').eq(0).addClass(classToAdd);
actionToAdd.detailClass = classToAdd;
personaCardController.addAction(actionToAdd);
return clone;
};
return PersonaCardDirective;
}());
exports.PersonaCardDirective = PersonaCardDirective;
var PersonaCardController = (function () {
function PersonaCardController($log, $scope) {
var _this = this;
this.$log = $log;
this.$scope = $scope;
this.detailCss = {
1: 'Chat',
2: 'Phone',
3: 'Video',
4: 'Mail',
5: 'Org'
};
$scope.personaCardActions = new Array();
$scope.regularActionsCount = 0;
$scope.detailClass = 'ms-PersonaCard-detailChat';
$scope.selectAction = function ($event, action) {
$scope.personaCardActions.forEach(function (value) {
value.isActive = false;
});
action.isActive = true;
var detailNumber = +(action.detailClass.charAt(action.detailClass.length - 1));
$scope.detailClass = 'ms-PersonaCard-detail' + _this.detailCss[detailNumber];
};
}
PersonaCardController.prototype.addAction = function (actionToAdd) {
if (this.$scope.personaCardActions.length === 0) {
actionToAdd.isActive = true;
}
this.$scope.personaCardActions.push(actionToAdd);
};
return PersonaCardController;
}());
PersonaCardController.$inject = ['$log', '$scope'];
exports.PersonaCardController = PersonaCardController;
var PersonaCardAction = (function () {
function PersonaCardAction(icon, placeholder) {
this.icon = icon;
this.placeholder = placeholder;
}
return PersonaCardAction;
}());
var PersonaCardTextDirective = (function () {
function PersonaCardTextDirective(directiveType) {
var _this = this;
this.directiveType = directiveType;
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.scope = false;
this.availableClasses = {
'optional': 'ms-Persona-optionalText',
'primary': 'ms-Persona-primaryText',
'secondary': 'ms-Persona-secondaryText',
'tertiary': 'ms-Persona-tertiaryText'
};
this.template = function ($element, $attrs) {
var directiveTemplate = '';
return directiveTemplate;
};
if (angular.isUndefined(this.availableClasses[this.directiveType])) {
this.directiveType = 'optional';
}
}
PersonaCardTextDirective.factory = function (type) {
var directive = function () { return new PersonaCardTextDirective(type); };
return directive;
};
return PersonaCardTextDirective;
}());
exports.PersonaCardTextDirective = PersonaCardTextDirective;
var PersonaCardActionDirective = (function () {
function PersonaCardActionDirective($log) {
var _this = this;
this.$log = $log;
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.require = '^?uifPersonaCard';
this.scope = false;
this.template = function (instanceElement, actionAttrs) {
if (angular.isDefined(actionAttrs.uifPlaceholder) && angular.isUndefined(placeholderEnum_1.PlaceholderEnum[actionAttrs.uifPlaceholder])) {
_this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.personacard - ' +
'"' + actionAttrs.uifPlaceholder + '" is not a valid value for uifPlaceholder. It should be regular, topright or overflow.');
return '';
}
if (placeholderEnum_1.PlaceholderEnum[actionAttrs.uifPlaceholder] === placeholderEnum_1.PlaceholderEnum.overflow) {
return '';
}
return '';
};
}
PersonaCardActionDirective.factory = function () {
var directive = function ($log) { return new PersonaCardActionDirective($log); };
directive.$inject = ['$log'];
return directive;
};
return PersonaCardActionDirective;
}());
exports.PersonaCardActionDirective = PersonaCardActionDirective;
var PersonaCardDetailLabelDirective = (function () {
function PersonaCardDetailLabelDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.scope = false;
this.template = '';
}
PersonaCardDetailLabelDirective.factory = function () {
var directive = function () { return new PersonaCardDetailLabelDirective(); };
return directive;
};
return PersonaCardDetailLabelDirective;
}());
exports.PersonaCardDetailLabelDirective = PersonaCardDetailLabelDirective;
var PersonaCardDetailLineDirective = (function () {
function PersonaCardDetailLineDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.scope = false;
this.template = '';
}
PersonaCardDetailLineDirective.factory = function () {
var directive = function () { return new PersonaCardDetailLineDirective(); };
return directive;
};
return PersonaCardDetailLineDirective;
}());
exports.PersonaCardDetailLineDirective = PersonaCardDetailLineDirective;
exports.module = angular.module('officeuifabric.components.personacard', ['officeuifabric.components'])
.directive('uifPersonaCard', PersonaCardDirective.factory())
.directive('uifPersonaCardAction', PersonaCardActionDirective.factory())
.directive('uifPersonaCardDetailLabel', PersonaCardDetailLabelDirective.factory())
.directive('uifPersonaCardDetailLine', PersonaCardDetailLineDirective.factory())
.directive('uifPersonaCardPrimaryText', PersonaCardTextDirective.factory('primary'))
.directive('uifPersonaCardSecondaryText', PersonaCardTextDirective.factory('secondary'))
.directive('uifPersonaCardTertiaryText', PersonaCardTextDirective.factory('tertiary'))
.directive('uifPersonaCardOptionalText', PersonaCardTextDirective.factory(''));
/***/ }),
/* 46 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PlaceholderEnum;
(function (PlaceholderEnum) {
PlaceholderEnum[PlaceholderEnum["regular"] = 0] = "regular";
PlaceholderEnum[PlaceholderEnum["topright"] = 1] = "topright";
PlaceholderEnum[PlaceholderEnum["overflow"] = 2] = "overflow";
})(PlaceholderEnum = exports.PlaceholderEnum || (exports.PlaceholderEnum = {}));
/***/ }),
/* 47 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PersonaSize;
(function (PersonaSize) {
PersonaSize[PersonaSize["xsmall"] = 0] = "xsmall";
PersonaSize[PersonaSize["small"] = 1] = "small";
PersonaSize[PersonaSize["medium"] = 2] = "medium";
PersonaSize[PersonaSize["large"] = 3] = "large";
PersonaSize[PersonaSize["xlarge"] = 4] = "xlarge";
})(PersonaSize = exports.PersonaSize || (exports.PersonaSize = {}));
/***/ }),
/* 48 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var pivotSizeEnum_1 = __webpack_require__(49);
var pivotTypeEnum_1 = __webpack_require__(50);
var PivotController = (function () {
function PivotController($log, $scope) {
this.$log = $log;
this.$scope = $scope;
$scope.pivotClick = function (index) {
$scope.uifPivots.forEach(function (pivotItem, pivotIndex) {
pivotItem.selected = pivotIndex === index;
if (pivotItem.selected) {
$scope.uifSelected = pivotItem;
}
});
};
}
return PivotController;
}());
PivotController.$inject = ['$log', '$scope'];
exports.PivotController = PivotController;
var PivotItem = (function () {
function PivotItem(title) {
this.title = title;
}
return PivotItem;
}());
exports.PivotItem = PivotItem;
var PivotEllipsisDirective = (function () {
function PivotEllipsisDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.template = '' +
'' +
'' +
'';
this.scope = false;
}
PivotEllipsisDirective.factory = function () {
var directive = function () { return new PivotEllipsisDirective(); };
return directive;
};
return PivotEllipsisDirective;
}());
exports.PivotEllipsisDirective = PivotEllipsisDirective;
var PivotDirective = (function () {
function PivotDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = false;
this.controller = PivotController;
this.require = ['uifPivot'];
this.template = '' +
'' +
'- {{pivot.title}}
' +
'' +
'' +
'
';
this.scope = {
uifPivots: '=?',
uifSelected: '=?',
uifSize: '@',
uifType: '@'
};
}
PivotDirective.factory = function () {
var directive = function () { return new PivotDirective(); };
return directive;
};
PivotDirective.prototype.link = function (scope, intanceElement, attrs, controllers) {
var pivotController = controllers[0];
scope.$watch('uifSize', function (newSize) {
if (angular.isDefined(newSize) && angular.isUndefined(pivotSizeEnum_1.PivotSize[newSize])) {
pivotController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.pivot - Unsupported size: ' +
'"' + newSize + '" is not a valid value for uifSize. It should be regular or large.');
}
});
scope.$watch('uifType', function (newType) {
if (angular.isDefined(newType) && angular.isUndefined(pivotTypeEnum_1.PivotType[newType])) {
pivotController.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.pivot - Unsupported size: ' +
'"' + newType + '" is not a valid value for uifType. It should be regular or tabs.');
}
});
scope.$watch('uifSelected', function (newValue, oldValue) {
if (angular.isDefined(newValue)) {
scope.uifPivots.forEach(function (currentPivot) {
currentPivot.selected = currentPivot.title === newValue.title;
});
var selectedPivots = scope.uifPivots.filter(function (currentPivot) {
return currentPivot.selected;
});
if (selectedPivots.length > 1) {
for (var i = 1; i < selectedPivots.length; i++) {
selectedPivots[i].selected = false;
}
}
}
});
scope.getClasses = function () {
var classes = '';
classes += pivotTypeEnum_1.PivotType[scope.uifType] === pivotTypeEnum_1.PivotType.tabs ? 'ms-Pivot--tabs' : '';
classes += pivotSizeEnum_1.PivotSize[scope.uifSize] === pivotSizeEnum_1.PivotSize.large ? ' ms-Pivot--large' : '';
return classes;
};
};
return PivotDirective;
}());
exports.PivotDirective = PivotDirective;
exports.module = angular.module('officeuifabric.components.pivot', ['officeuifabric.components'])
.directive('uifPivot', PivotDirective.factory())
.directive('uifPivotEllipsis', PivotEllipsisDirective.factory());
/***/ }),
/* 49 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PivotSize;
(function (PivotSize) {
PivotSize[PivotSize["regular"] = 0] = "regular";
PivotSize[PivotSize["large"] = 1] = "large";
})(PivotSize = exports.PivotSize || (exports.PivotSize = {}));
/***/ }),
/* 50 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PivotType;
(function (PivotType) {
PivotType[PivotType["regular"] = 0] = "regular";
PivotType[PivotType["tabs"] = 1] = "tabs";
})(PivotType = exports.PivotType || (exports.PivotType = {}));
/***/ }),
/* 51 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var ProgressIndicatorDirective = (function () {
function ProgressIndicatorDirective(log) {
this.log = log;
this.restrict = 'E';
this.template = '' +
'
{{uifName}}
' +
'
' +
'
{{uifDescription}}
' +
'
';
this.scope = {
uifDescription: '@',
uifName: '@',
uifPercentComplete: '@'
};
ProgressIndicatorDirective.log = log;
}
ProgressIndicatorDirective.factory = function () {
var directive = function (log) { return new ProgressIndicatorDirective(log); };
directive.$inject = ['$log'];
return directive;
};
ProgressIndicatorDirective.prototype.link = function (scope) {
scope.$watch('uifPercentComplete', function (newValue, oldValue) {
if (newValue == null || newValue === '') {
scope.uifPercentComplete = 0;
return;
}
var newPercentComplete = parseFloat(newValue);
if (isNaN(newPercentComplete) || newPercentComplete < 0 || newPercentComplete > 100) {
ProgressIndicatorDirective.log.error('Error [ngOfficeUiFabric] officeuifabric.components.progressindicator - ' +
'Percent complete must be a valid number between 0 and 100.');
scope.uifPercentComplete = Math.max(Math.min(newPercentComplete, 100), 0);
}
});
};
return ProgressIndicatorDirective;
}());
exports.ProgressIndicatorDirective = ProgressIndicatorDirective;
exports.module = angular.module('officeuifabric.components.progressindicator', [
'officeuifabric.components'
])
.directive('uifProgressIndicator', ProgressIndicatorDirective.factory());
/***/ }),
/* 52 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var SearchBoxDirective = (function () {
function SearchBoxDirective() {
this.template = '' +
'' +
'' +
'' +
'
';
this.require = ['?ngModel'];
this.scope = {
placeholder: '=?',
value: '=?ngModel'
};
}
SearchBoxDirective.factory = function () {
var directive = function () { return new SearchBoxDirective(); };
return directive;
};
SearchBoxDirective.prototype.link = function (scope, elem, attrs, controllers) {
var ngModelCtrl;
if (angular.isDefined(controllers) && controllers.length > 0) {
ngModelCtrl = controllers[0];
}
scope.isFocus = false;
scope.isCancel = false;
scope.isLabelHidden = false;
scope.isActive = false;
scope.inputFocus = function () {
scope.isFocus = true;
scope.isLabelHidden = true;
scope.isActive = true;
};
scope.inputChange = function () {
if (ngModelCtrl !== null) {
ngModelCtrl.$setDirty();
}
};
scope.inputBlur = function () {
if (scope.isCancel) {
if (ngModelCtrl !== null) {
ngModelCtrl.$setViewValue('');
}
else {
scope.value = '';
}
scope.isLabelHidden = false;
}
scope.isActive = false;
if (typeof (scope.value) === 'undefined' || scope.value === '') {
scope.isLabelHidden = false;
}
scope.isFocus = scope.isCancel = false;
if (ngModelCtrl !== null) {
ngModelCtrl.$setTouched();
}
};
scope.btnMousedown = function () {
scope.isCancel = true;
};
scope.$watch('value', function (val) {
if (!scope.isFocus) {
if (val && val !== '') {
scope.isLabelHidden = true;
}
else {
scope.isLabelHidden = false;
}
scope.value = val;
if (ngModelCtrl !== null) {
ngModelCtrl.$setViewValue(val);
}
else {
scope.value = val;
}
}
});
scope.$watch('placeholder', function (search) {
scope.placeholder = search;
});
attrs.$observe('disabled', function (disabled) {
scope.isDisabled = !!disabled;
});
};
return SearchBoxDirective;
}());
exports.SearchBoxDirective = SearchBoxDirective;
exports.module = angular.module('officeuifabric.components.searchbox', ['officeuifabric.components'])
.directive('uifSearchbox', SearchBoxDirective.factory());
/***/ }),
/* 53 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var spinnerSizeEnum_1 = __webpack_require__(54);
var SpinnerDirective = (function () {
function SpinnerDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
this.controller = SpinnerController;
this.scope = {
'ngShow': '=',
'uifSize': '@'
};
}
SpinnerDirective.factory = function () {
var directive = function () { return new SpinnerDirective(); };
return directive;
};
SpinnerDirective.prototype.link = function (scope, instanceElement, attrs, controller, $transclude) {
if (angular.isDefined(attrs.uifSize)) {
if (angular.isUndefined(spinnerSizeEnum_1.SpinnerSize[attrs.uifSize])) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.spinner - Unsupported size: ' +
'Spinner size (\'' + attrs.uifSize + '\') is not supported by the Office UI Fabric.');
}
if (spinnerSizeEnum_1.SpinnerSize[attrs.uifSize] === spinnerSizeEnum_1.SpinnerSize.large) {
instanceElement.addClass('ms-Spinner--large');
}
}
if (attrs.ngShow != null) {
scope.$watch('ngShow', function (newVisible, oldVisible, spinnerScope) {
if (newVisible) {
spinnerScope.start();
}
else {
spinnerScope.stop();
}
});
}
else {
scope.start();
}
$transclude(function (clone) {
if (clone.length > 0) {
var wrapper = angular.element('');
wrapper.addClass('ms-Spinner-label').append(clone);
instanceElement.append(wrapper);
}
});
scope.init();
};
return SpinnerDirective;
}());
exports.SpinnerDirective = SpinnerDirective;
var SpinnerController = (function () {
function SpinnerController($scope, $element, $interval, $log) {
var _this = this;
this.$scope = $scope;
this.$element = $element;
this.$interval = $interval;
this.$log = $log;
this._offsetSize = 0.179;
this._numCircles = 8;
this._animationSpeed = 90;
this._circles = [];
$scope.init = function () {
_this._parentSize = spinnerSizeEnum_1.SpinnerSize[_this.$scope.uifSize] === spinnerSizeEnum_1.SpinnerSize.large ? 28 : 20;
_this.createCirclesAndArrange();
_this.setInitialOpacity();
};
$scope.start = function () {
_this._animationInterval = $interval(function () {
var i = _this._circles.length;
while (i--) {
_this.fadeCircle(_this._circles[i]);
}
}, _this._animationSpeed);
};
$scope.stop = function () {
$interval.cancel(_this._animationInterval);
};
}
SpinnerController.prototype.createCirclesAndArrange = function () {
var angle = 0;
var offset = this._parentSize * this._offsetSize;
var step = (2 * Math.PI) / this._numCircles;
var i = this._numCircles;
var radius = (this._parentSize - offset) * 0.5;
while (i--) {
var circle = this.createCircle();
var x = Math.round(this._parentSize * 0.5 + radius * Math.cos(angle) - circle[0].clientWidth * 0.5) - offset * 0.5;
var y = Math.round(this._parentSize * 0.5 + radius * Math.sin(angle) - circle[0].clientHeight * 0.5) - offset * 0.5;
this.$element.append(circle);
circle.css('left', (x + 'px'));
circle.css('top', (y + 'px'));
angle += step;
var circleObject = new CircleObject(circle, i);
this._circles.push(circleObject);
}
};
SpinnerController.prototype.createCircle = function () {
var circle = angular.element('');
var dotSize = (this._parentSize * this._offsetSize) + 'px';
circle.addClass('ms-Spinner-circle').css('width', dotSize).css('height', dotSize);
return circle;
};
SpinnerController.prototype.setInitialOpacity = function () {
var _this = this;
var opcaityToSet;
this._fadeIncrement = 1 / this._numCircles;
this._circles.forEach(function (circle, index) {
opcaityToSet = (_this._fadeIncrement * (index + 1));
circle.opacity = opcaityToSet;
});
};
SpinnerController.prototype.fadeCircle = function (circle) {
var newOpacity = circle.opacity - this._fadeIncrement;
if (newOpacity <= 0) {
newOpacity = 1;
}
circle.opacity = newOpacity;
};
return SpinnerController;
}());
SpinnerController.$inject = ['$scope', '$element', '$interval', '$log'];
var CircleObject = (function () {
function CircleObject(circleElement, circleIndex) {
this.circleElement = circleElement;
this.circleIndex = circleIndex;
}
Object.defineProperty(CircleObject.prototype, "opacity", {
get: function () {
return +(this.circleElement.css('opacity'));
},
set: function (opacity) {
this.circleElement.css('opacity', opacity);
},
enumerable: true,
configurable: true
});
return CircleObject;
}());
exports.module = angular.module('officeuifabric.components.spinner', ['officeuifabric.components'])
.directive('uifSpinner', SpinnerDirective.factory());
/***/ }),
/* 54 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var SpinnerSize;
(function (SpinnerSize) {
SpinnerSize[SpinnerSize["small"] = 0] = "small";
SpinnerSize[SpinnerSize["large"] = 1] = "large";
})(SpinnerSize = exports.SpinnerSize || (exports.SpinnerSize = {}));
/***/ }),
/* 55 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var tableRowSelectModeEnum_1 = __webpack_require__(56);
var tableTypeEnum_1 = __webpack_require__(57);
var TableController = (function () {
function TableController($scope, $log) {
this.$scope = $scope;
this.$log = $log;
this.$scope.orderBy = null;
this.$scope.orderAsc = true;
this.$scope.rows = [];
if (!this.$scope.selectedItems) {
this.$scope.selectedItems = [];
}
}
Object.defineProperty(TableController.prototype, "orderBy", {
get: function () {
return this.$scope.orderBy;
},
set: function (property) {
this.$scope.orderBy = property;
this.$scope.$digest();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TableController.prototype, "orderAsc", {
get: function () {
return this.$scope.orderAsc;
},
set: function (orderAsc) {
this.$scope.orderAsc = orderAsc;
this.$scope.$digest();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TableController.prototype, "rowSelectMode", {
get: function () {
return this.$scope.rowSelectMode;
},
set: function (rowSelectMode) {
if (tableRowSelectModeEnum_1.TableRowSelectModeEnum[rowSelectMode] === undefined) {
this.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.table. ' +
'\'' + rowSelectMode + '\' is not a valid option for \'uif-row-select-mode\'. ' +
'Valid options are none|single|multiple.');
}
this.$scope.rowSelectMode = rowSelectMode;
this.$scope.$digest();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TableController.prototype, "rows", {
get: function () {
return this.$scope.rows;
},
set: function (rows) {
this.$scope.rows = rows;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TableController.prototype, "selectedItems", {
get: function () {
return this.$scope.selectedItems;
},
enumerable: true,
configurable: true
});
return TableController;
}());
TableController.$inject = ['$scope', '$log'];
var TableDirective = (function () {
function TableDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '';
this.controller = TableController;
this.controllerAs = 'table';
}
TableDirective.factory = function () {
var directive = function () { return new TableDirective(); };
return directive;
};
TableDirective.prototype.link = function (scope, instanceElement, attrs, controller) {
if (attrs.uifSelectedItems !== undefined && attrs.uifSelectedItems !== null) {
var selectedItems = null;
selectedItems = scope.$eval(attrs.uifSelectedItems);
if (selectedItems === undefined || selectedItems === null) {
selectedItems = [];
}
scope.selectedItems = selectedItems;
}
if (attrs.uifRowSelectMode !== undefined && attrs.uifRowSelectMode !== null) {
if (tableRowSelectModeEnum_1.TableRowSelectModeEnum[attrs.uifRowSelectMode] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.table. ' +
'\'' + attrs.uifRowSelectMode + '\' is not a valid option for \'uif-row-select-mode\'. ' +
'Valid options are none|single|multiple.');
}
else {
scope.rowSelectMode = attrs.uifRowSelectMode;
}
}
if (scope.rowSelectMode === undefined) {
scope.rowSelectMode = tableRowSelectModeEnum_1.TableRowSelectModeEnum[tableRowSelectModeEnum_1.TableRowSelectModeEnum.none];
}
if (attrs.uifTableType !== undefined && attrs.uifTableType !== null) {
if (tableTypeEnum_1.TableTypeEnum[attrs.uifTableType] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.table. ' +
'\'' + attrs.uifTableType + '\' is not a valid option for \'uif-table-type\'. ' +
'Valid options are fixed|fluid.');
}
else {
scope.tableType = attrs.uifTableType;
}
}
if (scope.tableType === undefined) {
scope.tableType = tableTypeEnum_1.TableTypeEnum[tableTypeEnum_1.TableTypeEnum.fluid];
}
if (scope.tableType === tableTypeEnum_1.TableTypeEnum[tableTypeEnum_1.TableTypeEnum.fixed]) {
scope.tableTypeClass = 'ms-Table--fixed';
}
};
return TableDirective;
}());
exports.TableDirective = TableDirective;
var TableRowController = (function () {
function TableRowController($scope, $log) {
this.$scope = $scope;
this.$log = $log;
}
Object.defineProperty(TableRowController.prototype, "item", {
get: function () {
return this.$scope.item;
},
set: function (item) {
this.$scope.item = item;
this.$scope.$digest();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TableRowController.prototype, "selected", {
get: function () {
return this.$scope.selected;
},
set: function (selected) {
this.$scope.selected = selected;
this.$scope.$digest();
},
enumerable: true,
configurable: true
});
return TableRowController;
}());
TableRowController.$inject = ['$scope', '$log'];
var TableRowDirective = (function () {
function TableRowDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = '
';
this.require = '^uifTable';
this.scope = {
item: '=uifItem'
};
this.controller = TableRowController;
}
TableRowDirective.factory = function () {
var directive = function () { return new TableRowDirective(); };
return directive;
};
TableRowDirective.prototype.link = function (scope, instanceElement, attrs, table) {
if (attrs.uifSelected !== undefined &&
attrs.uifSelected !== null) {
var selectedString = attrs.uifSelected.toLowerCase();
if (selectedString !== 'true' && selectedString !== 'false') {
table.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.table. ' +
'\'' + attrs.uifSelected + '\' is not a valid boolean value. ' +
'Valid options are true|false.');
}
else {
if (selectedString === 'true') {
scope.selected = true;
}
}
}
if (scope.item !== undefined) {
table.rows.push(scope);
}
scope.rowClick = function (ev) {
scope.selected = !scope.selected;
scope.$apply();
};
scope.$watch('selected', function (newValue, oldValue, tableRowScope) {
if (newValue === true) {
if (table.rowSelectMode === tableRowSelectModeEnum_1.TableRowSelectModeEnum[tableRowSelectModeEnum_1.TableRowSelectModeEnum.single]) {
if (table.rows) {
for (var i = 0; i < table.rows.length; i++) {
if (table.rows[i] !== tableRowScope) {
table.rows[i].selected = false;
}
}
table.selectedItems.splice(0, table.selectedItems.length - 1);
table.selectedItems.push(tableRowScope.item);
}
}
var itemAlreadySelected = false;
for (var i = 0; i < table.selectedItems.length; i++) {
if (table.selectedItems[i] === tableRowScope.item) {
itemAlreadySelected = true;
break;
}
}
if (!itemAlreadySelected) {
table.selectedItems.push(tableRowScope.item);
}
instanceElement.addClass('is-selected');
}
else {
for (var i = 0; i < table.selectedItems.length; i++) {
if (table.selectedItems[i] === tableRowScope.item) {
table.selectedItems.splice(i, 1);
break;
}
}
instanceElement.removeClass('is-selected');
}
});
if (table.rowSelectMode !== tableRowSelectModeEnum_1.TableRowSelectModeEnum[tableRowSelectModeEnum_1.TableRowSelectModeEnum.none] &&
scope.item !== undefined) {
instanceElement.on('click', scope.rowClick);
}
if (table.rowSelectMode === tableRowSelectModeEnum_1.TableRowSelectModeEnum[tableRowSelectModeEnum_1.TableRowSelectModeEnum.none]) {
instanceElement.css('cursor', 'default');
}
};
return TableRowDirective;
}());
exports.TableRowDirective = TableRowDirective;
var TableRowSelectDirective = (function () {
function TableRowSelectDirective() {
this.restrict = 'E';
this.template = ' | ';
this.replace = true;
this.require = ['^uifTable', '?^uifTableHead', '^uifTableRow'];
}
TableRowSelectDirective.factory = function () {
var directive = function () { return new TableRowSelectDirective(); };
return directive;
};
TableRowSelectDirective.prototype.link = function (scope, instanceElement, attrs, controllers) {
var thead = controllers[1];
if (thead) {
var newElem = angular.element(' | ');
instanceElement.replaceWith(newElem);
instanceElement = newElem;
}
scope.rowSelectClick = function (ev) {
var table = controllers[0];
var row = controllers[2];
if (table.rowSelectMode !== tableRowSelectModeEnum_1.TableRowSelectModeEnum[tableRowSelectModeEnum_1.TableRowSelectModeEnum.multiple]) {
return;
}
if (row.item === undefined || row.item === null) {
var shouldSelectAll = false;
for (var i = 0; i < table.rows.length; i++) {
if (table.rows[i].selected !== true) {
shouldSelectAll = true;
break;
}
}
for (var i = 0; i < table.rows.length; i++) {
if (table.rows[i].selected !== shouldSelectAll) {
table.rows[i].selected = shouldSelectAll;
}
}
scope.$apply();
}
};
instanceElement.on('click', scope.rowSelectClick);
};
return TableRowSelectDirective;
}());
exports.TableRowSelectDirective = TableRowSelectDirective;
var TableCellDirective = (function () {
function TableCellDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = ' | ';
this.replace = true;
}
TableCellDirective.factory = function () {
var directive = function () { return new TableCellDirective(); };
return directive;
};
return TableCellDirective;
}());
exports.TableCellDirective = TableCellDirective;
var TableHeaderDirective = (function () {
function TableHeaderDirective() {
this.restrict = 'E';
this.transclude = true;
this.replace = true;
this.template = ' | ';
this.require = '^uifTable';
}
TableHeaderDirective.factory = function () {
var directive = function () { return new TableHeaderDirective(); };
return directive;
};
TableHeaderDirective.prototype.link = function (scope, instanceElement, attrs, table) {
scope.headerClick = function (ev) {
if (table.orderBy === attrs.uifOrderBy) {
table.orderAsc = !table.orderAsc;
}
else {
table.orderBy = attrs.uifOrderBy;
table.orderAsc = true;
}
};
scope.$watch('table.orderBy', function (newOrderBy, oldOrderBy, tableHeaderScope) {
if (oldOrderBy !== newOrderBy &&
newOrderBy === attrs.uifOrderBy) {
var cells = instanceElement.parent().children();
for (var i = 0; i < cells.length; i++) {
var _children = cells.eq(i).children();
if (_children.length > 0) {
var _sorter = _children.eq(_children.length - 1);
if (_sorter.hasClass('uif-sort-order')) {
_sorter.remove();
}
}
}
instanceElement.append(' \
');
}
});
scope.$watch('table.orderAsc', function (newOrderAsc, oldOrderAsc, tableHeaderScope) {
if (instanceElement.children().length > 0) {
var _sorter = instanceElement.children().eq(instanceElement.children().length - 1);
if (_sorter.hasClass('uif-sort-order')) {
var oldCssClass = oldOrderAsc ? 'ms-Icon--caretDown' : 'ms-Icon--caretUp';
var newCssClass = newOrderAsc ? 'ms-Icon--caretDown' : 'ms-Icon--caretUp';
_sorter.children().eq(0).removeClass(oldCssClass).addClass(newCssClass);
}
}
});
if ('uifOrderBy' in attrs) {
instanceElement.on('click', scope.headerClick);
}
};
return TableHeaderDirective;
}());
exports.TableHeaderDirective = TableHeaderDirective;
var TableHeadController = (function () {
function TableHeadController() {
}
return TableHeadController;
}());
var TableHeadDirective = (function () {
function TableHeadDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = true;
this.controller = TableHeadController;
}
TableHeadDirective.factory = function () {
var directive = function () { return new TableHeadDirective(); };
return directive;
};
return TableHeadDirective;
}());
exports.TableHeadDirective = TableHeadDirective;
var TableBodyDirective = (function () {
function TableBodyDirective() {
this.restrict = 'E';
this.transclude = true;
this.template = '';
this.replace = true;
}
TableBodyDirective.factory = function () {
var directive = function () { return new TableBodyDirective(); };
return directive;
};
return TableBodyDirective;
}());
exports.TableBodyDirective = TableBodyDirective;
exports.module = angular.module('officeuifabric.components.table', ['officeuifabric.components'])
.directive('uifTable', TableDirective.factory())
.directive('uifTableRow', TableRowDirective.factory())
.directive('uifTableRowSelect', TableRowSelectDirective.factory())
.directive('uifTableCell', TableCellDirective.factory())
.directive('uifTableHeader', TableHeaderDirective.factory())
.directive('uifTableHead', TableHeadDirective.factory())
.directive('uifTableBody', TableBodyDirective.factory());
/***/ }),
/* 56 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var TableRowSelectModeEnum;
(function (TableRowSelectModeEnum) {
TableRowSelectModeEnum[TableRowSelectModeEnum["none"] = 0] = "none";
TableRowSelectModeEnum[TableRowSelectModeEnum["single"] = 1] = "single";
TableRowSelectModeEnum[TableRowSelectModeEnum["multiple"] = 2] = "multiple";
})(TableRowSelectModeEnum = exports.TableRowSelectModeEnum || (exports.TableRowSelectModeEnum = {}));
/***/ }),
/* 57 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var TableTypeEnum;
(function (TableTypeEnum) {
TableTypeEnum[TableTypeEnum["fluid"] = 0] = "fluid";
TableTypeEnum[TableTypeEnum["fixed"] = 1] = "fixed";
})(TableTypeEnum = exports.TableTypeEnum || (exports.TableTypeEnum = {}));
/***/ }),
/* 58 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var uifTypeEnum_1 = __webpack_require__(59);
var TextFieldController = (function () {
function TextFieldController($log) {
this.$log = $log;
}
return TextFieldController;
}());
TextFieldController.$inject = ['$log'];
var TextFieldDirective = (function () {
function TextFieldDirective() {
this.controller = TextFieldController;
this.template = '' +
'' +
'' +
'' +
'{{uifDescription}}' +
'
';
this.scope = {
max: '@',
min: '@',
ngChange: '=?',
ngModel: '=?',
ngRequired: '',
placeholder: '@',
step: '@',
uifDescription: '@',
uifLabel: '@',
uifType: '@'
};
this.require = ['uifTextfield', '?ngModel'];
this.restrict = 'E';
}
TextFieldDirective.factory = function () {
var directive = function () { return new TextFieldDirective(); };
return directive;
};
TextFieldDirective.prototype.link = function (scope, instanceElement, attrs, controllers) {
var controller = controllers[0];
var ngModel = controllers[1];
scope.disabled = 'disabled' in attrs;
scope.$watch(function () { return instanceElement.attr('disabled'); }, (function (newValue) { scope.disabled = typeof newValue !== 'undefined'; }));
scope.labelShown = true;
scope.required = 'required' in attrs;
scope.uifMultiline = attrs.uifMultiline === 'true';
scope.uifType = attrs.uifType;
scope.$watch('uifType', function (newValue, oldValue) {
if (typeof newValue !== 'undefined') {
if (uifTypeEnum_1.InputTypeEnum[newValue] === undefined) {
controller.$log.error('Error [ngOfficeUiFabric] officeuifabric.components.textfield - Unsupported type: ' +
'The type (\'' + scope.uifType + '\') is not supported by the Office UI Fabric. ' +
'Supported options are listed here: ' +
'https://github.com/ngOfficeUIFabric/ng-officeuifabric/blob/master/src/components/textfield/uifTypeEnum.ts');
}
}
else {
scope.uifType = uifTypeEnum_1.InputTypeEnum.text;
}
});
scope.$watch('ngRequired', function (newValue, oldValue) {
if (newValue) {
scope.required = true;
}
else if (typeof newValue !== 'undefined') {
scope.required = false;
}
});
scope.uifUnderlined = 'uifUnderlined' in attrs;
scope.inputFocus = function (ev) {
if (scope.placeholder) {
scope.labelShown = false;
}
scope.isActive = true;
};
scope.inputBlur = function (ev) {
var input = instanceElement.find('input');
if (scope.placeholder && input.val().length === 0) {
scope.labelShown = true;
}
scope.isActive = false;
if (angular.isDefined(ngModel) && ngModel != null) {
ngModel.$setTouched();
}
};
scope.labelClick = function (ev) {
if (scope.placeholder) {
var input = scope.uifMultiline ? instanceElement.find('textarea')
: instanceElement.find('input');
input[0].focus();
}
};
scope.inputChange = function (ev) {
if (angular.isDefined(ngModel) && ngModel != null) {
ngModel.$setDirty();
}
};
if (ngModel != null) {
ngModel.$render = function () {
if (scope.placeholder) {
scope.labelShown = !ngModel.$viewValue;
}
};
}
};
return TextFieldDirective;
}());
exports.TextFieldDirective = TextFieldDirective;
exports.module = angular.module('officeuifabric.components.textfield', [
'officeuifabric.components'
])
.directive('uifTextfield', TextFieldDirective.factory());
/***/ }),
/* 59 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var InputTypeEnum;
(function (InputTypeEnum) {
InputTypeEnum[InputTypeEnum["text"] = 0] = "text";
InputTypeEnum[InputTypeEnum["password"] = 1] = "password";
InputTypeEnum[InputTypeEnum["email"] = 2] = "email";
InputTypeEnum[InputTypeEnum["url"] = 3] = "url";
InputTypeEnum[InputTypeEnum["tel"] = 4] = "tel";
InputTypeEnum[InputTypeEnum["range"] = 5] = "range";
InputTypeEnum[InputTypeEnum["number"] = 6] = "number";
})(InputTypeEnum = exports.InputTypeEnum || (exports.InputTypeEnum = {}));
/***/ }),
/* 60 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var angular = __webpack_require__(0);
var ToggleDirective = (function () {
function ToggleDirective() {
this.template = '' +
'' +
'' +
'' +
'
';
this.restrict = 'E';
this.transclude = true;
this.require = ['?ngModel'];
this.scope = {
ngChange: '&?',
ngFalseValue: '@?',
ngModel: '=?',
ngTrueValue: '@?',
uifLabelOff: '@',
uifLabelOn: '@',
uifTextLocation: '@'
};
}
ToggleDirective.factory = function () {
var directive = function () { return new ToggleDirective(); };
return directive;
};
ToggleDirective.prototype.link = function (scope, elem, attrs, ctrls) {
var ngModelCtrl;
if (angular.isDefined(ctrls) && ctrls.length > 0) {
ngModelCtrl = ctrls[0];
}
if (scope.uifTextLocation) {
var loc = scope.uifTextLocation;
loc = loc.charAt(0).toUpperCase() + loc.slice(1);
scope.textLocation = ' ms-Toggle--text' + loc;
}
scope.$watch(function () { return elem.attr('disabled'); }, (function (newValue) { scope.disabled = typeof newValue !== 'undefined'; }));
scope.disabled = 'disabled' in attrs;
scope.checkboxChange = function () {
if (angular.isDefined(ngModelCtrl) && ngModelCtrl !== null) {
ngModelCtrl.$setDirty();
ngModelCtrl.$setTouched();
}
};
};
return ToggleDirective;
}());
exports.ToggleDirective = ToggleDirective;
exports.module = angular.module('officeuifabric.components.toggle', [
'officeuifabric.components'
])
.directive('uifToggle', ToggleDirective.factory());
/***/ }),
/* 61 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var PersonaInitialsColor;
(function (PersonaInitialsColor) {
PersonaInitialsColor[PersonaInitialsColor["lightBlue"] = 0] = "lightBlue";
PersonaInitialsColor[PersonaInitialsColor["blue"] = 1] = "blue";
PersonaInitialsColor[PersonaInitialsColor["darkBlue"] = 2] = "darkBlue";
PersonaInitialsColor[PersonaInitialsColor["teal"] = 3] = "teal";
PersonaInitialsColor[PersonaInitialsColor["lightGreen"] = 4] = "lightGreen";
PersonaInitialsColor[PersonaInitialsColor["green"] = 5] = "green";
PersonaInitialsColor[PersonaInitialsColor["darkGreen"] = 6] = "darkGreen";
PersonaInitialsColor[PersonaInitialsColor["lightPink"] = 7] = "lightPink";
PersonaInitialsColor[PersonaInitialsColor["pink"] = 8] = "pink";
PersonaInitialsColor[PersonaInitialsColor["magenta"] = 9] = "magenta";
PersonaInitialsColor[PersonaInitialsColor["purple"] = 10] = "purple";
PersonaInitialsColor[PersonaInitialsColor["black"] = 11] = "black";
PersonaInitialsColor[PersonaInitialsColor["orange"] = 12] = "orange";
PersonaInitialsColor[PersonaInitialsColor["red"] = 13] = "red";
PersonaInitialsColor[PersonaInitialsColor["darkRed"] = 14] = "darkRed";
})(PersonaInitialsColor = exports.PersonaInitialsColor || (exports.PersonaInitialsColor = {}));
/***/ }),
/* 62 */
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__(7);
module.exports = __webpack_require__(6);
/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA2ZWNjNzg4NTI3NjI1YzZjZGZmOSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJhbmd1bGFyXCIiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvcmUvcGVyc29uYVN0eWxlRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jb250ZXh0dWFsbWVudS9jb250ZXh0dWFsTWVudS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29uL2ljb25FbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3BlcnNvbmEvc2l6ZUVudW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvcmUvcGVyc29uYVByZXNlbmNlRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29yZS9jb21wb25lbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy9jb3JlL2NvcmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvYnJlYWRjcnVtYi9icmVhZGNydW1iRGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2J1dHRvbi9idXR0b25EaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvYnV0dG9uL2J1dHRvblRlbXBsYXRlVHlwZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9idXR0b24vYnV0dG9uVHlwZUVudW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvY2FsbG91dC9jYWxsb3V0QXJyb3dFbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NhbGxvdXQvY2FsbG91dERpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jYWxsb3V0L2NhbGxvdXRUeXBlRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jaG9pY2VmaWVsZC9jaG9pY2VmaWVsZERpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jaG9pY2VmaWVsZC9jaG9pY2VmaWVsZFR5cGVFbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NvbW1hbmRiYXIvY29tbWFuZEJhckRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jb250ZW50L2NvbnRlbnREaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9kYXRlcGlja2VyRGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2RpYWxvZy9kaWFsb2dEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvZGlhbG9nL2RpYWxvZ0VudW1zLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2Ryb3Bkb3duL2Ryb3Bkb3duRGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ZhY2VwaWxlL2ZhY2VwaWxlRGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb24vaWNvbkRpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9sYWJlbC9sYWJlbERpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9saW5rL2xpbmtEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbGlzdC9saXN0RGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2xpc3QvbGlzdEl0ZW1TZWxlY3RNb2RlRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9saXN0L2xpc3RJdGVtVHlwZUVudW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbGlzdC9saXN0TGF5b3V0RW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9tZXNzYWdlYmFubmVyL21lc3NhZ2VCYW5uZXJEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbWVzc2FnZWJhci9tZXNzYWdlQmFyRGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL21lc3NhZ2ViYXIvbWVzc2FnZUJhclR5cGVFbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL25hdmJhci9uYXZiYXJEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvb3JnY2hhcnQvb3JnQ2hhcnREaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvb3JnY2hhcnQvb3JnQ2hhcnRQcmVzZW5jZUVudW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvb3JnY2hhcnQvb3JnQ2hhcnRTZWxlY3RNb2RlRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9vcmdjaGFydC9vcmdDaGFydFN0eWxlRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9vdmVybGF5L292ZXJsYXlEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvb3ZlcmxheS9vdmVybGF5TW9kZUVudW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvcGFuZWwvcGFuZWxEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvcGFuZWwvcGFuZWxEaXJlY3RpdmVFbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3Blb3BsZXBpY2tlci9wZW9wbGVQaWNrZXJEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvcGVyc29uYS9wZXJzb25hRGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3BlcnNvbmFjYXJkL3BlcnNvbmFjYXJkRGlyZWN0aXZlLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3BlcnNvbmFjYXJkL3BsYWNlaG9sZGVyRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9wZXJzb25hY2FyZC9zaXplRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9waXZvdC9waXZvdERpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9waXZvdC9waXZvdFNpemVFbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3Bpdm90L3Bpdm90VHlwZUVudW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvcHJvZ3Jlc3NpbmRpY2F0b3IvcHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvc2VhcmNoYm94L3NlYXJjaGJveERpcmVjdGl2ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9zcGlubmVyL3NwaW5uZXJEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvc3Bpbm5lci9zcGlubmVyU2l6ZUVudW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGVEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGVSb3dTZWxlY3RNb2RlRW51bS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy90YWJsZS90YWJsZVR5cGVFbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3RleHRmaWVsZC90ZXh0RmllbGREaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdGV4dGZpZWxkL3VpZlR5cGVFbnVtLnRzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3RvZ2dsZS90b2dnbGVEaXJlY3RpdmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvcmUvcGVyc29uYUluaXRpYWxzQ29sb3JFbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtREFBMkMsY0FBYzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDaEVBLCtDOzs7Ozs7O0FDQUE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsK0VBQStFOzs7Ozs7OztBQ05oRjtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzQ0FBc0M7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLHlKQUF5SixxREFBcUQ7QUFDOU07QUFDQSxnSEFBZ0gscURBQXFEO0FBQ3JLO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLDhDQUE4QztBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHNDQUFzQztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDL1FBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx1REFBdUQ7Ozs7Ozs7O0FDeFZ4RDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdFQUFnRTs7Ozs7Ozs7QUNWakU7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxtRUFBbUU7Ozs7Ozs7O0FDVnBFO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUNsRUE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBOzs7Ozs7OztBQ0hBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHlDQUF5QyxFQUFFO0FBQzdFO0FBQ0EsU0FBUztBQUNULGtDQUFrQyx3REFBd0QsRUFBRSx3QkFBd0IsaUJBQWlCLEVBQUU7QUFDdkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsNkNBQTZDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMkJBQTJCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMs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QTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDL1FBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsK0JBQStCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDdEJBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixVQUFVO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FB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OztBQ2hEQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFNBQVM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw0QkFBNEI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQzFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw2QkFBNkI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7Ozs7Ozs7QUN0Q0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxVQUFVO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDRCQUE0QjtBQUNqRTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUN2QkE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDRCQUE0QjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsNkJBQTZCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGdDQUFnQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtCQUErQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsdUJBQXVCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLCtCQUErQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLCtCQUErQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDJDQUEyQztBQUNoRjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDZDQUE2QztBQUNsRjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDRDQUE0QztBQUNqRjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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O0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGdDQUFnQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHFDQUFxQztBQUMxRTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDBDQUEwQztBQUMvRTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLG9DQUFvQztBQUN6RTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsMkNBQTJDO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyx1QkFBdUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsdUJBQXVCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhMQUE4TCxPQUFPO0FBQ3JNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMscUNBQXFDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHdDQUF3QztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyx1Q0FBdUM7QUFDNUU7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQywyQ0FBMkM7QUFDaEY7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw2Q0FBNkM7QUFDbEY7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHVCQUF1QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQzNXQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDJGQUEyRjs7Ozs7Ozs7QUNWNUY7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsaUdBQWlHOzs7Ozs7OztBQ05sRztBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrRkFBa0Y7Ozs7Ozs7O0FDTm5GO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCwwQ0FBMEM7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msa0NBQWtDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQzNDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxnRUFBZ0U7Ozs7Ozs7O0FDTmpFO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtTQUFrUztBQUNsUztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQscURBQXFEO0FBQ2xIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsbUNBQW1DO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDcElBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNkRBQTZEOzs7Ozs7OztBQ1Y5RDtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLHNCQUFzQjtBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4Q0FBOEM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxtQ0FBbUM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDJDQUEyQztBQUNoRjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyw2Q0FBNkM7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsOENBQThDO0FBQ25GO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw2Q0FBNkM7QUFDbEY7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7Ozs7Ozs7QUMzRkE7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsK0JBQStCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7Ozs7Ozs7O0FDaEpBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdFQUFnRTs7Ozs7Ozs7QUNOakU7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw2QkFBNkI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxnQ0FBZ0M7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsdUJBQXVCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixnQ0FBZ0M7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixnQ0FBZ0M7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxzQ0FBc0M7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix1QkFBdUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQix1QkFBdUI7QUFD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Q0EsdUVBQXVFLDBCQUEwQjtBQUNqRztBQUNBLDBDQUEwQyxPQUFPO0FBQ2pELDREQUE0RDtBQUM1RCxzQ0FBc0MsMEJBQTBCLDRCQUE0QiwyQkFBMkI7QUFDdkgsMkJBQTJCLE9BQU87QUFDbEMsb0RBQW9ELGFBQWE7QUFDakUsbURBQW1ELFlBQVk7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsOEJBQThCO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyw4QkFBOEIsRUFBRSx3QkFBd0Isa0RBQWtELEVBQUU7QUFDOUk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDekRBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsMkZBQTJGIiwiZmlsZSI6Im5nT2ZmaWNlVWlGYWJyaWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJhbmd1bGFyXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImFuZ3VsYXJcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIHtcblx0XHR2YXIgYSA9IHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyA/IGZhY3RvcnkocmVxdWlyZShcImFuZ3VsYXJcIikpIDogZmFjdG9yeShyb290W1wiYW5ndWxhclwiXSk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzBfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYyKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA2ZWNjNzg4NTI3NjI1YzZjZGZmOSIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8wX187XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJhbmd1bGFyXCJcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUGVyc29uYVN0eWxlRW51bTtcbihmdW5jdGlvbiAoUGVyc29uYVN0eWxlRW51bSkge1xuICAgIFBlcnNvbmFTdHlsZUVudW1bUGVyc29uYVN0eWxlRW51bVtcInJvdW5kXCJdID0gMF0gPSBcInJvdW5kXCI7XG4gICAgUGVyc29uYVN0eWxlRW51bVtQZXJzb25hU3R5bGVFbnVtW1wic3F1YXJlXCJdID0gMV0gPSBcInNxdWFyZVwiO1xufSkoUGVyc29uYVN0eWxlRW51bSA9IGV4cG9ydHMuUGVyc29uYVN0eWxlRW51bSB8fCAoZXhwb3J0cy5QZXJzb25hU3R5bGVFbnVtID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvcmUvcGVyc29uYVN0eWxlRW51bS50c1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgTWVudUl0ZW1UeXBlcztcbihmdW5jdGlvbiAoTWVudUl0ZW1UeXBlcykge1xuICAgIE1lbnVJdGVtVHlwZXNbTWVudUl0ZW1UeXBlc1tcImxpbmtcIl0gPSAwXSA9IFwibGlua1wiO1xuICAgIE1lbnVJdGVtVHlwZXNbTWVudUl0ZW1UeXBlc1tcImRpdmlkZXJcIl0gPSAxXSA9IFwiZGl2aWRlclwiO1xuICAgIE1lbnVJdGVtVHlwZXNbTWVudUl0ZW1UeXBlc1tcImhlYWRlclwiXSA9IDJdID0gXCJoZWFkZXJcIjtcbiAgICBNZW51SXRlbVR5cGVzW01lbnVJdGVtVHlwZXNbXCJzdWJNZW51XCJdID0gM10gPSBcInN1Yk1lbnVcIjtcbn0pKE1lbnVJdGVtVHlwZXMgfHwgKE1lbnVJdGVtVHlwZXMgPSB7fSkpO1xudmFyIENvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29udGV4dHVhbE1lbnVJdGVtRGlyZWN0aXZlKCRsb2cpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gJ151aWZDb250ZXh0dWFsTWVudSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IENvbnRleHR1YWxNZW51SXRlbUNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICBpc1NlbGVjdGVkOiAnPT91aWZJc1NlbGVjdGVkJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICcmbmdDbGljaycsXG4gICAgICAgICAgICB0ZXh0OiAnPT91aWZUZXh0JyxcbiAgICAgICAgICAgIHR5cGU6ICdAdWlmVHlwZSdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzID0ge307XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBmdW5jdGlvbiAoJGVsZW1lbnQsICRhdHRycykge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSAkYXR0cnMudWlmVHlwZTtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRlbXBsYXRlVHlwZXNbTWVudUl0ZW1UeXBlcy5saW5rXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNZW51SXRlbVR5cGVzW3R5cGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5jb250ZXh0dWFsbWVudSAtIHVuc3VwcG9ydGVkIG1lbnUgdHlwZTpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSB0eXBlIFxcJycgKyB0eXBlICsgJ1xcJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IG5nLU9mZmljZSBVSSBGYWJyaWMgYXMgdmFsaWQgdHlwZSBmb3IgY29udGV4dCBtZW51LicgK1xuICAgICAgICAgICAgICAgICAgICAnU3VwcG9ydGVkIHR5cGVzIGNhbiBiZSBmb3VuZCB1bmRlciBNZW51SXRlbVR5cGVzIGVudW0gaGVyZTpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL2NvbnRleHR1YWxtZW51L2NvbnRleHR1YWxNZW51LnRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMudGVtcGxhdGVUeXBlc1tNZW51SXRlbVR5cGVzW3R5cGVdXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5saW5rID0gZnVuY3Rpb24gKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgY29udGV4dHVhbE1lbnVDb250cm9sbGVyLCAkdHJhbnNjbHVkZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAkc2NvcGUuaXNTZWxlY3RlZCAhPT0gJ2Jvb2xlYW4nICYmICRzY29wZS5pc1NlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsTWVudUNvbnRyb2xsZXIuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMuY29udGV4dHVhbG1lbnUgLSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgYXR0cmlidXRlIHR5cGU6IFxcJ3VpZi1pcy1zZWxlY3RlZFxcJy5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1RoZSB0eXBlIFxcJycgKyB0eXBlb2YgJHNjb3BlLmlzU2VsZWN0ZWQgKyAnXFwnIGlzIG5vdCBzdXBwb3J0ZWQgYXMgdmFsaWQgdHlwZSBmb3IgXFwndWlmLWlzLXNlbGVjdGVkXFwnIGF0dHJpYnV0ZSBmb3IgJyArXG4gICAgICAgICAgICAgICAgICAgICc8dWlmLWNvbnRleHR1YWwtbWVudS1pdGVtIC8+LiBUaGUgdmFsaWQgdHlwZSBpcyBib29sZWFuLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJGF0dHJzLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICRzY29wZS5pc0Rpc2FibGVkID0gISFkaXNhYmxlZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX3RoaXMudHJhbnNjbHVkZUNoaWxkcygkc2NvcGUsICRlbGVtZW50LCAkdHJhbnNjbHVkZSk7XG4gICAgICAgICAgICAkc2NvcGUuc2VsZWN0SXRlbSA9IGZ1bmN0aW9uICgkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHR1YWxNZW51Q29udHJvbGxlci5pc011bHRpU2VsZWN0aW9uTWVudSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHR1YWxNZW51Q29udHJvbGxlci5kZXNlbGVjdEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKCRzY29wZS5pc1NlbGVjdGVkKSAmJiAhJHNjb3BlLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmlzU2VsZWN0ZWQgPSAhJHNjb3BlLmlzU2VsZWN0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghJHNjb3BlLmhhc0NoaWxkTWVudSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0dWFsTWVudUNvbnRyb2xsZXIuY2xvc2VTdWJNZW51cyhudWxsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0dWFsTWVudUNvbnRyb2xsZXIuaXNSb290TWVudSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0dWFsTWVudUNvbnRyb2xsZXIuZGVzZWxlY3RJdGVtcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dHVhbE1lbnVDb250cm9sbGVyLmNsb3NlU3ViTWVudXMoJHNjb3BlLiRpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuaGFzQ2hpbGRNZW51KSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5jaGlsZE1lbnVDdHJsLm9wZW5NZW51KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYW5ndWxhci5pc1VuZGVmaW5lZCgkc2NvcGUub25DbGljaykpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm9uQ2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICRzY29wZS4kb24oJ3VpZi1tZW51LWRlc2VsZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICRzY29wZS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICRzY29wZS4kb24oJ3VpZi1tZW51LWNsb3NlJywgZnVuY3Rpb24gKGV2ZW50LCBtZW51SXRlbUlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCRzY29wZS5oYXNDaGlsZE1lbnUgJiYgJHNjb3BlLiRpZCAhPT0gbWVudUl0ZW1JZCkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY2hpbGRNZW51Q3RybC5jbG9zZU1lbnUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzW01lbnVJdGVtVHlwZXMuc3ViTWVudV0gPVxuICAgICAgICAgICAgXCI8bGkgY2xhc3M9XFxcIm1zLUNvbnRleHR1YWxNZW51LWl0ZW1cXFwiPlxcbiAgICAgICAgICA8YSBjbGFzcz1cXFwibXMtQ29udGV4dHVhbE1lbnUtbGluayBtcy1Db250ZXh0dWFsTWVudS1saW5rLS1oYXNNZW51XFxcIlxcbiAgICAgICAgICBuZy1jbGFzcz1cXFwieydpcy1zZWxlY3RlZCc6IGlzU2VsZWN0ZWQsICdpcy1kaXNhYmxlZCc6IGlzRGlzYWJsZWR9XFxcIiBuZy1jbGljaz1cXFwic2VsZWN0SXRlbSgkZXZlbnQpXFxcIiBocmVmPlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSd1aWYtaXRlbS1jb250ZW50Jz48L3NwYW4+PC9hPlxcbiAgICAgICAgICA8aSBjbGFzcz1cXFwibXMtQ29udGV4dHVhbE1lbnUtc3ViTWVudUljb24gbXMtSWNvbiBtcy1JY29uLS1jaGV2cm9uUmlnaHRcXFwiPjwvaT5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwidWlmLWNvbnRleHQtc3VibWVudVxcXCI+PC9kaXY+XFxuICAgICAgIDwvbGk+XCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGVUeXBlc1tNZW51SXRlbVR5cGVzLmxpbmtdID1cbiAgICAgICAgICAgIFwiPGxpIGNsYXNzPVxcXCJtcy1Db250ZXh0dWFsTWVudS1pdGVtXFxcIj5cXG4gICAgICAgICAgICA8YSBjbGFzcz1cXFwibXMtQ29udGV4dHVhbE1lbnUtbGlua1xcXCIgbmctY2xhc3M9XFxcInsnaXMtc2VsZWN0ZWQnOiBpc1NlbGVjdGVkLCAnaXMtZGlzYWJsZWQnOiBpc0Rpc2FibGVkfVxcXCJcXG4gICAgICAgICAgICBuZy1jbGljaz1cXFwic2VsZWN0SXRlbSgkZXZlbnQpXFxcIiBocmVmPjxzcGFuIGNsYXNzPSd1aWYtaXRlbS1jb250ZW50Jz48L3NwYW4+PC9hPlxcbiAgICAgICAgPC9saT5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzW01lbnVJdGVtVHlwZXMuaGVhZGVyXSA9IFwiXFxuICAgIDxsaSBjbGFzcz1cXFwibXMtQ29udGV4dHVhbE1lbnUtaXRlbSBtcy1Db250ZXh0dWFsTWVudS1pdGVtLS1oZWFkZXJcXFwiPlxcbiAgICAgIDxzcGFuIGNsYXNzPSd1aWYtaXRlbS1jb250ZW50Jz48L3NwYW4+XFxuICAgIDwvbGk+XCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGVUeXBlc1tNZW51SXRlbVR5cGVzLmRpdmlkZXJdID0gXCI8bGkgY2xhc3M9XFxcIm1zLUNvbnRleHR1YWxNZW51LWl0ZW0gbXMtQ29udGV4dHVhbE1lbnUtaXRlbS0tZGl2aWRlclxcXCI+PC9saT5cIjtcbiAgICB9XG4gICAgQ29udGV4dHVhbE1lbnVJdGVtRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoJGxvZykgeyByZXR1cm4gbmV3IENvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZSgkbG9nKTsgfTtcbiAgICAgICAgZGlyZWN0aXZlLiRpbmplY3QgPSBbJyRsb2cnXTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIENvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZS5wcm90b3R5cGUudHJhbnNjbHVkZUNoaWxkcyA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkdHJhbnNjbHVkZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAkdHJhbnNjbHVkZShmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgIHZhciBoYXNDb250ZW50ID0gX3RoaXMuaGFzSXRlbUNvbnRlbnQoY2xvbmUpO1xuICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmICEkc2NvcGUudGV4dCAmJiAhJHNjb3BlLmhhc0NoaWxkTWVudSAmJiAkc2NvcGUudHlwZSAhPT0gJ2RpdmlkZXInKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMuY29udGV4dHVhbG1lbnUgLSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3lvdSBuZWVkIHRvIHByb3ZpZGUgYSB0ZXh0IGZvciBhIGNvbnRleHR1YWwgbWVudSBpdGVtLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnRm9yIDx1aWYtY29udGV4dHVhbC1tZW51LWl0ZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkgZWl0aGVyIFxcJ3VpZi10ZXh0XFwnIGFzIGF0dHJpYnV0ZSBvciA8dWlmLWNvbnRlbnQ+IGFzIGEgY2hpbGQgZGlyZWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5pbnNlcnRJdGVtQ29udGVudChjbG9uZSwgJHNjb3BlLCAkZWxlbWVudCk7XG4gICAgICAgICAgICBfdGhpcy5pbnNlcnRTdWJNZW51KGNsb25lLCAkc2NvcGUsICRlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250ZXh0dWFsTWVudUl0ZW1EaXJlY3RpdmUucHJvdG90eXBlLmluc2VydEl0ZW1Db250ZW50ID0gZnVuY3Rpb24gKGNsb25lLCAkc2NvcGUsICRlbGVtZW50KSB7XG4gICAgICAgIHZhciBlbGVtZW50VG9SZXBsYWNlID0gYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy51aWYtaXRlbS1jb250ZW50JykpO1xuICAgICAgICBpZiAodGhpcy5oYXNJdGVtQ29udGVudChjbG9uZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChjbG9uZVtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ3VpZi1jb250ZW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvUmVwbGFjZS5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudFRvUmVwbGFjZS5yZXBsYWNlV2l0aChhbmd1bGFyLmVsZW1lbnQoJzxzcGFuPicgKyAkc2NvcGUudGV4dCArICc8L3NwYW4+JykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb250ZXh0dWFsTWVudUl0ZW1EaXJlY3RpdmUucHJvdG90eXBlLmluc2VydFN1Yk1lbnUgPSBmdW5jdGlvbiAoY2xvbmUsICRzY29wZSwgJGVsZW1lbnQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoY2xvbmVbaV0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ21zLUNvbnRleHR1YWxNZW51JykpIHtcbiAgICAgICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLnVpZi1jb250ZXh0LXN1Ym1lbnUnKSkucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZS5wcm90b3R5cGUuaGFzSXRlbUNvbnRlbnQgPSBmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoY2xvbmVbaV0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ3VpZi1jb250ZW50JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dHVhbE1lbnVJdGVtRGlyZWN0aXZlO1xufSgpKTtcbkNvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lID0gJ3VpZkNvbnRleHR1YWxNZW51SXRlbSc7XG5leHBvcnRzLkNvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZSA9IENvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZTtcbnZhciBDb250ZXh0dWFsTWVudUl0ZW1Db250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250ZXh0dWFsTWVudUl0ZW1Db250cm9sbGVyKCRzY29wZSwgJGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSAkZWxlbWVudDtcbiAgICB9XG4gICAgQ29udGV4dHVhbE1lbnVJdGVtQ29udHJvbGxlci5wcm90b3R5cGUuc2V0Q2hpbGRNZW51ID0gZnVuY3Rpb24gKGNoaWxkTWVudUN0cmwpIHtcbiAgICAgICAgdGhpcy4kc2NvcGUuaGFzQ2hpbGRNZW51ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4kc2NvcGUuY2hpbGRNZW51Q3RybCA9IGNoaWxkTWVudUN0cmw7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dHVhbE1lbnVJdGVtQ29udHJvbGxlcjtcbn0oKSk7XG5Db250ZXh0dWFsTWVudUl0ZW1Db250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckZWxlbWVudCddO1xuZXhwb3J0cy5Db250ZXh0dWFsTWVudUl0ZW1Db250cm9sbGVyID0gQ29udGV4dHVhbE1lbnVJdGVtQ29udHJvbGxlcjtcbnZhciBDb250ZXh0dWFsTWVudURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29udGV4dHVhbE1lbnVEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMucmVxdWlyZSA9IENvbnRleHR1YWxNZW51RGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWU7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIjx1bCBjbGFzcz1cXFwibXMtQ29udGV4dHVhbE1lbnVcXFwiIG5nLXRyYW5zY2x1ZGU+PC91bD5cIjtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gQ29udGV4dHVhbE1lbnVDb250cm9sbGVyO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgY2xvc2VPbkNsaWNrOiAnQHVpZkNsb3NlT25DbGljaycsXG4gICAgICAgICAgICBpc09wZW46ICc9P3VpZklzT3BlbicsXG4gICAgICAgICAgICBtdWx0aXNlbGVjdDogJ0B1aWZNdWx0aXNlbGVjdCdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29udGV4dHVhbE1lbnVEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBDb250ZXh0dWFsTWVudURpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgQ29udGV4dHVhbE1lbnVEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoJHNjb3BlLCAkZWxlbWVudCwgJGF0dHJzLCBjb250ZXh0dWFsTWVudUNvbnRyb2xsZXIpIHtcbiAgICAgICAgdmFyIHNldENsb3NlT25DbGljayA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgJHNjb3BlLmNsb3NlT25DbGljayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUuY2xvc2VPbkNsaWNrID0gdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNldENsb3NlT25DbGljaygkc2NvcGUuY2xvc2VPbkNsaWNrKTtcbiAgICAgICAgJGF0dHJzLiRvYnNlcnZlKCd1aWZDbG9zZU9uQ2xpY2snLCBzZXRDbG9zZU9uQ2xpY2spO1xuICAgICAgICB2YXIgcGFyZW50TWVudUl0ZW1DdHJsID0gJGVsZW1lbnQuY29udHJvbGxlcihDb250ZXh0dWFsTWVudUl0ZW1EaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSk7XG4gICAgICAgIGlmICghYW5ndWxhci5pc1VuZGVmaW5lZChwYXJlbnRNZW51SXRlbUN0cmwpKSB7XG4gICAgICAgICAgICBwYXJlbnRNZW51SXRlbUN0cmwuc2V0Q2hpbGRNZW51KGNvbnRleHR1YWxNZW51Q29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbmd1bGFyLmlzVW5kZWZpbmVkKCRzY29wZS5tdWx0aXNlbGVjdCkgJiYgJHNjb3BlLm11bHRpc2VsZWN0LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoJ21zLUNvbnRleHR1YWxNZW51LS1tdWx0aXNlbGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dHVhbE1lbnVEaXJlY3RpdmU7XG59KCkpO1xuQ29udGV4dHVhbE1lbnVEaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSA9ICd1aWZDb250ZXh0dWFsTWVudSc7XG5leHBvcnRzLkNvbnRleHR1YWxNZW51RGlyZWN0aXZlID0gQ29udGV4dHVhbE1lbnVEaXJlY3RpdmU7XG52YXIgQ29udGV4dHVhbE1lbnVDb250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250ZXh0dWFsTWVudUNvbnRyb2xsZXIoJHNjb3BlLCAkYW5pbWF0ZSwgJGVsZW1lbnQsICRsb2cpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgIHRoaXMuJGFuaW1hdGUgPSAkYW5pbWF0ZTtcbiAgICAgICAgdGhpcy4kZWxlbWVudCA9ICRlbGVtZW50O1xuICAgICAgICB0aGlzLiRsb2cgPSAkbG9nO1xuICAgICAgICB0aGlzLm9uUm9vdE1lbnVDbG9zZWQgPSBbXTtcbiAgICAgICAgdGhpcy5pc09wZW5DbGFzc05hbWUgPSAnaXMtb3Blbic7XG4gICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKCRlbGVtZW50LmNvbnRyb2xsZXIoQ29udGV4dHVhbE1lbnVJdGVtRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUpKSkge1xuICAgICAgICAgICAgJHNjb3BlLmlzUm9vdE1lbnUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgICRzY29wZS4kd2F0Y2goJ2lzT3BlbicsIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5jb250ZXh0dWFsbWVudSAtIGludmFsaWQgYXR0cmlidXRlIHR5cGU6IFxcJ3VpZi1pcy1vcGVuXFwnLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlIHR5cGUgXFwnJyArIHR5cGVvZiBuZXdWYWx1ZSArICdcXCcgaXMgbm90IHN1cHBvcnRlZCBhcyB2YWxpZCB0eXBlIGZvciBcXCd1aWYtaXMtb3BlblxcJyBhdHRyaWJ1dGUgZm9yICcgK1xuICAgICAgICAgICAgICAgICAgICAnPHVpZi1jb250ZXh0dWFsLW1lbnUgLz4uIFRoZSB2YWxpZCB0eXBlIGlzIGJvb2xlYW4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkYW5pbWF0ZVtuZXdWYWx1ZSA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgkZWxlbWVudCwgX3RoaXMuaXNPcGVuQ2xhc3NOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25Sb290TWVudUNsb3NlZC5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLmNsb3NlTWVudSgpO1xuICAgICAgICAgICAgX3RoaXMuZGVzZWxlY3RJdGVtcyh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgICRzY29wZS4kb24oJ3VpZi1tZW51LWNsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCRzY29wZS5pc1Jvb3RNZW51ICYmICRzY29wZS5jbG9zZU9uQ2xpY2spIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5vblJvb3RNZW51Q2xvc2VkLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBDb250ZXh0dWFsTWVudUNvbnRyb2xsZXIucHJvdG90eXBlLmRlc2VsZWN0SXRlbXMgPSBmdW5jdGlvbiAoZGVzZWxlY3RQYXJlbnRNZW51cykge1xuICAgICAgICB0aGlzLiRzY29wZS4kYnJvYWRjYXN0KCd1aWYtbWVudS1kZXNlbGVjdCcpO1xuICAgICAgICBpZiAoZGVzZWxlY3RQYXJlbnRNZW51cykge1xuICAgICAgICAgICAgdGhpcy4kc2NvcGUuJGVtaXQoJ3VpZi1tZW51LWRlc2VsZWN0Jyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRleHR1YWxNZW51Q29udHJvbGxlci5wcm90b3R5cGUuY2xvc2VTdWJNZW51cyA9IGZ1bmN0aW9uIChtZW51SXRlbVRvU2tpcCwgY2xvc2VSb290TWVudSkge1xuICAgICAgICB0aGlzLiRzY29wZS4kYnJvYWRjYXN0KCd1aWYtbWVudS1jbG9zZScsIG1lbnVJdGVtVG9Ta2lwKTtcbiAgICAgICAgaWYgKGNsb3NlUm9vdE1lbnUpIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLiRlbWl0KCd1aWYtbWVudS1jbG9zZScpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb250ZXh0dWFsTWVudUNvbnRyb2xsZXIucHJvdG90eXBlLm9wZW5NZW51ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRzY29wZS5pc09wZW4gPSB0cnVlO1xuICAgIH07XG4gICAgQ29udGV4dHVhbE1lbnVDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZU1lbnUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuJHNjb3BlLmlzT3BlbiA9IGZhbHNlO1xuICAgIH07XG4gICAgQ29udGV4dHVhbE1lbnVDb250cm9sbGVyLnByb3RvdHlwZS5pc1Jvb3RNZW51ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuaXNSb290TWVudTtcbiAgICB9O1xuICAgIENvbnRleHR1YWxNZW51Q29udHJvbGxlci5wcm90b3R5cGUuaXNNdWx0aVNlbGVjdGlvbk1lbnUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHRoaXMuJHNjb3BlLm11bHRpc2VsZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5tdWx0aXNlbGVjdC50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gICAgfTtcbiAgICBDb250ZXh0dWFsTWVudUNvbnRyb2xsZXIucHJvdG90eXBlLmlzTWVudU9wZW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2lzLW9wZW4nKTtcbiAgICB9O1xuICAgIHJldHVybiBDb250ZXh0dWFsTWVudUNvbnRyb2xsZXI7XG59KCkpO1xuQ29udGV4dHVhbE1lbnVDb250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckYW5pbWF0ZScsICckZWxlbWVudCcsICckbG9nJ107XG5leHBvcnRzLkNvbnRleHR1YWxNZW51Q29udHJvbGxlciA9IENvbnRleHR1YWxNZW51Q29udHJvbGxlcjtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMuY29udGV4dHVhbG1lbnUnLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoQ29udGV4dHVhbE1lbnVEaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSwgQ29udGV4dHVhbE1lbnVEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoQ29udGV4dHVhbE1lbnVJdGVtRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUsIENvbnRleHR1YWxNZW51SXRlbURpcmVjdGl2ZS5mYWN0b3J5KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9jb250ZXh0dWFsbWVudS9jb250ZXh0dWFsTWVudS50c1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBJY29uRW51bTtcbihmdW5jdGlvbiAoSWNvbkVudW0pIHtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImFsZXJ0XCJdID0gMF0gPSBcImFsZXJ0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJhbGVydDJcIl0gPSAxXSA9IFwiYWxlcnQyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJhbGVydE91dGxpbmVcIl0gPSAyXSA9IFwiYWxlcnRPdXRsaW5lXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJhcnJvd0Rvd25cIl0gPSAzXSA9IFwiYXJyb3dEb3duXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJhcnJvd0Rvd24yXCJdID0gNF0gPSBcImFycm93RG93bjJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImFycm93RG93bkxlZnRcIl0gPSA1XSA9IFwiYXJyb3dEb3duTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiYXJyb3dEb3duUmlnaHRcIl0gPSA2XSA9IFwiYXJyb3dEb3duUmlnaHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImFycm93TGVmdFwiXSA9IDddID0gXCJhcnJvd0xlZnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImFycm93UmlnaHRcIl0gPSA4XSA9IFwiYXJyb3dSaWdodFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiYXJyb3dVcFwiXSA9IDldID0gXCJhcnJvd1VwXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJhcnJvd1VwMlwiXSA9IDEwXSA9IFwiYXJyb3dVcDJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImFycm93VXBMZWZ0XCJdID0gMTFdID0gXCJhcnJvd1VwTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiYXJyb3dVcFJpZ2h0XCJdID0gMTJdID0gXCJhcnJvd1VwUmlnaHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImFzY2VuZGluZ1wiXSA9IDEzXSA9IFwiYXNjZW5kaW5nXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJhdFwiXSA9IDE0XSA9IFwiYXRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImF0dGFjaG1lbnRcIl0gPSAxNV0gPSBcImF0dGFjaG1lbnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImJhZ1wiXSA9IDE2XSA9IFwiYmFnXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJiYWxsb29uXCJdID0gMTddID0gXCJiYWxsb29uXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJiZWxsXCJdID0gMThdID0gXCJiZWxsXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJib2FyZHNcIl0gPSAxOV0gPSBcImJvYXJkc1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiYm9sZFwiXSA9IDIwXSA9IFwiYm9sZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiYm9va21hcmtcIl0gPSAyMV0gPSBcImJvb2ttYXJrXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJib29rc1wiXSA9IDIyXSA9IFwiYm9va3NcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImJyaWVmY2FzZVwiXSA9IDIzXSA9IFwiYnJpZWZjYXNlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJidW5kbGVcIl0gPSAyNF0gPSBcImJ1bmRsZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2FrZVwiXSA9IDI1XSA9IFwiY2FrZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2FsZW5kYXJcIl0gPSAyNl0gPSBcImNhbGVuZGFyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjYWxlbmRhckRheVwiXSA9IDI3XSA9IFwiY2FsZW5kYXJEYXlcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhbGVuZGFyUHVibGljXCJdID0gMjhdID0gXCJjYWxlbmRhclB1YmxpY1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2FsZW5kYXJXZWVrXCJdID0gMjldID0gXCJjYWxlbmRhcldlZWtcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhbGVuZGFyV29ya1dlZWtcIl0gPSAzMF0gPSBcImNhbGVuZGFyV29ya1dlZWtcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhbWVyYVwiXSA9IDMxXSA9IFwiY2FtZXJhXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjYXJcIl0gPSAzMl0gPSBcImNhclwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2FyZXREb3duXCJdID0gMzNdID0gXCJjYXJldERvd25cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhcmV0RG93bkxlZnRcIl0gPSAzNF0gPSBcImNhcmV0RG93bkxlZnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhcmV0RG93bk91dGxpbmVcIl0gPSAzNV0gPSBcImNhcmV0RG93bk91dGxpbmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhcmV0RG93blJpZ2h0XCJdID0gMzZdID0gXCJjYXJldERvd25SaWdodFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2FyZXRMZWZ0XCJdID0gMzddID0gXCJjYXJldExlZnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhcmV0TGVmdE91dGxpbmVcIl0gPSAzOF0gPSBcImNhcmV0TGVmdE91dGxpbmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhcmV0UmlnaHRcIl0gPSAzOV0gPSBcImNhcmV0UmlnaHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhcmV0UmlnaHRPdXRsaW5lXCJdID0gNDBdID0gXCJjYXJldFJpZ2h0T3V0bGluZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2FyZXRVcFwiXSA9IDQxXSA9IFwiY2FyZXRVcFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2FyZXRVcExlZnRcIl0gPSA0Ml0gPSBcImNhcmV0VXBMZWZ0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjYXJldFVwT3V0bGluZVwiXSA9IDQzXSA9IFwiY2FyZXRVcE91dGxpbmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNhcmV0VXBSaWdodFwiXSA9IDQ0XSA9IFwiY2FyZXRVcFJpZ2h0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjYXJ0XCJdID0gNDVdID0gXCJjYXJ0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjYXRcIl0gPSA0Nl0gPSBcImNhdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hhcnRcIl0gPSA0N10gPSBcImNoYXJ0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaGF0XCJdID0gNDhdID0gXCJjaGF0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaGF0QWRkXCJdID0gNDldID0gXCJjaGF0QWRkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaGVja1wiXSA9IDUwXSA9IFwiY2hlY2tcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNoZWNrYm94XCJdID0gNTFdID0gXCJjaGVja2JveFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hlY2tib3hDaGVja1wiXSA9IDUyXSA9IFwiY2hlY2tib3hDaGVja1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hlY2tib3hFbXB0eVwiXSA9IDUzXSA9IFwiY2hlY2tib3hFbXB0eVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hlY2tib3hNaXhlZFwiXSA9IDU0XSA9IFwiY2hlY2tib3hNaXhlZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hlY2tQZW9wbGVcIl0gPSA1NV0gPSBcImNoZWNrUGVvcGxlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaGV2cm9uRG93blwiXSA9IDU2XSA9IFwiY2hldnJvbkRvd25cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNoZXZyb25MZWZ0XCJdID0gNTddID0gXCJjaGV2cm9uTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvblJpZ2h0XCJdID0gNThdID0gXCJjaGV2cm9uUmlnaHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNoZXZyb25zRG93blwiXSA9IDU5XSA9IFwiY2hldnJvbnNEb3duXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaGV2cm9uc0xlZnRcIl0gPSA2MF0gPSBcImNoZXZyb25zTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvbnNSaWdodFwiXSA9IDYxXSA9IFwiY2hldnJvbnNSaWdodFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvbnNVcFwiXSA9IDYyXSA9IFwiY2hldnJvbnNVcFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvblRoaWNrRG93blwiXSA9IDYzXSA9IFwiY2hldnJvblRoaWNrRG93blwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvblRoaWNrTGVmdFwiXSA9IDY0XSA9IFwiY2hldnJvblRoaWNrTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvblRoaWNrUmlnaHRcIl0gPSA2NV0gPSBcImNoZXZyb25UaGlja1JpZ2h0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaGV2cm9uVGhpY2tVcFwiXSA9IDY2XSA9IFwiY2hldnJvblRoaWNrVXBcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNoZXZyb25UaGluRG93blwiXSA9IDY3XSA9IFwiY2hldnJvblRoaW5Eb3duXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaGV2cm9uVGhpbkxlZnRcIl0gPSA2OF0gPSBcImNoZXZyb25UaGluTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvblRoaW5SaWdodFwiXSA9IDY5XSA9IFwiY2hldnJvblRoaW5SaWdodFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvblRoaW5VcFwiXSA9IDcwXSA9IFwiY2hldnJvblRoaW5VcFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2hldnJvblVwXCJdID0gNzFdID0gXCJjaGV2cm9uVXBcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZUJhbGxcIl0gPSA3Ml0gPSBcImNpcmNsZUJhbGxcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZUJhbGxvb25zXCJdID0gNzNdID0gXCJjaXJjbGVCYWxsb29uc1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2lyY2xlQ2FyXCJdID0gNzRdID0gXCJjaXJjbGVDYXJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZUNhdFwiXSA9IDc1XSA9IFwiY2lyY2xlQ2F0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaXJjbGVDb2ZmZWVcIl0gPSA3Nl0gPSBcImNpcmNsZUNvZmZlZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2lyY2xlRG9nXCJdID0gNzddID0gXCJjaXJjbGVEb2dcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZUVtcHR5XCJdID0gNzhdID0gXCJjaXJjbGVFbXB0eVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2lyY2xlRmlsbFwiXSA9IDc5XSA9IFwiY2lyY2xlRmlsbFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY2lyY2xlRmlsbGVkXCJdID0gODBdID0gXCJjaXJjbGVGaWxsZWRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZUhhbGZGaWxsZWRcIl0gPSA4MV0gPSBcImNpcmNsZUhhbGZGaWxsZWRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZUluZm9cIl0gPSA4Ml0gPSBcImNpcmNsZUluZm9cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZUxpZ2h0bmluZ1wiXSA9IDgzXSA9IFwiY2lyY2xlTGlnaHRuaW5nXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaXJjbGVQaWxsXCJdID0gODRdID0gXCJjaXJjbGVQaWxsXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaXJjbGVQbGFuZVwiXSA9IDg1XSA9IFwiY2lyY2xlUGxhbmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZVBsdXNcIl0gPSA4Nl0gPSBcImNpcmNsZVBsdXNcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNpcmNsZVBvb2RsZVwiXSA9IDg3XSA9IFwiY2lyY2xlUG9vZGxlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjaXJjbGVVbmZpbGxlZFwiXSA9IDg4XSA9IFwiY2lyY2xlVW5maWxsZWRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNsYXNzTm90ZWJvb2tcIl0gPSA4OV0gPSBcImNsYXNzTm90ZWJvb2tcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNsYXNzcm9vbVwiXSA9IDkwXSA9IFwiY2xhc3Nyb29tXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjbG9ja1wiXSA9IDkxXSA9IFwiY2xvY2tcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNsdXR0ZXJcIl0gPSA5Ml0gPSBcImNsdXR0ZXJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNvZmZlZVwiXSA9IDkzXSA9IFwiY29mZmVlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjb2xsYXBzZVwiXSA9IDk0XSA9IFwiY29sbGFwc2VcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImNvbmZsaWN0XCJdID0gOTVdID0gXCJjb25mbGljdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY29udGFjdFwiXSA9IDk2XSA9IFwiY29udGFjdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY29udGFjdEZvcm1cIl0gPSA5N10gPSBcImNvbnRhY3RGb3JtXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjb250YWN0UHVibGljXCJdID0gOThdID0gXCJjb250YWN0UHVibGljXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjb3B5XCJdID0gOTldID0gXCJjb3B5XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJjcmVkaXRDYXJkXCJdID0gMTAwXSA9IFwiY3JlZGl0Q2FyZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiY3JlZGl0Q2FyZE91dGxpbmVcIl0gPSAxMDFdID0gXCJjcmVkaXRDYXJkT3V0bGluZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZGFzaGJvYXJkXCJdID0gMTAyXSA9IFwiZGFzaGJvYXJkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJkZXNjZW5kaW5nXCJdID0gMTAzXSA9IFwiZGVzY2VuZGluZ1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZGVza3RvcFwiXSA9IDEwNF0gPSBcImRlc2t0b3BcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImRldmljZVdpcGVcIl0gPSAxMDVdID0gXCJkZXZpY2VXaXBlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJkaWFscGFkXCJdID0gMTA2XSA9IFwiZGlhbHBhZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZGlyZWN0aW9uc1wiXSA9IDEwN10gPSBcImRpcmVjdGlvbnNcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImRvY3VtZW50XCJdID0gMTA4XSA9IFwiZG9jdW1lbnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImRvY3VtZW50QWRkXCJdID0gMTA5XSA9IFwiZG9jdW1lbnRBZGRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImRvY3VtZW50Rm9yd2FyZFwiXSA9IDExMF0gPSBcImRvY3VtZW50Rm9yd2FyZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZG9jdW1lbnRMYW5kc2NhcGVcIl0gPSAxMTFdID0gXCJkb2N1bWVudExhbmRzY2FwZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZG9jdW1lbnRQREZcIl0gPSAxMTJdID0gXCJkb2N1bWVudFBERlwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZG9jdW1lbnRSZXBseVwiXSA9IDExM10gPSBcImRvY3VtZW50UmVwbHlcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImRvY3VtZW50c1wiXSA9IDExNF0gPSBcImRvY3VtZW50c1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZG9jdW1lbnRTZWFyY2hcIl0gPSAxMTVdID0gXCJkb2N1bWVudFNlYXJjaFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZG9nXCJdID0gMTE2XSA9IFwiZG9nXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJkb2dBbHRcIl0gPSAxMTddID0gXCJkb2dBbHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImRvdFwiXSA9IDExOF0gPSBcImRvdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZG93bmxvYWRcIl0gPSAxMTldID0gXCJkb3dubG9hZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZHJtXCJdID0gMTIwXSA9IFwiZHJtXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJkcm9wXCJdID0gMTIxXSA9IFwiZHJvcFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZHJvcGRvd25cIl0gPSAxMjJdID0gXCJkcm9wZG93blwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZWRpdEJveFwiXSA9IDEyM10gPSBcImVkaXRCb3hcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImVsbGlwc2lzXCJdID0gMTI0XSA9IFwiZWxsaXBzaXNcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImVtYmVkXCJdID0gMTI1XSA9IFwiZW1iZWRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImV2ZW50XCJdID0gMTI2XSA9IFwiZXZlbnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImV2ZW50Q2FuY2VsXCJdID0gMTI3XSA9IFwiZXZlbnRDYW5jZWxcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImV2ZW50SW5mb1wiXSA9IDEyOF0gPSBcImV2ZW50SW5mb1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZXZlbnRSZWN1cnJpbmdcIl0gPSAxMjldID0gXCJldmVudFJlY3VycmluZ1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZXZlbnRTaGFyZVwiXSA9IDEzMF0gPSBcImV2ZW50U2hhcmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImV4Y2xhbWF0aW9uXCJdID0gMTMxXSA9IFwiZXhjbGFtYXRpb25cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImV4cGFuZFwiXSA9IDEzMl0gPSBcImV4cGFuZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZXllXCJdID0gMTMzXSA9IFwiZXllXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmYXZvcml0ZXNcIl0gPSAxMzRdID0gXCJmYXZvcml0ZXNcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZheFwiXSA9IDEzNV0gPSBcImZheFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZmllbGRNYWlsXCJdID0gMTM2XSA9IFwiZmllbGRNYWlsXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmaWVsZE51bWJlclwiXSA9IDEzN10gPSBcImZpZWxkTnVtYmVyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmaWVsZFRleHRcIl0gPSAxMzhdID0gXCJmaWVsZFRleHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZpZWxkVGV4dEJveFwiXSA9IDEzOV0gPSBcImZpZWxkVGV4dEJveFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZmlsZURvY3VtZW50XCJdID0gMTQwXSA9IFwiZmlsZURvY3VtZW50XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmaWxlSW1hZ2VcIl0gPSAxNDFdID0gXCJmaWxlSW1hZ2VcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZpbGVQREZcIl0gPSAxNDJdID0gXCJmaWxlUERGXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmaWx0ZXJcIl0gPSAxNDNdID0gXCJmaWx0ZXJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZpbHRlckNsZWFyXCJdID0gMTQ0XSA9IFwiZmlsdGVyQ2xlYXJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZpcnN0QWlkXCJdID0gMTQ1XSA9IFwiZmlyc3RBaWRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZsYWdcIl0gPSAxNDZdID0gXCJmbGFnXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmb2xkZXJcIl0gPSAxNDddID0gXCJmb2xkZXJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZvbGRlck1vdmVcIl0gPSAxNDhdID0gXCJmb2xkZXJNb3ZlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmb2xkZXJQdWJsaWNcIl0gPSAxNDldID0gXCJmb2xkZXJQdWJsaWNcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZvbGRlclNlYXJjaFwiXSA9IDE1MF0gPSBcImZvbGRlclNlYXJjaFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZm9udENvbG9yXCJdID0gMTUxXSA9IFwiZm9udENvbG9yXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmb250RGVjcmVhc2VcIl0gPSAxNTJdID0gXCJmb250RGVjcmVhc2VcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImZvbnRJbmNyZWFzZVwiXSA9IDE1M10gPSBcImZvbnRJbmNyZWFzZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZnJvd255XCJdID0gMTU0XSA9IFwiZnJvd255XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJmdWxsc2NyZWVuXCJdID0gMTU1XSA9IFwiZnVsbHNjcmVlblwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiZ2VhclwiXSA9IDE1Nl0gPSBcImdlYXJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImdsYXNzZXNcIl0gPSAxNTddID0gXCJnbGFzc2VzXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJnbG9iZVwiXSA9IDE1OF0gPSBcImdsb2JlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJncmFwaFwiXSA9IDE1OV0gPSBcImdyYXBoXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJncm91cFwiXSA9IDE2MF0gPSBcImdyb3VwXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJoZWFkZXJcIl0gPSAxNjFdID0gXCJoZWFkZXJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImhlYXJ0XCJdID0gMTYyXSA9IFwiaGVhcnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImhlYXJ0RW1wdHlcIl0gPSAxNjNdID0gXCJoZWFydEVtcHR5XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJoaWRlXCJdID0gMTY0XSA9IFwiaGlkZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiaG9tZVwiXSA9IDE2NV0gPSBcImhvbWVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImluYm94Q2hlY2tcIl0gPSAxNjZdID0gXCJpbmJveENoZWNrXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJpbmZvXCJdID0gMTY3XSA9IFwiaW5mb1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wiaW5mb0NpcmNsZVwiXSA9IDE2OF0gPSBcImluZm9DaXJjbGVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIml0YWxpY1wiXSA9IDE2OV0gPSBcIml0YWxpY1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wia2V5XCJdID0gMTcwXSA9IFwia2V5XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJsYXRlXCJdID0gMTcxXSA9IFwibGF0ZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibGlmZXNhdmVyXCJdID0gMTcyXSA9IFwibGlmZXNhdmVyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJsaWZlc2F2ZXJMb2NrXCJdID0gMTczXSA9IFwibGlmZXNhdmVyTG9ja1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibGlnaHRCdWxiXCJdID0gMTc0XSA9IFwibGlnaHRCdWxiXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJsaWdodG5pbmdcIl0gPSAxNzVdID0gXCJsaWdodG5pbmdcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImxpbmtcIl0gPSAxNzZdID0gXCJsaW5rXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJsaW5rUmVtb3ZlXCJdID0gMTc3XSA9IFwibGlua1JlbW92ZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibGlzdEJ1bGxldHNcIl0gPSAxNzhdID0gXCJsaXN0QnVsbGV0c1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibGlzdENoZWNrXCJdID0gMTc5XSA9IFwibGlzdENoZWNrXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJsaXN0Q2hlY2tib3hcIl0gPSAxODBdID0gXCJsaXN0Q2hlY2tib3hcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImxpc3RHcm91cFwiXSA9IDE4MV0gPSBcImxpc3RHcm91cFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibGlzdEdyb3VwMlwiXSA9IDE4Ml0gPSBcImxpc3RHcm91cDJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcImxpc3ROdW1iZXJlZFwiXSA9IDE4M10gPSBcImxpc3ROdW1iZXJlZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibG9ja1wiXSA9IDE4NF0gPSBcImxvY2tcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1haWxcIl0gPSAxODVdID0gXCJtYWlsXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtYWlsQ2hlY2tcIl0gPSAxODZdID0gXCJtYWlsQ2hlY2tcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1haWxEb3duXCJdID0gMTg3XSA9IFwibWFpbERvd25cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1haWxFZGl0XCJdID0gMTg4XSA9IFwibWFpbEVkaXRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1haWxFbXB0eVwiXSA9IDE4OV0gPSBcIm1haWxFbXB0eVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibWFpbEVycm9yXCJdID0gMTkwXSA9IFwibWFpbEVycm9yXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtYWlsT3BlblwiXSA9IDE5MV0gPSBcIm1haWxPcGVuXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtYWlsUGF1c2VcIl0gPSAxOTJdID0gXCJtYWlsUGF1c2VcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1haWxQdWJsaWNcIl0gPSAxOTNdID0gXCJtYWlsUHVibGljXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtYWlsUmVhZFwiXSA9IDE5NF0gPSBcIm1haWxSZWFkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtYWlsU2VuZFwiXSA9IDE5NV0gPSBcIm1haWxTZW5kXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtYWlsU3luY1wiXSA9IDE5Nl0gPSBcIm1haWxTeW5jXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtYWlsVW5yZWFkXCJdID0gMTk3XSA9IFwibWFpbFVucmVhZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibWFwTWFya2VyXCJdID0gMTk4XSA9IFwibWFwTWFya2VyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtZWFsXCJdID0gMTk5XSA9IFwibWVhbFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibWVudVwiXSA9IDIwMF0gPSBcIm1lbnVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1lbnUyXCJdID0gMjAxXSA9IFwibWVudTJcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1lcmdlXCJdID0gMjAyXSA9IFwibWVyZ2VcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1ldGFkYXRhXCJdID0gMjAzXSA9IFwibWV0YWRhdGFcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm1pY3JvcGhvbmVcIl0gPSAyMDRdID0gXCJtaWNyb3Bob25lXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtaW5pYXR1cmVzXCJdID0gMjA1XSA9IFwibWluaWF0dXJlc1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibWludXNcIl0gPSAyMDZdID0gXCJtaW51c1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibW9iaWxlXCJdID0gMjA3XSA9IFwibW9iaWxlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtb25leVwiXSA9IDIwOF0gPSBcIm1vbmV5XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJtb3ZlXCJdID0gMjA5XSA9IFwibW92ZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibXVsdGlDaG9pY2VcIl0gPSAyMTBdID0gXCJtdWx0aUNob2ljZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibXVzaWNcIl0gPSAyMTFdID0gXCJtdXNpY1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibmF2aWdhdGVcIl0gPSAyMTJdID0gXCJuYXZpZ2F0ZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibmV3XCJdID0gMjEzXSA9IFwibmV3XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJuZXdzZmVlZFwiXSA9IDIxNF0gPSBcIm5ld3NmZWVkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJub3RlXCJdID0gMjE1XSA9IFwibm90ZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibm90ZWJvb2tcIl0gPSAyMTZdID0gXCJub3RlYm9va1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibm90ZUVkaXRcIl0gPSAyMTddID0gXCJub3RlRWRpdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibm90ZUZvcndhcmRcIl0gPSAyMThdID0gXCJub3RlRm9yd2FyZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wibm90ZVJlcGx5XCJdID0gMjE5XSA9IFwibm90ZVJlcGx5XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJub3RSZWN1cnJpbmdcIl0gPSAyMjBdID0gXCJub3RSZWN1cnJpbmdcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm9uZWRyaXZlXCJdID0gMjIxXSA9IFwib25lZHJpdmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm9ubGluZUFkZFwiXSA9IDIyMl0gPSBcIm9ubGluZUFkZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wib25saW5lSm9pblwiXSA9IDIyM10gPSBcIm9ubGluZUpvaW5cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm9vZlJlcGx5XCJdID0gMjI0XSA9IFwib29mUmVwbHlcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIm9yZ1wiXSA9IDIyNV0gPSBcIm9yZ1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGFnZVwiXSA9IDIyNl0gPSBcInBhZ2VcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBhaW50XCJdID0gMjI3XSA9IFwicGFpbnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBhbmVsXCJdID0gMjI4XSA9IFwicGFuZWxcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBhcnRuZXJcIl0gPSAyMjldID0gXCJwYXJ0bmVyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwYXVzZVwiXSA9IDIzMF0gPSBcInBhdXNlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwZW5jaWxcIl0gPSAyMzFdID0gXCJwZW5jaWxcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBlb3BsZVwiXSA9IDIzMl0gPSBcInBlb3BsZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGVvcGxlQWRkXCJdID0gMjMzXSA9IFwicGVvcGxlQWRkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwZW9wbGVDaGVja1wiXSA9IDIzNF0gPSBcInBlb3BsZUNoZWNrXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwZW9wbGVFcnJvclwiXSA9IDIzNV0gPSBcInBlb3BsZUVycm9yXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwZW9wbGVQYXVzZVwiXSA9IDIzNl0gPSBcInBlb3BsZVBhdXNlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwZW9wbGVSZW1vdmVcIl0gPSAyMzddID0gXCJwZW9wbGVSZW1vdmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBlb3BsZVNlY3VyaXR5XCJdID0gMjM4XSA9IFwicGVvcGxlU2VjdXJpdHlcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBlb3BsZVN5bmNcIl0gPSAyMzldID0gXCJwZW9wbGVTeW5jXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwZXJzb25cIl0gPSAyNDBdID0gXCJwZXJzb25cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBlcnNvbkFkZFwiXSA9IDI0MV0gPSBcInBlcnNvbkFkZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGVyc29uUmVtb3ZlXCJdID0gMjQyXSA9IFwicGVyc29uUmVtb3ZlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwaG9uZVwiXSA9IDI0M10gPSBcInBob25lXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwaG9uZUFkZFwiXSA9IDI0NF0gPSBcInBob25lQWRkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwaG9uZVRyYW5zZmVyXCJdID0gMjQ1XSA9IFwicGhvbmVUcmFuc2ZlclwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGljdHVyZVwiXSA9IDI0Nl0gPSBcInBpY3R1cmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBpY3R1cmVBZGRcIl0gPSAyNDddID0gXCJwaWN0dXJlQWRkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwaWN0dXJlRWRpdFwiXSA9IDI0OF0gPSBcInBpY3R1cmVFZGl0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwaWN0dXJlUmVtb3ZlXCJdID0gMjQ5XSA9IFwicGljdHVyZVJlbW92ZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGlsbFwiXSA9IDI1MF0gPSBcInBpbGxcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBpbkRvd25cIl0gPSAyNTFdID0gXCJwaW5Eb3duXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwaW5MZWZ0XCJdID0gMjUyXSA9IFwicGluTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGxhY2Vob2xkZXJcIl0gPSAyNTNdID0gXCJwbGFjZWhvbGRlclwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGxhbmVcIl0gPSAyNTRdID0gXCJwbGFuZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicGxheVwiXSA9IDI1NV0gPSBcInBsYXlcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBsdXNcIl0gPSAyNTZdID0gXCJwbHVzXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwbHVzMlwiXSA9IDI1N10gPSBcInBsdXMyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJwb2ludEl0ZW1cIl0gPSAyNThdID0gXCJwb2ludEl0ZW1cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInBvcG91dFwiXSA9IDI1OV0gPSBcInBvcG91dFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicG9zdFwiXSA9IDI2MF0gPSBcInBvc3RcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInByaW50XCJdID0gMjYxXSA9IFwicHJpbnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInByb3RlY3Rpb25DZW50ZXJcIl0gPSAyNjJdID0gXCJwcm90ZWN0aW9uQ2VudGVyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJxdWVzdGlvblwiXSA9IDI2M10gPSBcInF1ZXN0aW9uXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJxdWVzdGlvblJldmVyc2VcIl0gPSAyNjRdID0gXCJxdWVzdGlvblJldmVyc2VcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInF1b3RlXCJdID0gMjY1XSA9IFwicXVvdGVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInJhZGlvQnV0dG9uXCJdID0gMjY2XSA9IFwicmFkaW9CdXR0b25cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInJlYWN0aXZhdGVcIl0gPSAyNjddID0gXCJyZWFjdGl2YXRlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJyZWNlaXB0Q2hlY2tcIl0gPSAyNjhdID0gXCJyZWNlaXB0Q2hlY2tcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInJlY2VpcHRGb3J3YXJkXCJdID0gMjY5XSA9IFwicmVjZWlwdEZvcndhcmRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInJlY2VpcHRSZXBseVwiXSA9IDI3MF0gPSBcInJlY2VpcHRSZXBseVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicmVmcmVzaFwiXSA9IDI3MV0gPSBcInJlZnJlc2hcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInJlbG9hZFwiXSA9IDI3Ml0gPSBcInJlbG9hZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicmVwbHlcIl0gPSAyNzNdID0gXCJyZXBseVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicmVwbHlBbGxcIl0gPSAyNzRdID0gXCJyZXBseUFsbFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicmVwbHlBbGxBbHRcIl0gPSAyNzVdID0gXCJyZXBseUFsbEFsdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicmVwbHlBbHRcIl0gPSAyNzZdID0gXCJyZXBseUFsdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wicmliYm9uXCJdID0gMjc3XSA9IFwicmliYm9uXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJyb29tXCJdID0gMjc4XSA9IFwicm9vbVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wic2F2ZVwiXSA9IDI3OV0gPSBcInNhdmVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInNjaGVkdWxpbmdcIl0gPSAyODBdID0gXCJzY2hlZHVsaW5nXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzZWFyY2hcIl0gPSAyODFdID0gXCJzZWFyY2hcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInNlY3Rpb25cIl0gPSAyODJdID0gXCJzZWN0aW9uXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzZWN0aW9uc1wiXSA9IDI4M10gPSBcInNlY3Rpb25zXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzZXR0aW5nc1wiXSA9IDI4NF0gPSBcInNldHRpbmdzXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzaGFyZVwiXSA9IDI4NV0gPSBcInNoYXJlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzaGllbGRcIl0gPSAyODZdID0gXCJzaGllbGRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInNpdGVzXCJdID0gMjg3XSA9IFwic2l0ZXNcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInNtaWxleVwiXSA9IDI4OF0gPSBcInNtaWxleVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wic29jY2VyXCJdID0gMjg5XSA9IFwic29jY2VyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzb2NpYWxMaXN0ZW5pbmdcIl0gPSAyOTBdID0gXCJzb2NpYWxMaXN0ZW5pbmdcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInNvcnRcIl0gPSAyOTFdID0gXCJzb3J0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzb3J0TGluZXNcIl0gPSAyOTJdID0gXCJzb3J0TGluZXNcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInNwbGl0XCJdID0gMjkzXSA9IFwic3BsaXRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInN0YXJcIl0gPSAyOTRdID0gXCJzdGFyXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzdGFyRW1wdHlcIl0gPSAyOTVdID0gXCJzdGFyRW1wdHlcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInN0b3B3YXRjaFwiXSA9IDI5Nl0gPSBcInN0b3B3YXRjaFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wic3RvcnlcIl0gPSAyOTddID0gXCJzdG9yeVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wic3R5bGVSZW1vdmVcIl0gPSAyOThdID0gXCJzdHlsZVJlbW92ZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wic3Vic2NyaWJlXCJdID0gMjk5XSA9IFwic3Vic2NyaWJlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJzdW5cIl0gPSAzMDBdID0gXCJzdW5cIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInN1bkFkZFwiXSA9IDMwMV0gPSBcInN1bkFkZFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wic3VuUXVlc3Rpb25cIl0gPSAzMDJdID0gXCJzdW5RdWVzdGlvblwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1wic3VwcG9ydFwiXSA9IDMwM10gPSBcInN1cHBvcnRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRhYmxlXCJdID0gMzA0XSA9IFwidGFibGVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRhYmxldFwiXSA9IDMwNV0gPSBcInRhYmxldFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widGFnXCJdID0gMzA2XSA9IFwidGFnXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ0YXNrUmVjdXJyaW5nXCJdID0gMzA3XSA9IFwidGFza1JlY3VycmluZ1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widGFza3NcIl0gPSAzMDhdID0gXCJ0YXNrc1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widGVhbXdvcmtcIl0gPSAzMDldID0gXCJ0ZWFtd29ya1wiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widGV4dFwiXSA9IDMxMF0gPSBcInRleHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRleHRCb3hcIl0gPSAzMTFdID0gXCJ0ZXh0Qm94XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ0aWxlXCJdID0gMzEyXSA9IFwidGlsZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widGltZWxpbmVcIl0gPSAzMTNdID0gXCJ0aW1lbGluZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widG9kYXlcIl0gPSAzMTRdID0gXCJ0b2RheVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widG9nZ2xlXCJdID0gMzE1XSA9IFwidG9nZ2xlXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ0b2dnbGVNaWRkbGVcIl0gPSAzMTZdID0gXCJ0b2dnbGVNaWRkbGVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRvdWNoXCJdID0gMzE3XSA9IFwidG91Y2hcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRyYXNoXCJdID0gMzE4XSA9IFwidHJhc2hcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRyaWFuZ2xlRG93blwiXSA9IDMxOV0gPSBcInRyaWFuZ2xlRG93blwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widHJpYW5nbGVFbXB0eURvd25cIl0gPSAzMjBdID0gXCJ0cmlhbmdsZUVtcHR5RG93blwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widHJpYW5nbGVFbXB0eUxlZnRcIl0gPSAzMjFdID0gXCJ0cmlhbmdsZUVtcHR5TGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widHJpYW5nbGVFbXB0eVJpZ2h0XCJdID0gMzIyXSA9IFwidHJpYW5nbGVFbXB0eVJpZ2h0XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ0cmlhbmdsZUVtcHR5VXBcIl0gPSAzMjNdID0gXCJ0cmlhbmdsZUVtcHR5VXBcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRyaWFuZ2xlTGVmdFwiXSA9IDMyNF0gPSBcInRyaWFuZ2xlTGVmdFwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widHJpYW5nbGVSaWdodFwiXSA9IDMyNV0gPSBcInRyaWFuZ2xlUmlnaHRcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInRyaWFuZ2xlVXBcIl0gPSAzMjZdID0gXCJ0cmlhbmdsZVVwXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ0cm9waHlcIl0gPSAzMjddID0gXCJ0cm9waHlcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInVuZGVybGluZVwiXSA9IDMyOF0gPSBcInVuZGVybGluZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widW5zdWJzY3JpYmVcIl0gPSAzMjldID0gXCJ1bnN1YnNjcmliZVwiO1xuICAgIEljb25FbnVtW0ljb25FbnVtW1widXBsb2FkXCJdID0gMzMwXSA9IFwidXBsb2FkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ2aWRlb1wiXSA9IDMzMV0gPSBcInZpZGVvXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ2b2ljZW1haWxcIl0gPSAzMzJdID0gXCJ2b2ljZW1haWxcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInZvaWNlbWFpbEZvcndhcmRcIl0gPSAzMzNdID0gXCJ2b2ljZW1haWxGb3J3YXJkXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ2b2ljZW1haWxSZXBseVwiXSA9IDMzNF0gPSBcInZvaWNlbWFpbFJlcGx5XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ3YWZmbGVcIl0gPSAzMzVdID0gXCJ3YWZmbGVcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcIndvcmtcIl0gPSAzMzZdID0gXCJ3b3JrXCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ3cmVuY2hcIl0gPSAzMzddID0gXCJ3cmVuY2hcIjtcbiAgICBJY29uRW51bVtJY29uRW51bVtcInhcIl0gPSAzMzhdID0gXCJ4XCI7XG4gICAgSWNvbkVudW1bSWNvbkVudW1bXCJ4Q2lyY2xlXCJdID0gMzM5XSA9IFwieENpcmNsZVwiO1xufSkoSWNvbkVudW0gPSBleHBvcnRzLkljb25FbnVtIHx8IChleHBvcnRzLkljb25FbnVtID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvaWNvbi9pY29uRW51bS50c1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBQZXJzb25hU2l6ZTtcbihmdW5jdGlvbiAoUGVyc29uYVNpemUpIHtcbiAgICBQZXJzb25hU2l6ZVtQZXJzb25hU2l6ZVtcInRpbnlcIl0gPSAwXSA9IFwidGlueVwiO1xuICAgIFBlcnNvbmFTaXplW1BlcnNvbmFTaXplW1wieHNtYWxsXCJdID0gMV0gPSBcInhzbWFsbFwiO1xuICAgIFBlcnNvbmFTaXplW1BlcnNvbmFTaXplW1wic21hbGxcIl0gPSAyXSA9IFwic21hbGxcIjtcbiAgICBQZXJzb25hU2l6ZVtQZXJzb25hU2l6ZVtcIm1lZGl1bVwiXSA9IDNdID0gXCJtZWRpdW1cIjtcbiAgICBQZXJzb25hU2l6ZVtQZXJzb25hU2l6ZVtcImxhcmdlXCJdID0gNF0gPSBcImxhcmdlXCI7XG4gICAgUGVyc29uYVNpemVbUGVyc29uYVNpemVbXCJ4bGFyZ2VcIl0gPSA1XSA9IFwieGxhcmdlXCI7XG59KShQZXJzb25hU2l6ZSA9IGV4cG9ydHMuUGVyc29uYVNpemUgfHwgKGV4cG9ydHMuUGVyc29uYVNpemUgPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9wZXJzb25hL3NpemVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFByZXNlbmNlRW51bTtcbihmdW5jdGlvbiAoUHJlc2VuY2VFbnVtKSB7XG4gICAgUHJlc2VuY2VFbnVtW1ByZXNlbmNlRW51bVtcImF2YWlsYWJsZVwiXSA9IDBdID0gXCJhdmFpbGFibGVcIjtcbiAgICBQcmVzZW5jZUVudW1bUHJlc2VuY2VFbnVtW1wiYXdheVwiXSA9IDFdID0gXCJhd2F5XCI7XG4gICAgUHJlc2VuY2VFbnVtW1ByZXNlbmNlRW51bVtcImJsb2NrZWRcIl0gPSAyXSA9IFwiYmxvY2tlZFwiO1xuICAgIFByZXNlbmNlRW51bVtQcmVzZW5jZUVudW1bXCJidXN5XCJdID0gM10gPSBcImJ1c3lcIjtcbiAgICBQcmVzZW5jZUVudW1bUHJlc2VuY2VFbnVtW1wiZG5kXCJdID0gNF0gPSBcImRuZFwiO1xuICAgIFByZXNlbmNlRW51bVtQcmVzZW5jZUVudW1bXCJvZmZsaW5lXCJdID0gNV0gPSBcIm9mZmxpbmVcIjtcbn0pKFByZXNlbmNlRW51bSA9IGV4cG9ydHMuUHJlc2VuY2VFbnVtIHx8IChleHBvcnRzLlByZXNlbmNlRW51bSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb3JlL3BlcnNvbmFQcmVzZW5jZUVudW0udHNcbi8vIG1vZHVsZSBpZCA9IDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIGJyZWFkY3J1bWJNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9icmVhZGNydW1iL2JyZWFkY3J1bWJEaXJlY3RpdmVcIik7XG52YXIgYnV0dG9uTW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvYnV0dG9uL2J1dHRvbkRpcmVjdGl2ZVwiKTtcbnZhciBjYWxsb3V0TW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvY2FsbG91dC9jYWxsb3V0RGlyZWN0aXZlXCIpO1xudmFyIGNob2ljZWZpZWxkTW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvY2hvaWNlZmllbGQvY2hvaWNlZmllbGREaXJlY3RpdmVcIik7XG52YXIgY29tbWFuZEJhck1vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL2NvbW1hbmRiYXIvY29tbWFuZEJhckRpcmVjdGl2ZVwiKTtcbnZhciBjb250ZW50TW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvY29udGVudC9jb250ZW50RGlyZWN0aXZlXCIpO1xudmFyIGNvbnRleHR1YWxNZW51TW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvY29udGV4dHVhbG1lbnUvY29udGV4dHVhbE1lbnVcIik7XG52YXIgZGF0ZXBpY2tlck1vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlckRpcmVjdGl2ZVwiKTtcbnZhciBkaWFsb2dNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9kaWFsb2cvZGlhbG9nRGlyZWN0aXZlXCIpO1xudmFyIGRyb3Bkb3duTW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd25EaXJlY3RpdmVcIik7XG52YXIgZmFjZXBpbGVNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9mYWNlcGlsZS9mYWNlcGlsZURpcmVjdGl2ZVwiKTtcbnZhciBpY29uTW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvaWNvbi9pY29uRGlyZWN0aXZlXCIpO1xudmFyIGxhYmVsTW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvbGFiZWwvbGFiZWxEaXJlY3RpdmVcIik7XG52YXIgbGlua01vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL2xpbmsvbGlua0RpcmVjdGl2ZVwiKTtcbnZhciBsaXN0TW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvbGlzdC9saXN0RGlyZWN0aXZlXCIpO1xudmFyIG1lc3NhZ2VCYW5uZXJNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9tZXNzYWdlYmFubmVyL21lc3NhZ2VCYW5uZXJEaXJlY3RpdmVcIik7XG52YXIgbWVzc2FnZUJhck1vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL21lc3NhZ2ViYXIvbWVzc2FnZUJhckRpcmVjdGl2ZVwiKTtcbnZhciBuYXZCYXJNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9uYXZiYXIvbmF2YmFyRGlyZWN0aXZlXCIpO1xudmFyIG9yZ0NoYXJ0TW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvb3JnY2hhcnQvb3JnQ2hhcnREaXJlY3RpdmVcIik7XG52YXIgb3ZlcmxheU1vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL292ZXJsYXkvb3ZlcmxheURpcmVjdGl2ZVwiKTtcbnZhciBwYW5lbE1vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL3BhbmVsL3BhbmVsRGlyZWN0aXZlXCIpO1xudmFyIHBlb3BsZVBpY2tlck1vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL3Blb3BsZXBpY2tlci9wZW9wbGVQaWNrZXJEaXJlY3RpdmVcIik7XG52YXIgcGVyc29uYWNhcmRNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9wZXJzb25hY2FyZC9wZXJzb25hY2FyZERpcmVjdGl2ZVwiKTtcbnZhciBwZXJzb25hTW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvcGVyc29uYS9wZXJzb25hRGlyZWN0aXZlXCIpO1xudmFyIHBpdm90TW9kdWxlID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvcGl2b3QvcGl2b3REaXJlY3RpdmVcIik7XG52YXIgcHJvZ3Jlc3NJbmRpY2F0b3JNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9wcm9ncmVzc2luZGljYXRvci9wcm9ncmVzc0luZGljYXRvckRpcmVjdGl2ZVwiKTtcbnZhciBzZWFyY2hib3hNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9zZWFyY2hib3gvc2VhcmNoYm94RGlyZWN0aXZlXCIpO1xudmFyIHNwaW5uZXJNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9zcGlubmVyL3NwaW5uZXJEaXJlY3RpdmVcIik7XG52YXIgdGFibGVNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy90YWJsZS90YWJsZURpcmVjdGl2ZVwiKTtcbnZhciB0ZXh0RmllbGRNb2R1bGUgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy90ZXh0ZmllbGQvdGV4dEZpZWxkRGlyZWN0aXZlXCIpO1xudmFyIHRvZ2dsZU1vZHVsZSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL3RvZ2dsZS90b2dnbGVEaXJlY3RpdmVcIik7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJywgW1xuICAgIGJyZWFkY3J1bWJNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgYnV0dG9uTW9kdWxlLm1vZHVsZS5uYW1lLFxuICAgIGNhbGxvdXRNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgY2hvaWNlZmllbGRNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgY29tbWFuZEJhck1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBjb250ZW50TW9kdWxlLm1vZHVsZS5uYW1lLFxuICAgIGNvbnRleHR1YWxNZW51TW9kdWxlLm1vZHVsZS5uYW1lLFxuICAgIGRhdGVwaWNrZXJNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgZGlhbG9nTW9kdWxlLm1vZHVsZS5uYW1lLFxuICAgIGRyb3Bkb3duTW9kdWxlLm1vZHVsZS5uYW1lLFxuICAgIGZhY2VwaWxlTW9kdWxlLm1vZHVsZS5uYW1lLFxuICAgIGljb25Nb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgbGFiZWxNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgbGlua01vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBsaXN0TW9kdWxlLm1vZHVsZS5uYW1lLFxuICAgIG1lc3NhZ2VCYW5uZXJNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgbWVzc2FnZUJhck1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBuYXZCYXJNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgb3JnQ2hhcnRNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgb3ZlcmxheU1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBwYW5lbE1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBwZW9wbGVQaWNrZXJNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgcGVyc29uYWNhcmRNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgcGVyc29uYU1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBwaXZvdE1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBwcm9ncmVzc0luZGljYXRvck1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICBzZWFyY2hib3hNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgc3Bpbm5lck1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICB0YWJsZU1vZHVsZS5tb2R1bGUubmFtZSxcbiAgICB0ZXh0RmllbGRNb2R1bGUubW9kdWxlLm5hbWUsXG4gICAgdG9nZ2xlTW9kdWxlLm1vZHVsZS5uYW1lXG5dKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvcmUvY29tcG9uZW50cy50c1xuLy8gbW9kdWxlIGlkID0gNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb3JlJywgW10pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29yZS9jb3JlLnRzXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBCcmVhZGNydW1iTGlua0RpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnJlYWRjcnVtYkxpbmtEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMucmVxdWlyZSA9ICdedWlmQnJlYWRjcnVtYic7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIlxcbiAgPGxpIGNsYXNzPVxcXCJtcy1CcmVhZGNydW1iLWxpc3RJdGVtXFxcIj5cXG4gICAgPGEgY2xhc3M9XFxcIm1zLUJyZWFkY3J1bWItaXRlbUxpbmtcXFwiIG5nLWhyZWY9XFxcInt7bmdIcmVmfX1cXFwiIHRhYmluZGV4PVxcXCJ7e3VpZlRhYmluZGV4fX1cXFwiIG5nLXRyYW5zY2x1ZGU+PC9hPlxcbiAgICA8aSBjbGFzcz1cXFwibXMtQnJlYWRjcnVtYi1jaGV2cm9uIG1zLUljb24gbXMtSWNvbi0tY2hldnJvblJpZ2h0XFxcIj48L2k+XFxuICA8L2xpPlwiO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgbmdIcmVmOiAnQCdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQnJlYWRjcnVtYkxpbmtEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBCcmVhZGNydW1iTGlua0RpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgQnJlYWRjcnVtYkxpbmtEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cmlidXRlcywgY3RybCwgdHJhbnNjbHVkZSkge1xuICAgICAgICB2YXIgdGFiaW5kZXggPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGluc3RhbmNlRWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpLCBpbnN0YW5jZUVsZW1lbnRbMF0pICsgMjtcbiAgICAgICAgc2NvcGUudWlmVGFiaW5kZXggPSB0YWJpbmRleDtcbiAgICB9O1xuICAgIHJldHVybiBCcmVhZGNydW1iTGlua0RpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkJyZWFkY3J1bWJMaW5rRGlyZWN0aXZlID0gQnJlYWRjcnVtYkxpbmtEaXJlY3RpdmU7XG52YXIgQnJlYWRjcnVtYkxpbmsgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJyZWFkY3J1bWJMaW5rKGhyZWYsIGxpbmtUZXh0KSB7XG4gICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7XG4gICAgICAgIHRoaXMubGlua1RleHQgPSBsaW5rVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIEJyZWFkY3J1bWJMaW5rO1xufSgpKTtcbmV4cG9ydHMuQnJlYWRjcnVtYkxpbmsgPSBCcmVhZGNydW1iTGluaztcbnZhciBCcmVhZGNydW1iQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnJlYWRjcnVtYkNvbnRyb2xsZXIoJHNjb3BlLCAkZG9jdW1lbnQsICR3aW5kb3cpIHtcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgIHRoaXMuJGRvY3VtZW50ID0gJGRvY3VtZW50O1xuICAgICAgICB0aGlzLiR3aW5kb3cgPSAkd2luZG93O1xuICAgIH1cbiAgICByZXR1cm4gQnJlYWRjcnVtYkNvbnRyb2xsZXI7XG59KCkpO1xuQnJlYWRjcnVtYkNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHNjb3BlJywgJyRkb2N1bWVudCcsICckd2luZG93J107XG5leHBvcnRzLkJyZWFkY3J1bWJDb250cm9sbGVyID0gQnJlYWRjcnVtYkNvbnRyb2xsZXI7XG52YXIgQnJlYWRjcnVtYkRpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnJlYWRjcnVtYkRpcmVjdGl2ZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IFwiXFxuICA8ZGl2IGNsYXNzPVxcXCJtcy1CcmVhZGNydW1iXFxcIiBuZy1jbGFzcz1cXFwieydpcy1vdmVyZmxvdyc6IGlzT3ZlcmZsb3coKX1cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJtcy1CcmVhZGNydW1iLW92ZXJmbG93XFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1CcmVhZGNydW1iLW92ZXJmbG93QnV0dG9uIG1zLUljb24gbXMtSWNvbi0tZWxsaXBzaXNcXFwiXFxuICAgICAgICAgICBuZy1jbGljaz1cXFwib3Blbk92ZXJmbG93KCRldmVudClcXFwiIHRhYmluZGV4PVxcXCIxXFxcIj48L2Rpdj5cXG4gICAgICA8aSBjbGFzcz1cXFwibXMtQnJlYWRjcnVtYi1jaGV2cm9uIG1zLUljb24gbXMtSWNvbi0tY2hldnJvblJpZ2h0XFxcIj48L2k+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwibXMtQnJlYWRjcnVtYi1vdmVyZmxvd01lbnVcXFwiIG5nLWNsYXNzPVxcXCJ7J2lzLW9wZW4nOiBvdmVyZmxvd01lbnVPcGVufVxcXCI+XFxuICAgICAgICA8dWwgY2xhc3M9XFxcIm1zLUNvbnRleHR1YWxNZW51IGlzLW9wZW5cXFwiPlxcbiAgICAgICAgICA8bGkgY2xhc3M9XFxcIm1zLUNvbnRleHR1YWxNZW51LWl0ZW1cXFwiXFxuICAgICAgICAgICAgICBuZy1yZXBlYXQ9XFxcImxpbmsgaW4gdWlmQnJlYWRjcnVtYkxpbmtzIHwgbGltaXRUbzpvdmVyZmxvd0VsZW1lbnRzKClcXFwiPlxcbiAgICAgICAgICAgIDxhIGNsYXNzPVxcXCJtcy1Db250ZXh0dWFsTWVudS1saW5rXFxcIiBuZy1ocmVmPVxcXCJ7e2xpbmsuaHJlZn19XFxcIj57e2xpbmsubGlua1RleHR9fTwvYT5cXG4gICAgICAgICAgPC9saT5cXG4gICAgICAgIDwvdWw+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8dWwgY2xhc3M9XFxcIm1zLUJyZWFkY3J1bWItbGlzdFxcXCI+XFxuICAgICAgPHVpZi1icmVhZGNydW1iLWxpbmsgbmctcmVwZWF0PVxcXCJsaW5rIGluIHVpZkJyZWFkY3J1bWJMaW5rcyB8IGxpbWl0VG86LXZpc2libGVFbGVtZW50c1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1ocmVmPVxcXCJ7e2xpbmsuaHJlZn19XFxcIj57e2xpbmsubGlua1RleHR9fTwvdWlmLWJyZWFkY3J1bWItbGluaz5cXG4gICAgPC91bD5cXG4gIDwvZGl2PlwiO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBCcmVhZGNydW1iQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gJ3VpZkJyZWFkY3J1bWInO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgJ3VpZkJyZWFkY3J1bWJMaW5rcyc6ICc9J1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLlNNQUxMX0JSRUFLX1BPSU5UID0gNjM5O1xuICAgICAgICB0aGlzLmxpbmsgPSBmdW5jdGlvbiAoJHNjb3BlLCAkaW5zdGFuY2VFbGVtZW50LCAkYXR0cnMsICRicmVhZGNydW1iQ29udHJvbGxlcikge1xuICAgICAgICAgICAgJHNjb3BlLnZpc2libGVFbGVtZW50cyA9IDQ7XG4gICAgICAgICAgICAkc2NvcGUub3ZlcmZsb3dNZW51T3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgJHNjb3BlLmlzT3ZlcmZsb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG92ZXJmbG93ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBhbmd1bGFyLmlzRGVmaW5lZCgkc2NvcGUudWlmQnJlYWRjcnVtYkxpbmtzKSAmJiAkc2NvcGUudWlmQnJlYWRjcnVtYkxpbmtzLmxlbmd0aCA+ICRzY29wZS52aXNpYmxlRWxlbWVudHM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJmbG93O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICRzY29wZS5vdmVyZmxvd0VsZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkc2NvcGUuaXNPdmVyZmxvdygpID8gJHNjb3BlLnVpZkJyZWFkY3J1bWJMaW5rcy5sZW5ndGggLSAkc2NvcGUudmlzaWJsZUVsZW1lbnRzIDogMDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAkc2NvcGUub3Blbk92ZXJmbG93ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgJHNjb3BlLm92ZXJmbG93TWVudU9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudCgkYnJlYWRjcnVtYkNvbnRyb2xsZXIuJHdpbmRvdykuYmluZCgncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICRzY29wZS5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgICRzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICRicmVhZGNydW1iQ29udHJvbGxlci4kZG9jdW1lbnQuZmluZCgnaHRtbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICRzY29wZS5vdmVyZmxvd01lbnVPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgJHNjb3BlLiRhcHBseSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkc2NvcGUub25SZXNpemUgPSBmdW5jdGlvbiAoaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmIChpbm5lcldpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHNUb1Nob3cgPSAoaW5uZXJXaWR0aCA+IF90aGlzLlNNQUxMX0JSRUFLX1BPSU5UKSA/IDQgOiAyO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1RvU2hvdyAhPT0gJHNjb3BlLnZpc2libGVFbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmlzaWJsZUVsZW1lbnRzID0gZWxlbWVudHNUb1Nob3c7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJHNjb3BlLm9uUmVzaXplKCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIEJyZWFkY3J1bWJEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBCcmVhZGNydW1iRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gQnJlYWRjcnVtYkRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkJyZWFkY3J1bWJEaXJlY3RpdmUgPSBCcmVhZGNydW1iRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5icmVhZGNydW1iJywgWydvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ10pXG4gICAgLmRpcmVjdGl2ZSgndWlmQnJlYWRjcnVtYicsIEJyZWFkY3J1bWJEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkJyZWFkY3J1bWJMaW5rJywgQnJlYWRjcnVtYkxpbmtEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvYnJlYWRjcnVtYi9icmVhZGNydW1iRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBidXR0b25UeXBlRW51bV8xID0gcmVxdWlyZShcIi4vYnV0dG9uVHlwZUVudW1cIik7XG52YXIgYnV0dG9uVGVtcGxhdGVUeXBlXzEgPSByZXF1aXJlKFwiLi9idXR0b25UZW1wbGF0ZVR5cGVcIik7XG52YXIgQnV0dG9uQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnV0dG9uQ29udHJvbGxlcigkbG9nKSB7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgfVxuICAgIHJldHVybiBCdXR0b25Db250cm9sbGVyO1xufSgpKTtcbkJ1dHRvbkNvbnRyb2xsZXIuJGluamVjdCA9IFsnJGxvZyddO1xudmFyIEJ1dHRvbkRpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnV0dG9uRGlyZWN0aXZlKCRsb2cpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBCdXR0b25Db250cm9sbGVyO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJBcyA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLnRlbXBsYXRlT3B0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gZnVuY3Rpb24gKCRlbGVtZW50LCAkYXR0cnMpIHtcbiAgICAgICAgICAgIGlmICghYW5ndWxhci5pc1VuZGVmaW5lZCgkYXR0cnMudWlmVHlwZSkgJiYgYW5ndWxhci5pc1VuZGVmaW5lZChidXR0b25UeXBlRW51bV8xLkJ1dHRvblR5cGVFbnVtWyRhdHRycy51aWZUeXBlXSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5idXR0b24gLSBVbnN1cHBvcnRlZCBidXR0b246ICcgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlIGJ1dHRvbiAoXFwnJyArICRhdHRycy51aWZUeXBlICsgJ1xcJykgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgT2ZmaWNlIFVJIEZhYnJpYy4gJyArXG4gICAgICAgICAgICAgICAgICAgICdTdXBwb3J0ZWQgb3B0aW9ucyBhcmUgbGlzdGVkIGhlcmU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL25nT2ZmaWNlVUlGYWJyaWMvbmctb2ZmaWNldWlmYWJyaWMvYmxvYi9tYXN0ZXIvc3JjL2NvbXBvbmVudHMvYnV0dG9uL2J1dHRvblR5cGVFbnVtLnRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKCRhdHRycy51aWZUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBidXR0b25UeXBlRW51bV8xLkJ1dHRvblR5cGVFbnVtW2J1dHRvblR5cGVFbnVtXzEuQnV0dG9uVHlwZUVudW0ucHJpbWFyeV06XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmlzVW5kZWZpbmVkKCRhdHRycy5uZ0hyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF90aGlzLnRlbXBsYXRlT3B0aW9uc1tidXR0b25UZW1wbGF0ZVR5cGVfMS5CdXR0b25UZW1wbGF0ZVR5cGUucHJpbWFyeUJ1dHRvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3RoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5wcmltYXJ5TGlua107XG4gICAgICAgICAgICAgICAgY2FzZSBidXR0b25UeXBlRW51bV8xLkJ1dHRvblR5cGVFbnVtW2J1dHRvblR5cGVFbnVtXzEuQnV0dG9uVHlwZUVudW0uY29tbWFuZF06XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmlzVW5kZWZpbmVkKCRhdHRycy5uZ0hyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF90aGlzLnRlbXBsYXRlT3B0aW9uc1tidXR0b25UZW1wbGF0ZVR5cGVfMS5CdXR0b25UZW1wbGF0ZVR5cGUuY29tbWFuZEJ1dHRvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3RoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5jb21tYW5kTGlua107XG4gICAgICAgICAgICAgICAgY2FzZSBidXR0b25UeXBlRW51bV8xLkJ1dHRvblR5cGVFbnVtW2J1dHRvblR5cGVFbnVtXzEuQnV0dG9uVHlwZUVudW0uY29tcG91bmRdOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5ndWxhci5pc1VuZGVmaW5lZCgkYXR0cnMubmdIcmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfdGhpcy50ZW1wbGF0ZU9wdGlvbnNbYnV0dG9uVGVtcGxhdGVUeXBlXzEuQnV0dG9uVGVtcGxhdGVUeXBlLmNvbXBvdW5kQnV0dG9uXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdGhpcy50ZW1wbGF0ZU9wdGlvbnNbYnV0dG9uVGVtcGxhdGVUeXBlXzEuQnV0dG9uVGVtcGxhdGVUeXBlLmNvbXBvdW5kTGlua107XG4gICAgICAgICAgICAgICAgY2FzZSBidXR0b25UeXBlRW51bV8xLkJ1dHRvblR5cGVFbnVtW2J1dHRvblR5cGVFbnVtXzEuQnV0dG9uVHlwZUVudW0uaGVyb106XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmlzVW5kZWZpbmVkKCRhdHRycy5uZ0hyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF90aGlzLnRlbXBsYXRlT3B0aW9uc1tidXR0b25UZW1wbGF0ZVR5cGVfMS5CdXR0b25UZW1wbGF0ZVR5cGUuaGVyb0J1dHRvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3RoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5oZXJvTGlua107XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXIuaXNVbmRlZmluZWQoJGF0dHJzLm5nSHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gX3RoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5hY3Rpb25CdXR0b25dXG4gICAgICAgICAgICAgICAgICAgICAgICA6IF90aGlzLnRlbXBsYXRlT3B0aW9uc1tidXR0b25UZW1wbGF0ZVR5cGVfMS5CdXR0b25UZW1wbGF0ZVR5cGUuYWN0aW9uTGlua107XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3BvcHVsYXRlSHRtbFRlbXBsYXRlcygpO1xuICAgIH1cbiAgICBCdXR0b25EaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgkbG9nKSB7IHJldHVybiBuZXcgQnV0dG9uRGlyZWN0aXZlKCRsb2cpOyB9O1xuICAgICAgICBkaXJlY3RpdmUuJGluamVjdCA9IFsnJGxvZyddO1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgQnV0dG9uRGlyZWN0aXZlLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGF0dHJzLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3N0OiB0aGlzLnBvc3RMaW5rLFxuICAgICAgICAgICAgcHJlOiB0aGlzLnByZUxpbmtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEJ1dHRvbkRpcmVjdGl2ZS5wcm90b3R5cGUucHJlTGluayA9IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIGF0dHJzLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uIChpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBzY29wZS5kaXNhYmxlZCA9ICEhaXNEaXNhYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnQub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBCdXR0b25EaXJlY3RpdmUucHJvdG90eXBlLnBvc3RMaW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcnMsIHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQoYXR0cnMudWlmVHlwZSkgfHxcbiAgICAgICAgICAgIGF0dHJzLnVpZlR5cGUgPT09IGJ1dHRvblR5cGVFbnVtXzEuQnV0dG9uVHlwZUVudW1bYnV0dG9uVHlwZUVudW1fMS5CdXR0b25UeXBlRW51bS5wcmltYXJ5XSB8fFxuICAgICAgICAgICAgYXR0cnMudWlmVHlwZSA9PT0gYnV0dG9uVHlwZUVudW1fMS5CdXR0b25UeXBlRW51bVtidXR0b25UeXBlRW51bV8xLkJ1dHRvblR5cGVFbnVtLmNvbXBvdW5kXSkge1xuICAgICAgICAgICAgdmFyIGljb25FbGVtZW50ID0gZWxlbWVudC5maW5kKCd1aWYtaWNvbicpO1xuICAgICAgICAgICAgaWYgKGljb25FbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGljb25FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmJ1dHRvbiAtICcgK1xuICAgICAgICAgICAgICAgICAgICAnSWNvbiBub3QgYWxsb3dlZCBpbiBwcmltYXJ5IG9yIGNvbXBvdW5kIGJ1dHRvbnM6ICcgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlIHByaW1hcnkgJiBjb21wb3VuZCBidXR0b24gZG9lcyBub3Qgc3VwcG9ydCBpbmNsdWRpbmcgaWNvbnMgaW4gdGhlIGJvZHkuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlIGljb24gaGFzIGJlZW4gcmVtb3ZlZCBidXQgbWF5IGNhdXNlIHJlbmRlcmluZyBlcnJvcnMuIENvbnNpZGVyIGJ1dHRvbnMgdGhhdCBzdXBwb3J0IGljb25zIHN1Y2ggYXMgY29tbWFuZCBvciBoZXJvLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyYW5zY2x1ZGUoZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICB2YXIgd3JhcHBlcjtcbiAgICAgICAgICAgIHN3aXRjaCAoYXR0cnMudWlmVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgYnV0dG9uVHlwZUVudW1fMS5CdXR0b25UeXBlRW51bVtidXR0b25UeXBlRW51bV8xLkJ1dHRvblR5cGVFbnVtLmNvbW1hbmRdOlxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2lzVmFsaWRMYWJlbChjbG9uZVtpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gYW5ndWxhci5lbGVtZW50KCc8c3Bhbj48L3NwYW4+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygnbXMtQnV0dG9uLWxhYmVsJykuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZCh3cmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbG9uZVtpXS50YWdOYW1lID09PSAnVUlGLUlDT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlciA9IGFuZ3VsYXIuZWxlbWVudCgnPHNwYW4+PC9zcGFuPicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2xhc3MoJ21zLUJ1dHRvbi1pY29uJykuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZCh3cmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGJ1dHRvblR5cGVFbnVtXzEuQnV0dG9uVHlwZUVudW1bYnV0dG9uVHlwZUVudW1fMS5CdXR0b25UeXBlRW51bS5jb21wb3VuZF06XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbG9uZVtpXS50YWdOYW1lID09PSAnVUlGLUlDT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2lzVmFsaWRMYWJlbChjbG9uZVtpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gYW5ndWxhci5lbGVtZW50KCc8c3Bhbj48L3NwYW4+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDbGFzcygnbXMtQnV0dG9uLWxhYmVsJykuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZCh3cmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGJ1dHRvblR5cGVFbnVtXzEuQnV0dG9uVHlwZUVudW1bYnV0dG9uVHlwZUVudW1fMS5CdXR0b25UeXBlRW51bS5oZXJvXTpcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLl9pc1ZhbGlkTGFiZWwoY2xvbmVbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlciA9IGFuZ3VsYXIuZWxlbWVudCgnPHNwYW4+PC9zcGFuPicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2xhc3MoJ21zLUJ1dHRvbi1sYWJlbCcpLmFwcGVuZChjbG9uZVtpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQod3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xvbmVbaV0udGFnTmFtZSA9PT0gJ1VJRi1JQ09OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIgPSBhbmd1bGFyLmVsZW1lbnQoJzxzcGFuPjwvc3Bhbj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZENsYXNzKCdtcy1CdXR0b24taWNvbicpLmFwcGVuZChjbG9uZVtpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQod3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQnV0dG9uRGlyZWN0aXZlLnByb3RvdHlwZS5faXNWYWxpZExhYmVsID0gZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgIHJldHVybiBjbG9uZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgY2xvbmUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH07XG4gICAgQnV0dG9uRGlyZWN0aXZlLnByb3RvdHlwZS5fcG9wdWxhdGVIdG1sVGVtcGxhdGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlT3B0aW9uc1tidXR0b25UZW1wbGF0ZVR5cGVfMS5CdXR0b25UZW1wbGF0ZVR5cGUuYWN0aW9uQnV0dG9uXSA9XG4gICAgICAgICAgICBcIjxidXR0b24gY2xhc3M9XFxcIm1zLUJ1dHRvblxcXCIgbmctY2xhc3M9XFxcInsnaXMtZGlzYWJsZWQnOiBkaXNhYmxlZH1cXFwiPlxcbiAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtcy1CdXR0b24tbGFiZWxcXFwiIG5nLXRyYW5zY2x1ZGU+PC9zcGFuPlxcbiAgICAgICA8L2J1dHRvbj5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9wdGlvbnNbYnV0dG9uVGVtcGxhdGVUeXBlXzEuQnV0dG9uVGVtcGxhdGVUeXBlLmFjdGlvbkxpbmtdID1cbiAgICAgICAgICAgIFwiPGEgY2xhc3M9XFxcIm1zLUJ1dHRvblxcXCIgbmctY2xhc3M9XFxcInsnaXMtZGlzYWJsZWQnOiBkaXNhYmxlZH1cXFwiPlxcbiAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtcy1CdXR0b24tbGFiZWxcXFwiIG5nLXRyYW5zY2x1ZGU+PC9zcGFuPlxcbiAgICAgICA8L2E+XCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5wcmltYXJ5QnV0dG9uXSA9XG4gICAgICAgICAgICBcIjxidXR0b24gY2xhc3M9XFxcIm1zLUJ1dHRvbiBtcy1CdXR0b24tLXByaW1hcnlcXFwiIG5nLWNsYXNzPVxcXCJ7J2lzLWRpc2FibGVkJzogZGlzYWJsZWR9XFxcIj5cXG4gICAgICAgICA8c3BhbiBjbGFzcz1cXFwibXMtQnV0dG9uLWxhYmVsXFxcIiBuZy10cmFuc2NsdWRlPjwvc3Bhbj5cXG4gICAgICAgPC9idXR0b24+XCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5wcmltYXJ5TGlua10gPVxuICAgICAgICAgICAgXCI8YSBjbGFzcz1cXFwibXMtQnV0dG9uIG1zLUJ1dHRvbi0tcHJpbWFyeVxcXCIgbmctY2xhc3M9XFxcInsnaXMtZGlzYWJsZWQnOiBkaXNhYmxlZH1cXFwiPlxcbiAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtcy1CdXR0b24tbGFiZWxcXFwiIG5nLXRyYW5zY2x1ZGU+PC9zcGFuPlxcbiAgICAgICA8L2E+XCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5jb21tYW5kQnV0dG9uXSA9XG4gICAgICAgICAgICBcIjxidXR0b24gY2xhc3M9XFxcIm1zLUJ1dHRvbiBtcy1CdXR0b24tLWNvbW1hbmRcXFwiIG5nLWNsYXNzPVxcXCJ7J2lzLWRpc2FibGVkJzogZGlzYWJsZWR9XFxcIj48L2J1dHRvbj5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9wdGlvbnNbYnV0dG9uVGVtcGxhdGVUeXBlXzEuQnV0dG9uVGVtcGxhdGVUeXBlLmNvbW1hbmRMaW5rXSA9XG4gICAgICAgICAgICBcIjxhIGNsYXNzPVxcXCJtcy1CdXR0b24gbXMtQnV0dG9uLS1jb21tYW5kXFxcIiBuZy1jbGFzcz1cXFwieydpcy1kaXNhYmxlZCc6IGRpc2FibGVkfVxcXCI+PC9hPlwiO1xuICAgICAgICB0aGlzLnRlbXBsYXRlT3B0aW9uc1tidXR0b25UZW1wbGF0ZVR5cGVfMS5CdXR0b25UZW1wbGF0ZVR5cGUuY29tcG91bmRCdXR0b25dID1cbiAgICAgICAgICAgIFwiPGJ1dHRvbiBjbGFzcz1cXFwibXMtQnV0dG9uIG1zLUJ1dHRvbi0tY29tcG91bmRcXFwiIG5nLWNsYXNzPVxcXCJ7J2lzLWRpc2FibGVkJzogZGlzYWJsZWR9XFxcIj48L2J1dHRvbj5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9wdGlvbnNbYnV0dG9uVGVtcGxhdGVUeXBlXzEuQnV0dG9uVGVtcGxhdGVUeXBlLmNvbXBvdW5kTGlua10gPVxuICAgICAgICAgICAgXCI8YSBjbGFzcz1cXFwibXMtQnV0dG9uIG1zLUJ1dHRvbi0tY29tcG91bmRcXFwiIG5nLWNsYXNzPVxcXCJ7J2lzLWRpc2FibGVkJzogZGlzYWJsZWR9XFxcIj48L2E+XCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb25zW2J1dHRvblRlbXBsYXRlVHlwZV8xLkJ1dHRvblRlbXBsYXRlVHlwZS5oZXJvQnV0dG9uXSA9XG4gICAgICAgICAgICBcIjxidXR0b24gY2xhc3M9XFxcIm1zLUJ1dHRvbiBtcy1CdXR0b24tLWhlcm9cXFwiIG5nLWNsYXNzPVxcXCJ7J2lzLWRpc2FibGVkJzogZGlzYWJsZWR9XFxcIj48L2J1dHRvbj5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9wdGlvbnNbYnV0dG9uVGVtcGxhdGVUeXBlXzEuQnV0dG9uVGVtcGxhdGVUeXBlLmhlcm9MaW5rXSA9XG4gICAgICAgICAgICBcIjxhIGNsYXNzPVxcXCJtcy1CdXR0b24gbXMtQnV0dG9uLS1oZXJvXFxcIiBuZy1jbGFzcz1cXFwieydpcy1kaXNhYmxlZCc6IGRpc2FibGVkfVxcXCI+PC9hPlwiO1xuICAgIH07XG4gICAgcmV0dXJuIEJ1dHRvbkRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkJ1dHRvbkRpcmVjdGl2ZSA9IEJ1dHRvbkRpcmVjdGl2ZTtcbnZhciBCdXR0b25EZXNjcmlwdGlvbkRpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnV0dG9uRGVzY3JpcHRpb25EaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMucmVxdWlyZSA9ICdedWlmQnV0dG9uJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxzcGFuIGNsYXNzPVwibXMtQnV0dG9uLWRlc2NyaXB0aW9uXCIgbmctdHJhbnNjbHVkZT48L3NwYW4+JztcbiAgICB9XG4gICAgQnV0dG9uRGVzY3JpcHRpb25EaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBCdXR0b25EZXNjcmlwdGlvbkRpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIEJ1dHRvbkRlc2NyaXB0aW9uRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuQnV0dG9uRGVzY3JpcHRpb25EaXJlY3RpdmUgPSBCdXR0b25EZXNjcmlwdGlvbkRpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMuYnV0dG9uJywgW1xuICAgICdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ1xuXSlcbiAgICAuZGlyZWN0aXZlKCd1aWZCdXR0b24nLCBCdXR0b25EaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkJ1dHRvbkRlc2NyaXB0aW9uJywgQnV0dG9uRGVzY3JpcHRpb25EaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvYnV0dG9uL2J1dHRvbkRpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBCdXR0b25UZW1wbGF0ZVR5cGU7XG4oZnVuY3Rpb24gKEJ1dHRvblRlbXBsYXRlVHlwZSkge1xuICAgIEJ1dHRvblRlbXBsYXRlVHlwZVtCdXR0b25UZW1wbGF0ZVR5cGVbXCJhY3Rpb25CdXR0b25cIl0gPSAwXSA9IFwiYWN0aW9uQnV0dG9uXCI7XG4gICAgQnV0dG9uVGVtcGxhdGVUeXBlW0J1dHRvblRlbXBsYXRlVHlwZVtcImFjdGlvbkxpbmtcIl0gPSAxXSA9IFwiYWN0aW9uTGlua1wiO1xuICAgIEJ1dHRvblRlbXBsYXRlVHlwZVtCdXR0b25UZW1wbGF0ZVR5cGVbXCJwcmltYXJ5QnV0dG9uXCJdID0gMl0gPSBcInByaW1hcnlCdXR0b25cIjtcbiAgICBCdXR0b25UZW1wbGF0ZVR5cGVbQnV0dG9uVGVtcGxhdGVUeXBlW1wicHJpbWFyeUxpbmtcIl0gPSAzXSA9IFwicHJpbWFyeUxpbmtcIjtcbiAgICBCdXR0b25UZW1wbGF0ZVR5cGVbQnV0dG9uVGVtcGxhdGVUeXBlW1wiY29tbWFuZEJ1dHRvblwiXSA9IDRdID0gXCJjb21tYW5kQnV0dG9uXCI7XG4gICAgQnV0dG9uVGVtcGxhdGVUeXBlW0J1dHRvblRlbXBsYXRlVHlwZVtcImNvbW1hbmRMaW5rXCJdID0gNV0gPSBcImNvbW1hbmRMaW5rXCI7XG4gICAgQnV0dG9uVGVtcGxhdGVUeXBlW0J1dHRvblRlbXBsYXRlVHlwZVtcImNvbXBvdW5kQnV0dG9uXCJdID0gNl0gPSBcImNvbXBvdW5kQnV0dG9uXCI7XG4gICAgQnV0dG9uVGVtcGxhdGVUeXBlW0J1dHRvblRlbXBsYXRlVHlwZVtcImNvbXBvdW5kTGlua1wiXSA9IDddID0gXCJjb21wb3VuZExpbmtcIjtcbiAgICBCdXR0b25UZW1wbGF0ZVR5cGVbQnV0dG9uVGVtcGxhdGVUeXBlW1wiaGVyb0J1dHRvblwiXSA9IDhdID0gXCJoZXJvQnV0dG9uXCI7XG4gICAgQnV0dG9uVGVtcGxhdGVUeXBlW0J1dHRvblRlbXBsYXRlVHlwZVtcImhlcm9MaW5rXCJdID0gOV0gPSBcImhlcm9MaW5rXCI7XG59KShCdXR0b25UZW1wbGF0ZVR5cGUgPSBleHBvcnRzLkJ1dHRvblRlbXBsYXRlVHlwZSB8fCAoZXhwb3J0cy5CdXR0b25UZW1wbGF0ZVR5cGUgPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9idXR0b24vYnV0dG9uVGVtcGxhdGVUeXBlLnRzXG4vLyBtb2R1bGUgaWQgPSAxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBCdXR0b25UeXBlRW51bTtcbihmdW5jdGlvbiAoQnV0dG9uVHlwZUVudW0pIHtcbiAgICBCdXR0b25UeXBlRW51bVtCdXR0b25UeXBlRW51bVtcInByaW1hcnlcIl0gPSAwXSA9IFwicHJpbWFyeVwiO1xuICAgIEJ1dHRvblR5cGVFbnVtW0J1dHRvblR5cGVFbnVtW1wiY29tbWFuZFwiXSA9IDFdID0gXCJjb21tYW5kXCI7XG4gICAgQnV0dG9uVHlwZUVudW1bQnV0dG9uVHlwZUVudW1bXCJjb21wb3VuZFwiXSA9IDJdID0gXCJjb21wb3VuZFwiO1xuICAgIEJ1dHRvblR5cGVFbnVtW0J1dHRvblR5cGVFbnVtW1wiaGVyb1wiXSA9IDNdID0gXCJoZXJvXCI7XG59KShCdXR0b25UeXBlRW51bSA9IGV4cG9ydHMuQnV0dG9uVHlwZUVudW0gfHwgKGV4cG9ydHMuQnV0dG9uVHlwZUVudW0gPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9idXR0b24vYnV0dG9uVHlwZUVudW0udHNcbi8vIG1vZHVsZSBpZCA9IDExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENhbGxvdXRBcnJvdztcbihmdW5jdGlvbiAoQ2FsbG91dEFycm93KSB7XG4gICAgQ2FsbG91dEFycm93W0NhbGxvdXRBcnJvd1tcImxlZnRcIl0gPSAwXSA9IFwibGVmdFwiO1xuICAgIENhbGxvdXRBcnJvd1tDYWxsb3V0QXJyb3dbXCJyaWdodFwiXSA9IDFdID0gXCJyaWdodFwiO1xuICAgIENhbGxvdXRBcnJvd1tDYWxsb3V0QXJyb3dbXCJ0b3BcIl0gPSAyXSA9IFwidG9wXCI7XG4gICAgQ2FsbG91dEFycm93W0NhbGxvdXRBcnJvd1tcImJvdHRvbVwiXSA9IDNdID0gXCJib3R0b21cIjtcbn0pKENhbGxvdXRBcnJvdyA9IGV4cG9ydHMuQ2FsbG91dEFycm93IHx8IChleHBvcnRzLkNhbGxvdXRBcnJvdyA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL2NhbGxvdXQvY2FsbG91dEFycm93RW51bS50c1xuLy8gbW9kdWxlIGlkID0gMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIGNhbGxvdXRUeXBlRW51bV8xID0gcmVxdWlyZShcIi4vY2FsbG91dFR5cGVFbnVtXCIpO1xudmFyIGNhbGxvdXRBcnJvd0VudW1fMSA9IHJlcXVpcmUoXCIuL2NhbGxvdXRBcnJvd0VudW1cIik7XG52YXIgQ2FsbG91dENvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENhbGxvdXRDb250cm9sbGVyKCRzY29wZSwgJGxvZykge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICB9XG4gICAgcmV0dXJuIENhbGxvdXRDb250cm9sbGVyO1xufSgpKTtcbkNhbGxvdXRDb250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckbG9nJ107XG5leHBvcnRzLkNhbGxvdXRDb250cm9sbGVyID0gQ2FsbG91dENvbnRyb2xsZXI7XG52YXIgQ2FsbG91dEhlYWRlckRpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FsbG91dEhlYWRlckRpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtQ2FsbG91dC1oZWFkZXJcIj48cCBjbGFzcz1cIm1zLUNhbGxvdXQtdGl0bGVcIiBuZy10cmFuc2NsdWRlPjwvcD48L2Rpdj4nO1xuICAgIH1cbiAgICBDYWxsb3V0SGVhZGVyRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQ2FsbG91dEhlYWRlckRpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgQ2FsbG91dEhlYWRlckRpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSwgaW5zdGFuY2VFbGVtZW50LCBhdHRycywgY3RybHMpIHtcbiAgICAgICAgdmFyIG1haW5XcmFwcGVyID0gaW5zdGFuY2VFbGVtZW50LnBhcmVudCgpLnBhcmVudCgpO1xuICAgICAgICBpZiAoIWFuZ3VsYXIuaXNVbmRlZmluZWQobWFpbldyYXBwZXIpICYmIG1haW5XcmFwcGVyLmhhc0NsYXNzKCdtcy1DYWxsb3V0LW1haW4nKSkge1xuICAgICAgICAgICAgdmFyIGRldGFjaGVkSGVhZGVyID0gaW5zdGFuY2VFbGVtZW50LmRldGFjaCgpO1xuICAgICAgICAgICAgbWFpbldyYXBwZXIucHJlcGVuZChkZXRhY2hlZEhlYWRlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDYWxsb3V0SGVhZGVyRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuQ2FsbG91dEhlYWRlckRpcmVjdGl2ZSA9IENhbGxvdXRIZWFkZXJEaXJlY3RpdmU7XG52YXIgQ2FsbG91dENvbnRlbnREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENhbGxvdXRDb250ZW50RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1DYWxsb3V0LWNvbnRlbnRcIj48cCBjbGFzcz1cIm1zLUNhbGxvdXQtc3ViVGV4dFwiIG5nLXRyYW5zY2x1ZGU+PC9wPjwvZGl2Pic7XG4gICAgfVxuICAgIENhbGxvdXRDb250ZW50RGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQ2FsbG91dENvbnRlbnREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBDYWxsb3V0Q29udGVudERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkNhbGxvdXRDb250ZW50RGlyZWN0aXZlID0gQ2FsbG91dENvbnRlbnREaXJlY3RpdmU7XG52YXIgQ2FsbG91dEFjdGlvbnNEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENhbGxvdXRBY3Rpb25zRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1DYWxsb3V0LWFjdGlvbnNcIiBuZy10cmFuc2NsdWRlPjwvZGl2Pic7XG4gICAgICAgIHRoaXMucmVxdWlyZSA9ICdeP3VpZkNhbGxvdXQnO1xuICAgIH1cbiAgICBDYWxsb3V0QWN0aW9uc0RpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IENhbGxvdXRBY3Rpb25zRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBDYWxsb3V0QWN0aW9uc0RpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSwgaW5zdGFuY2VFbGVtZW50LCBhdHRycywgY2FsbG91dENvbnRyb2xsZXIpIHtcbiAgICAgICAgaWYgKGFuZ3VsYXIuaXNPYmplY3QoY2FsbG91dENvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgICBjYWxsb3V0Q29udHJvbGxlci4kc2NvcGUuJHdhdGNoKCdoYXNTZXBhcmF0b3InLCBmdW5jdGlvbiAoaGFzU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc1NlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uQ2hpbGRyZW4gPSBpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5lcSgwKS5jaGlsZHJlbigpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBidXR0b25JbmRleCA9IDA7IGJ1dHRvbkluZGV4IDwgYWN0aW9uQ2hpbGRyZW4ubGVuZ3RoOyBidXR0b25JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9uQ2hpbGRyZW4uZXEoYnV0dG9uSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmFkZENsYXNzKCdtcy1DYWxsb3V0LWFjdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvblNwYW5zID0gYWN0aW9uLmZpbmQoJ3NwYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHNwYW5JbmRleCA9IDA7IHNwYW5JbmRleCA8IGFjdGlvblNwYW5zLmxlbmd0aDsgc3BhbkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uU3BhbiA9IGFjdGlvblNwYW5zLmVxKHNwYW5JbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblNwYW4uaGFzQ2xhc3MoJ21zLUJ1dHRvbi1sYWJlbCcpIHx8IGFjdGlvblNwYW4uaGFzQ2xhc3MoJ21zLUJ1dHRvbi1pY29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uU3Bhbi5hZGRDbGFzcygnbXMtQ2FsbG91dC1hY3Rpb25UZXh0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDYWxsb3V0QWN0aW9uc0RpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkNhbGxvdXRBY3Rpb25zRGlyZWN0aXZlID0gQ2FsbG91dEFjdGlvbnNEaXJlY3RpdmU7XG52YXIgQ2FsbG91dERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FsbG91dERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLUNhbGxvdXRcIiAnICtcbiAgICAgICAgICAgICduZy1jbGFzcz1cImdldENhbGxvdXRDbGFzc2VzKClcIj4gJyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLUNhbGxvdXQtbWFpblwiPjxkaXYgY2xhc3M9XCJtcy1DYWxsb3V0LWlubmVyXCIgbmctdHJhbnNjbHVkZT48L2Rpdj48L2Rpdj48L2Rpdj4nO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ3VpZkNhbGxvdXQnXTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIG5nU2hvdzogJz0/JyxcbiAgICAgICAgICAgIHVpZlR5cGU6ICdAJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBDYWxsb3V0Q29udHJvbGxlcjtcbiAgICAgICAgdGhpcy51aWZBcnJvd0NsYXNzZXMgPSAoX2EgPSB7fSxcbiAgICAgICAgICAgIF9hW2NhbGxvdXRBcnJvd0VudW1fMS5DYWxsb3V0QXJyb3cuYm90dG9tXSA9ICdtcy1DYWxsb3V0LS1hcnJvd0JvdHRvbScsXG4gICAgICAgICAgICBfYVtjYWxsb3V0QXJyb3dFbnVtXzEuQ2FsbG91dEFycm93LmxlZnRdID0gJ21zLUNhbGxvdXQtLWFycm93TGVmdCcsXG4gICAgICAgICAgICBfYVtjYWxsb3V0QXJyb3dFbnVtXzEuQ2FsbG91dEFycm93LnJpZ2h0XSA9ICdtcy1DYWxsb3V0LS1hcnJvd1JpZ2h0JyxcbiAgICAgICAgICAgIF9hW2NhbGxvdXRBcnJvd0VudW1fMS5DYWxsb3V0QXJyb3cudG9wXSA9ICdtcy1DYWxsb3V0LS1hcnJvd1RvcCcsXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIHRoaXMudWlmVHlwZUNsYXNzZXMgPSAoX2IgPSB7fSxcbiAgICAgICAgICAgIF9iW2NhbGxvdXRUeXBlRW51bV8xLkNhbGxvdXRUeXBlLm9vYmVdID0gJ21zLUNhbGxvdXQtLU9PQkUnLFxuICAgICAgICAgICAgX2JbY2FsbG91dFR5cGVFbnVtXzEuQ2FsbG91dFR5cGUucGVla10gPSAnbXMtQ2FsbG91dC0tUGVlaycsXG4gICAgICAgICAgICBfYik7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgfVxuICAgIENhbGxvdXREaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBDYWxsb3V0RGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBDYWxsb3V0RGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBpbnN0YW5jZUVsZW1lbnQsIGF0dHJzLCBjdHJscykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY2FsbG91dENvbnRyb2xsZXIgPSBjdHJsc1swXTtcbiAgICAgICAgYXR0cnMuJG9ic2VydmUoJ3VpZlR5cGUnLCBmdW5jdGlvbiAoY2FsbG91dFR5cGUpIHtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKGNhbGxvdXRUeXBlRW51bV8xLkNhbGxvdXRUeXBlW2NhbGxvdXRUeXBlXSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsb3V0Q29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5jYWxsb3V0IC0gXCInICtcbiAgICAgICAgICAgICAgICAgICAgY2FsbG91dFR5cGUgKyAnXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHVpZlR5cGUuIEl0IHNob3VsZCBiZSBvb2JlIG9yIHBlZWsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJzLiRvYnNlcnZlKCd1aWZBcnJvdycsIGZ1bmN0aW9uIChhdHRyQXJyb3dEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdHRyQXJyb3dEaXJlY3Rpb24pICYmIGFuZ3VsYXIuaXNVbmRlZmluZWQoY2FsbG91dEFycm93RW51bV8xLkNhbGxvdXRBcnJvd1thdHRyQXJyb3dEaXJlY3Rpb25dKSkge1xuICAgICAgICAgICAgICAgIGNhbGxvdXRDb250cm9sbGVyLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmNhbGxvdXQgLSBcIicgK1xuICAgICAgICAgICAgICAgICAgICBhdHRyQXJyb3dEaXJlY3Rpb24gKyAnXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHVpZkFycm93LiBJdCBzaG91bGQgYmUgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmFycm93RGlyZWN0aW9uID0gYXR0ckFycm93RGlyZWN0aW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGUuaGFzU2VwYXJhdG9yID0gKCFhbmd1bGFyLmlzVW5kZWZpbmVkKGF0dHJzLnVpZkFjdGlvblRleHQpIHx8ICFhbmd1bGFyLmlzVW5kZWZpbmVkKGF0dHJzLnVpZlNlcGFyYXRvcikpO1xuICAgICAgICBpZiAoIWFuZ3VsYXIuaXNVbmRlZmluZWQoYXR0cnMudWlmQ2xvc2UpKSB7XG4gICAgICAgICAgICBzY29wZS5jbG9zZUJ1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICB2YXIgY2xvc2VCdXR0b25FbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KCc8YnV0dG9uIGNsYXNzPVwibXMtQ2FsbG91dC1jbG9zZVwiIHR5cGU9XCJidXR0b25cIj4nICtcbiAgICAgICAgICAgICAgICAnPGkgY2xhc3M9XCJtcy1JY29uIG1zLUljb24tLXhcIj48L2k+JyArXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicpO1xuICAgICAgICAgICAgdmFyIGNhbGxvdXREaXYgPSBpbnN0YW5jZUVsZW1lbnQuZmluZCgnZGl2JykuZXEoMCk7XG4gICAgICAgICAgICBjYWxsb3V0RGl2LmFwcGVuZChjbG9zZUJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICAgICAgY2xvc2VCdXR0b25FbGVtZW50LmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubmdTaG93ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc2NvcGUuY2xvc2VCdXR0b25DbGlja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlRWxlbWVudC5iaW5kKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKGV2ZW50T2JqZWN0KSB7XG4gICAgICAgICAgICBzY29wZS5pc01vdXNlT3ZlciA9IHRydWU7XG4gICAgICAgICAgICBzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGluc3RhbmNlRWxlbWVudC5iaW5kKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKGV2ZW50T2JqZWN0KSB7XG4gICAgICAgICAgICBzY29wZS5pc01vdXNlT3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY29wZS4kd2F0Y2goJ25nU2hvdycsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBpc0Nsb3NpbmdCeUJ1dHRvbkNsaWNrID0gIW5ld1ZhbHVlICYmIHNjb3BlLmNsb3NlQnV0dG9uQ2xpY2tlZDtcbiAgICAgICAgICAgIGlmIChpc0Nsb3NpbmdCeUJ1dHRvbkNsaWNrKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubmdTaG93ID0gc2NvcGUuY2xvc2VCdXR0b25DbGlja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFuZXdWYWx1ZSAmJiBhbmd1bGFyLmlzVW5kZWZpbmVkKGF0dHJzLnVpZkNsb3NlKSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLm5nU2hvdyA9IHNjb3BlLmlzTW91c2VPdmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubmdTaG93ID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzY29wZS4kd2F0Y2goJ2lzTW91c2VPdmVyJywgZnVuY3Rpb24gKG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgICAgICAgICBpZiAoIW5ld1ZhbCAmJiBvbGRWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm5nU2hvdyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNjb3BlLmdldENhbGxvdXRDbGFzc2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNhbGxvdXRDbGFzc2VzID0gW107XG4gICAgICAgICAgICB2YXIgY2FsbG91dFR5cGUgPSBjYWxsb3V0VHlwZUVudW1fMS5DYWxsb3V0VHlwZVtzY29wZS51aWZUeXBlXTtcbiAgICAgICAgICAgIHZhciBjYWxsb3V0QXJyb3cgPSBhbmd1bGFyLmlzRGVmaW5lZChzY29wZS5hcnJvd0RpcmVjdGlvbikgPyBjYWxsb3V0QXJyb3dFbnVtXzEuQ2FsbG91dEFycm93W3Njb3BlLmFycm93RGlyZWN0aW9uXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChjYWxsb3V0VHlwZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsb3V0Q2xhc3Nlcy5wdXNoKF90aGlzLnVpZlR5cGVDbGFzc2VzW2NhbGxvdXRUeXBlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoY2FsbG91dEFycm93KSkge1xuICAgICAgICAgICAgICAgIGNhbGxvdXRDbGFzc2VzLnB1c2goX3RoaXMudWlmQXJyb3dDbGFzc2VzW2NhbGxvdXRBcnJvd10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNjb3BlLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgY2FsbG91dENsYXNzZXMucHVzaCgnbXMtQ2FsbG91dC0tY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY29wZS5oYXNTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBjYWxsb3V0Q2xhc3Nlcy5wdXNoKCdtcy1DYWxsb3V0LS1hY3Rpb25UZXh0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FsbG91dENsYXNzZXMuam9pbignICcpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIENhbGxvdXREaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5DYWxsb3V0RGlyZWN0aXZlID0gQ2FsbG91dERpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMuY2FsbG91dCcsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkNhbGxvdXQnLCBDYWxsb3V0RGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZDYWxsb3V0SGVhZGVyJywgQ2FsbG91dEhlYWRlckRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmQ2FsbG91dENvbnRlbnQnLCBDYWxsb3V0Q29udGVudERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmQ2FsbG91dEFjdGlvbnMnLCBDYWxsb3V0QWN0aW9uc0RpcmVjdGl2ZS5mYWN0b3J5KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9jYWxsb3V0L2NhbGxvdXREaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENhbGxvdXRUeXBlO1xuKGZ1bmN0aW9uIChDYWxsb3V0VHlwZSkge1xuICAgIENhbGxvdXRUeXBlW0NhbGxvdXRUeXBlW1wib29iZVwiXSA9IDBdID0gXCJvb2JlXCI7XG4gICAgQ2FsbG91dFR5cGVbQ2FsbG91dFR5cGVbXCJwZWVrXCJdID0gMV0gPSBcInBlZWtcIjtcbn0pKENhbGxvdXRUeXBlID0gZXhwb3J0cy5DYWxsb3V0VHlwZSB8fCAoZXhwb3J0cy5DYWxsb3V0VHlwZSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL2NhbGxvdXQvY2FsbG91dFR5cGVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgY2hvaWNlZmllbGRUeXBlRW51bV8xID0gcmVxdWlyZShcIi4vY2hvaWNlZmllbGRUeXBlRW51bVwiKTtcbnZhciBDaG9pY2VmaWVsZE9wdGlvbkNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENob2ljZWZpZWxkT3B0aW9uQ29udHJvbGxlcigkbG9nKSB7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgfVxuICAgIHJldHVybiBDaG9pY2VmaWVsZE9wdGlvbkNvbnRyb2xsZXI7XG59KCkpO1xuQ2hvaWNlZmllbGRPcHRpb25Db250cm9sbGVyLiRpbmplY3QgPSBbJyRsb2cnXTtcbmV4cG9ydHMuQ2hvaWNlZmllbGRPcHRpb25Db250cm9sbGVyID0gQ2hvaWNlZmllbGRPcHRpb25Db250cm9sbGVyO1xudmFyIENob2ljZWZpZWxkT3B0aW9uRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDaG9pY2VmaWVsZE9wdGlvbkRpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtQ2hvaWNlRmllbGRcIj4nICtcbiAgICAgICAgICAgICc8aW5wdXQgaWQ9XCJ7ezo6JGlkfX1cIiBjbGFzcz1cIm1zLUNob2ljZUZpZWxkLWlucHV0XCIgdHlwZT1cInt7dWlmVHlwZX19XCIgdmFsdWU9XCJ7e3ZhbHVlfX1cIiBuZy1kaXNhYmxlZD1cImRpc2FibGVkXCIgICcgK1xuICAgICAgICAgICAgJ25nLW1vZGVsPVwibmdNb2RlbFwiIG5nLXRydWUtdmFsdWU9XCJ7e25nVHJ1ZVZhbHVlfX1cIiBuZy1mYWxzZS12YWx1ZT1cInt7bmdGYWxzZVZhbHVlfX1cIiAvPicgK1xuICAgICAgICAgICAgJzxsYWJlbCBmb3I9XCJ7ezo6JGlkfX1cIiBjbGFzcz1cIm1zLUNob2ljZUZpZWxkLWZpZWxkXCI+PHNwYW4gY2xhc3M9XCJtcy1MYWJlbFwiIG5nLXRyYW5zY2x1ZGU+PC9zcGFuPjwvbGFiZWw+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gWyd1aWZDaG9pY2VmaWVsZE9wdGlvbicsICdeP3VpZkNob2ljZWZpZWxkR3JvdXAnXTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIG5nRmFsc2VWYWx1ZTogJ0AnLFxuICAgICAgICAgICAgbmdNb2RlbDogJz0nLFxuICAgICAgICAgICAgbmdUcnVlVmFsdWU6ICdAJyxcbiAgICAgICAgICAgIHVpZlR5cGU6ICdAJyxcbiAgICAgICAgICAgIHZhbHVlOiAnQCdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gQ2hvaWNlZmllbGRPcHRpb25Db250cm9sbGVyO1xuICAgIH1cbiAgICBDaG9pY2VmaWVsZE9wdGlvbkRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VmaWVsZE9wdGlvbkRpcmVjdGl2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgQ2hvaWNlZmllbGRPcHRpb25EaXJlY3RpdmUucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAodGVtcGxhdGVFbGVtZW50LCB0ZW1wbGF0ZUF0dHJpYnV0ZXMsIHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gdGVtcGxhdGVFbGVtZW50LmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgIGlmICghKCduZ01vZGVsJyBpbiB0ZW1wbGF0ZUF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgICBpbnB1dC5yZW1vdmVBdHRyKCduZy1tb2RlbCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmU6IHRoaXMucHJlTGlua1xuICAgICAgICB9O1xuICAgIH07XG4gICAgQ2hvaWNlZmllbGRPcHRpb25EaXJlY3RpdmUucHJvdG90eXBlLnByZUxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cnMsIGN0cmxzLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIHZhciBjaG9pY2VmaWVsZE9wdGlvbkNvbnRyb2xsZXIgPSBjdHJsc1swXTtcbiAgICAgICAgdmFyIGNob2ljZWZpZWxkR3JvdXBDb250cm9sbGVyID0gY3RybHNbMV07XG4gICAgICAgIHNjb3BlLiR3YXRjaCgndWlmVHlwZScsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChjaG9pY2VmaWVsZFR5cGVFbnVtXzEuQ2hvaWNlZmllbGRUeXBlW25ld1ZhbHVlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2hvaWNlZmllbGRPcHRpb25Db250cm9sbGVyLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmNob2ljZWZpZWxkIC0gXCInICtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgKyAnXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHVpZlR5cGUuICcgK1xuICAgICAgICAgICAgICAgICAgICAnU3VwcG9ydGVkIG9wdGlvbnMgYXJlIGxpc3RlZCBoZXJlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL2Nob2ljZWZpZWxkL2Nob2ljZWZpZWxkVHlwZUVudW0udHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyXzEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoZWNrZWQgPSAoY2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIuZ2V0Vmlld1ZhbHVlKCkgPT09IGF0dHJzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuZmluZCgnaW5wdXQnKS5wcm9wKCdjaGVja2VkJywgY2hlY2tlZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIuYWRkUmVuZGVyKHJlbmRlcl8xKTtcbiAgICAgICAgICAgIGF0dHJzLiRvYnNlcnZlKCd2YWx1ZScsIHJlbmRlcl8xKTtcbiAgICAgICAgICAgIGluc3RhbmNlRWxlbWVudFxuICAgICAgICAgICAgICAgIC5vbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIucmVtb3ZlUmVuZGVyKHJlbmRlcl8xKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRTY29wZSA9IHNjb3BlLiRwYXJlbnQuJHBhcmVudDtcbiAgICAgICAgdmFyIGNoZWNrRGlzYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5kaXNhYmxlZCA9ICdkaXNhYmxlZCcgaW4gYXR0cnMgJiYgYXR0cnMuZGlzYWJsZWQ7XG4gICAgICAgICAgICBzY29wZS5kaXNhYmxlZCA9IHNjb3BlLmRpc2FibGVkIHx8IChwYXJlbnRTY29wZSAhPSBudWxsICYmIHBhcmVudFNjb3BlLmRpc2FibGVkKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluc3RhbmNlRWxlbWVudC5hdHRyKCdkaXNhYmxlZCcpOyB9LCAoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBjaGVja0Rpc2FibGVkKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhcmVudFNjb3BlID09IG51bGwgPyAnJyA6IHBhcmVudFNjb3BlLmRpc2FibGVkOyB9LCAoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7IGNoZWNrRGlzYWJsZWQoKTsgfSkpO1xuICAgICAgICBjaGVja0Rpc2FibGVkKCk7XG4gICAgICAgIGluc3RhbmNlRWxlbWVudFxuICAgICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKHNjb3BlLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNob2ljZWZpZWxkR3JvdXBDb250cm9sbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlci5zZXRUb3VjaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChjaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNob2ljZWZpZWxkR3JvdXBDb250cm9sbGVyLnNldFZpZXdWYWx1ZShhdHRycy52YWx1ZSwgZXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDaG9pY2VmaWVsZE9wdGlvbkRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkNob2ljZWZpZWxkT3B0aW9uRGlyZWN0aXZlID0gQ2hvaWNlZmllbGRPcHRpb25EaXJlY3RpdmU7XG52YXIgQ2hvaWNlZmllbGRHcm91cFRpdGxlRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDaG9pY2VmaWVsZEdyb3VwVGl0bGVEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLUNob2ljZUZpZWxkR3JvdXAtdGl0bGVcIj48bmctdHJhbnNjbHVkZSAvPjwvZGl2Pic7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgfVxuICAgIENob2ljZWZpZWxkR3JvdXBUaXRsZURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IENob2ljZWZpZWxkR3JvdXBUaXRsZURpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIENob2ljZWZpZWxkR3JvdXBUaXRsZURpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkNob2ljZWZpZWxkR3JvdXBUaXRsZURpcmVjdGl2ZSA9IENob2ljZWZpZWxkR3JvdXBUaXRsZURpcmVjdGl2ZTtcbnZhciBDaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIoJGVsZW1lbnQsICRzY29wZSkge1xuICAgICAgICB0aGlzLiRlbGVtZW50ID0gJGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuJHNjb3BlID0gJHNjb3BlO1xuICAgICAgICB0aGlzLnJlbmRlckZucyA9IFtdO1xuICAgIH1cbiAgICBDaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLiRzY29wZS5uZ01vZGVsICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLiRzY29wZS5uZ01vZGVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLm5nTW9kZWwuJHJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlci5wcm90b3R5cGUuYWRkUmVuZGVyID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHRoaXMucmVuZGVyRm5zLnB1c2goZm4pO1xuICAgIH07XG4gICAgQ2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIucHJvdG90eXBlLnJlbW92ZVJlbmRlciA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB0aGlzLnJlbmRlckZucy5zcGxpY2UodGhpcy5yZW5kZXJGbnMuaW5kZXhPZihmbikpO1xuICAgIH07XG4gICAgQ2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIucHJvdG90eXBlLnNldFZpZXdWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZXZlbnRUeXBlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy4kc2NvcGUubmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy4kc2NvcGUubmdNb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5nZXRWaWV3VmFsdWUoKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5uZ01vZGVsLiRzZXREaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4kc2NvcGUubmdNb2RlbC4kc2V0Vmlld1ZhbHVlKHZhbHVlLCBldmVudFR5cGUpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIucHJvdG90eXBlLnNldFRvdWNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy4kc2NvcGUubmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy4kc2NvcGUubmdNb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiRzY29wZS5uZ01vZGVsLiRzZXRUb3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENob2ljZWZpZWxkR3JvdXBDb250cm9sbGVyLnByb3RvdHlwZS5nZXRWaWV3VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy4kc2NvcGUubmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy4kc2NvcGUubmdNb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUubmdNb2RlbC4kdmlld1ZhbHVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVuZGVyRm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckZuc1tpXSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXI7XG59KCkpO1xuQ2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXIuJGluamVjdCA9IFsnJGVsZW1lbnQnLCAnJHNjb3BlJ107XG5leHBvcnRzLkNob2ljZWZpZWxkR3JvdXBDb250cm9sbGVyID0gQ2hvaWNlZmllbGRHcm91cENvbnRyb2xsZXI7XG52YXIgQ2hvaWNlZmllbGRHcm91cERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2hvaWNlZmllbGRHcm91cERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtQ2hvaWNlRmllbGRHcm91cFwiPicgK1xuICAgICAgICAgICAgJzxuZy10cmFuc2NsdWRlIC8+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gWyd1aWZDaG9pY2VmaWVsZEdyb3VwJywgJz9uZ01vZGVsJ107XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IENob2ljZWZpZWxkR3JvdXBDb250cm9sbGVyO1xuICAgICAgICB0aGlzLnNjb3BlID0ge307XG4gICAgfVxuICAgIENob2ljZWZpZWxkR3JvdXBEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBDaG9pY2VmaWVsZEdyb3VwRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBDaG9pY2VmaWVsZEdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24gKHRlbXBsYXRlRWxlbWVudCwgdGVtcGxhdGVBdHRyaWJ1dGVzLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmU6IHRoaXMucHJlTGlua1xuICAgICAgICB9O1xuICAgIH07XG4gICAgQ2hvaWNlZmllbGRHcm91cERpcmVjdGl2ZS5wcm90b3R5cGUucHJlTGluayA9IGZ1bmN0aW9uIChzY29wZSwgaW5zdGFuY2VFbGVtZW50LCBpbnN0YW5jZUF0dHJpYnV0ZXMsIGN0cmxzKSB7XG4gICAgICAgIHZhciBjaG9pY2VmaWVsZEdyb3VwQ29udHJvbGxlciA9IGN0cmxzWzBdO1xuICAgICAgICB2YXIgbW9kZWxDb250cm9sbGVyID0gY3RybHNbMV07XG4gICAgICAgIHNjb3BlLm5nTW9kZWwgPSBtb2RlbENvbnRyb2xsZXI7XG4gICAgICAgIGNob2ljZWZpZWxkR3JvdXBDb250cm9sbGVyLmluaXQoKTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluc3RhbmNlRWxlbWVudC5hdHRyKCdkaXNhYmxlZCcpOyB9LCAoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7IHNjb3BlLmRpc2FibGVkID0gdHlwZW9mIG5ld1ZhbHVlICE9PSAndW5kZWZpbmVkJzsgfSkpO1xuICAgICAgICBzY29wZS5kaXNhYmxlZCA9ICdkaXNhYmxlZCcgaW4gaW5zdGFuY2VBdHRyaWJ1dGVzO1xuICAgIH07XG4gICAgcmV0dXJuIENob2ljZWZpZWxkR3JvdXBEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5DaG9pY2VmaWVsZEdyb3VwRGlyZWN0aXZlID0gQ2hvaWNlZmllbGRHcm91cERpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMuY2hvaWNlZmllbGQnLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkNob2ljZWZpZWxkT3B0aW9uJywgQ2hvaWNlZmllbGRPcHRpb25EaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkNob2ljZWZpZWxkR3JvdXAnLCBDaG9pY2VmaWVsZEdyb3VwRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZDaG9pY2VmaWVsZEdyb3VwVGl0bGUnLCBDaG9pY2VmaWVsZEdyb3VwVGl0bGVEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvY2hvaWNlZmllbGQvY2hvaWNlZmllbGREaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENob2ljZWZpZWxkVHlwZTtcbihmdW5jdGlvbiAoQ2hvaWNlZmllbGRUeXBlKSB7XG4gICAgQ2hvaWNlZmllbGRUeXBlW0Nob2ljZWZpZWxkVHlwZVtcInJhZGlvXCJdID0gMF0gPSBcInJhZGlvXCI7XG4gICAgQ2hvaWNlZmllbGRUeXBlW0Nob2ljZWZpZWxkVHlwZVtcImNoZWNrYm94XCJdID0gMV0gPSBcImNoZWNrYm94XCI7XG59KShDaG9pY2VmaWVsZFR5cGUgPSBleHBvcnRzLkNob2ljZWZpZWxkVHlwZSB8fCAoZXhwb3J0cy5DaG9pY2VmaWVsZFR5cGUgPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9jaG9pY2VmaWVsZC9jaG9pY2VmaWVsZFR5cGVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSAxNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgQ29tbWFuZEJhckRpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tbWFuZEJhckRpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtQ29tbWFuZEJhclwiIG5nLXRyYW5zY2x1ZGU+PC9kaXY+JztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQCcsXG4gICAgICAgICAgICB1aWZTZWFyY2hUZXJtOiAnPSdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29tbWFuZEJhckRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IENvbW1hbmRCYXJEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIENvbW1hbmRCYXJEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAgIHNjb3BlLmZvY3VzU2VhcmNoSW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuaXNTZWFyY2hBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbGVtWzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1Db21tYW5kQmFyU2VhcmNoLWlucHV0JykpWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2NvcGUuY2xlYXJTZWFyY2hUZXJtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnVpZlNlYXJjaFRlcm0gPSBudWxsO1xuICAgICAgICAgICAgICAgIHNjb3BlLmlzU2VhcmNoQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29tbWFuZEJhckRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkNvbW1hbmRCYXJEaXJlY3RpdmUgPSBDb21tYW5kQmFyRGlyZWN0aXZlO1xudmFyIENvbW1hbmRCYXJTZWFyY2hEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbW1hbmRCYXJTZWFyY2hEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIjxkaXYgY2xhc3M9XFxcIm1zLUNvbW1hbmRCYXJTZWFyY2hcXFwiIG5nLWNsYXNzPVxcXCIkcGFyZW50LmlzU2VhcmNoQWN0aXZlID09IHRydWUgPyAnaXMtYWN0aXZlJyA6ICcnO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XFxcIm1zLUNvbW1hbmRCYXJTZWFyY2gtaW5wdXRcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cXFwidGV4dFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cXFwie3skcGFyZW50LnBsYWNlaG9sZGVyfX1cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XFxcIjFcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctZm9jdXM9XFxcIiRwYXJlbnQuaXNTZWFyY2hBY3RpdmUgPSB0cnVlO1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1ibHVyPVxcXCIkcGFyZW50LmlzU2VhcmNoQWN0aXZlID0gZmFsc2U7XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPVxcXCIkcGFyZW50LnVpZlNlYXJjaFRlcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibXMtQ29tbWFuZEJhclNlYXJjaC1pY29uV3JhcHBlciBtcy1Db21tYW5kQmFyU2VhcmNoLWljb25TZWFyY2hXcmFwcGVyXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz1cXFwiJHBhcmVudC5mb2N1c1NlYXJjaElucHV0KClcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLWljb24gdWlmLXR5cGU9XFxcInNlYXJjaFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLUNvbW1hbmRCYXJTZWFyY2gtaWNvbldyYXBwZXIgbXMtQ29tbWFuZEJhclNlYXJjaC1pY29uQ2xlYXJXcmFwcGVyIG1zLWZvbnQtc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctbW91c2Vkb3duPVxcXCIkcGFyZW50LmNsZWFyU2VhcmNoVGVybSgpXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1pY29uIHVpZi10eXBlPVxcXCJ4XFxcIi8+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlwiO1xuICAgIH1cbiAgICBDb21tYW5kQmFyU2VhcmNoRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQ29tbWFuZEJhclNlYXJjaERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIENvbW1hbmRCYXJTZWFyY2hEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5Db21tYW5kQmFyU2VhcmNoRGlyZWN0aXZlID0gQ29tbWFuZEJhclNlYXJjaERpcmVjdGl2ZTtcbnZhciBDb21tYW5kQmFyU2lkZURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tbWFuZEJhclNpZGVEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLUNvbW1hbmRCYXItc2lkZUNvbW1hbmRzXCIgbmctdHJhbnNjbHVkZT48L2Rpdj4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgIH1cbiAgICBDb21tYW5kQmFyU2lkZURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IENvbW1hbmRCYXJTaWRlRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gQ29tbWFuZEJhclNpZGVEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5Db21tYW5kQmFyU2lkZURpcmVjdGl2ZSA9IENvbW1hbmRCYXJTaWRlRGlyZWN0aXZlO1xudmFyIENvbW1hbmRCYXJNYWluRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21tYW5kQmFyTWFpbkRpcmVjdGl2ZSgkdGltZW91dCkge1xuICAgICAgICB0aGlzLiR0aW1lb3V0ID0gJHRpbWVvdXQ7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIjxkaXYgY2xhc3M9XFxcIm1zLUNvbW1hbmRCYXItbWFpbkFyZWFcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nLWlmPVxcXCJ1aWZTaG93T3ZlcmZsb3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwibXMtQ29tbWFuZEJhckl0ZW0gbXMtQ29tbWFuZEJhckl0ZW0tLWljb25Pbmx5IG1zLUNvbW1hbmRCYXJJdGVtLW92ZXJmbG93XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xhc3M9XFxcIm92ZXJmbG93VmlzaWJsZSA9PSB0cnVlID8gJ2lzLXZpc2libGUnIDogJyc7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibXMtQ29tbWFuZEJhckl0ZW0tbGlua1dyYXBwZXJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xpY2s9XFxcIm9wZW5PdmVyZmxvd01lbnUoKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcIm1zLUNvbW1hbmRCYXJJdGVtLWxpbmtcXFwiIHRhYmluZGV4PVxcXCIyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aWYtaWNvbiB1aWYtdHlwZT1cXFwiZWxsaXBzaXNcXFwiIC8+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XCI7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IENvbW1hbmRCYXJNYWluQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHVpZlNob3dPdmVyZmxvdzogJz0nXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbW1hbmRCYXJNYWluRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoJHRpbWVvdXQpIHsgcmV0dXJuIG5ldyBDb21tYW5kQmFyTWFpbkRpcmVjdGl2ZSgkdGltZW91dCk7IH07XG4gICAgICAgIGRpcmVjdGl2ZS4kaW5qZWN0ID0gWyckdGltZW91dCddO1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgQ29tbWFuZEJhck1haW5EaXJlY3RpdmUucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cnMsIHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc3Q6IHRoaXMucG9zdExpbmtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENvbW1hbmRCYXJNYWluRGlyZWN0aXZlLnByb3RvdHlwZS5wb3N0TGluayA9IGZ1bmN0aW9uIChzY29wZSwgZWxlbSwgYXR0cnMsIGN0cmwpIHtcbiAgICAgICAgc2NvcGUub3Blbk92ZXJmbG93TWVudSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLm92ZXJmbG93TWVudU9wZW4gPSAhc2NvcGUub3ZlcmZsb3dNZW51T3BlbjtcbiAgICAgICAgICAgIHZhciBjb250ZXh0dWFsTWVudTtcbiAgICAgICAgICAgIGNvbnRleHR1YWxNZW51ID0gXCIgPHVpZi1jb250ZXh0dWFsLW1lbnUgY2xhc3M9XFxcIm1zLUNvbW1hbmRCYXItb3ZlcmZsb3dNZW51XFxcIlxcbiAgICAgICAgICAgICAgdWlmLWlzLW9wZW49XFxcIm92ZXJmbG93TWVudU9wZW5cXFwiXFxuICAgICAgICAgICAgICB1aWYtY2xvc2Utb24tY2xpY2s9XFxcImZhbHNlXFxcIj5cIjtcbiAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbGVtWzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1Db21tYW5kQmFySXRlbS1vdmVyZmxvdyAubXMtQ29tbWFuZEJhckl0ZW0tbGlua1dyYXBwZXIgdWwnKSkucmVtb3ZlKCk7XG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goc2NvcGUuaGlkZGVuSXRlbXMsIGZ1bmN0aW9uIChtZW51aXRlbSkge1xuICAgICAgICAgICAgICAgIGlmIChtZW51aXRlbS5zdWJtZW51KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHR1YWxNZW51ICs9IFwiPHVpZi1jb250ZXh0dWFsLW1lbnUtaXRlbSBuZy1tb2RlbD1cXFwiaGlkZGVuSXRlbXNbXCIgKyBtZW51aXRlbS5pICsgXCJdXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz0nb3Blbk92ZXJmbG93SXRlbShoaWRkZW5JdGVtc1tcIiArIG1lbnVpdGVtLmkgKyBcIl0pJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWYtdGV4dD0naGlkZGVuSXRlbXNbXCIgKyBtZW51aXRlbS5pICsgXCJdLnRleHQnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLXNob3c9J2hpZGRlbkl0ZW1zW1wiICsgbWVudWl0ZW0uaSArIFwiXS52aXNpYmxlJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWYtdHlwZT1cXFwic3ViTWVudVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1jb250ZXh0dWFsLW1lbnU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aWYtY29udGV4dHVhbC1tZW51LWl0ZW1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPSdvcGVuT3ZlcmZsb3dJdGVtKHN1Yml0ZW0pJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlmLXRleHQ9J3N1Yml0ZW0udGV4dCdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZi10eXBlPVxcXCJsaW5rXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctcmVwZWF0PVxcXCJzdWJpdGVtIGluIGhpZGRlbkl0ZW1zW1wiICsgbWVudWl0ZW0uaSArIFwiXS5zdWJtZW51aXRlbXMgdHJhY2sgYnkgJGluZGV4XFxcIi8+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aWYtY29udGV4dHVhbC1tZW51PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aWYtY29udGV4dHVhbC1tZW51LWl0ZW0+XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0dWFsTWVudSArPSBcIjx1aWYtY29udGV4dHVhbC1tZW51LWl0ZW0gbmctbW9kZWw9XFxcImhpZGRlbkl0ZW1zW1wiICsgbWVudWl0ZW0uaSArIFwiXVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xpY2s9J29wZW5PdmVyZmxvd0l0ZW0oaGlkZGVuSXRlbXNbXCIgKyBtZW51aXRlbS5pICsgXCJdKSdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlmLXRleHQ9J2hpZGRlbkl0ZW1zW1wiICsgbWVudWl0ZW0uaSArIFwiXS50ZXh0J1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1zaG93PSdoaWRkZW5JdGVtc1tcIiArIG1lbnVpdGVtLmkgKyBcIl0udmlzaWJsZSdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlmLXR5cGU9XFxcImxpbmtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aWYtY29udGV4dHVhbC1tZW51LWl0ZW0+XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250ZXh0dWFsTWVudSArPSAnPC88dWlmLWNvbnRleHR1YWwtbWVudT4nO1xuICAgICAgICAgICAgdmFyIG1lbnU7XG4gICAgICAgICAgICBtZW51ID0gZWxlbVswXS5xdWVyeVNlbGVjdG9yKCcubXMtQ29tbWFuZEJhckl0ZW0tb3ZlcmZsb3cgLm1zLUNvbW1hbmRCYXJJdGVtLWxpbmtXcmFwcGVyJyk7XG4gICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQobWVudSkuYXBwZW5kKGN0cmwuJGNvbXBpbGUoY29udGV4dHVhbE1lbnUpKHNjb3BlKSk7XG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLmxvYWRNZW51SXRlbXMgPSBmdW5jdGlvbiAoY29tbWFuZEl0ZW1zKSB7XG4gICAgICAgICAgICB2YXIgY29tbWFuZEl0ZW1XaWR0aCA9IDA7XG4gICAgICAgICAgICB2YXIgY29tbWFuZEl0ZW1JbmRleCA9IDA7XG4gICAgICAgICAgICBzY29wZS5jb21tYW5kSXRlbXMgPSBbXTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChjb21tYW5kSXRlbXMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuZWxlbWVudChlbGVtZW50KS5oYXNDbGFzcygnbXMtQ29tbWFuZEJhckl0ZW0tb3ZlcmZsb3cnKSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kSXRlbVdpZHRoICs9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmNvbW1hbmRJdGVtcy5wdXNoKHsgaW5kZXg6IGNvbW1hbmRJdGVtSW5kZXgsIG9mZnNldDogY29tbWFuZEl0ZW1XaWR0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEl0ZW1JbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBzY29wZS5vcGVuT3ZlcmZsb3dJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChpdGVtLnN1Ym1lbnUpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnN1Ym1lbnVpdGVtcyA9IFtdO1xuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChpdGVtLnN1Ym1lbnUuY2hpbGRyZW4sIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdWJtZW51aXRlbTtcbiAgICAgICAgICAgICAgICAgICAgc3VibWVudWl0ZW0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgc3VibWVudWl0ZW0udGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICBzdWJtZW51aXRlbS5tZW51VHlwZSA9ICdpdGVtJztcbiAgICAgICAgICAgICAgICAgICAgc3VibWVudWl0ZW0uY2hpbGRpdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3VibWVudWl0ZW0uaSA9IGl0ZW0uc3VibWVudWl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgc3VibWVudWl0ZW0ucGFyZW50ID0gaXRlbS5pO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN1Ym1lbnVpdGVtcy5wdXNoKHN1Ym1lbnVpdGVtKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN0cmwuJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jaGlsZGl0ZW0gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGVsZW1bMF0ucXVlcnlTZWxlY3RvckFsbCgnLm1zLUNvbW1hbmRCYXJJdGVtJylbaXRlbS5wYXJlbnRdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tcy1Db250ZXh0dWFsTWVudS1pdGVtJylbaXRlbS5pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChtKS50cmlnZ2VySGFuZGxlcignY2xpY2snKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbGVtWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tcy1Db21tYW5kQmFySXRlbScpW2l0ZW0uaV0pLnRyaWdnZXJIYW5kbGVyKCdjbGljaycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLnRvZ2dsZUl0ZW1WaXNpYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbW1hbmRCYXJJdGVtcztcbiAgICAgICAgICAgIGNvbW1hbmRCYXJJdGVtcyA9IGFuZ3VsYXIuZWxlbWVudChlbGVtWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tcy1Db21tYW5kQmFyLW1haW5BcmVhIC5tcy1Db21tYW5kQmFySXRlbScpKTtcbiAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDY0MCAmJiBzY29wZS5tb2JpbGVTd2l0Y2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubG9hZE1lbnVJdGVtcyhjb21tYW5kQmFySXRlbXMpO1xuICAgICAgICAgICAgICAgIHNjb3BlLm1vYmlsZVN3aXRjaCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+PSA2NDAgJiYgc2NvcGUubW9iaWxlU3dpdGNoID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubG9hZE1lbnVJdGVtcyhjb21tYW5kQmFySXRlbXMpO1xuICAgICAgICAgICAgICAgIHNjb3BlLm1vYmlsZVN3aXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNjb3BlLmNvbW1hbmRJdGVtcywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5vZmZzZXQgPj0gZWxlbS5wcm9wKCdvZmZzZXRXaWR0aCcpIC0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbGVtWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tcy1Db21tYW5kQmFySXRlbScpW2VsZW1lbnQuaW5kZXhdKS5hZGRDbGFzcygnaXMtaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmhpZGRlbkl0ZW1zW2VsZW1lbnQuaW5kZXhdLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5vdmVyZmxvd1Zpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsZW1bMF0ucXVlcnlTZWxlY3RvckFsbCgnLm1zLUNvbW1hbmRCYXJJdGVtJylbZWxlbWVudC5pbmRleF0pLnJlbW92ZUNsYXNzKCdpcy1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaGlkZGVuSXRlbXNbZWxlbWVudC5pbmRleF0udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5vdmVyZmxvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN0cmwuJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseSgpO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLiRvbigndWlmLWNvbW1hbmQtYmFyLXJlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLm92ZXJmbG93TWVudU9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLnRvZ2dsZUl0ZW1WaXNpYmlsaXR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBhbmd1bGFyLmVsZW1lbnQod2luZG93KS5iaW5kKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS4kYnJvYWRjYXN0KCd1aWYtY29tbWFuZC1iYXItcmVzaXplJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLmxvYWRNZW51SXRlbXMoYW5ndWxhci5lbGVtZW50KGVsZW1bMF0ucXVlcnlTZWxlY3RvckFsbCgnLm1zLUNvbW1hbmRCYXJJdGVtJykpKTtcbiAgICAgICAgICAgIHNjb3BlLnRvZ2dsZUl0ZW1WaXNpYmlsaXR5KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIENvbW1hbmRCYXJNYWluRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuQ29tbWFuZEJhck1haW5EaXJlY3RpdmUgPSBDb21tYW5kQmFyTWFpbkRpcmVjdGl2ZTtcbnZhciBDb21tYW5kQmFyTWFpbkNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbW1hbmRCYXJNYWluQ29udHJvbGxlcigkc2NvcGUsICRlbGVtZW50LCAkY29tcGlsZSwgJHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSAkZWxlbWVudDtcbiAgICAgICAgdGhpcy4kY29tcGlsZSA9ICRjb21waWxlO1xuICAgICAgICB0aGlzLiR0aW1lb3V0ID0gJHRpbWVvdXQ7XG4gICAgfVxuICAgIENvbW1hbmRCYXJNYWluQ29udHJvbGxlci5wcm90b3R5cGUuYWRkT3ZlcmZsb3dJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKHRoaXMuJHNjb3BlLmhpZGRlbkl0ZW1zID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLmhpZGRlbkl0ZW1zID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaXRlbS5pID0gdGhpcy4kc2NvcGUuaGlkZGVuSXRlbXMubGVuZ3RoO1xuICAgICAgICB0aGlzLiRzY29wZS5oaWRkZW5JdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH07XG4gICAgcmV0dXJuIENvbW1hbmRCYXJNYWluQ29udHJvbGxlcjtcbn0oKSk7XG5Db21tYW5kQmFyTWFpbkNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHNjb3BlJywgJyRlbGVtZW50JywgJyRjb21waWxlJywgJyR0aW1lb3V0J107XG5leHBvcnRzLkNvbW1hbmRCYXJNYWluQ29udHJvbGxlciA9IENvbW1hbmRCYXJNYWluQ29udHJvbGxlcjtcbnZhciBDb21tYW5kQmFySXRlbURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tbWFuZEJhckl0ZW1EaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLUNvbW1hbmRCYXJJdGVtXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLUNvbW1hbmRCYXJJdGVtLWxpbmtXcmFwcGVyXCI+JyArXG4gICAgICAgICAgICAnIDxhIGNsYXNzPVwibXMtQ29tbWFuZEJhckl0ZW0tbGlua1wiPicgK1xuICAgICAgICAgICAgJyA8L2E+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gQ29tbWFuZEJhck1haW5Db250cm9sbGVyO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSAnXj91aWZDb21tYW5kQmFyTWFpbic7XG4gICAgfVxuICAgIENvbW1hbmRCYXJJdGVtRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQ29tbWFuZEJhckl0ZW1EaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIENvbW1hbmRCYXJJdGVtRGlyZWN0aXZlLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIGF0dHJzLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3N0OiB0aGlzLnBvc3RMaW5rXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBDb21tYW5kQmFySXRlbURpcmVjdGl2ZS5wcm90b3R5cGUucG9zdExpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHJzLCBjdHJsLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIHRyYW5zY2x1ZGUoZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICB2YXIgaGlkZGVuSXRlbTtcbiAgICAgICAgICAgIGhpZGRlbkl0ZW0gPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVbaV0udGFnTmFtZSA9PT0gJ1VJRi1JQ09OJykge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoZWxlbVswXS5xdWVyeVNlbGVjdG9yKCdhLm1zLUNvbW1hbmRCYXJJdGVtLWxpbmsnKSkuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNsb25lW2ldLnRhZ05hbWUgPT09ICdTUEFOJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb25lW2ldLmNsYXNzTGlzdC5jb250YWlucygnbXMtQ29tbWFuZEJhckl0ZW0tY29tbWFuZFRleHQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVbaV0uY2xhc3NMaXN0LmFkZCgnbXMtQ29tbWFuZEJhckl0ZW0tY29tbWFuZFRleHQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xvbmVbaV0uY2xhc3NOYW1lLmluZGV4T2YoJ21zLWZvbnQtJykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZVtpXS5jbGFzc0xpc3QuYWRkKCdtcy1mb250LW0nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoZWxlbVswXS5xdWVyeVNlbGVjdG9yKCdhLm1zLUNvbW1hbmRCYXJJdGVtLWxpbmsnKSkuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuSXRlbS50ZXh0ID0gY2xvbmVbaV0uaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVbaV0udGFnTmFtZSA9PT0gJ1VMJyAmJiBjbG9uZVtpXS5jbGFzc0xpc3QuY29udGFpbnMoJ21zLUNvbnRleHR1YWxNZW51JykpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsZW0pLmFwcGVuZChjbG9uZVtpXSk7XG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkl0ZW0uc3VibWVudSA9IGNsb25lW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdHJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhpZGRlbkl0ZW0uc3VibWVudSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkl0ZW0ubWVudVR5cGUgPSAnbGluayc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoaWRkZW5JdGVtLm1lbnVUeXBlID0gJ3N1Yk1lbnUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdHJsLmFkZE92ZXJmbG93SXRlbShoaWRkZW5JdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhbmd1bGFyLmVsZW1lbnQoZWxlbVswXS5xdWVyeVNlbGVjdG9yKCcubXMtQ29tbWFuZEJhckl0ZW0tbGluayA+IHVpZi1pY29uJykpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsZW1bMF0ucXVlcnlTZWxlY3RvcignLm1zLUNvbW1hbmRCYXJJdGVtJykpLmFkZENsYXNzKCdtcy1Db21tYW5kQmFySXRlbS1oYXNUZXh0T25seScpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29tbWFuZEJhckl0ZW1EaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5Db21tYW5kQmFySXRlbURpcmVjdGl2ZSA9IENvbW1hbmRCYXJJdGVtRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5jb21tYW5kYmFyJywgW1xuICAgICdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ1xuXSlcbiAgICAuZGlyZWN0aXZlKCd1aWZDb21tYW5kQmFyJywgQ29tbWFuZEJhckRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmQ29tbWFuZEJhclNlYXJjaCcsIENvbW1hbmRCYXJTZWFyY2hEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkNvbW1hbmRCYXJJdGVtJywgQ29tbWFuZEJhckl0ZW1EaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkNvbW1hbmRCYXJNYWluJywgQ29tbWFuZEJhck1haW5EaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkNvbW1hbmRCYXJTaWRlJywgQ29tbWFuZEJhclNpZGVEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvY29tbWFuZGJhci9jb21tYW5kQmFyRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgQ29udGVudERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29udGVudERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIjxzcGFuIGNsYXNzPVxcXCJ1aWYtY29udGVudFxcXCIgbmctdHJhbnNjbHVkZT48L3NwYW4+XCI7XG4gICAgfVxuICAgIENvbnRlbnREaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBDb250ZW50RGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGVudERpcmVjdGl2ZTtcbn0oKSk7XG5Db250ZW50RGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUgPSAndWlmQ29udGVudCc7XG5leHBvcnRzLkNvbnRlbnREaXJlY3RpdmUgPSBDb250ZW50RGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5jb250ZW50JywgW1xuICAgICdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ1xuXSlcbiAgICAuZGlyZWN0aXZlKENvbnRlbnREaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSwgQ29udGVudERpcmVjdGl2ZS5mYWN0b3J5KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9jb250ZW50L2NvbnRlbnREaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBEYXRlcGlja2VyQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGF0ZXBpY2tlckNvbnRyb2xsZXIoJGVsZW1lbnQsICRzY29wZSkge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy5pc1BpY2tpbmdZZWFycyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzUGlja2luZ01vbnRocyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRlRm9ybWF0ID0gJ2QgbW1tbSwgeXl5eSc7XG4gICAgICAgIHRoaXMuakVsZW1lbnQgPSAkKCRlbGVtZW50WzBdKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0ZUZvcm1hdCA9ICRzY29wZS51aWZEYXRlRm9ybWF0O1xuICAgICAgICAkc2NvcGUuY3RybCA9IHRoaXM7XG4gICAgfVxuICAgIERhdGVwaWNrZXJDb250cm9sbGVyLnByb3RvdHlwZS5yYW5nZSA9IGZ1bmN0aW9uIChtaW4sIG1heCwgc3RlcCkge1xuICAgICAgICBzdGVwID0gc3RlcCB8fCAxO1xuICAgICAgICB2YXIgaW5wdXQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IG1pbjsgaSA8PSBtYXg7IGkgKz0gc3RlcCkge1xuICAgICAgICAgICAgaW5wdXQucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfTtcbiAgICBEYXRlcGlja2VyQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0UGlja2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qRWxlbWVudC5maW5kKCcubXMtVGV4dEZpZWxkLWZpZWxkJykucGlja2FkYXRlKCdwaWNrZXInKTtcbiAgICB9O1xuICAgIERhdGVwaWNrZXJDb250cm9sbGVyLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmdldFBpY2tlcigpLnNldCgnc2VsZWN0JywgdmFsdWUpO1xuICAgICAgICB0aGlzLmNoYW5nZUhpZ2hsaWdodGVkRGF0ZSh2YWx1ZS5nZXRGdWxsWWVhcigpLCB2YWx1ZS5nZXRNb250aCgpLCB2YWx1ZS5nZXREYXRlKCkpO1xuICAgIH07XG4gICAgRGF0ZXBpY2tlckNvbnRyb2xsZXIucHJvdG90eXBlLmluaXREYXRlcGlja2VyID0gZnVuY3Rpb24gKG5nTW9kZWwpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLmpFbGVtZW50LmZpbmQoJy5tcy1UZXh0RmllbGQtZmllbGQnKS5waWNrYWRhdGUoe1xuICAgICAgICAgICAgY2xlYXI6ICcnLFxuICAgICAgICAgICAgY2xvc2U6ICcnLFxuICAgICAgICAgICAgZm9ybWF0OiBzZWxmLmRpc3BsYXlEYXRlRm9ybWF0LFxuICAgICAgICAgICAga2xhc3M6IHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6ICdtcy1EYXRlUGlja2VyLWlucHV0LS1hY3RpdmUnLFxuICAgICAgICAgICAgICAgIGJveDogJ21zLURhdGVQaWNrZXItZGF5UGlja2VyJyxcbiAgICAgICAgICAgICAgICBkYXk6ICdtcy1EYXRlUGlja2VyLWRheScsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICdtcy1EYXRlUGlja2VyLWRheS0tZGlzYWJsZWQnLFxuICAgICAgICAgICAgICAgIGZvY3VzZWQ6ICdtcy1EYXRlUGlja2VyLXBpY2tlci0tZm9jdXNlZCcsXG4gICAgICAgICAgICAgICAgZnJhbWU6ICdtcy1EYXRlUGlja2VyLWZyYW1lJyxcbiAgICAgICAgICAgICAgICBoZWFkZXI6ICdtcy1EYXRlUGlja2VyLWhlYWRlcicsXG4gICAgICAgICAgICAgICAgaG9sZGVyOiAnbXMtRGF0ZVBpY2tlci1ob2xkZXInLFxuICAgICAgICAgICAgICAgIGluZm9jdXM6ICdtcy1EYXRlUGlja2VyLWRheS0taW5mb2N1cycsXG4gICAgICAgICAgICAgICAgaW5wdXQ6ICdtcy1EYXRlUGlja2VyLWlucHV0JyxcbiAgICAgICAgICAgICAgICBtb250aDogJ21zLURhdGVQaWNrZXItbW9udGgnLFxuICAgICAgICAgICAgICAgIG5vdzogJ21zLURhdGVQaWNrZXItZGF5LS10b2RheScsXG4gICAgICAgICAgICAgICAgb3BlbmVkOiAnbXMtRGF0ZVBpY2tlci1waWNrZXItLW9wZW5lZCcsXG4gICAgICAgICAgICAgICAgb3V0Zm9jdXM6ICdtcy1EYXRlUGlja2VyLWRheS0tb3V0Zm9jdXMnLFxuICAgICAgICAgICAgICAgIHBpY2tlcjogJ21zLURhdGVQaWNrZXItcGlja2VyJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogJ21zLURhdGVQaWNrZXItZGF5LS1zZWxlY3RlZCcsXG4gICAgICAgICAgICAgICAgdGFibGU6ICdtcy1EYXRlUGlja2VyLXRhYmxlJyxcbiAgICAgICAgICAgICAgICB3ZWVrZGF5czogJ21zLURhdGVQaWNrZXItd2Vla2RheScsXG4gICAgICAgICAgICAgICAgd3JhcDogJ21zLURhdGVQaWNrZXItd3JhcCcsXG4gICAgICAgICAgICAgICAgeWVhcjogJ21zLURhdGVQaWNrZXIteWVhcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblN0YXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pbml0Q3VzdG9tVmlldygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvZGF5OiAnJyxcbiAgICAgICAgICAgIHdlZWtkYXlzU2hvcnQ6IFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcGlja2VyID0gdGhpcy5nZXRQaWNrZXIoKTtcbiAgICAgICAgcGlja2VyLm9uKHtcbiAgICAgICAgICAgIG9wZW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnNjcm9sbFVwKCk7XG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5nTW9kZWwpICYmIG5nTW9kZWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0VG91Y2hlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWxmLiRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRWYWx1ZSA9IHBpY2tlci5nZXQoJ3NlbGVjdCcsICd5eXl5LW1tLWRkJyk7XG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5nTW9kZWwpICYmIG5nTW9kZWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0Vmlld1ZhbHVlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRGF0ZXBpY2tlckNvbnRyb2xsZXIucHJvdG90eXBlLmluaXRDdXN0b21WaWV3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJG1vbnRoQ29udHJvbHMgPSB0aGlzLmpFbGVtZW50LmZpbmQoJy5tcy1EYXRlUGlja2VyLW1vbnRoQ29tcG9uZW50cycpO1xuICAgICAgICB2YXIgJGdvVG9kYXkgPSB0aGlzLmpFbGVtZW50LmZpbmQoJy5tcy1EYXRlUGlja2VyLWdvVG9kYXknKTtcbiAgICAgICAgdmFyICRtb250aFBpY2tlciA9IHRoaXMuakVsZW1lbnQuZmluZCgnLm1zLURhdGVQaWNrZXItbW9udGhQaWNrZXInKTtcbiAgICAgICAgdmFyICR5ZWFyUGlja2VyID0gdGhpcy5qRWxlbWVudC5maW5kKCcubXMtRGF0ZVBpY2tlci15ZWFyUGlja2VyJyk7XG4gICAgICAgIHZhciAkcGlja2VyV3JhcHBlciA9IHRoaXMuakVsZW1lbnQuZmluZCgnLm1zLURhdGVQaWNrZXItd3JhcCcpO1xuICAgICAgICB2YXIgJHBpY2tlciA9IHRoaXMuZ2V0UGlja2VyKCk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgJG1vbnRoQ29udHJvbHMuYXBwZW5kVG8oJHBpY2tlcldyYXBwZXIpO1xuICAgICAgICAkZ29Ub2RheS5hcHBlbmRUbygkcGlja2VyV3JhcHBlcik7XG4gICAgICAgICRtb250aFBpY2tlci5hcHBlbmRUbygkcGlja2VyV3JhcHBlcik7XG4gICAgICAgICR5ZWFyUGlja2VyLmFwcGVuZFRvKCRwaWNrZXJXcmFwcGVyKTtcbiAgICAgICAgJG1vbnRoQ29udHJvbHMub24oJ2NsaWNrJywgJy5qcy1wcmV2TW9udGgnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgbmV3TW9udGggPSAkcGlja2VyLmdldCgnaGlnaGxpZ2h0JykubW9udGggLSAxO1xuICAgICAgICAgICAgc2VsZi5jaGFuZ2VIaWdobGlnaHRlZERhdGUobnVsbCwgbmV3TW9udGgsIG51bGwpO1xuICAgICAgICAgICAgc2VsZi4kc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkbW9udGhDb250cm9scy5vbignY2xpY2snLCAnLmpzLW5leHRNb250aCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHZhciBuZXdNb250aCA9ICRwaWNrZXIuZ2V0KCdoaWdobGlnaHQnKS5tb250aCArIDE7XG4gICAgICAgICAgICBzZWxmLmNoYW5nZUhpZ2hsaWdodGVkRGF0ZShudWxsLCBuZXdNb250aCwgbnVsbCk7XG4gICAgICAgICAgICBzZWxmLiRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgICRtb250aFBpY2tlci5vbignY2xpY2snLCAnLmpzLXByZXZZZWFyJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIG5ld1llYXIgPSAkcGlja2VyLmdldCgnaGlnaGxpZ2h0JykueWVhciAtIDE7XG4gICAgICAgICAgICBzZWxmLmNoYW5nZUhpZ2hsaWdodGVkRGF0ZShuZXdZZWFyLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIHNlbGYuJHNjb3BlLiRhcHBseSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgJG1vbnRoUGlja2VyLm9uKCdjbGljaycsICcuanMtbmV4dFllYXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgbmV3WWVhciA9ICRwaWNrZXIuZ2V0KCdoaWdobGlnaHQnKS55ZWFyICsgMTtcbiAgICAgICAgICAgIHNlbGYuY2hhbmdlSGlnaGxpZ2h0ZWREYXRlKG5ld1llYXIsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgc2VsZi4kc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkeWVhclBpY2tlci5vbignY2xpY2snLCAnLmpzLXByZXZEZWNhZGUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgbmV3WWVhciA9ICRwaWNrZXIuZ2V0KCdoaWdobGlnaHQnKS55ZWFyIC0gMTA7XG4gICAgICAgICAgICBzZWxmLmNoYW5nZUhpZ2hsaWdodGVkRGF0ZShuZXdZZWFyLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIHNlbGYuJHNjb3BlLiRhcHBseSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgJHllYXJQaWNrZXIub24oJ2NsaWNrJywgJy5qcy1uZXh0RGVjYWRlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIG5ld1llYXIgPSAkcGlja2VyLmdldCgnaGlnaGxpZ2h0JykueWVhciArIDEwO1xuICAgICAgICAgICAgc2VsZi5jaGFuZ2VIaWdobGlnaHRlZERhdGUobmV3WWVhciwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICBzZWxmLiRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgICRnb1RvZGF5Lm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgJHBpY2tlci5zZXQoJ3NlbGVjdCcsIG5vdyk7XG4gICAgICAgICAgICBzZWxmLmpFbGVtZW50LnJlbW92ZUNsYXNzKCdpcy1waWNraW5nTW9udGhzJykucmVtb3ZlQ2xhc3MoJ2lzLXBpY2tpbmdZZWFycycpO1xuICAgICAgICAgICAgc2VsZi4kc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkbW9udGhQaWNrZXIub24oJ2NsaWNrJywgJy5qcy1jaGFuZ2VEYXRlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnREYXRlID0gJHBpY2tlci5nZXQoJ2hpZ2hsaWdodCcpO1xuICAgICAgICAgICAgdmFyIG5ld1llYXIgPSBjdXJyZW50RGF0ZS55ZWFyO1xuICAgICAgICAgICAgdmFyIG5ld01vbnRoID0gKyQodGhpcykuYXR0cignZGF0YS1tb250aCcpO1xuICAgICAgICAgICAgdmFyIG5ld0RheSA9IGN1cnJlbnREYXRlLmRhdGU7XG4gICAgICAgICAgICBzZWxmLmNoYW5nZUhpZ2hsaWdodGVkRGF0ZShuZXdZZWFyLCBuZXdNb250aCwgbmV3RGF5KTtcbiAgICAgICAgICAgIGlmIChzZWxmLmpFbGVtZW50Lmhhc0NsYXNzKCdpcy1waWNraW5nTW9udGhzJykpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmpFbGVtZW50LnJlbW92ZUNsYXNzKCdpcy1waWNraW5nTW9udGhzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLiRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgICR5ZWFyUGlja2VyLm9uKCdjbGljaycsICcuanMtY2hhbmdlRGF0ZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50RGF0ZSA9ICRwaWNrZXIuZ2V0KCdoaWdobGlnaHQnKTtcbiAgICAgICAgICAgIHZhciBuZXdZZWFyID0gKyQodGhpcykuYXR0cignZGF0YS15ZWFyJyk7XG4gICAgICAgICAgICB2YXIgbmV3TW9udGggPSBjdXJyZW50RGF0ZS5tb250aDtcbiAgICAgICAgICAgIHZhciBuZXdEYXkgPSBjdXJyZW50RGF0ZS5kYXRlO1xuICAgICAgICAgICAgc2VsZi5jaGFuZ2VIaWdobGlnaHRlZERhdGUobmV3WWVhciwgbmV3TW9udGgsIG5ld0RheSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5qRWxlbWVudC5oYXNDbGFzcygnaXMtcGlja2luZ1llYXJzJykpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmpFbGVtZW50LnJlbW92ZUNsYXNzKCdpcy1waWNraW5nWWVhcnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuJHNjb3BlLiRhcHBseSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgJG1vbnRoQ29udHJvbHMub24oJ2NsaWNrJywgJy5qcy1zaG93TW9udGhQaWNrZXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGYuaXNQaWNraW5nTW9udGhzID0gIXNlbGYuaXNQaWNraW5nTW9udGhzO1xuICAgICAgICAgICAgc2VsZi4kc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkbW9udGhQaWNrZXIub24oJ2NsaWNrJywgJy5qcy1zaG93WWVhclBpY2tlcicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgc2VsZi5pc1BpY2tpbmdZZWFycyA9ICFzZWxmLmlzUGlja2luZ1llYXJzO1xuICAgICAgICAgICAgc2VsZi4kc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLiRzY29wZS5oaWdobGlnaHRlZFZhbHVlID0gJHBpY2tlci5nZXQoJ2hpZ2hsaWdodCcpO1xuICAgIH07XG4gICAgRGF0ZXBpY2tlckNvbnRyb2xsZXIucHJvdG90eXBlLnNjcm9sbFVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7IHNjcm9sbFRvcDogdGhpcy5qRWxlbWVudC5vZmZzZXQoKS50b3AgfSwgMzY3KTtcbiAgICB9O1xuICAgIERhdGVwaWNrZXJDb250cm9sbGVyLnByb3RvdHlwZS5jaGFuZ2VIaWdobGlnaHRlZERhdGUgPSBmdW5jdGlvbiAobmV3WWVhciwgbmV3TW9udGgsIG5ld0RheSkge1xuICAgICAgICB2YXIgcGlja2VyID0gdGhpcy5nZXRQaWNrZXIoKTtcbiAgICAgICAgaWYgKG5ld1llYXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3WWVhciA9IHBpY2tlci5nZXQoJ2hpZ2hsaWdodCcpLnllYXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld01vbnRoID09IG51bGwpIHtcbiAgICAgICAgICAgIG5ld01vbnRoID0gcGlja2VyLmdldCgnaGlnaGxpZ2h0JykubW9udGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0RheSA9PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdEYXkgPSBwaWNrZXIuZ2V0KCdoaWdobGlnaHQnKS5kYXRlO1xuICAgICAgICB9XG4gICAgICAgIHBpY2tlci5zZXQoJ2hpZ2hsaWdodCcsIFtuZXdZZWFyLCBuZXdNb250aCwgbmV3RGF5XSk7XG4gICAgICAgIHRoaXMuJHNjb3BlLmhpZ2hsaWdodGVkVmFsdWUgPSBwaWNrZXIuZ2V0KCdoaWdobGlnaHQnKTtcbiAgICB9O1xuICAgIHJldHVybiBEYXRlcGlja2VyQ29udHJvbGxlcjtcbn0oKSk7XG5EYXRlcGlja2VyQ29udHJvbGxlci4kaW5qZWN0ID0gWyckZWxlbWVudCcsICckc2NvcGUnXTtcbmV4cG9ydHMuRGF0ZXBpY2tlckNvbnRyb2xsZXIgPSBEYXRlcGlja2VyQ29udHJvbGxlcjtcbnZhciBEYXRlcGlja2VyRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEYXRlcGlja2VyRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgbmctY2xhc3M9XCJ7XFwnbXMtRGF0ZVBpY2tlclxcJzogdHJ1ZSwgXFwnaXMtcGlja2luZ1llYXJzXFwnOiBjdHJsLmlzUGlja2luZ1llYXJzLCBcXCdpcy1waWNraW5nTW9udGhzXFwnOiBjdHJsLmlzUGlja2luZ01vbnRoc31cIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibXMtVGV4dEZpZWxkXCI+JyArXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJtcy1EYXRlUGlja2VyLWV2ZW50IG1zLUljb24gbXMtSWNvbi0tZXZlbnRcIj48L2k+JyArXG4gICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwibXMtVGV4dEZpZWxkLWZpZWxkXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cInt7cGxhY2Vob2xkZXJ9fVwiIG5nLWRpc2FibGVkPVwiaXNEaXNhYmxlZFwiPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1EYXRlUGlja2VyLW1vbnRoQ29tcG9uZW50c1wiPicgK1xuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwibXMtRGF0ZVBpY2tlci1uZXh0TW9udGgganMtbmV4dE1vbnRoXCI+PGkgY2xhc3M9XCJtcy1JY29uIG1zLUljb24tLWNoZXZyb25SaWdodFwiPjwvaT48L3NwYW4+JyArXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtcy1EYXRlUGlja2VyLXByZXZNb250aCBqcy1wcmV2TW9udGhcIj48aSBjbGFzcz1cIm1zLUljb24gbXMtSWNvbi0tY2hldnJvbkxlZnRcIj48L2k+PC9zcGFuPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1EYXRlUGlja2VyLWhlYWRlclRvZ2dsZVZpZXcganMtc2hvd01vbnRoUGlja2VyXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtcy1EYXRlUGlja2VyLWdvVG9kYXkganMtZ29Ub2RheVwiPkdvIHRvIHRvZGF5PC9zcGFuPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1EYXRlUGlja2VyLW1vbnRoUGlja2VyXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLURhdGVQaWNrZXItaGVhZGVyXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLURhdGVQaWNrZXIteWVhckNvbXBvbmVudHNcIj4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cIm1zLURhdGVQaWNrZXItbmV4dFllYXIganMtbmV4dFllYXJcIj48aSBjbGFzcz1cIm1zLUljb24gbXMtSWNvbi0tY2hldnJvblJpZ2h0XCI+PC9pPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cIm1zLURhdGVQaWNrZXItcHJldlllYXIganMtcHJldlllYXJcIj48aSBjbGFzcz1cIm1zLUljb24gbXMtSWNvbi0tY2hldnJvbkxlZnRcIj48L2k+PC9zcGFuPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1EYXRlUGlja2VyLWN1cnJlbnRZZWFyIGpzLXNob3dZZWFyUGlja2VyXCI+e3toaWdobGlnaHRlZFZhbHVlLnllYXJ9fTwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1EYXRlUGlja2VyLW9wdGlvbkdyaWRcIiA+JyArXG4gICAgICAgICAgICAnPHNwYW4gbmctcmVwZWF0PVwibW9udGggaW4gbW9udGhzQXJyYXlcIicgK1xuICAgICAgICAgICAgJ25nLWNsYXNzPVwie1xcJ21zLURhdGVQaWNrZXItbW9udGhPcHRpb24ganMtY2hhbmdlRGF0ZVxcJzogdHJ1ZSwgJyArXG4gICAgICAgICAgICAnXFwnaXMtaGlnaGxpZ2h0ZWRcXCc6IGhpZ2hsaWdodGVkVmFsdWUubW9udGggPT0gJGluZGV4fVwiJyArXG4gICAgICAgICAgICAnZGF0YS1tb250aD1cInt7JGluZGV4fX1cIj4nICtcbiAgICAgICAgICAgICd7e21vbnRofX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLURhdGVQaWNrZXIteWVhclBpY2tlclwiPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1EYXRlUGlja2VyLWRlY2FkZUNvbXBvbmVudHNcIj4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cIm1zLURhdGVQaWNrZXItbmV4dERlY2FkZSBqcy1uZXh0RGVjYWRlXCI+PGkgY2xhc3M9XCJtcy1JY29uIG1zLUljb24tLWNoZXZyb25SaWdodFwiPjwvaT48L3NwYW4+JyArXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtcy1EYXRlUGlja2VyLXByZXZEZWNhZGUganMtcHJldkRlY2FkZVwiPjxpIGNsYXNzPVwibXMtSWNvbiBtcy1JY29uLS1jaGV2cm9uTGVmdFwiPjwvaT48L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLURhdGVQaWNrZXItY3VycmVudERlY2FkZVwiPnt7aGlnaGxpZ2h0ZWRWYWx1ZS55ZWFyIC0gMTB9fSAtIHt7aGlnaGxpZ2h0ZWRWYWx1ZS55ZWFyfX08L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibXMtRGF0ZVBpY2tlci1vcHRpb25HcmlkXCI+JyArXG4gICAgICAgICAgICAnPHNwYW4gbmctY2xhc3M9XCJ7XFwnbXMtRGF0ZVBpY2tlci15ZWFyT3B0aW9uIGpzLWNoYW5nZURhdGVcXCc6IHRydWUsJyArXG4gICAgICAgICAgICAnXFwnaXMtaGlnaGxpZ2h0ZWRcXCc6IGhpZ2hsaWdodGVkVmFsdWUueWVhciA9PSB5ZWFyfVwiICcgK1xuICAgICAgICAgICAgJ25nLXJlcGVhdD1cInllYXIgaW4gY3RybC5yYW5nZShoaWdobGlnaHRlZFZhbHVlLnllYXIgLSAxMCwgaGlnaGxpZ2h0ZWRWYWx1ZS55ZWFyKVwiJyArXG4gICAgICAgICAgICAnZGF0YS15ZWFyPVwie3t5ZWFyfX1cIj57e3llYXJ9fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBEYXRlcGlja2VyQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQCcsXG4gICAgICAgICAgICB1aWZEYXRlRm9ybWF0OiAnQCcsXG4gICAgICAgICAgICB1aWZNb250aHM6ICdAJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ3VpZkRhdGVwaWNrZXInLCAnP25nTW9kZWwnXTtcbiAgICB9XG4gICAgRGF0ZXBpY2tlckRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERhdGVwaWNrZXJEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIERhdGVwaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAodGVtcGxhdGVFbGVtZW50LCB0ZW1wbGF0ZUF0dHJpYnV0ZXMsIHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc3Q6IHRoaXMucG9zdExpbmssXG4gICAgICAgICAgICBwcmU6IHRoaXMucHJlTGlua1xuICAgICAgICB9O1xuICAgIH07XG4gICAgRGF0ZXBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUucHJlTGluayA9IGZ1bmN0aW9uICgkc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgaW5zdGFuY2VBdHRyaWJ1dGVzLCBjdHJscykge1xuICAgICAgICBpZiAoISRzY29wZS51aWZNb250aHMpIHtcbiAgICAgICAgICAgICRzY29wZS51aWZNb250aHMgPSAnSmFuLCBGZWIsIE1hciwgQXByLCBNYXksIEp1biwgSnVsLCBBdWcsIFNlcCwgT2N0LCBOb3YsIERlYyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkc2NvcGUucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICRzY29wZS5wbGFjZWhvbGRlciA9ICdTZWxlY3QgYSBkYXRlJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoISRzY29wZS51aWZEYXRlRm9ybWF0KSB7XG4gICAgICAgICAgICAkc2NvcGUudWlmRGF0ZUZvcm1hdCA9ICdkIG1tbW0sIHl5eXknO1xuICAgICAgICB9XG4gICAgICAgICRzY29wZS5tb250aHNBcnJheSA9ICRzY29wZS51aWZNb250aHMuc3BsaXQoJywnKTtcbiAgICAgICAgaWYgKCRzY29wZS5tb250aHNBcnJheS5sZW5ndGggIT09IDEyKSB7XG4gICAgICAgICAgICB0aHJvdyAnTW9udGhzIHNldHRpbmcgc2hvdWxkIGhhdmUgMTIgbW9udGhzLCBzZXBhcmF0ZWQgYnkgYSBjb21tYSc7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2VBdHRyaWJ1dGVzLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgJHNjb3BlLmlzRGlzYWJsZWQgPSAhIWRpc2FibGVkO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIERhdGVwaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLnBvc3RMaW5rID0gZnVuY3Rpb24gKCRzY29wZSwgJGVsZW1lbnQsIGF0dHJzLCBjdHJscykge1xuICAgICAgICB2YXIgZGF0ZXBpY2tlckNvbnRyb2xsZXIgPSBjdHJsc1swXTtcbiAgICAgICAgdmFyIG5nTW9kZWwgPSBjdHJsc1sxXTtcbiAgICAgICAgZGF0ZXBpY2tlckNvbnRyb2xsZXIuaW5pdERhdGVwaWNrZXIobmdNb2RlbCk7XG4gICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChuZ01vZGVsKSAmJiBuZ01vZGVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBuZ01vZGVsLiRyZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5nTW9kZWwuJG1vZGVsVmFsdWUgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgJiYgbmdNb2RlbC4kbW9kZWxWYWx1ZSAhPT0gJydcbiAgICAgICAgICAgICAgICAgICAgJiYgdHlwZW9mIG5nTW9kZWwuJG1vZGVsVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmdNb2RlbC4kbW9kZWxWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUobmdNb2RlbC4kbW9kZWxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlcGlja2VyQ29udHJvbGxlci5zZXRWYWx1ZShkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVwaWNrZXJDb250cm9sbGVyLnNldFZhbHVlKG5nTW9kZWwuJG1vZGVsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5nTW9kZWwuJHNldFByaXN0aW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERhdGVwaWNrZXJEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5EYXRlcGlja2VyRGlyZWN0aXZlID0gRGF0ZXBpY2tlckRpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMuZGF0ZXBpY2tlcicsIFtcbiAgICAnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cydcbl0pXG4gICAgLmRpcmVjdGl2ZSgndWlmRGF0ZXBpY2tlcicsIERhdGVwaWNrZXJEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9kYXRlcGlja2VyRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgZGlhbG9nRW51bXNfMSA9IHJlcXVpcmUoXCIuL2RpYWxvZ0VudW1zXCIpO1xudmFyIERpYWxvZ0NvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERpYWxvZ0NvbnRyb2xsZXIoJGxvZykge1xuICAgICAgICB0aGlzLiRsb2cgPSAkbG9nO1xuICAgIH1cbiAgICByZXR1cm4gRGlhbG9nQ29udHJvbGxlcjtcbn0oKSk7XG5EaWFsb2dDb250cm9sbGVyLiRpbmplY3QgPSBbJyRsb2cnXTtcbmV4cG9ydHMuRGlhbG9nQ29udHJvbGxlciA9IERpYWxvZ0NvbnRyb2xsZXI7XG52YXIgRGlhbG9nRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaWFsb2dEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IERpYWxvZ0NvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLURpYWxvZ1wiJyArXG4gICAgICAgICAgICAnbmctY2xhc3M9XCJ7IFxcJ21zLURpYWxvZy0tY2xvc2VcXCc6IHVpZkNsb3NlPT1cXCd0cnVlXFwnJyArXG4gICAgICAgICAgICAnLCBcXCdtcy1EaWFsb2ctLWxnSGVhZGVyXFwnOiB1aWZUeXBlPT1cXCdoZWFkZXJcXCcnICtcbiAgICAgICAgICAgICcsIFxcJ21zLURpYWxvZy0tbXVsdGlsaW5lXFwnOiB1aWZUeXBlPT1cXCdtdWx0aWxpbmVcXCcgfVwiPicgK1xuICAgICAgICAgICAgJzx1aWYtb3ZlcmxheSB1aWYtbW9kZT1cInt7dWlmT3ZlcmxheX19XCI+PC91aWYtb3ZlcmxheT4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibXMtRGlhbG9nLW1haW5cIiBuZy10cmFuc2NsdWRlPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICB1aWZDbG9zZTogJ0AnLFxuICAgICAgICAgICAgdWlmT3ZlcmxheTogJ0AnLFxuICAgICAgICAgICAgdWlmVHlwZTogJ0AnXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWxvZ0RpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERpYWxvZ0RpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgRGlhbG9nRGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcikge1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZlR5cGUnLCBmdW5jdGlvbiAobmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChuZXdWYWx1ZSkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRpYWxvZ0VudW1zXzEuRGlhbG9nVHlwZUVudW1bbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5kaWFsb2cgLSBVbnN1cHBvcnRlZCB0eXBlOicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSB0eXBlIChcXCcnICsgc2NvcGUudWlmVHlwZSArICdcXCcpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIE9mZmljZSBVSSBGYWJyaWMuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnU3VwcG9ydGVkIG9wdGlvbnMgYXJlIGxpc3RlZCBoZXJlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vbmdPZmZpY2VVSUZhYnJpYy9uZy1vZmZpY2V1aWZhYnJpYy9ibG9iL21hc3Rlci9zcmMvY29tcG9uZW50cy9kaWFsb2cvZGlhbG9nRW51bXMudHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIERpYWxvZ0RpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkRpYWxvZ0RpcmVjdGl2ZSA9IERpYWxvZ0RpcmVjdGl2ZTtcbnZhciBEaWFsb2dIZWFkZXJEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERpYWxvZ0hlYWRlckRpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gJ15edWlmRGlhbG9nJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtRGlhbG9nLWhlYWRlclwiPicgK1xuICAgICAgICAgICAgJzxidXR0b24gbmctaWY9XCIkcGFyZW50LnVpZkNsb3NlXCIgY2xhc3M9XCJtcy1EaWFsb2ctYnV0dG9uIG1zLURpYWxvZy1idXR0b24tLWNsb3NlXCI+JyArXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJtcy1JY29uIG1zLUljb24tLXhcIj48L2k+PC9idXR0b24+JyArXG4gICAgICAgICAgICAnPG5nLXRyYW5zY2x1ZGU+PC9uZy10cmFuc2NsdWRlPjwvZGl2Pic7XG4gICAgfVxuICAgIERpYWxvZ0hlYWRlckRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERpYWxvZ0hlYWRlckRpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIERpYWxvZ0hlYWRlckRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkRpYWxvZ0hlYWRlckRpcmVjdGl2ZSA9IERpYWxvZ0hlYWRlckRpcmVjdGl2ZTtcbnZhciBEaWFsb2dDb250ZW50RGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaWFsb2dDb250ZW50RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1EaWFsb2ctY29udGVudFwiIG5nLXRyYW5zY2x1ZGU+PC9kaXY+JztcbiAgICB9XG4gICAgRGlhbG9nQ29udGVudERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERpYWxvZ0NvbnRlbnREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBEaWFsb2dDb250ZW50RGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuRGlhbG9nQ29udGVudERpcmVjdGl2ZSA9IERpYWxvZ0NvbnRlbnREaXJlY3RpdmU7XG52YXIgRGlhbG9nSW5uZXJEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERpYWxvZ0lubmVyRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1EaWFsb2ctaW5uZXJcIiBuZy10cmFuc2NsdWRlPjwvZGl2Pic7XG4gICAgfVxuICAgIERpYWxvZ0lubmVyRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRGlhbG9nSW5uZXJEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBEaWFsb2dJbm5lckRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkRpYWxvZ0lubmVyRGlyZWN0aXZlID0gRGlhbG9nSW5uZXJEaXJlY3RpdmU7XG52YXIgRGlhbG9nU3VidGV4dERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGlhbG9nU3VidGV4dERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8cCBjbGFzcz1cIm1zLURpYWxvZy1zdWJUZXh0XCIgbmctdHJhbnNjbHVkZT48L3A+JztcbiAgICB9XG4gICAgRGlhbG9nU3VidGV4dERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERpYWxvZ1N1YnRleHREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBEaWFsb2dTdWJ0ZXh0RGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuRGlhbG9nU3VidGV4dERpcmVjdGl2ZSA9IERpYWxvZ1N1YnRleHREaXJlY3RpdmU7XG52YXIgRGlhbG9nQWN0aW9uc0NvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERpYWxvZ0FjdGlvbnNDb250cm9sbGVyKCRsb2cpIHtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICB9XG4gICAgcmV0dXJuIERpYWxvZ0FjdGlvbnNDb250cm9sbGVyO1xufSgpKTtcbkRpYWxvZ0FjdGlvbnNDb250cm9sbGVyLiRpbmplY3QgPSBbJyRsb2cnXTtcbmV4cG9ydHMuRGlhbG9nQWN0aW9uc0NvbnRyb2xsZXIgPSBEaWFsb2dBY3Rpb25zQ29udHJvbGxlcjtcbnZhciBEaWFsb2dBY3Rpb25zRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaWFsb2dBY3Rpb25zRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBEaWFsb2dBY3Rpb25zQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtRGlhbG9nLWFjdGlvbnNcIj48ZGl2IG5nLWNsYXNzPVwieyBcXCdtcy1EaWFsb2ctYWN0aW9uc1JpZ2h0XFwnOiB1aWZQb3NpdGlvbj09XFwncmlnaHRcXCd9XCI+JyArXG4gICAgICAgICAgICAnPG5nLXRyYW5zY2x1ZGU+PC9uZy10cmFuc2NsdWRlPjwvZGl2PjwvZGl2Pic7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICB1aWZQb3NpdGlvbjogJ0AnXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWxvZ0FjdGlvbnNEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBEaWFsb2dBY3Rpb25zRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBEaWFsb2dBY3Rpb25zRGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcikge1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZlBvc2l0aW9uJywgZnVuY3Rpb24gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAobmV3VmFsdWUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChkaWFsb2dFbnVtc18xLkRpYWxvZ0FjdGlvbnNQb3NpdGlvbkVudW1bbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5kaWFsb2cgLSBVbnN1cHBvcnRlZCB0eXBlOicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSB0eXBlIChcXCcnICsgc2NvcGUudWlmUG9zaXRpb24gKyAnXFwnKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBPZmZpY2UgVUkgRmFicmljLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCBvcHRpb25zIGFyZSBsaXN0ZWQgaGVyZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL25nT2ZmaWNlVUlGYWJyaWMvbmctb2ZmaWNldWlmYWJyaWMvYmxvYi9tYXN0ZXIvc3JjL2NvbXBvbmVudHMvZGlhbG9nL2RpYWxvZ0VudW1zLnRzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBEaWFsb2dBY3Rpb25zRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuRGlhbG9nQWN0aW9uc0RpcmVjdGl2ZSA9IERpYWxvZ0FjdGlvbnNEaXJlY3RpdmU7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmRpYWxvZycsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkRpYWxvZycsIERpYWxvZ0RpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmRGlhbG9nSGVhZGVyJywgRGlhbG9nSGVhZGVyRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZEaWFsb2dDb250ZW50JywgRGlhbG9nQ29udGVudERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmRGlhbG9nSW5uZXInLCBEaWFsb2dJbm5lckRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmRGlhbG9nU3VidGV4dCcsIERpYWxvZ1N1YnRleHREaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkRpYWxvZ0FjdGlvbnMnLCBEaWFsb2dBY3Rpb25zRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL2RpYWxvZy9kaWFsb2dEaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIERpYWxvZ1R5cGVFbnVtO1xuKGZ1bmN0aW9uIChEaWFsb2dUeXBlRW51bSkge1xuICAgIERpYWxvZ1R5cGVFbnVtW0RpYWxvZ1R5cGVFbnVtW1wibm9uZVwiXSA9IDBdID0gXCJub25lXCI7XG4gICAgRGlhbG9nVHlwZUVudW1bRGlhbG9nVHlwZUVudW1bXCJoZWFkZXJcIl0gPSAxXSA9IFwiaGVhZGVyXCI7XG4gICAgRGlhbG9nVHlwZUVudW1bRGlhbG9nVHlwZUVudW1bXCJtdWx0aWxpbmVcIl0gPSAyXSA9IFwibXVsdGlsaW5lXCI7XG59KShEaWFsb2dUeXBlRW51bSA9IGV4cG9ydHMuRGlhbG9nVHlwZUVudW0gfHwgKGV4cG9ydHMuRGlhbG9nVHlwZUVudW0gPSB7fSkpO1xudmFyIERpYWxvZ0FjdGlvbnNQb3NpdGlvbkVudW07XG4oZnVuY3Rpb24gKERpYWxvZ0FjdGlvbnNQb3NpdGlvbkVudW0pIHtcbiAgICBEaWFsb2dBY3Rpb25zUG9zaXRpb25FbnVtW0RpYWxvZ0FjdGlvbnNQb3NpdGlvbkVudW1bXCJub25lXCJdID0gMF0gPSBcIm5vbmVcIjtcbiAgICBEaWFsb2dBY3Rpb25zUG9zaXRpb25FbnVtW0RpYWxvZ0FjdGlvbnNQb3NpdGlvbkVudW1bXCJsZWZ0XCJdID0gMV0gPSBcImxlZnRcIjtcbiAgICBEaWFsb2dBY3Rpb25zUG9zaXRpb25FbnVtW0RpYWxvZ0FjdGlvbnNQb3NpdGlvbkVudW1bXCJyaWdodFwiXSA9IDJdID0gXCJyaWdodFwiO1xufSkoRGlhbG9nQWN0aW9uc1Bvc2l0aW9uRW51bSA9IGV4cG9ydHMuRGlhbG9nQWN0aW9uc1Bvc2l0aW9uRW51bSB8fCAoZXhwb3J0cy5EaWFsb2dBY3Rpb25zUG9zaXRpb25FbnVtID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvZGlhbG9nL2RpYWxvZ0VudW1zLnRzXG4vLyBtb2R1bGUgaWQgPSAyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgRHJvcGRvd25PcHRpb25EaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyb3Bkb3duT3B0aW9uRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxsaSBjbGFzcz1cIm1zLURyb3Bkb3duLWl0ZW1cIiBuZy10cmFuc2NsdWRlPjwvbGk+JztcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gJ151aWZEcm9wZG93bic7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgfVxuICAgIERyb3Bkb3duT3B0aW9uRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRHJvcGRvd25PcHRpb25EaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIERyb3Bkb3duT3B0aW9uRGlyZWN0aXZlLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24gKHRlbXBsYXRlRWxlbWVudCwgdGVtcGxhdGVBdHRyaWJ1dGVzLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3N0OiB0aGlzLnBvc3RMaW5rXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBEcm9wZG93bk9wdGlvbkRpcmVjdGl2ZS5wcm90b3R5cGUucG9zdExpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cnMsIGRyb3Bkb3duQ29udHJvbGxlciwgdHJhbnNjbHVkZSkge1xuICAgICAgICBpZiAoIWRyb3Bkb3duQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhyb3cgJ0Ryb3Bkb3duIGNvbnRyb2xsZXIgbm90IGZvdW5kISc7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2VFbGVtZW50XG4gICAgICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbGxlci5zZXRWaWV3VmFsdWUoaW5zdGFuY2VFbGVtZW50LnRleHQoKSwgYXR0cnMudmFsdWUsIGV2KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHZhbHVlID0gJycgKyBkcm9wZG93bkNvbnRyb2xsZXIuZ2V0Vmlld1ZhbHVlKCk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSA9PT0gYXR0cnMudmFsdWUpIHtcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbGxlci5zZXRWaWV3VmFsdWUoYXR0cnMudGl0bGUsIGF0dHJzLnZhbHVlLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERyb3Bkb3duT3B0aW9uRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuRHJvcGRvd25PcHRpb25EaXJlY3RpdmUgPSBEcm9wZG93bk9wdGlvbkRpcmVjdGl2ZTtcbnZhciBEcm9wZG93bkNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyb3Bkb3duQ29udHJvbGxlcigkZWxlbWVudCwgJHNjb3BlLCAkZG9jdW1lbnQpIHtcbiAgICAgICAgdGhpcy4kZWxlbWVudCA9ICRlbGVtZW50O1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kZG9jdW1lbnQgPSAkZG9jdW1lbnQ7XG4gICAgfVxuICAgIERyb3Bkb3duQ29udHJvbGxlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoIXNlbGYuJHNjb3BlLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi4kc2NvcGUuaXNPcGVuID0gIXNlbGYuJHNjb3BlLmlzT3BlbjtcbiAgICAgICAgICAgICAgICBzZWxmLiRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd25XaWR0aCA9IGFuZ3VsYXIuZWxlbWVudCh0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5tcy1Ecm9wZG93bicpKVswXS5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQodGhpcy5xdWVyeVNlbGVjdG9yKCcubXMtRHJvcGRvd24taXRlbXMnKSlbMF0uc3R5bGUud2lkdGggPSBkcm9wZG93bldpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLiRzY29wZS5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY3VtZW50Q2xpY2tIYW5kbGVyXzEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLiRzY29wZS5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuJHNjb3BlLiRhcHBseSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi4kZG9jdW1lbnQub2ZmKCdjbGljaycsIGRvY3VtZW50Q2xpY2tIYW5kbGVyXzEpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzZWxmLiRkb2N1bWVudC5vbignY2xpY2snLCBkb2N1bWVudENsaWNrSGFuZGxlcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi4kc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuJGRvY3VtZW50Lm9mZignY2xpY2snLCBkb2N1bWVudENsaWNrSGFuZGxlcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZWxmLiRzY29wZS5uZ01vZGVsICE9PSB1bmRlZmluZWQgJiYgc2VsZi4kc2NvcGUubmdNb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuJHNjb3BlLm5nTW9kZWwuJHNldFRvdWNoZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuJHNjb3BlLm5nTW9kZWwgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuJHNjb3BlLm5nTW9kZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4kc2NvcGUubmdNb2RlbC4kcmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gc2VsZi4kZWxlbWVudC5maW5kKCdsaScpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9uID0gb3B0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gb3B0aW9uLmdldEF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBzZWxmLiRzY29wZS5uZ01vZGVsLiR2aWV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuJHNjb3BlLnNlbGVjdGVkVGl0bGUgPSBhbmd1bGFyLmVsZW1lbnQob3B0aW9uKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuJHNjb3BlLnNlbGVjdGVkVGl0bGUgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEcm9wZG93bkNvbnRyb2xsZXIucHJvdG90eXBlLnNldFZpZXdWYWx1ZSA9IGZ1bmN0aW9uICh0aXRsZSwgdmFsdWUsIGV2ZW50VHlwZSkge1xuICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZFRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuJHNjb3BlLm5nTW9kZWwuJHNldFZpZXdWYWx1ZSh2YWx1ZSwgZXZlbnRUeXBlKTtcbiAgICB9O1xuICAgIERyb3Bkb3duQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0Vmlld1ZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuJHNjb3BlLm5nTW9kZWwgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuJHNjb3BlLm5nTW9kZWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLm5nTW9kZWwuJHZpZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERyb3Bkb3duQ29udHJvbGxlcjtcbn0oKSk7XG5Ecm9wZG93bkNvbnRyb2xsZXIuJGluamVjdCA9IFsnJGVsZW1lbnQnLCAnJHNjb3BlJywgJyRkb2N1bWVudCddO1xuZXhwb3J0cy5Ecm9wZG93bkNvbnRyb2xsZXIgPSBEcm9wZG93bkNvbnRyb2xsZXI7XG52YXIgRHJvcGRvd25EaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyb3Bkb3duRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgbmctY2xpY2s9XCJkcm9wZG93bkNsaWNrXCIgJyArXG4gICAgICAgICAgICAnbmctY2xhc3M9XCJ7XFwnbXMtRHJvcGRvd25cXCcgOiB0cnVlLCBcXCdpcy1vcGVuXFwnOiBpc09wZW4sIFxcJ2lzLWRpc2FibGVkXFwnOiBkaXNhYmxlZH1cIiB0YWJpbmRleD1cIjBcIj4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cIm1zLURyb3Bkb3duLWNhcmV0RG93biBtcy1JY29uIG1zLUljb24tLWNhcmV0RG93blwiPjwvaT4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cIm1zLURyb3Bkb3duLXRpdGxlXCI+e3tzZWxlY3RlZFRpdGxlfX08L3NwYW4+PHVsIGNsYXNzPVwibXMtRHJvcGRvd24taXRlbXNcIj48bmctdHJhbnNjbHVkZT48L25nLXRyYW5zY2x1ZGU+PC91bD48L2Rpdj4nO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ3VpZkRyb3Bkb3duJywgJz9uZ01vZGVsJ107XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7fTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gRHJvcGRvd25Db250cm9sbGVyO1xuICAgIH1cbiAgICBEcm9wZG93bkRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERyb3Bkb3duRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBEcm9wZG93bkRpcmVjdGl2ZS5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZUVsZW1lbnQsIHRlbXBsYXRlQXR0cmlidXRlcywgdHJhbnNjbHVkZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJlOiB0aGlzLnByZUxpbmtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIERyb3Bkb3duRGlyZWN0aXZlLnByb3RvdHlwZS5wcmVMaW5rID0gZnVuY3Rpb24gKHNjb3BlLCBpbnN0YW5jZUVsZW1lbnQsIGluc3RhbmNlQXR0cmlidXRlcywgY3RybHMpIHtcbiAgICAgICAgdmFyIGRyb3Bkb3duQ29udHJvbGxlciA9IGN0cmxzWzBdO1xuICAgICAgICB2YXIgbW9kZWxDb250cm9sbGVyID0gY3RybHNbMV07XG4gICAgICAgIHNjb3BlLm5nTW9kZWwgPSBtb2RlbENvbnRyb2xsZXI7XG4gICAgICAgIGRyb3Bkb3duQ29udHJvbGxlci5pbml0KCk7XG4gICAgICAgIHNjb3BlLiR3YXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBpbnN0YW5jZUVsZW1lbnQuYXR0cignZGlzYWJsZWQnKTsgfSwgKGZ1bmN0aW9uIChuZXdWYWx1ZSkgeyBzY29wZS5kaXNhYmxlZCA9IHR5cGVvZiBuZXdWYWx1ZSAhPT0gJ3VuZGVmaW5lZCc7IH0pKTtcbiAgICAgICAgc2NvcGUuZGlzYWJsZWQgPSAnZGlzYWJsZWQnIGluIGluc3RhbmNlQXR0cmlidXRlcztcbiAgICB9O1xuICAgIHJldHVybiBEcm9wZG93bkRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkRyb3Bkb3duRGlyZWN0aXZlID0gRHJvcGRvd25EaXJlY3RpdmU7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmRyb3Bkb3duJywgW1xuICAgICdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ1xuXSlcbiAgICAuZGlyZWN0aXZlKCd1aWZEcm9wZG93bk9wdGlvbicsIERyb3Bkb3duT3B0aW9uRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZEcm9wZG93bicsIERyb3Bkb3duRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL2Ryb3Bkb3duL2Ryb3Bkb3duRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgRmFjZXBpbGVEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZhY2VwaWxlRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gXCI8ZGl2IGNsYXNzPVxcXCJtcy1GYWNlcGlsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdHJhbnNjbHVkZT48L25nLXRyYW5zY2x1ZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1GYWNlcGlsZS1tZW1iZXJzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAgbmctcmVwZWF0PVxcXCJtZW1iZXIgaW4gbWVtYmVycyB0cmFjayBieSAkaW5kZXhcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctaWYgPVxcXCIkaW5kZXggPCB1aWZPdmVyZmxvd0xpbWl0XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwibXMtRmFjZXBpbGUtaXRlbUJ0biBtcy1GYWNlcGlsZS1pdGVtQnRuLS1tZW1iZXJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVxcXCJ7e21lbWJlci5wcmltYXJ5VGV4dH19XFxcIiB0YWJpbmRleD1cXFwiMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1wZXJzb25hIHVpZi1zdHlsZT1cXFwicm91bmRcXFwiIHVpZi1zaXplPVxcXCJ4c21hbGxcXFwiIHVpZi1pbWFnZS11cmw9XFxcInt7bWVtYmVyLmljb259fVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLXBlcnNvbmEtaW5pdGlhbHMgdWlmLWNvbG9yPVxcXCJ7e21lbWJlci5jb2xvcn19XFxcIj57e21lbWJlci5pbml0aWFsc319PC91aWYtcGVyc29uYS1pbml0aWFscz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VpZi1wZXJzb25hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctc2hvdz1cXFwidWlmT3ZlcmZsb3dMaW1pdCA+IDAgJiYgbWVtYmVycy5sZW5ndGggPiB1aWZPdmVyZmxvd0xpbWl0XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPVxcXCJvdmVyZmxvd1BhbmVsSXNPcGVuID0gdHJ1ZTtcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcIm1zLUZhY2VwaWxlLWl0ZW1CdG4gbXMtRmFjZXBpbGUtaXRlbUJ0bi0tb3ZlcmZsb3cganMtb3ZlcmZsb3dQYW5lbCBpcy1hY3RpdmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJtcy1GYWNlcGlsZS1vdmVyZmxvd1RleHRcXFwiPit7e21lbWJlcnMubGVuZ3RoIC0gdWlmT3ZlcmZsb3dMaW1pdH19PC9zcGFuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLXBhbmVsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZi10eXBlPVxcXCJtZWRpdW1cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZi1pcy1vcGVuPVxcXCJvdmVyZmxvd1BhbmVsSXNPcGVuXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWYtc2hvdy1vdmVybGF5PVxcXCJ0cnVlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWYtc2hvdy1jbG9zZT1cXFwidHJ1ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aWYtcGFuZWwtaGVhZGVyPnt7bWVtYmVycy5sZW5ndGh9fSB7e3VpZkZhY2VwaWxlTmFtZX19PC91aWYtcGFuZWwtaGVhZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZy1yZXBlYXQ9XFxcIm1lbWJlciBpbiBtZW1iZXJzIHRyYWNrIGJ5ICRpbmRleFxcXCIgdGl0bGU9XFxcInt7bWVtYmVyLnByaW1hcnlUZXh0fX1cXFwiIHRhYmluZGV4PVxcXCIwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aWYtcGVyc29uYSB1aWYtc3R5bGU9XFxcInJvdW5kXFxcIiB1aWYtc2l6ZT1cXFwibWVkaXVtXFxcIiB1aWYtaW1hZ2UtdXJsPVxcXCJ7e21lbWJlci5pY29ufX1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLXBlcnNvbmEtaW5pdGlhbHMgdWlmLWNvbG9yPVxcXCJ7e21lbWJlci5jb2xvcn19XFxcIj57e21lbWJlci5pbml0aWFsc319PC91aWYtcGVyc29uYS1pbml0aWFscz5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1wZXJzb25hLXByaW1hcnktdGV4dD57e21lbWJlci5wcmltYXJ5VGV4dH19PC91aWYtcGVyc29uYS1wcmltYXJ5LXRleHQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aWYtcGVyc29uYS1zZWNvbmRhcnktdGV4dD57e21lbWJlci5zZWNvbmRhcnlUZXh0fX08L3VpZi1wZXJzb25hLXNlY29uZGFyeS10ZXh0PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aWYtcGVyc29uYT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aWYtY29udGVudD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWlmLXBhbmVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlwiO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgbWVtYmVyczogJz1uZ01vZGVsJyxcbiAgICAgICAgICAgIHVpZkZhY2VwaWxlTmFtZTogJ0B1aWZGYWNlcGlsZU5hbWUnLFxuICAgICAgICAgICAgdWlmT3ZlcmZsb3dMaW1pdDogJ0AnXG4gICAgICAgIH07XG4gICAgfVxuICAgIEZhY2VwaWxlRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRmFjZXBpbGVEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBGYWNlcGlsZURpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkZhY2VwaWxlRGlyZWN0aXZlID0gRmFjZXBpbGVEaXJlY3RpdmU7XG52YXIgRmFjZXBpbGVBZGRJY29uRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGYWNlcGlsZUFkZEljb25EaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIjxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcIm1zLUZhY2VwaWxlLWl0ZW1CdG4gbXMtRmFjZXBpbGUtaXRlbUJ0bi0tYWRkUGVyc29uIGpzLWFkZFBlcnNvblxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPVxcXCJwZW9wbGVwaWNrZXJQYW5lbElzT3BlbiA9IHRydWU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XFxcIm1zLUZhY2VwaWxlLWFkZFBlcnNvbkljb24gbXMtSWNvbiBtcy1JY29uLS1wZXJzb25BZGRcXFwiPjwvaT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1wYW5lbFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlmLXR5cGU9XFxcImxhcmdlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlmLWlzLW9wZW49XFxcInBlb3BsZXBpY2tlclBhbmVsSXNPcGVuXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlmLXNob3ctb3ZlcmxheT1cXFwidHJ1ZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZi1zaG93LWNsb3NlPVxcXCJ0cnVlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLXBhbmVsLWhlYWRlcj57e3Blb3BsZVBpY2tlclBsYWNlaG9sZGVyfX08L3VpZi1wYW5lbC1oZWFkZXI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1jb250ZW50PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLXBlb3BsZS1waWNrZXJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZi1wZW9wbGU9XFxcIm9uRmFjZVBpbGVTZWFyY2hcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZy1tb2RlbD1cXFwicGFyZW50U2NvcGUubWVtYmVyc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZi1zZWFyY2gtZGVsYXk9XFxcIjUwMFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZi10eXBlPVxcXCJmYWNlUGlsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1zZWxlY3RlZC1wZW9wbGUtaGVhZGVyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlbGVjdGVkRmFjZVBpbGVQZW9wbGUubGVuZ3RofX0gc2VsZWN0ZWQgcGVyc29uKHMpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aWYtc2VsZWN0ZWQtcGVvcGxlLWhlYWRlcj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWlmLXBlb3BsZS1zZWFyY2gtbW9yZT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1aWYtcHJpbWFyeS10ZXh0IHVpZi1zZWFyY2gtZm9yLXRleHQ9XFxcIllvdSBhcmUgc2VhcmNoaW5nIGZvcjogXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggb3JnYW5pemF0aW9uIHBlb3BsZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VpZi1wcmltYXJ5LXRleHQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91aWYtcGVvcGxlLXNlYXJjaC1tb3JlPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VpZi1wZW9wbGUtcGlja2VyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWlmLWNvbnRlbnQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VpZi1wYW5lbD5cIjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIG9uRmFjZVBpbGVTZWFyY2g6ICc9dWlmUGVvcGxlJyxcbiAgICAgICAgICAgIHBlb3BsZVBpY2tlclBsYWNlaG9sZGVyOiAnQHBsYWNlaG9sZGVyJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBGYWNlcGlsZUFkZEljb25EaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBGYWNlcGlsZUFkZEljb25EaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIEZhY2VwaWxlQWRkSWNvbkRpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSwgZWxlbSwgYXR0cnMpIHtcbiAgICAgICAge1xuICAgICAgICAgICAgc2NvcGUucGFyZW50U2NvcGUgPSBzY29wZS4kcGFyZW50LiRwYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBGYWNlcGlsZUFkZEljb25EaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5GYWNlcGlsZUFkZEljb25EaXJlY3RpdmUgPSBGYWNlcGlsZUFkZEljb25EaXJlY3RpdmU7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmZhY2VwaWxlJywgW1xuICAgICdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ1xuXSlcbiAgICAuZGlyZWN0aXZlKCd1aWZGYWNlcGlsZScsIEZhY2VwaWxlRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZGYWNlcGlsZUFkZEljb24nLCBGYWNlcGlsZUFkZEljb25EaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvZmFjZXBpbGUvZmFjZXBpbGVEaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBpY29uRW51bV8xID0gcmVxdWlyZShcIi4vaWNvbkVudW1cIik7XG52YXIgSWNvbkNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEljb25Db250cm9sbGVyKCRsb2cpIHtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICB9XG4gICAgcmV0dXJuIEljb25Db250cm9sbGVyO1xufSgpKTtcbkljb25Db250cm9sbGVyLiRpbmplY3QgPSBbJyRsb2cnXTtcbnZhciBJY29uRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJY29uRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxpIGNsYXNzPVwibXMtSWNvbiBtcy1JY29uLS17e3VpZlR5cGV9fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4nO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgdWlmVHlwZTogJ0AnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IEljb25Db250cm9sbGVyO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJBcyA9ICdpY29uJztcbiAgICB9XG4gICAgSWNvbkRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEljb25EaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIEljb25EaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgc2NvcGUuJHdhdGNoKCd1aWZUeXBlJywgZnVuY3Rpb24gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGljb25FbnVtXzEuSWNvbkVudW1bbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmljb24gLSBVbnN1cHBvcnRlZCBpY29uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RoZSBpY29uIChcXCcnICsgc2NvcGUudWlmVHlwZSArICdcXCcpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIE9mZmljZSBVSSBGYWJyaWMuICcgK1xuICAgICAgICAgICAgICAgICAgICAnU3VwcG9ydGVkIG9wdGlvbnMgYXJlIGxpc3RlZCBoZXJlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL2ljb24vaWNvbkVudW0udHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSWNvbkRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkljb25EaXJlY3RpdmUgPSBJY29uRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5pY29uJywgW1xuICAgICdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ1xuXSlcbiAgICAuZGlyZWN0aXZlKCd1aWZJY29uJywgSWNvbkRpcmVjdGl2ZS5mYWN0b3J5KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9pY29uL2ljb25EaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBMYWJlbERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTGFiZWxEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgbmdSZXF1aXJlZDogJzw/J1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxsYWJlbCBjbGFzcz1cIm1zLUxhYmVsXCI+PG5nLXRyYW5zY2x1ZGUvPjwvbGFiZWw+JztcbiAgICB9XG4gICAgTGFiZWxEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBMYWJlbERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgTGFiZWxEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cmlidXRlcykge1xuICAgICAgICB2YXIgbGFiZWwgPSBpbnN0YW5jZUVsZW1lbnQuZmluZCgnbGFiZWwnKS5lcSgwKTtcbiAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKGF0dHJpYnV0ZXMuZGlzYWJsZWQpKSB7XG4gICAgICAgICAgICBsYWJlbC5hZGRDbGFzcygnaXMtZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoYXR0cmlidXRlcy5yZXF1aXJlZCkpIHtcbiAgICAgICAgICAgIGxhYmVsLmFkZENsYXNzKCdpcy1yZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLiR3YXRjaCgnbmdSZXF1aXJlZCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGxhYmVsLmFkZENsYXNzKCdpcy1yZXF1aXJlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBsYWJlbC5yZW1vdmVDbGFzcygnaXMtcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gTGFiZWxEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5MYWJlbERpcmVjdGl2ZSA9IExhYmVsRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5sYWJlbCcsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkxhYmVsJywgTGFiZWxEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvbGFiZWwvbGFiZWxEaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBMaW5rRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaW5rRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxhIG5nLWhyZWY9XCJ7eyBuZ0hyZWYgfX1cIiBjbGFzcz1cIm1zLUxpbmtcIiBuZy10cmFuc2NsdWRlPjwvYT4nO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgbmdIcmVmOiAnQCdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICB9XG4gICAgTGlua0RpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IExpbmtEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBMaW5rRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuTGlua0RpcmVjdGl2ZSA9IExpbmtEaXJlY3RpdmU7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmxpbmsnLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkxpbmsnLCBMaW5rRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL2xpbmsvbGlua0RpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIGxpc3RJdGVtU2VsZWN0TW9kZUVudW1fMSA9IHJlcXVpcmUoXCIuL2xpc3RJdGVtU2VsZWN0TW9kZUVudW1cIik7XG52YXIgbGlzdEl0ZW1UeXBlRW51bV8xID0gcmVxdWlyZShcIi4vbGlzdEl0ZW1UeXBlRW51bVwiKTtcbnZhciBsaXN0TGF5b3V0RW51bV8xID0gcmVxdWlyZShcIi4vbGlzdExheW91dEVudW1cIik7XG52YXIgTGlzdENvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExpc3RDb250cm9sbGVyKCRzY29wZSwgJGxvZykge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy4kc2NvcGUuaXRlbXMgPSBbXTtcbiAgICAgICAgaWYgKCF0aGlzLiRzY29wZS5zZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLiRzY29wZS5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExpc3RDb250cm9sbGVyLnByb3RvdHlwZSwgXCJpdGVtU2VsZWN0TW9kZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLml0ZW1TZWxlY3RNb2RlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTGlzdENvbnRyb2xsZXIucHJvdG90eXBlLCBcInNlbGVjdGVkSXRlbXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5zZWxlY3RlZEl0ZW1zO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTGlzdENvbnRyb2xsZXIucHJvdG90eXBlLCBcIml0ZW1zXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuaXRlbXM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBMaXN0Q29udHJvbGxlcjtcbn0oKSk7XG5MaXN0Q29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnLCAnJGxvZyddO1xudmFyIExpc3REaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExpc3REaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzx1bCBjbGFzcz1cIm1zLUxpc3RcIiBuZy10cmFuc2NsdWRlPjwvdWw+JztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gTGlzdENvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuY29udHJvbGxlckFzID0gJ2xpc3QnO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtczogJz0/dWlmU2VsZWN0ZWRJdGVtcycsXG4gICAgICAgICAgICB1aWZJdGVtU2VsZWN0TW9kZTogJ0A/JyxcbiAgICAgICAgICAgIHVpZkxheW91dDogJ0A/J1xuICAgICAgICB9O1xuICAgIH1cbiAgICBMaXN0RGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTGlzdERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgTGlzdERpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSwgaW5zdGFuY2VFbGVtZW50LCBhdHRycywgY29udHJvbGxlcikge1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZkxheW91dCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG5ld1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RMYXlvdXRFbnVtXzEuTGlzdExheW91dEVudW1bbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5saXN0LiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgbGF5b3V0IChcXCcnICsgbmV3VmFsdWUgKyAnXFwnKSBpcyBub3QgYSB2YWxpZCBvcHRpb24gZm9yIFxcJ3VpZi1sYXlvdXRcXCcuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCBvcHRpb25zIGFyZSBsaXN0ZWQgaGVyZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL25nT2ZmaWNlVUlGYWJyaWMvbmctb2ZmaWNldWlmYWJyaWMvYmxvYi9tYXN0ZXIvc3JjL2NvbXBvbmVudHMvbGlzdC9saXN0TGF5b3V0RW51bS50cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUubGF5b3V0ID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNjb3BlLmxheW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubGF5b3V0ID0gbGlzdExheW91dEVudW1fMS5MaXN0TGF5b3V0RW51bVtsaXN0TGF5b3V0RW51bV8xLkxpc3RMYXlvdXRFbnVtLmxpc3RdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNjb3BlLmxheW91dCA9PT0gbGlzdExheW91dEVudW1fMS5MaXN0TGF5b3V0RW51bVtsaXN0TGF5b3V0RW51bV8xLkxpc3RMYXlvdXRFbnVtLmdyaWRdKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50LmNoaWxkcmVuKCkuZXEoMCkuYWRkQ2xhc3MoJ21zLUxpc3QtLWdyaWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlRWxlbWVudC5jaGlsZHJlbigpLmVxKDApLnJlbW92ZUNsYXNzKCdtcy1MaXN0LS1ncmlkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZkl0ZW1TZWxlY3RNb2RlJywgZnVuY3Rpb24gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1TZWxlY3RNb2RlRW51bV8xLkxpc3RJdGVtU2VsZWN0TW9kZUVudW1bbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5saXN0LiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgVGhlIHNlbGVjdGlvbiBtb2RlIChcXCcnICsgbmV3VmFsdWUgKyAnXFwnKSBpcyBub3QgYSB2YWxpZCBvcHRpb24gZm9yIFxcJ3VpZi1pdGVtLXNlbGVjdC1tb2RlXFwnLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTdXBwb3J0ZWQgb3B0aW9ucyBhcmUgbGlzdGVkIGhlcmU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL2xpc3QvbGlzdEl0ZW1TZWxlY3RNb2RlRW51bS50cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaXRlbVNlbGVjdE1vZGUgPSBhdHRycy51aWZJdGVtU2VsZWN0TW9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NvcGUuaXRlbVNlbGVjdE1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLml0ZW1TZWxlY3RNb2RlID0gbGlzdEl0ZW1TZWxlY3RNb2RlRW51bV8xLkxpc3RJdGVtU2VsZWN0TW9kZUVudW1bbGlzdEl0ZW1TZWxlY3RNb2RlRW51bV8xLkxpc3RJdGVtU2VsZWN0TW9kZUVudW0ubm9uZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250cm9sbGVyLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaXRlbXNbaV0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2NvcGUuJGJyb2FkY2FzdCgnbGlzdC1pdGVtLXNlbGVjdC1tb2RlLWNoYW5nZWQnLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIExpc3REaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5MaXN0RGlyZWN0aXZlID0gTGlzdERpcmVjdGl2ZTtcbnZhciBMaXN0SXRlbUNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExpc3RJdGVtQ29udHJvbGxlcigkc2NvcGUsICRsb2cpIHtcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgfVxuICAgIHJldHVybiBMaXN0SXRlbUNvbnRyb2xsZXI7XG59KCkpO1xuTGlzdEl0ZW1Db250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckbG9nJ107XG52YXIgTGlzdEl0ZW1EaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExpc3RJdGVtRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8bGkgY2xhc3M9XCJtcy1MaXN0SXRlbVwiIG5nLXRyYW5zY2x1ZGU+PC9saT4nO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSAnXnVpZkxpc3QnO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgaXRlbTogJz11aWZJdGVtJyxcbiAgICAgICAgICAgIHVpZlR5cGU6ICdAPydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gTGlzdEl0ZW1Db250cm9sbGVyO1xuICAgIH1cbiAgICBMaXN0SXRlbURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IExpc3RJdGVtRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBMaXN0SXRlbURpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSwgaW5zdGFuY2VFbGVtZW50LCBhdHRycywgbGlzdCkge1xuICAgICAgICBpZiAoYXR0cnMudWlmU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCAmJiBhdHRycy51aWZTZWxlY3RlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGVkU3RyaW5nID0gYXR0cnMudWlmU2VsZWN0ZWQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFN0cmluZyAhPT0gJ3RydWUnICYmIHNlbGVjdGVkU3RyaW5nICE9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgbGlzdC4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5saXN0LiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcJycgKyBhdHRycy51aWZTZWxlY3RlZCArICdcXCcgaXMgbm90IGEgdmFsaWQgYm9vbGVhbiB2YWx1ZS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdWYWxpZCBvcHRpb25zIGFyZSB0cnVlfGZhbHNlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGUuaXRlbSAmJiBsaXN0LnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0LnNlbGVjdGVkSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5zZWxlY3RlZEl0ZW1zW2ldID09PSBzY29wZS5pdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUuJHdhdGNoKCd1aWZUeXBlJywgZnVuY3Rpb24gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW1UeXBlRW51bV8xLkxpc3RJdGVtVHlwZUVudW1bbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5saXN0LiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgbGlzdCBpdGVtIHR5cGUgKFxcJycgKyBuZXdWYWx1ZSArICdcXCcpIGlzIG5vdCBhIHZhbGlkIG9wdGlvbiBmb3IgXFwndWlmLXR5cGVcXCcuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCBvcHRpb25zIGFyZSBsaXN0ZWQgaGVyZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL25nT2ZmaWNlVUlGYWJyaWMvbmctb2ZmaWNldWlmYWJyaWMvYmxvYi9tYXN0ZXIvc3JjL2NvbXBvbmVudHMvbGlzdC9saXN0SXRlbVR5cGVFbnVtLnRzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50LmNoaWxkcmVuKCkuZXEoMCkucmVtb3ZlQ2xhc3MoJ21zLUxpc3RJdGVtLS1pbWFnZScpO1xuICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50LmNoaWxkcmVuKCkuZXEoMCkucmVtb3ZlQ2xhc3MoJ21zLUxpc3RJdGVtLS1kb2N1bWVudCcpO1xuICAgICAgICAgICAgc3dpdGNoIChsaXN0SXRlbVR5cGVFbnVtXzEuTGlzdEl0ZW1UeXBlRW51bVthdHRycy51aWZUeXBlXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgbGlzdEl0ZW1UeXBlRW51bV8xLkxpc3RJdGVtVHlwZUVudW0uaXRlbVdpdGhJY29uOlxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnbXMtTGlzdEl0ZW0tLWRvY3VtZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgbGlzdEl0ZW1UeXBlRW51bV8xLkxpc3RJdGVtVHlwZUVudW0uaXRlbVdpdGhJbWFnZTpcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50LmNoaWxkcmVuKCkuZXEoMCkuYWRkQ2xhc3MoJ21zLUxpc3RJdGVtLS1pbWFnZScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdEl0ZW1UeXBlRW51bV8xLkxpc3RJdGVtVHlwZUVudW1bYXR0cnMudWlmVHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsaXN0SXRlbVR5cGVFbnVtXzEuTGlzdEl0ZW1UeXBlRW51bS5pdGVtV2l0aEljb246XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VFbGVtZW50LmNoaWxkcmVuKCkuZmluZCgndWlmLWxpc3QtaXRlbS1pY29uJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5saXN0LiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpc3QgaXRlbSB0eXBlIGBpdGVtV2l0aEljb25gIHJlcXVpcmVzIHRoZSBgdWlmLWxpc3QtaXRlbS1pY29uYCBkaXJlY3RpdmUuIFdpdGhvdXQgdGhpcyB0aGUgaWNvbiB3aWxsIG5vdCBhcHBlYXIuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBsaXN0SXRlbVR5cGVFbnVtXzEuTGlzdEl0ZW1UeXBlRW51bS5pdGVtV2l0aEltYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlRWxlbWVudC5jaGlsZHJlbigpLmZpbmQoJ3VpZi1saXN0LWl0ZW0taW1hZ2UnKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmxpc3QuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGlzdCBpdGVtIHR5cGUgYGl0ZW1XaXRoSW1hZ2VgIHJlcXVpcmVzIHRoZSBgdWlmLWxpc3QtaXRlbS1pbWFnZWAgZGlyZWN0aXZlLiBXaXRob3V0IHRoaXMgdGhlIGltYWdlIHdpbGwgbm90IGFwcGVhci4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYXR0cnMudWlmVW5yZWFkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGF0dHJzLnVpZlVucmVhZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHVucmVhZFN0cmluZyA9IGF0dHJzLnVpZlVucmVhZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHVucmVhZFN0cmluZyAhPT0gJ3RydWUnICYmIHVucmVhZFN0cmluZyAhPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIGxpc3QuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMubGlzdC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdcXCcnICsgYXR0cnMudWlmVW5yZWFkICsgJ1xcJyBpcyBub3QgYSB2YWxpZCBib29sZWFuIHZhbHVlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1ZhbGlkIG9wdGlvbnMgYXJlIHRydWV8ZmFsc2UuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodW5yZWFkU3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUudW5yZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0dHJzLnVpZlVuc2VlbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBhdHRycy51aWZVbnNlZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciB1bnNlZW5TdHJpbmcgPSBhdHRycy51aWZVbnNlZW4udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh1bnNlZW5TdHJpbmcgIT09ICd0cnVlJyAmJiB1bnNlZW5TdHJpbmcgIT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICBsaXN0LiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLmxpc3QuICcgK1xuICAgICAgICAgICAgICAgICAgICAnXFwnJyArIGF0dHJzLnVpZlVuc2VlbiArICdcXCcgaXMgbm90IGEgdmFsaWQgYm9vbGVhbiB2YWx1ZS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdWYWxpZCBvcHRpb25zIGFyZSB0cnVlfGZhbHNlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuc2VlblN0cmluZyA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnVuc2VlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzY29wZS5pdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxpc3QuaXRlbXMucHVzaChzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUuaXRlbUNsaWNrID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBzY29wZS5zZWxlY3RlZCA9ICFzY29wZS5zZWxlY3RlZDtcbiAgICAgICAgICAgIHNjb3BlLiRhcHBseSgpO1xuICAgICAgICB9O1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3NlbGVjdGVkJywgZnVuY3Rpb24gKG5ld1ZhbHVlLCBvbGRWYWx1ZSwgbGlzdEl0ZW1TY29wZSkge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3QuaXRlbVNlbGVjdE1vZGUgPT09IGxpc3RJdGVtU2VsZWN0TW9kZUVudW1fMS5MaXN0SXRlbVNlbGVjdE1vZGVFbnVtW2xpc3RJdGVtU2VsZWN0TW9kZUVudW1fMS5MaXN0SXRlbVNlbGVjdE1vZGVFbnVtLnNpbmdsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0Lml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5pdGVtc1tpXSAhPT0gbGlzdEl0ZW1TY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZW1zW2ldLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpdGVtQWxyZWFkeVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0LnNlbGVjdGVkSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3Quc2VsZWN0ZWRJdGVtc1tpXSA9PT0gbGlzdEl0ZW1TY29wZS5pdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtQWxyZWFkeVNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaXRlbUFscmVhZHlTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0LnNlbGVjdGVkSXRlbXMucHVzaChsaXN0SXRlbVNjb3BlLml0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnaXMtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5zZWxlY3RlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LnNlbGVjdGVkSXRlbXNbaV0gPT09IGxpc3RJdGVtU2NvcGUuaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5zZWxlY3RlZEl0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluc3RhbmNlRWxlbWVudC5jaGlsZHJlbigpLmVxKDApLnJlbW92ZUNsYXNzKCdpcy1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKCd1bnJlYWQnLCBmdW5jdGlvbiAobmV3VmFsdWUsIG9sZFZhbHVlLCBsaXN0SXRlbVNjb3BlKSB7XG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnaXMtdW5yZWFkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5lcSgwKS5yZW1vdmVDbGFzcygnaXMtdW5yZWFkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3Vuc2VlbicsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUsIGxpc3RJdGVtU2NvcGUpIHtcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlRWxlbWVudC5jaGlsZHJlbigpLmVxKDApLmFkZENsYXNzKCdpcy11bnNlZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlRWxlbWVudC5jaGlsZHJlbigpLmVxKDApLnJlbW92ZUNsYXNzKCdpcy11bnNlZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsaXN0Lml0ZW1TZWxlY3RNb2RlICE9PSBsaXN0SXRlbVNlbGVjdE1vZGVFbnVtXzEuTGlzdEl0ZW1TZWxlY3RNb2RlRW51bVtsaXN0SXRlbVNlbGVjdE1vZGVFbnVtXzEuTGlzdEl0ZW1TZWxlY3RNb2RlRW51bS5ub25lXSkge1xuICAgICAgICAgICAgdXBkYXRlSXRlbVNlbGVjdGlvbk1vZGVEZWNvcmF0aW9uKGxpc3QuaXRlbVNlbGVjdE1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLiRvbignbGlzdC1pdGVtLXNlbGVjdC1tb2RlLWNoYW5nZWQnLCBmdW5jdGlvbiAoZXZlbnQsIHNlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW1TZWxlY3Rpb25Nb2RlRGVjb3JhdGlvbihzZWxlY3Rpb25Nb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUl0ZW1TZWxlY3Rpb25Nb2RlRGVjb3JhdGlvbihzZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50LmNoaWxkcmVuKCkuZXEoMCkucmVtb3ZlQ2xhc3MoJ2lzLXNlbGVjdGFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5lcSgwKS5oYXNDbGFzcygnaXMtc2VsZWN0YWJsZScpKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50Lm9uKCdjbGljaycsIHNjb3BlLml0ZW1DbGljayk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50LmNoaWxkcmVuKCkuZXEoMCkuYWRkQ2xhc3MoJ2lzLXNlbGVjdGFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIExpc3RJdGVtRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuTGlzdEl0ZW1EaXJlY3RpdmUgPSBMaXN0SXRlbURpcmVjdGl2ZTtcbnZhciBMaXN0SXRlbVByaW1hcnlUZXh0RGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaXN0SXRlbVByaW1hcnlUZXh0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxzcGFuIGNsYXNzPVwibXMtTGlzdEl0ZW0tcHJpbWFyeVRleHRcIiBuZy10cmFuc2NsdWRlPjwvc3Bhbj4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICB9XG4gICAgTGlzdEl0ZW1QcmltYXJ5VGV4dERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IExpc3RJdGVtUHJpbWFyeVRleHREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBMaXN0SXRlbVByaW1hcnlUZXh0RGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuTGlzdEl0ZW1QcmltYXJ5VGV4dERpcmVjdGl2ZSA9IExpc3RJdGVtUHJpbWFyeVRleHREaXJlY3RpdmU7XG52YXIgTGlzdEl0ZW1TZWNvbmRhcnlUZXh0RGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaXN0SXRlbVNlY29uZGFyeVRleHREaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPHNwYW4gY2xhc3M9XCJtcy1MaXN0SXRlbS1zZWNvbmRhcnlUZXh0XCIgbmctdHJhbnNjbHVkZT48L3NwYW4+JztcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gZmFsc2U7XG4gICAgfVxuICAgIExpc3RJdGVtU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IExpc3RJdGVtU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIExpc3RJdGVtU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLkxpc3RJdGVtU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZSA9IExpc3RJdGVtU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZTtcbnZhciBMaXN0SXRlbVRlcnRpYXJ5VGV4dERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTGlzdEl0ZW1UZXJ0aWFyeVRleHREaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPHNwYW4gY2xhc3M9XCJtcy1MaXN0SXRlbS10ZXJ0aWFyeVRleHRcIiBuZy10cmFuc2NsdWRlPjwvc3Bhbj4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICB9XG4gICAgTGlzdEl0ZW1UZXJ0aWFyeVRleHREaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBMaXN0SXRlbVRlcnRpYXJ5VGV4dERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIExpc3RJdGVtVGVydGlhcnlUZXh0RGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuTGlzdEl0ZW1UZXJ0aWFyeVRleHREaXJlY3RpdmUgPSBMaXN0SXRlbVRlcnRpYXJ5VGV4dERpcmVjdGl2ZTtcbnZhciBMaXN0SXRlbU1ldGFUZXh0RGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaXN0SXRlbU1ldGFUZXh0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxzcGFuIGNsYXNzPVwibXMtTGlzdEl0ZW0tbWV0YVRleHRcIiBuZy10cmFuc2NsdWRlPjwvc3Bhbj4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICB9XG4gICAgTGlzdEl0ZW1NZXRhVGV4dERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IExpc3RJdGVtTWV0YVRleHREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBMaXN0SXRlbU1ldGFUZXh0RGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuTGlzdEl0ZW1NZXRhVGV4dERpcmVjdGl2ZSA9IExpc3RJdGVtTWV0YVRleHREaXJlY3RpdmU7XG52YXIgTGlzdEl0ZW1JbWFnZURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTGlzdEl0ZW1JbWFnZURpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtTGlzdEl0ZW0taW1hZ2VcIiBuZy10cmFuc2NsdWRlPjwvZGl2Pic7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBMaXN0SXRlbUltYWdlRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTGlzdEl0ZW1JbWFnZURpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIExpc3RJdGVtSW1hZ2VEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5MaXN0SXRlbUltYWdlRGlyZWN0aXZlID0gTGlzdEl0ZW1JbWFnZURpcmVjdGl2ZTtcbnZhciBMaXN0SXRlbUljb25EaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExpc3RJdGVtSWNvbkRpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtTGlzdEl0ZW0taXRlbUljb25cIiBuZy10cmFuc2NsdWRlPjwvZGl2Pic7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBMaXN0SXRlbUljb25EaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBMaXN0SXRlbUljb25EaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBMaXN0SXRlbUljb25EaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5MaXN0SXRlbUljb25EaXJlY3RpdmUgPSBMaXN0SXRlbUljb25EaXJlY3RpdmU7XG52YXIgTGlzdEl0ZW1TZWxlY3Rpb25UYXJnZXREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExpc3RJdGVtU2VsZWN0aW9uVGFyZ2V0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1MaXN0SXRlbS1zZWxlY3Rpb25UYXJnZXRcIiBuZy10cmFuc2NsdWRlPjwvZGl2Pic7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBMaXN0SXRlbVNlbGVjdGlvblRhcmdldERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IExpc3RJdGVtU2VsZWN0aW9uVGFyZ2V0RGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gTGlzdEl0ZW1TZWxlY3Rpb25UYXJnZXREaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5MaXN0SXRlbVNlbGVjdGlvblRhcmdldERpcmVjdGl2ZSA9IExpc3RJdGVtU2VsZWN0aW9uVGFyZ2V0RGlyZWN0aXZlO1xudmFyIExpc3RJdGVtQWN0aW9uc0RpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTGlzdEl0ZW1BY3Rpb25zRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1MaXN0SXRlbS1hY3Rpb25zXCIgbmctdHJhbnNjbHVkZT48L2Rpdj4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICB9XG4gICAgTGlzdEl0ZW1BY3Rpb25zRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTGlzdEl0ZW1BY3Rpb25zRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gTGlzdEl0ZW1BY3Rpb25zRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuTGlzdEl0ZW1BY3Rpb25zRGlyZWN0aXZlID0gTGlzdEl0ZW1BY3Rpb25zRGlyZWN0aXZlO1xudmFyIExpc3RJdGVtQWN0aW9uRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaXN0SXRlbUFjdGlvbkRpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtTGlzdEl0ZW0tYWN0aW9uXCIgbmctdHJhbnNjbHVkZT48L2Rpdj4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICB9XG4gICAgTGlzdEl0ZW1BY3Rpb25EaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBMaXN0SXRlbUFjdGlvbkRpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIExpc3RJdGVtQWN0aW9uRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuTGlzdEl0ZW1BY3Rpb25EaXJlY3RpdmUgPSBMaXN0SXRlbUFjdGlvbkRpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMubGlzdCcsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkxpc3QnLCBMaXN0RGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZMaXN0SXRlbScsIExpc3RJdGVtRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZMaXN0SXRlbVByaW1hcnlUZXh0JywgTGlzdEl0ZW1QcmltYXJ5VGV4dERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmTGlzdEl0ZW1TZWNvbmRhcnlUZXh0JywgTGlzdEl0ZW1TZWNvbmRhcnlUZXh0RGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZMaXN0SXRlbVRlcnRpYXJ5VGV4dCcsIExpc3RJdGVtVGVydGlhcnlUZXh0RGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZMaXN0SXRlbU1ldGFUZXh0JywgTGlzdEl0ZW1NZXRhVGV4dERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmTGlzdEl0ZW1JbWFnZScsIExpc3RJdGVtSW1hZ2VEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZkxpc3RJdGVtSWNvbicsIExpc3RJdGVtSWNvbkRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmTGlzdEl0ZW1TZWxlY3Rpb25UYXJnZXQnLCBMaXN0SXRlbVNlbGVjdGlvblRhcmdldERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmTGlzdEl0ZW1BY3Rpb25zJywgTGlzdEl0ZW1BY3Rpb25zRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZMaXN0SXRlbUFjdGlvbicsIExpc3RJdGVtQWN0aW9uRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL2xpc3QvbGlzdERpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgTGlzdEl0ZW1TZWxlY3RNb2RlRW51bTtcbihmdW5jdGlvbiAoTGlzdEl0ZW1TZWxlY3RNb2RlRW51bSkge1xuICAgIExpc3RJdGVtU2VsZWN0TW9kZUVudW1bTGlzdEl0ZW1TZWxlY3RNb2RlRW51bVtcIm5vbmVcIl0gPSAwXSA9IFwibm9uZVwiO1xuICAgIExpc3RJdGVtU2VsZWN0TW9kZUVudW1bTGlzdEl0ZW1TZWxlY3RNb2RlRW51bVtcInNpbmdsZVwiXSA9IDFdID0gXCJzaW5nbGVcIjtcbiAgICBMaXN0SXRlbVNlbGVjdE1vZGVFbnVtW0xpc3RJdGVtU2VsZWN0TW9kZUVudW1bXCJtdWx0aXBsZVwiXSA9IDJdID0gXCJtdWx0aXBsZVwiO1xufSkoTGlzdEl0ZW1TZWxlY3RNb2RlRW51bSA9IGV4cG9ydHMuTGlzdEl0ZW1TZWxlY3RNb2RlRW51bSB8fCAoZXhwb3J0cy5MaXN0SXRlbVNlbGVjdE1vZGVFbnVtID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvbGlzdC9saXN0SXRlbVNlbGVjdE1vZGVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSAyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBMaXN0SXRlbVR5cGVFbnVtO1xuKGZ1bmN0aW9uIChMaXN0SXRlbVR5cGVFbnVtKSB7XG4gICAgTGlzdEl0ZW1UeXBlRW51bVtMaXN0SXRlbVR5cGVFbnVtW1wiaXRlbVwiXSA9IDBdID0gXCJpdGVtXCI7XG4gICAgTGlzdEl0ZW1UeXBlRW51bVtMaXN0SXRlbVR5cGVFbnVtW1wiaXRlbVdpdGhJbWFnZVwiXSA9IDFdID0gXCJpdGVtV2l0aEltYWdlXCI7XG4gICAgTGlzdEl0ZW1UeXBlRW51bVtMaXN0SXRlbVR5cGVFbnVtW1wiaXRlbVdpdGhJY29uXCJdID0gMl0gPSBcIml0ZW1XaXRoSWNvblwiO1xufSkoTGlzdEl0ZW1UeXBlRW51bSA9IGV4cG9ydHMuTGlzdEl0ZW1UeXBlRW51bSB8fCAoZXhwb3J0cy5MaXN0SXRlbVR5cGVFbnVtID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvbGlzdC9saXN0SXRlbVR5cGVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBMaXN0TGF5b3V0RW51bTtcbihmdW5jdGlvbiAoTGlzdExheW91dEVudW0pIHtcbiAgICBMaXN0TGF5b3V0RW51bVtMaXN0TGF5b3V0RW51bVtcImxpc3RcIl0gPSAwXSA9IFwibGlzdFwiO1xuICAgIExpc3RMYXlvdXRFbnVtW0xpc3RMYXlvdXRFbnVtW1wiZ3JpZFwiXSA9IDFdID0gXCJncmlkXCI7XG59KShMaXN0TGF5b3V0RW51bSA9IGV4cG9ydHMuTGlzdExheW91dEVudW0gfHwgKGV4cG9ydHMuTGlzdExheW91dEVudW0gPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9saXN0L2xpc3RMYXlvdXRFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSAzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgTWVzc2FnZUJhbm5lckNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1lc3NhZ2VCYW5uZXJDb250cm9sbGVyKCRzY29wZSwgJGxvZywgJHdpbmRvdykge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy4kd2luZG93ID0gJHdpbmRvdztcbiAgICB9XG4gICAgcmV0dXJuIE1lc3NhZ2VCYW5uZXJDb250cm9sbGVyO1xufSgpKTtcbk1lc3NhZ2VCYW5uZXJDb250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckbG9nJywgJyR3aW5kb3cnXTtcbmV4cG9ydHMuTWVzc2FnZUJhbm5lckNvbnRyb2xsZXIgPSBNZXNzYWdlQmFubmVyQ29udHJvbGxlcjtcbnZhciBNZXNzYWdlQmFubmVyRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNZXNzYWdlQmFubmVyRGlyZWN0aXZlKCRsb2csICR0aW1lb3V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgICAgIHRoaXMuJHRpbWVvdXQgPSAkdGltZW91dDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gTWVzc2FnZUJhbm5lckNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSAndWlmTWVzc2FnZUJhbm5lcic7XG4gICAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gXCJcXG4gICAgPGRpdiBjbGFzcz1cXFwibXMtTWVzc2FnZUJhbm5lclxcXCIgbmctc2hvdz1cXFwidWlmSXNWaXNpYmxlXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibXMtTWVzc2FnZUJhbm5lci1jb250ZW50XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibXMtTWVzc2FnZUJhbm5lci10ZXh0XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibXMtTWVzc2FnZUJhbm5lci1jbGlwcGVyXFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDx1aWYtYnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgdWlmLXR5cGU9XFxcImNvbW1hbmRcXFwiIGNsYXNzPVxcXCJtcy1NZXNzYWdlQmFubmVyLWV4cGFuZFxcXCI+XFxuICAgIDx1aWYtaWNvbiB1aWYtdHlwZT1cXFwiY2hldnJvbnNEb3duXFxcIiBuZy1zaG93PVxcXCIhaXNFeHBhbmRlZFxcXCI+PC91aWYtaWNvbj5cXG4gICAgPHVpZi1pY29uIHVpZi10eXBlPVxcXCJjaGV2cm9uc1VwXFxcIiBuZy1zaG93PVxcXCJpc0V4cGFuZGVkXFxcIj48L3VpZi1pY29uPlxcbiAgICA8L3VpZi1idXR0b24+XFxuICAgIDxkaXYgY2xhc3M9XFxcIm1zLU1lc3NhZ2VCYW5uZXItYWN0aW9uXFxcIj5cXG4gICAgPHVpZi1idXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiB1aWYtdHlwZT1cXFwicHJpbWFyeVxcXCIgY2xhc3M9XFxcIm1zLWZvbnRDb2xvci1uZXV0cmFsTGlnaHRcXFwiIG5nLWNsaWNrPVxcXCJ1aWZBY3Rpb24oKVxcXCI+e3sgdWlmQWN0aW9uTGFiZWwgfX08L3VpZi1idXR0b24+XFxuICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPHVpZi1idXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiB1aWYtdHlwZT1cXFwiY29tbWFuZFxcXCIgY2xhc3M9XFxcIm1zLU1lc3NhZ2VCYW5uZXItY2xvc2VcXFwiIG5nLWNsaWNrPVxcXCJ1aWZPbkNsb3NlKClcXFwiIHN0eWxlPVxcXCJoZWlnaHQ6NTJweFxcXCI+XFxuICAgIDx1aWYtaWNvbiB1aWYtdHlwZT1cXFwieFxcXCI+PC91aWYtaWNvbj5cXG4gICAgPC91aWYtYnV0dG9uPlxcbiAgICA8L2Rpdj5cIjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHVpZkFjdGlvbjogJyYnLFxuICAgICAgICAgICAgdWlmQWN0aW9uTGFiZWw6ICdAJyxcbiAgICAgICAgICAgIHVpZklzVmlzaWJsZTogJz0/JyxcbiAgICAgICAgICAgIHVpZk9uQ2xvc2U6ICcmPydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fdGV4dENvbnRhaW5lck1heFdpZHRoID0gNzAwO1xuICAgICAgICB0aGlzLl9idWZmZXJFbGVtZW50c1dpZHRoID0gODg7XG4gICAgICAgIHRoaXMuX2J1ZmZlckVsZW1lbnRzV2lkdGhTbWFsbCA9IDM1O1xuICAgICAgICB0aGlzLlNNQUxMX0JSRUFLX1BPSU5UID0gNDgwO1xuICAgICAgICB0aGlzLmxpbmsgPSBmdW5jdGlvbiAoJHNjb3BlLCAkZWxlbSwgJGF0dHJzLCAkY29udHJvbGxlciwgJHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgICAgICRzY29wZS51aWZBY3Rpb25MYWJlbCA9ICRhdHRycy51aWZBY3Rpb25MYWJlbDtcbiAgICAgICAgICAgICRzY29wZS5pc0V4cGFuZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAkc2NvcGUub25SZXNpemUgPSBmdW5jdGlvbiAoaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGlmIChpbm5lcldpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5fY2xpZW50V2lkdGggPSBfdGhpcy5fbWVzc2FnZUJhbm5lclswXS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXJXaWR0aCA+PSBfdGhpcy5TTUFMTF9CUkVBS19QT0lOVCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVzaXplUmVndWxhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3Jlc2l6ZVNtYWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIF90aGlzLl9pbml0TG9jYWxzKCRlbGVtKTtcbiAgICAgICAgICAgIF90aGlzLnRyYW5zY2x1ZGVDaGlsZHMoJHNjb3BlLCAkZWxlbSwgJHRyYW5zY2x1ZGUpO1xuICAgICAgICAgICAgX3RoaXMuX2luaXRUZXh0V2lkdGggPSAoX3RoaXMuX2NsaXBwZXIuY2hpbGRyZW4oKS5lcSgwKSlbMF0ub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoJGNvbnRyb2xsZXIuJHdpbmRvdykuYmluZCgncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICRzY29wZS5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgICRzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChfdGhpcy5fY2hldnJvbkJ1dHRvbikuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3RvZ2dsZUV4cGFuc2lvbigkc2NvcGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoX3RoaXMuX2Nsb3NlQnV0dG9uKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5faGlkZUJhbm5lcigkc2NvcGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkc2NvcGUub25SZXNpemUoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgTWVzc2FnZUJhbm5lckRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCRsb2csICR0aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VCYW5uZXJEaXJlY3RpdmUoJGxvZywgJHRpbWVvdXQpO1xuICAgICAgICB9O1xuICAgICAgICBkaXJlY3RpdmUuJGluamVjdCA9IFsnJGxvZycsICckdGltZW91dCddO1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgTWVzc2FnZUJhbm5lckRpcmVjdGl2ZS5wcm90b3R5cGUudHJhbnNjbHVkZUNoaWxkcyA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkdHJhbnNjbHVkZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAkdHJhbnNjbHVkZShmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgIHZhciBoYXNDb250ZW50ID0gX3RoaXMuaGFzSXRlbUNvbnRlbnQoY2xvbmUpO1xuICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMubWVzc2FnZWJhbm5lciAtICcgK1xuICAgICAgICAgICAgICAgICAgICAneW91IG5lZWQgdG8gcHJvdmlkZSBhIHRleHQgZm9yIHRoZSBtZXNzYWdlIGJhbm5lci5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0ZvciA8dWlmLW1lc3NhZ2UtYmFubmVyPiB5b3UgbmVlZCB0byBzcGVjaWZ5JyArXG4gICAgICAgICAgICAgICAgICAgICc8dWlmLWNvbnRlbnQ+IGFzIGEgY2hpbGQgZGlyZWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5pbnNlcnRJdGVtQ29udGVudChjbG9uZSwgJHNjb3BlLCAkZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWVzc2FnZUJhbm5lckRpcmVjdGl2ZS5wcm90b3R5cGUuaW5zZXJ0SXRlbUNvbnRlbnQgPSBmdW5jdGlvbiAoY2xvbmUsICRzY29wZSwgJGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGNvbnRlbnRFbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1NZXNzYWdlQmFubmVyLWNsaXBwZXInKSk7XG4gICAgICAgIGlmICh0aGlzLmhhc0l0ZW1Db250ZW50KGNsb25lKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcygndWlmLWNvbnRlbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTWVzc2FnZUJhbm5lckRpcmVjdGl2ZS5wcm90b3R5cGUuaGFzSXRlbUNvbnRlbnQgPSBmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoY2xvbmVbaV0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ3VpZi1jb250ZW50JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBNZXNzYWdlQmFubmVyRGlyZWN0aXZlLnByb3RvdHlwZS5faW5pdExvY2FscyA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlQmFubmVyID0gYW5ndWxhci5lbGVtZW50KCRlbGVtWzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1NZXNzYWdlQmFubmVyJykpO1xuICAgICAgICB0aGlzLl9jbGlwcGVyID0gYW5ndWxhci5lbGVtZW50KCRlbGVtWzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1NZXNzYWdlQmFubmVyLWNsaXBwZXInKSk7XG4gICAgICAgIHRoaXMuX2NoZXZyb25CdXR0b24gPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1bMF0ucXVlcnlTZWxlY3RvckFsbCgnLm1zLU1lc3NhZ2VCYW5uZXItZXhwYW5kJykpO1xuICAgICAgICB0aGlzLl9hY3Rpb25CdXR0b24gPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1bMF0ucXVlcnlTZWxlY3RvcignLm1zLU1lc3NhZ2VCYW5uZXItYWN0aW9uJykpO1xuICAgICAgICB0aGlzLl9idWZmZXJTaXplID0gdGhpcy5fYWN0aW9uQnV0dG9uWzBdLm9mZnNldFdpZHRoICsgdGhpcy5fYnVmZmVyRWxlbWVudHNXaWR0aDtcbiAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1bMF0ucXVlcnlTZWxlY3RvcignLm1zLU1lc3NhZ2VCYW5uZXItY2xvc2UnKSk7XG4gICAgfTtcbiAgICBNZXNzYWdlQmFubmVyRGlyZWN0aXZlLnByb3RvdHlwZS5fcmVzaXplUmVndWxhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCh0aGlzLl9jbGllbnRXaWR0aCAtIHRoaXMuX2J1ZmZlclNpemUpID4gdGhpcy5faW5pdFRleHRXaWR0aCAmJiB0aGlzLl9pbml0VGV4dFdpZHRoIDwgdGhpcy5fdGV4dENvbnRhaW5lck1heFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0V2lkdGggPSAnYXV0byc7XG4gICAgICAgICAgICB0aGlzLl9jaGV2cm9uQnV0dG9uWzBdLmNsYXNzTmFtZSA9ICdtcy1NZXNzYWdlQmFubmVyLWV4cGFuZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0V2lkdGggPSBNYXRoLm1pbigodGhpcy5fY2xpZW50V2lkdGggLSB0aGlzLl9idWZmZXJTaXplKSwgdGhpcy5fdGV4dENvbnRhaW5lck1heFdpZHRoKSArICdweCc7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NoZXZyb25CdXR0b24uaGFzQ2xhc3MoJ2lzLXZpc2libGUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoZXZyb25CdXR0b25bMF0uY2xhc3NOYW1lICs9ICcgaXMtdmlzaWJsZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xpcHBlclswXS5zdHlsZS53aWR0aCA9IHRoaXMuX3RleHRXaWR0aDtcbiAgICAgICAgdGhpcy5fY2hldnJvbkJ1dHRvblswXS5zdHlsZS5oZWlnaHQgPSAnNTJweCc7XG4gICAgfTtcbiAgICBNZXNzYWdlQmFubmVyRGlyZWN0aXZlLnByb3RvdHlwZS5fcmVzaXplU21hbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbGllbnRXaWR0aCAtICh0aGlzLl9idWZmZXJFbGVtZW50c1dpZHRoU21hbGwgKyB0aGlzLl9jbG9zZUJ1dHRvblswXS5vZmZzZXRXaWR0aCkgPiB0aGlzLl9pbml0VGV4dFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0V2lkdGggPSAnYXV0byc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0V2lkdGggPSAodGhpcy5fY2xpZW50V2lkdGggLSAodGhpcy5fYnVmZmVyRWxlbWVudHNXaWR0aFNtYWxsICsgdGhpcy5fY2xvc2VCdXR0b25bMF0ub2Zmc2V0V2lkdGgpKSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xpcHBlclswXS5zdHlsZS53aWR0aCA9IHRoaXMuX3RleHRXaWR0aDtcbiAgICAgICAgdGhpcy5fY2hldnJvbkJ1dHRvblswXS5zdHlsZS5oZWlnaHQgPSAnODVweCc7XG4gICAgfTtcbiAgICBNZXNzYWdlQmFubmVyRGlyZWN0aXZlLnByb3RvdHlwZS5fdG9nZ2xlRXhwYW5zaW9uID0gZnVuY3Rpb24gKCRzY29wZSkge1xuICAgICAgICAkc2NvcGUuaXNFeHBhbmRlZCA9ICEkc2NvcGUuaXNFeHBhbmRlZDtcbiAgICAgICAgJHNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJhbm5lci50b2dnbGVDbGFzcygnaXMtZXhwYW5kZWQnKTtcbiAgICB9O1xuICAgIE1lc3NhZ2VCYW5uZXJEaXJlY3RpdmUucHJvdG90eXBlLl9oaWRlQmFubmVyID0gZnVuY3Rpb24gKCRzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoJHNjb3BlLnVpZklzVmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUJhbm5lci5hZGRDbGFzcygnaGlkZScpO1xuICAgICAgICAgICAgdGhpcy4kdGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJHNjb3BlLnVpZklzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJhbm5lci5yZW1vdmVDbGFzcygnaGlkZScpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1lc3NhZ2VCYW5uZXJEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5NZXNzYWdlQmFubmVyRGlyZWN0aXZlID0gTWVzc2FnZUJhbm5lckRpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMubWVzc2FnZWJhbm5lcicsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZk1lc3NhZ2VCYW5uZXInLCBNZXNzYWdlQmFubmVyRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL21lc3NhZ2ViYW5uZXIvbWVzc2FnZUJhbm5lckRpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIG1lc3NhZ2VCYXJUeXBlRW51bV8xID0gcmVxdWlyZShcIi4vbWVzc2FnZUJhclR5cGVFbnVtXCIpO1xudmFyIE1lc3NhZ2VCYXJDb250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNZXNzYWdlQmFyQ29udHJvbGxlcigkc2NvcGUsICRsb2cpIHtcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgfVxuICAgIHJldHVybiBNZXNzYWdlQmFyQ29udHJvbGxlcjtcbn0oKSk7XG5NZXNzYWdlQmFyQ29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnLCAnJGxvZyddO1xuZXhwb3J0cy5NZXNzYWdlQmFyQ29udHJvbGxlciA9IE1lc3NhZ2VCYXJDb250cm9sbGVyO1xudmFyIE1lc3NhZ2VCYXJEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1lc3NhZ2VCYXJEaXJlY3RpdmUoJGxvZywgJHRpbWVvdXQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy4kdGltZW91dCA9ICR0aW1lb3V0O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBNZXNzYWdlQmFyQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVxdWlyZSA9ICd1aWZNZXNzYWdlQmFyJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICcnICtcbiAgICAgICAgICAgICc8ZGl2IG5nLWNsYXNzPVwiW1xcJ21zLU1lc3NhZ2VCYXJcXCcsIGNsYXNzVHlwZV1cIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibXMtTWVzc2FnZUJhci1jb250ZW50XCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLU1lc3NhZ2VCYXItaWNvblwiPicgK1xuICAgICAgICAgICAgJzxpIG5nLWNsYXNzPVwiW1xcJ21zLUljb25cXCcsIGljb25UeXBlXVwiPjwvaT4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibXMtTWVzc2FnZUJhci10ZXh0XCIgLz4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgdWlmVHlwZTogJ0AnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubGluayA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsICRjb250cm9sbGVyLCAkdHJhbnNjbHVkZSkge1xuICAgICAgICAgICAgJHNjb3BlLmljb25UeXBlID0gJ21zLUljb24tLWluZm9DaXJjbGUnO1xuICAgICAgICAgICAgJHNjb3BlLmNsYXNzVHlwZSA9ICcnO1xuICAgICAgICAgICAgJHNjb3BlLnVpZlR5cGUgPSAkYXR0cnMudWlmVHlwZTtcbiAgICAgICAgICAgICRzY29wZS4kd2F0Y2goJ3VpZlR5cGUnLCBmdW5jdGlvbiAobmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VCYXJUeXBlRW51bV8xLk1lc3NhZ2VCYXJUeXBlRW51bVtuZXdWYWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRyb2xsZXIuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMubWVzc2FnZWJhciAtIFVuc3VwcG9ydGVkIHR5cGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgdHlwZSAoXFwnJyArICRzY29wZS51aWZUeXBlICsgJ1xcJykgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgT2ZmaWNlIFVJIEZhYnJpYy4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCBvcHRpb25zIGFyZSBsaXN0ZWQgaGVyZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL21lc3NhZ2ViYXIvJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2VCYXJUeXBlRW51bS50cycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9ICcgbXMtTWVzc2FnZUJhci0tJztcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5jbGFzc1R5cGUgPSBjbGFzc05hbWUgKyBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZUJhclR5cGVFbnVtXzEuTWVzc2FnZUJhclR5cGVFbnVtW25ld1ZhbHVlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbWVzc2FnZUJhclR5cGVFbnVtXzEuTWVzc2FnZUJhclR5cGVFbnVtLmVycm9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaWNvblR5cGUgPSAnbXMtSWNvbi0teENpcmNsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbWVzc2FnZUJhclR5cGVFbnVtXzEuTWVzc2FnZUJhclR5cGVFbnVtLnJlbW92ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmljb25UeXBlID0gJ21zLUljb24tLW1pbnVzIG1zLUljb24tLWNpcmNsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbWVzc2FnZUJhclR5cGVFbnVtXzEuTWVzc2FnZUJhclR5cGVFbnVtLnNldmVyZXdhcm5pbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5pY29uVHlwZSA9ICdtcy1JY29uLS1hbGVydCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbWVzc2FnZUJhclR5cGVFbnVtXzEuTWVzc2FnZUJhclR5cGVFbnVtLnN1Y2Nlc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5pY29uVHlwZSA9ICdtcy1JY29uLS1jaGVja2JveENoZWNrIG1zLUljb24tLWNpcmNsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy50cmFuc2NsdWRlQ2hpbGRzKCRzY29wZSwgJGVsZW1lbnQsICR0cmFuc2NsdWRlKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgTWVzc2FnZUJhckRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCRsb2csICR0aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VCYXJEaXJlY3RpdmUoJGxvZywgJHRpbWVvdXQpO1xuICAgICAgICB9O1xuICAgICAgICBkaXJlY3RpdmUuJGluamVjdCA9IFsnJGxvZycsICckdGltZW91dCddO1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgTWVzc2FnZUJhckRpcmVjdGl2ZS5wcm90b3R5cGUudHJhbnNjbHVkZUNoaWxkcyA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkdHJhbnNjbHVkZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAkdHJhbnNjbHVkZShmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgIHZhciBoYXNDb250ZW50ID0gX3RoaXMuaGFzSXRlbUNvbnRlbnQoY2xvbmUsICd1aWYtY29udGVudCcpO1xuICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMuTWVzc2FnZUJhciAtICcgK1xuICAgICAgICAgICAgICAgICAgICAneW91IG5lZWQgdG8gcHJvdmlkZSBhIHRleHQgZm9yIHRoZSBtZXNzYWdlIGJhci5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ0ZvciA8dWlmLW1lc3NhZ2UtYmFyPiB5b3UgbmVlZCB0byBzcGVjaWZ5JyArXG4gICAgICAgICAgICAgICAgICAgICc8dWlmLWNvbnRlbnQ+IGFzIGEgY2hpbGQgZGlyZWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5pbnNlcnRJdGVtQ29udGVudChjbG9uZSwgJHNjb3BlLCAkZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWVzc2FnZUJhckRpcmVjdGl2ZS5wcm90b3R5cGUuaW5zZXJ0SXRlbUNvbnRlbnQgPSBmdW5jdGlvbiAoY2xvbmUsICRzY29wZSwgJGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGNvbnRlbnRFbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1NZXNzYWdlQmFyLXRleHQnKSk7XG4gICAgICAgIGlmICh0aGlzLmhhc0l0ZW1Db250ZW50KGNsb25lLCAndWlmLWNvbnRlbnQnKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcygndWlmLWNvbnRlbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNJdGVtQ29udGVudChjbG9uZSwgJ21zLUxpbmsnKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcygnbXMtTGluaycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LmFwcGVuZChhbmd1bGFyLmVsZW1lbnQoJzxiciAvPicpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1lc3NhZ2VCYXJEaXJlY3RpdmUucHJvdG90eXBlLmhhc0l0ZW1Db250ZW50ID0gZnVuY3Rpb24gKGNsb25lLCBzZWxlY3Rvcikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChjbG9uZVtpXSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gTWVzc2FnZUJhckRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLk1lc3NhZ2VCYXJEaXJlY3RpdmUgPSBNZXNzYWdlQmFyRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5tZXNzYWdlYmFyJywgWydvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ10pXG4gICAgLmRpcmVjdGl2ZSgndWlmTWVzc2FnZUJhcicsIE1lc3NhZ2VCYXJEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvbWVzc2FnZWJhci9tZXNzYWdlQmFyRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSAzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBNZXNzYWdlQmFyVHlwZUVudW07XG4oZnVuY3Rpb24gKE1lc3NhZ2VCYXJUeXBlRW51bSkge1xuICAgIE1lc3NhZ2VCYXJUeXBlRW51bVtNZXNzYWdlQmFyVHlwZUVudW1bXCJlcnJvclwiXSA9IDBdID0gXCJlcnJvclwiO1xuICAgIE1lc3NhZ2VCYXJUeXBlRW51bVtNZXNzYWdlQmFyVHlwZUVudW1bXCJyZW1vdmVcIl0gPSAxXSA9IFwicmVtb3ZlXCI7XG4gICAgTWVzc2FnZUJhclR5cGVFbnVtW01lc3NhZ2VCYXJUeXBlRW51bVtcInNldmVyZXdhcm5pbmdcIl0gPSAyXSA9IFwic2V2ZXJld2FybmluZ1wiO1xuICAgIE1lc3NhZ2VCYXJUeXBlRW51bVtNZXNzYWdlQmFyVHlwZUVudW1bXCJzdWNjZXNzXCJdID0gM10gPSBcInN1Y2Nlc3NcIjtcbiAgICBNZXNzYWdlQmFyVHlwZUVudW1bTWVzc2FnZUJhclR5cGVFbnVtW1wid2FybmluZ1wiXSA9IDRdID0gXCJ3YXJuaW5nXCI7XG59KShNZXNzYWdlQmFyVHlwZUVudW0gPSBleHBvcnRzLk1lc3NhZ2VCYXJUeXBlRW51bSB8fCAoZXhwb3J0cy5NZXNzYWdlQmFyVHlwZUVudW0gPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9tZXNzYWdlYmFyL21lc3NhZ2VCYXJUeXBlRW51bS50c1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIGNvbnRleHR1YWxNZW51XzEgPSByZXF1aXJlKFwiLi8uLi9jb250ZXh0dWFsbWVudS9jb250ZXh0dWFsTWVudVwiKTtcbnZhciBOYXZCYXJDb250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOYXZCYXJDb250cm9sbGVyKCRzY29wZSwgJGFuaW1hdGUsICRlbGVtZW50LCAkbG9nKSB7XG4gICAgICAgIHRoaXMuJHNjb3BlID0gJHNjb3BlO1xuICAgICAgICB0aGlzLiRhbmltYXRlID0gJGFuaW1hdGU7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSAkZWxlbWVudDtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICB9XG4gICAgTmF2QmFyQ29udHJvbGxlci5wcm90b3R5cGUub3Blbk1vYmlsZU1lbnUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtZW51VmlzaWJsZSA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2lzLW9wZW4nKTtcbiAgICAgICAgdGhpcy4kYW5pbWF0ZVttZW51VmlzaWJsZSA/ICdyZW1vdmVDbGFzcycgOiAnYWRkQ2xhc3MnXSh0aGlzLiRlbGVtZW50LCAnaXMtb3BlbicpO1xuICAgIH07XG4gICAgTmF2QmFyQ29udHJvbGxlci5wcm90b3R5cGUuY2xvc2VNb2JpbGVNZW51ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaXMtb3BlbicpKSB7XG4gICAgICAgICAgICB0aGlzLiRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJGVsZW1lbnQsICdpcy1vcGVuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5hdkJhckNvbnRyb2xsZXIucHJvdG90eXBlLmNsb3NlQWxsQ29udGV4dE1lbnVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmF2QmFySXRlbXMgPSB0aGlzLiRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tcy1OYXZCYXItaXRlbScpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hdkJhckl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmdFbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KG5hdkJhckl0ZW1zW2ldKTtcbiAgICAgICAgICAgIHZhciBuYXZCYXJJdGVtQ3RybCA9IG5nRWxlbWVudC5jb250cm9sbGVyKE5hdkJhckl0ZW1EaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSk7XG4gICAgICAgICAgICBpZiAobmF2QmFySXRlbUN0cmwpIHtcbiAgICAgICAgICAgICAgICBuYXZCYXJJdGVtQ3RybC5jbG9zZUNvbnRleHR1YWxNZW51KCk7XG4gICAgICAgICAgICAgICAgbmF2QmFySXRlbUN0cmwuZGVzZWxlY3RJdGVtKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5hdkJhckNvbnRyb2xsZXIucHJvdG90eXBlLmhpZGVTZWFyY2hUZXh0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmF2QmFySXRlbXMgPSB0aGlzLiRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tcy1OYXZCYXItaXRlbS0tc2VhcmNoJyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmF2QmFySXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBuZ0VsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQobmF2QmFySXRlbXNbaV0pO1xuICAgICAgICAgICAgdmFyIG5hdlNlYXJjaEN0cmwgPSBuZ0VsZW1lbnQuY29udHJvbGxlcihOYXZCYXJTZWFyY2guZGlyZWN0aXZlTmFtZSk7XG4gICAgICAgICAgICBpZiAobmF2U2VhcmNoQ3RybCkge1xuICAgICAgICAgICAgICAgIG5hdlNlYXJjaEN0cmwuY2xvc2VTZWFyY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE5hdkJhckNvbnRyb2xsZXI7XG59KCkpO1xuTmF2QmFyQ29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnLCAnJGFuaW1hdGUnLCAnJGVsZW1lbnQnLCAnJGxvZyddO1xuZXhwb3J0cy5OYXZCYXJDb250cm9sbGVyID0gTmF2QmFyQ29udHJvbGxlcjtcbnZhciBOYXZCYXJEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5hdkJhckRpcmVjdGl2ZSgkbG9nLCAkYW5pbWF0ZSwgJGRvY3VtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgICAgIHRoaXMuJGFuaW1hdGUgPSAkYW5pbWF0ZTtcbiAgICAgICAgdGhpcy4kZG9jdW1lbnQgPSAkZG9jdW1lbnQ7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IE5hdkJhckNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuY29udHJvbGxlckFzID0gJ25hdic7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIlxcbiAgPGRpdiBjbGFzcz1cXFwibXMtTmF2QmFyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibXMtTmF2QmFyLW9wZW5NZW51IGpzLW9wZW5NZW51XFxcIiBuZy1jbGljaz1cXFwibmF2Lm9wZW5Nb2JpbGVNZW51KClcXFwiPlxcbiAgICAgIDx1aWYtaWNvbiB1aWYtdHlwZT1cXFwibWVudVxcXCI+PC91aWYtaWNvbj5cXG4gICAgPC9kaXY+XFxuICAgIDx1aWYtb3ZlcmxheSB1aWYtbW9kZT1cXFwie3tvdmVybGF5fX1cXFwiIG5nLWNsaWNrPVxcXCJuYXYuY2xvc2VNb2JpbGVNZW51KClcXFwiPjwvdWlmLW92ZXJsYXk+XFxuICAgIDx1bCBjbGFzcz1cXFwibXMtTmF2QmFyLWl0ZW1zXFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPSd1aWYtbmF2LWl0ZW1zJz48L2Rpdj5cXG4gICAgPC91bD5cXG4gIDwvZGl2PlwiO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgb3ZlcmxheTogJ0A/dWlmT3ZlcmxheSdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5saW5rID0gZnVuY3Rpb24gKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgbmF2QmFyQ29udHJvbGxlciwgJHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgICAgIF90aGlzLiRkb2N1bWVudC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmF2QmFyQ29udHJvbGxlci5jbG9zZUFsbENvbnRleHRNZW51cygpO1xuICAgICAgICAgICAgICAgIG5hdkJhckNvbnRyb2xsZXIuaGlkZVNlYXJjaFRleHRCb3goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRUb1JlcGxhY2UgPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLnVpZi1uYXYtaXRlbXMnKSk7XG4gICAgICAgICAgICAgICAgZWxlbWVudFRvUmVwbGFjZS5yZXBsYWNlV2l0aChjbG9uZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgTmF2QmFyRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoJGxvZywgJGFuaW1hdGUsICRkb2N1bWVudCkgeyByZXR1cm4gbmV3IE5hdkJhckRpcmVjdGl2ZSgkbG9nLCAkYW5pbWF0ZSwgJGRvY3VtZW50KTsgfTtcbiAgICAgICAgZGlyZWN0aXZlLiRpbmplY3QgPSBbJyRsb2cnLCAnJGFuaW1hdGUnLCAnJGRvY3VtZW50J107XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gTmF2QmFyRGlyZWN0aXZlO1xufSgpKTtcbk5hdkJhckRpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lID0gJ3VpZk5hdkJhcic7XG5OYXZCYXJEaXJlY3RpdmUub3ZlcmxheVZhbHVlcyA9IFsnbGlnaHQnLCAnZGFyayddO1xuZXhwb3J0cy5OYXZCYXJEaXJlY3RpdmUgPSBOYXZCYXJEaXJlY3RpdmU7XG52YXIgTmF2QmFySXRlbVR5cGVzO1xuKGZ1bmN0aW9uIChOYXZCYXJJdGVtVHlwZXMpIHtcbiAgICBOYXZCYXJJdGVtVHlwZXNbTmF2QmFySXRlbVR5cGVzW1wibGlua1wiXSA9IDBdID0gXCJsaW5rXCI7XG4gICAgTmF2QmFySXRlbVR5cGVzW05hdkJhckl0ZW1UeXBlc1tcIm1lbnVcIl0gPSAxXSA9IFwibWVudVwiO1xufSkoTmF2QmFySXRlbVR5cGVzIHx8IChOYXZCYXJJdGVtVHlwZXMgPSB7fSkpO1xudmFyIE5hdkJhckl0ZW1Db250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOYXZCYXJJdGVtQ29udHJvbGxlcigkc2NvcGUsICRlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuJHNjb3BlID0gJHNjb3BlO1xuICAgICAgICB0aGlzLiRlbGVtZW50ID0gJGVsZW1lbnQ7XG4gICAgfVxuICAgIE5hdkJhckl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5jbG9zZUNvbnRleHR1YWxNZW51ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy4kc2NvcGUuaGFzQ2hpbGRNZW51KSB7XG4gICAgICAgICAgICB0aGlzLiRzY29wZS5jb250ZXh0TWVudUN0cmwuY2xvc2VNZW51KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5hdkJhckl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5kZXNlbGVjdEl0ZW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgfTtcbiAgICByZXR1cm4gTmF2QmFySXRlbUNvbnRyb2xsZXI7XG59KCkpO1xuTmF2QmFySXRlbUNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHNjb3BlJywgJyRlbGVtZW50J107XG5leHBvcnRzLk5hdkJhckl0ZW1Db250cm9sbGVyID0gTmF2QmFySXRlbUNvbnRyb2xsZXI7XG52YXIgTmF2QmFySXRlbURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmF2QmFySXRlbURpcmVjdGl2ZSgkbG9nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IE5hdkJhckl0ZW1Db250cm9sbGVyO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBcIl5cIiArIE5hdkJhckRpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgaXNEaXNhYmxlZDogJ0A/ZGlzYWJsZWQnLFxuICAgICAgICAgICAgcG9zaXRpb246ICdAP3VpZlBvc2l0aW9uJyxcbiAgICAgICAgICAgIHRleHQ6ICc9P3VpZlRleHQnLFxuICAgICAgICAgICAgdHlwZTogJ0A/dWlmVHlwZSdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzID0ge307XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBmdW5jdGlvbiAoJGVsZW1lbnQsICRhdHRycykge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSAkYXR0cnMudWlmVHlwZTtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRlbXBsYXRlVHlwZXNbTmF2QmFySXRlbVR5cGVzLmxpbmtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE5hdkJhckl0ZW1UeXBlc1t0eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMubmF2YmFyIC0gdW5zdXBwb3J0ZWQgbmF2IGJhciBpdGVtIHR5cGU6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICd0aGUgdHlwZSBcXCcnICsgdHlwZSArICdcXCcgaXMgbm90IHN1cHBvcnRlZCBieSBuZy1PZmZpY2UgVUkgRmFicmljIGFzIHZhbGlkIHR5cGUgZm9yIG5hdiBiYXIgaXRlbS4nICtcbiAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCB0eXBlcyBjYW4gYmUgZm91bmQgdW5kZXIgTmF2QmFySXRlbVR5cGVzIGVudW0gaGVyZTpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL25hdmJhci9uYXZiYXJEaXJlY3RpdmUudHMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJzxkaXY+PC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy50ZW1wbGF0ZVR5cGVzW05hdkJhckl0ZW1UeXBlc1t0eXBlXV07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubGluayA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIG5hdkJhckNvbnRyb2xsZXIsICR0cmFuc2NsdWRlKSB7XG4gICAgICAgICAgICBpZiAoJHNjb3BlLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmF2QmFyTGlua0VlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1OYXZCYXItbGluaycpKTtcbiAgICAgICAgICAgICAgICBuYXZCYXJMaW5rRWVsZW1lbnQucmVtb3ZlQXR0cignaHJlZicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQoJHNjb3BlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgJHNjb3BlLnR5cGUgPSBOYXZCYXJJdGVtVHlwZXNbTmF2QmFySXRlbVR5cGVzLmxpbmtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHNjb3BlLnNlbGVjdEl0ZW0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcygnaXMtZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRlbGVtZW50LnBhcmVudCgpLmZpbmQoJ2xpJykucmVtb3ZlQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgbmF2QmFyQ29udHJvbGxlci5jbG9zZUFsbENvbnRleHRNZW51cygpO1xuICAgICAgICAgICAgICAgIG5hdkJhckNvbnRyb2xsZXIuaGlkZVNlYXJjaFRleHRCb3goKTtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC50b2dnbGVDbGFzcygnaXMtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmhhc0NoaWxkTWVudSAmJiAkc2NvcGUuY29udGV4dE1lbnVDdHJsLmlzTWVudU9wZW5lZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5jb250ZXh0TWVudUN0cmwuY2xvc2VNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICRlbGVtZW50LnJlbW92ZUNsYXNzKCdpcy1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgkc2NvcGUuaGFzQ2hpbGRNZW51ICYmICEkc2NvcGUuY29udGV4dE1lbnVDdHJsLmlzTWVudU9wZW5lZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5jb250ZXh0TWVudUN0cmwub3Blbk1lbnUoKTtcbiAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEkc2NvcGUuaGFzQ2hpbGRNZW51KSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdkJhckNvbnRyb2xsZXIuY2xvc2VNb2JpbGVNZW51KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAkZWxlbWVudC5vbignY2xpY2snLCAkc2NvcGUuc2VsZWN0SXRlbSk7XG4gICAgICAgICAgICBfdGhpcy50cmFuc2NsdWRlQ2hpbGRzKCRzY29wZSwgJGVsZW1lbnQsICR0cmFuc2NsdWRlKTtcbiAgICAgICAgICAgIHZhciBjb250ZXh0TWVudUN0cmwgPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm1zLUNvbnRleHR1YWxNZW51JykpXG4gICAgICAgICAgICAgICAgLmNvbnRyb2xsZXIoY29udGV4dHVhbE1lbnVfMS5Db250ZXh0dWFsTWVudURpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lKTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0TWVudUN0cmwpIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUuaGFzQ2hpbGRNZW51ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAkc2NvcGUuY29udGV4dE1lbnVDdHJsID0gY29udGV4dE1lbnVDdHJsO1xuICAgICAgICAgICAgICAgICRzY29wZS5jb250ZXh0TWVudUN0cmwub25Sb290TWVudUNsb3NlZC5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2QmFyQ29udHJvbGxlci5jbG9zZU1vYmlsZU1lbnUoKTtcbiAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGVtcGxhdGVUeXBlc1tOYXZCYXJJdGVtVHlwZXMubGlua10gPSBcIlxcbiAgICA8bGkgY2xhc3M9XFxcIm1zLU5hdkJhci1pdGVtXFxcIlxcbiAgICBuZy1jbGFzcz1cXFwieydpcy1kaXNhYmxlZCc6IGlzRGlzYWJsZWQsICdtcy1OYXZCYXItaXRlbS0tcmlnaHQnOiBwb3NpdGlvbiA9PT0gJ3JpZ2h0J31cXFwiPlxcbiAgICAgIDxhIGNsYXNzPVxcXCJtcy1OYXZCYXItbGlua1xcXCIgaHJlZj1cXFwiXFxcIj48c3BhbiBjbGFzcz0ndWlmLW5hdi1pdGVtLWNvbnRlbnQnPjwvc3Bhbj48L2E+XFxuICAgIDwvbGk+XCI7XG4gICAgICAgIHRoaXMudGVtcGxhdGVUeXBlc1tOYXZCYXJJdGVtVHlwZXMubWVudV0gPSBcIlxcbiAgICA8bGkgY2xhc3M9XFxcIm1zLU5hdkJhci1pdGVtIG1zLU5hdkJhci1pdGVtLS1oYXNNZW51XFxcIiBuZy1jbGFzcz1cXFwieydpcy1kaXNhYmxlZCc6IGlzRGlzYWJsZWR9XFxcIj5cXG4gICAgICA8YSBjbGFzcz1cXFwibXMtTmF2QmFyLWxpbmtcXFwiIGhyZWY9XFxcIlxcXCI+PHNwYW4gY2xhc3M9J3VpZi1uYXYtaXRlbS1jb250ZW50Jz48L3NwYW4+PC9hPlxcbiAgICAgIDxpIGNsYXNzPVxcXCJtcy1OYXZCYXItY2hldnJvbkRvd24gbXMtSWNvbiBtcy1JY29uLS1jaGV2cm9uRG93blxcXCI+PC9pPlxcbiAgICAgIDxkaXYgY2xhc3M9J3VpZi1zdWJtZW51Jz48L2Rpdj5cXG4gICAgPC9saT5cIjtcbiAgICB9XG4gICAgTmF2QmFySXRlbURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCRsb2cpIHsgcmV0dXJuIG5ldyBOYXZCYXJJdGVtRGlyZWN0aXZlKCRsb2cpOyB9O1xuICAgICAgICBkaXJlY3RpdmUuJGluamVjdCA9IFsnJGxvZyddO1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgTmF2QmFySXRlbURpcmVjdGl2ZS5wcm90b3R5cGUudHJhbnNjbHVkZUNoaWxkcyA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkdHJhbnNjbHVkZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAkdHJhbnNjbHVkZShmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgIHZhciBoYXNDb250ZW50ID0gX3RoaXMuaGFzSXRlbUNvbnRlbnQoY2xvbmUpO1xuICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmICEkc2NvcGUudGV4dCkge1xuICAgICAgICAgICAgICAgIF90aGlzLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLm5hdmJhciAtICcgK1xuICAgICAgICAgICAgICAgICAgICAneW91IG5lZWQgdG8gcHJvdmlkZSBhIHRleHQgZm9yIGEgbmF2IGJhciBtZW51IGl0ZW0uXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdGb3IgPHVpZi1uYXYtYmFyLWl0ZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkgZWl0aGVyIFxcJ3VpZi10ZXh0XFwnIGFzIGF0dHJpYnV0ZSBvciA8dWlmLW5hdi1pdGVtLWNvbnRlbnQ+IGFzIGEgY2hpbGQgZGlyZWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5pbnNlcnRMaW5rKGNsb25lLCAkc2NvcGUsICRlbGVtZW50KTtcbiAgICAgICAgICAgIF90aGlzLmluc2VydE1lbnUoY2xvbmUsICRzY29wZSwgJGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE5hdkJhckl0ZW1EaXJlY3RpdmUucHJvdG90eXBlLmluc2VydExpbmsgPSBmdW5jdGlvbiAoY2xvbmUsICRzY29wZSwgJGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUb1JlcGxhY2UgPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLnVpZi1uYXYtaXRlbS1jb250ZW50JykpO1xuICAgICAgICBpZiAodGhpcy5oYXNJdGVtQ29udGVudChjbG9uZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChjbG9uZVtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ3VpZi1jb250ZW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvUmVwbGFjZS5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudFRvUmVwbGFjZS5yZXBsYWNlV2l0aChhbmd1bGFyLmVsZW1lbnQoJzxzcGFuPicgKyAkc2NvcGUudGV4dCArICc8L3NwYW4+JykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOYXZCYXJJdGVtRGlyZWN0aXZlLnByb3RvdHlwZS5pbnNlcnRNZW51ID0gZnVuY3Rpb24gKGNsb25lLCAkc2NvcGUsICRlbGVtZW50KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KGNsb25lW2ldKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0NsYXNzKCdtcy1Db250ZXh0dWFsTWVudScpKSB7XG4gICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy51aWYtc3VibWVudScpKS5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTmF2QmFySXRlbURpcmVjdGl2ZS5wcm90b3R5cGUuaGFzSXRlbUNvbnRlbnQgPSBmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoY2xvbmVbaV0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ3VpZi1jb250ZW50JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gTmF2QmFySXRlbURpcmVjdGl2ZTtcbn0oKSk7XG5OYXZCYXJJdGVtRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUgPSAndWlmTmF2QmFySXRlbSc7XG5leHBvcnRzLk5hdkJhckl0ZW1EaXJlY3RpdmUgPSBOYXZCYXJJdGVtRGlyZWN0aXZlO1xudmFyIE5hdkJhclNlYXJjaENvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5hdkJhclNlYXJjaENvbnRyb2xsZXIoJHNjb3BlLCAkZWxlbWVudCwgJGRvY3VtZW50LCAkYW5pbWF0ZSwgJHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSAkZWxlbWVudDtcbiAgICAgICAgdGhpcy4kZG9jdW1lbnQgPSAkZG9jdW1lbnQ7XG4gICAgICAgIHRoaXMuJGFuaW1hdGUgPSAkYW5pbWF0ZTtcbiAgICAgICAgdGhpcy4kdGltZW91dCA9ICR0aW1lb3V0O1xuICAgIH1cbiAgICBOYXZCYXJTZWFyY2hDb250cm9sbGVyLnByb3RvdHlwZS5jbG9zZVNlYXJjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy4kdGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLiRzY29wZS5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuJGFuaW1hdGUucmVtb3ZlQ2xhc3MoX3RoaXMuJGVsZW1lbnQsICdpcy1vcGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy4kYW5pbWF0ZS5yZW1vdmVDbGFzcyhfdGhpcy4kZWxlbWVudCwgJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE5hdkJhclNlYXJjaENvbnRyb2xsZXI7XG59KCkpO1xuTmF2QmFyU2VhcmNoQ29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnLCAnJGVsZW1lbnQnLCAnJGRvY3VtZW50JywgJyRhbmltYXRlJywgJyR0aW1lb3V0J107XG5leHBvcnRzLk5hdkJhclNlYXJjaENvbnRyb2xsZXIgPSBOYXZCYXJTZWFyY2hDb250cm9sbGVyO1xudmFyIE5hdkJhclNlYXJjaCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmF2QmFyU2VhcmNoKCRkb2N1bWVudCwgJGFuaW1hdGUsICR0aW1lb3V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuJGRvY3VtZW50ID0gJGRvY3VtZW50O1xuICAgICAgICB0aGlzLiRhbmltYXRlID0gJGFuaW1hdGU7XG4gICAgICAgIHRoaXMuJHRpbWVvdXQgPSAkdGltZW91dDtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gTmF2QmFyU2VhcmNoQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gW1wiXlwiICsgTmF2QmFyRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUsIFwiXCIgKyBOYXZCYXJTZWFyY2guZGlyZWN0aXZlTmFtZV07XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICBvblNlYXJjaENhbGxiYWNrOiAnJj91aWZPblNlYXJjaCcsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogJ0A/cGxhY2Vob2xkZXInXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIlxcbiAgICA8bGkgY2xhc3M9XFxcIm1zLU5hdkJhci1pdGVtIG1zLU5hdkJhci1pdGVtLS1zZWFyY2ggbXMtdS1oaWRkZW5TbVxcXCIgbmctY2xpY2s9XFxcIm9uU2VhcmNoKCRldmVudClcXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVRleHRGaWVsZFxcXCIgbmctY2xpY2s9XFxcInNraXBPbkNsaWNrKCRldmVudClcXFwiPlxcbiAgICAgICAgPGlucHV0IHBsYWNlaG9sZGVyPXt7cGxhY2Vob2xkZXJ9fSBjbGFzcz1cXFwibXMtVGV4dEZpZWxkLWZpZWxkXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBuZy1rZXlwcmVzcz1cXFwib25TZWFyY2goJGV2ZW50KVxcXCIgbmctbW9kZWw9XFxcInNlYXJjaFRleHRcXFwiPlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2xpPlwiO1xuICAgICAgICB0aGlzLmxpbmsgPSBmdW5jdGlvbiAoJHNjb3BlLCAkZWxlbWVudCwgJGF0dHJzLCBjdHJscywgJHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgICAgIF90aGlzLiRkb2N1bWVudC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY3RybHNbMV0uY2xvc2VTZWFyY2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHNjb3BlLnNraXBPbkNsaWNrID0gZnVuY3Rpb24gKCRldmVudCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmFwcGx5Q3NzQ2xhc3NlcygkZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICRzY29wZS5vblNlYXJjaCA9IGZ1bmN0aW9uICgkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjdHJsc1swXS5jbG9zZUFsbENvbnRleHRNZW51cygpO1xuICAgICAgICAgICAgICAgIGlmICgkZXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmICRldmVudC53aGljaCA9PT0gMTMgJiYgJHNjb3BlLm9uU2VhcmNoQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm9uU2VhcmNoQ2FsbGJhY2soeyBzZWFyY2g6ICRzY29wZS5zZWFyY2hUZXh0IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgkZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmICRlbGVtZW50Lmhhc0NsYXNzKCdpcy1vcGVuJykgJiYgJHNjb3BlLm9uU2VhcmNoQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm9uU2VhcmNoQ2FsbGJhY2soeyBzZWFyY2g6ICRzY29wZS5zZWFyY2hUZXh0IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5hcHBseUNzc0NsYXNzZXMoJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgfVxuICAgIE5hdkJhclNlYXJjaC5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCRkb2N1bWVudCwgJGFuaW1hdGUsICR0aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE5hdkJhclNlYXJjaCgkZG9jdW1lbnQsICRhbmltYXRlLCAkdGltZW91dCk7XG4gICAgICAgIH07XG4gICAgICAgIGRpcmVjdGl2ZS4kaW5qZWN0ID0gWyckZG9jdW1lbnQnLCAnJGFuaW1hdGUnLCAnJHRpbWVvdXQnXTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIE5hdkJhclNlYXJjaC5wcm90b3R5cGUuYXBwbHlDc3NDbGFzc2VzID0gZnVuY3Rpb24gKCRlbGVtZW50KSB7XG4gICAgICAgIGlmICghJGVsZW1lbnQuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xuICAgICAgICAgICAgdGhpcy4kYW5pbWF0ZS5hZGRDbGFzcygkZWxlbWVudCwgJ2lzLW9wZW4nKTtcbiAgICAgICAgICAgIHRoaXMuJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudCgkZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcubXMtVGV4dEZpZWxkLWZpZWxkJykpWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgfVxuICAgICAgICAkZWxlbWVudC5wYXJlbnQoKS5maW5kKCdsaScpLnJlbW92ZUNsYXNzKCdpcy1zZWxlY3RlZCcpO1xuICAgICAgICB0aGlzLiRhbmltYXRlLmFkZENsYXNzKCRlbGVtZW50LCAnaXMtc2VsZWN0ZWQnKTtcbiAgICB9O1xuICAgIHJldHVybiBOYXZCYXJTZWFyY2g7XG59KCkpO1xuTmF2QmFyU2VhcmNoLmRpcmVjdGl2ZU5hbWUgPSAndWlmTmF2QmFyU2VhcmNoJztcbmV4cG9ydHMuTmF2QmFyU2VhcmNoID0gTmF2QmFyU2VhcmNoO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5uYXZiYXInLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoTmF2QmFyRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUsIE5hdkJhckRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZShOYXZCYXJJdGVtRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUsIE5hdkJhckl0ZW1EaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoTmF2QmFyU2VhcmNoLmRpcmVjdGl2ZU5hbWUsIE5hdkJhclNlYXJjaC5mYWN0b3J5KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9uYXZiYXIvbmF2YmFyRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSAzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgb3JnQ2hhcnRQcmVzZW5jZUVudW1fMSA9IHJlcXVpcmUoXCIuL29yZ0NoYXJ0UHJlc2VuY2VFbnVtXCIpO1xudmFyIG9yZ0NoYXJ0U3R5bGVFbnVtXzEgPSByZXF1aXJlKFwiLi9vcmdDaGFydFN0eWxlRW51bVwiKTtcbnZhciBvcmdDaGFydFNlbGVjdE1vZGVFbnVtXzEgPSByZXF1aXJlKFwiLi9vcmdDaGFydFNlbGVjdE1vZGVFbnVtXCIpO1xudmFyIE9yZ0NoYXJ0Q29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3JnQ2hhcnRDb250cm9sbGVyKCRzY29wZSwgJGxvZykge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0TW9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuJHNjb3BlLml0ZW1zID0gW107XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPcmdDaGFydENvbnRyb2xsZXIucHJvdG90eXBlLCBcIml0ZW1zXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuaXRlbXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLiRzY29wZS5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT3JnQ2hhcnRDb250cm9sbGVyLnByb3RvdHlwZSwgXCJzZWxlY3RlZEl0ZW1zXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUuc2VsZWN0ZWRJdGVtcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoc2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkSXRlbXM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBPcmdDaGFydENvbnRyb2xsZXI7XG59KCkpO1xuT3JnQ2hhcnRDb250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckbG9nJ107XG52YXIgT3JnQ2hhcnREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9yZ0NoYXJ0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1PcmdDaGFydFwiIG5nLXRyYW5zY2x1ZGUgPjwvZGl2Pic7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IE9yZ0NoYXJ0Q29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM6ICc9P3VpZlNlbGVjdGVkSXRlbXMnXG4gICAgICAgIH07XG4gICAgfVxuICAgIE9yZ0NoYXJ0RGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgT3JnQ2hhcnREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIE9yZ0NoYXJ0RGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycywgY3RybCkge1xuICAgICAgICBpZiAoYXR0cnMudWlmU2VsZWN0TW9kZSkge1xuICAgICAgICAgICAgc3dpdGNoIChvcmdDaGFydFNlbGVjdE1vZGVFbnVtXzEuT3JnQ2hhcnRTZWxlY3RNb2RlRW51bVthdHRycy51aWZTZWxlY3RNb2RlXSkge1xuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRTZWxlY3RNb2RlRW51bV8xLk9yZ0NoYXJ0U2VsZWN0TW9kZUVudW0uc2luZ2xlOlxuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRTZWxlY3RNb2RlRW51bV8xLk9yZ0NoYXJ0U2VsZWN0TW9kZUVudW0ubXVsdGlwbGU6XG4gICAgICAgICAgICAgICAgICAgIGN0cmwuc2VsZWN0TW9kZSA9IG9yZ0NoYXJ0U2VsZWN0TW9kZUVudW1fMS5PcmdDaGFydFNlbGVjdE1vZGVFbnVtW2F0dHJzLnVpZlNlbGVjdE1vZGVdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjdHJsLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVJRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLm9yZ2NoYXJ0IC0gVW5zdXBwb3J0ZWQgc2VsZWN0LW1vZGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzZWxlY3QtbW9kZSAoXFwnJyArIGF0dHJzLnVpZlNlbGVjdE1vZGUgKyAnXFwpIGlzIG5vdCBzdXBwZXJ0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCBvcHRpb25zIGFyZTogc2luZ2xlLCBtdWx0aXBsZScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE9yZ0NoYXJ0RGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuT3JnQ2hhcnREaXJlY3RpdmUgPSBPcmdDaGFydERpcmVjdGl2ZTtcbnZhciBPcmdDaGFydEdyb3VwRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPcmdDaGFydEdyb3VwRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1PcmdDaGFydC1ncm91cFwiIG5nLXRyYW5zY2x1ZGUgPjwvZGl2Pic7XG4gICAgfVxuICAgIE9yZ0NoYXJ0R3JvdXBEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBPcmdDaGFydEdyb3VwRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gT3JnQ2hhcnRHcm91cERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLk9yZ0NoYXJ0R3JvdXBEaXJlY3RpdmUgPSBPcmdDaGFydEdyb3VwRGlyZWN0aXZlO1xudmFyIE9yZ0NoYXJ0R3JvdXBUaXRsZURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3JnQ2hhcnRHcm91cFRpdGxlRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1PcmdDaGFydC1ncm91cFRpdGxlXCIgbmctdHJhbnNjbHVkZSA+PC9kaXY+JztcbiAgICB9XG4gICAgT3JnQ2hhcnRHcm91cFRpdGxlRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgT3JnQ2hhcnRHcm91cFRpdGxlRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gT3JnQ2hhcnRHcm91cFRpdGxlRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuT3JnQ2hhcnRHcm91cFRpdGxlRGlyZWN0aXZlID0gT3JnQ2hhcnRHcm91cFRpdGxlRGlyZWN0aXZlO1xudmFyIE9yZ0NoYXJ0TGlzdERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3JnQ2hhcnRMaXN0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzx1bCBjbGFzcz1cIm1zLU9yZ0NoYXJ0LWxpc3RcIiBuZy10cmFuc2NsdWRlID48L3VsPic7XG4gICAgfVxuICAgIE9yZ0NoYXJ0TGlzdERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE9yZ0NoYXJ0TGlzdERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIE9yZ0NoYXJ0TGlzdERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLk9yZ0NoYXJ0TGlzdERpcmVjdGl2ZSA9IE9yZ0NoYXJ0TGlzdERpcmVjdGl2ZTtcbnZhciBPcmdDaGFydFBlcnNvbmFEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9yZ0NoYXJ0UGVyc29uYURpcmVjdGl2ZSgkbG9nKSB7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGxpIGNsYXNzPVwibXMtT3JnQ2hhcnQtbGlzdEl0ZW1cIj48ZGl2IGNsYXNzPVwibXMtUGVyc29uYVwiIG5nLXRyYW5zY2x1ZGUgPjwvZGl2PjwvbGk+JztcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gJ151aWZPcmdDaGFydCc7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICBpdGVtOiAnPT91aWZJdGVtJyxcbiAgICAgICAgICAgIHByZXNlbmNlOiAnPT91aWZQcmVzZW5jZScsXG4gICAgICAgICAgICBzZWxlY3RlZDogJz0/dWlmU2VsZWN0ZWQnXG4gICAgICAgIH07XG4gICAgfVxuICAgIE9yZ0NoYXJ0UGVyc29uYURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCRsb2cpIHsgcmV0dXJuIG5ldyBPcmdDaGFydFBlcnNvbmFEaXJlY3RpdmUoJGxvZyk7IH07XG4gICAgICAgIGRpcmVjdGl2ZS4kaW5qZWN0ID0gWyckbG9nJ107XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBPcmdDaGFydFBlcnNvbmFEaXJlY3RpdmUucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoZWxlbSwgYXR0cnMsIHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvc3Q6IHRoaXMucG9zdExpbmtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIE9yZ0NoYXJ0UGVyc29uYURpcmVjdGl2ZS5wcm90b3R5cGUucG9zdExpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHJzLCBjdHJsLCB0cmFuc2NsdWRlKSB7XG4gICAgICAgIGlmIChzY29wZS5zZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzY29wZS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY29wZS5wcmVzZW5jZSkge1xuICAgICAgICAgICAgc3dpdGNoIChvcmdDaGFydFByZXNlbmNlRW51bV8xLk9yZ0NoYXJ0UHJlc2VuY2VFbnVtW3Njb3BlLnByZXNlbmNlXSkge1xuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRQcmVzZW5jZUVudW1fMS5PcmdDaGFydFByZXNlbmNlRW51bS5hdmFpbGFibGU6XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnbXMtUGVyc29uYS0tYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRQcmVzZW5jZUVudW1fMS5PcmdDaGFydFByZXNlbmNlRW51bS5idXN5OlxuICAgICAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCkuZXEoMCkuYWRkQ2xhc3MoJ21zLVBlcnNvbmEtLWJ1c3knKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBvcmdDaGFydFByZXNlbmNlRW51bV8xLk9yZ0NoYXJ0UHJlc2VuY2VFbnVtLmF3YXk6XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnbXMtUGVyc29uYS0tYXdheScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIG9yZ0NoYXJ0UHJlc2VuY2VFbnVtXzEuT3JnQ2hhcnRQcmVzZW5jZUVudW0uYmxvY2tlZDpcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5jaGlsZHJlbigpLmVxKDApLmFkZENsYXNzKCdtcy1QZXJzb25hLS1ibG9ja2VkJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRQcmVzZW5jZUVudW1fMS5PcmdDaGFydFByZXNlbmNlRW51bS5kbmQ6XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnbXMtUGVyc29uYS0tZG5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRQcmVzZW5jZUVudW1fMS5PcmdDaGFydFByZXNlbmNlRW51bS5vZmZsaW5lOlxuICAgICAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCkuZXEoMCkuYWRkQ2xhc3MoJ21zLVBlcnNvbmEtLW9mZmxpbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY3RybC4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVSUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5vcmdjaGFydCAtIFVuc3VwcG9ydGVkIHByZXNlbmNlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgcHJlc2VuY2UgKFxcJycgKyBzY29wZS5wcmVzZW5jZSArICdcXCcpIGlzIG5vdCBzdXBwZXJ0ZWQgYnkgdGhlIE9mZmljZSBVSSBGYWJyaWMuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCBvcHRpb25zIGFyZTogYXZhaWxhYmxlLCBidXN5LCBhd2F5LCBibG9ja2VkLCBkbmQsIG9mZmxpbmUuJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRycy51aWZTdHlsZSkge1xuICAgICAgICAgICAgc3dpdGNoIChvcmdDaGFydFN0eWxlRW51bV8xLk9yZ0NoYXJ0U3R5bGVFbnVtW2F0dHJzLnVpZlN0eWxlXSkge1xuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRTdHlsZUVudW1fMS5PcmdDaGFydFN0eWxlRW51bS5zcXVhcmU6XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnbXMtUGVyc29uYS0tc3F1YXJlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2Ugb3JnQ2hhcnRTdHlsZUVudW1fMS5PcmdDaGFydFN0eWxlRW51bS5zdGFuZGFyZDogYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY3RybC4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVSUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5vcmdjaGFydCAtIFVuc3VwcG9ydGVkIHN0eWxlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgc3R5bGUgKFxcJycgKyBhdHRycy51aWZTdHlsZSArICdcXCkgaXMgbm90IHN1cHBlcnRlZCBieSB0aGUgT2ZmaWNlIFVJIEZhYnJpYy4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnU3VwcG9ydGVkIG9wdGlvbnMgYXJlOiBzdGFuZGFyZChkZWZhdWx0KSwgc3F1YXJlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdHJsLnNlbGVjdE1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWxlbS5jaGlsZHJlbigpLmVxKDApLmFkZENsYXNzKCdtcy1QZXJzb25hLS1zZWxlY3RhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUuJHdhdGNoKCdzZWxlY3RlZCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChjdHJsLnNlbGVjdE1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCkuZXEoMCkuYWRkQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCkuZXEoMCkucmVtb3ZlQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNjb3BlLml0ZW0pIHtcbiAgICAgICAgICAgIGN0cmwuaXRlbXMucHVzaChzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0cmwuc2VsZWN0TW9kZSA9PT0gb3JnQ2hhcnRTZWxlY3RNb2RlRW51bV8xLk9yZ0NoYXJ0U2VsZWN0TW9kZUVudW0uc2luZ2xlIHx8IGN0cmwuc2VsZWN0TW9kZSA9PT0gb3JnQ2hhcnRTZWxlY3RNb2RlRW51bV8xLk9yZ0NoYXJ0U2VsZWN0TW9kZUVudW0ubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGlmIChjdHJsLnNlbGVjdE1vZGUgPT09IG9yZ0NoYXJ0U2VsZWN0TW9kZUVudW1fMS5PcmdDaGFydFNlbGVjdE1vZGVFbnVtLnNpbmdsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3RybC5zZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHJsLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN0cmwuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdHJsLml0ZW1zW2ldICE9PSBzY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwuaXRlbXNbaV0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCkuZXEoMCkuYWRkQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN0cmwuc2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICBjdHJsLnNlbGVjdGVkSXRlbXMucHVzaChzY29wZS5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUucGVyc29uYUNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBzY29wZS5zZWxlY3RlZCA9ICFzY29wZS5zZWxlY3RlZDtcbiAgICAgICAgICAgIGlmIChzY29wZS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGlmIChjdHJsLnNlbGVjdE1vZGUgPT09IG9yZ0NoYXJ0U2VsZWN0TW9kZUVudW1fMS5PcmdDaGFydFNlbGVjdE1vZGVFbnVtLnNpbmdsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3RybC5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdHJsLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0cmwuaXRlbXNbaV0gIT09IHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwuaXRlbXNbaV0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxlbS5jaGlsZHJlbigpLmVxKDApLmFkZENsYXNzKCdpcy1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjdHJsLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgY3RybC5zZWxlY3RlZEl0ZW1zLnB1c2goc2NvcGUuaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdHJsLnNlbGVjdE1vZGUgPT09IG9yZ0NoYXJ0U2VsZWN0TW9kZUVudW1fMS5PcmdDaGFydFNlbGVjdE1vZGVFbnVtLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uY2hpbGRyZW4oKS5lcSgwKS5hZGRDbGFzcygnaXMtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0cmwuc2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3RybC5zZWxlY3RlZEl0ZW1zLnB1c2goc2NvcGUuaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCkuZXEoMCkucmVtb3ZlQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN0cmwuc2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBjdHJsLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihzY29wZS5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICgoY3RybC5zZWxlY3RNb2RlID09PSBvcmdDaGFydFNlbGVjdE1vZGVFbnVtXzEuT3JnQ2hhcnRTZWxlY3RNb2RlRW51bS5zaW5nbGUgfHwgY3RybC5zZWxlY3RNb2RlID09PSBvcmdDaGFydFNlbGVjdE1vZGVFbnVtXzEuT3JnQ2hhcnRTZWxlY3RNb2RlRW51bS5tdWx0aXBsZSkgJiYgc2NvcGUuaXRlbSkge1xuICAgICAgICAgICAgZWxlbS5jaGlsZHJlbigpLmVxKDApLm9uKCdjbGljaycsIHNjb3BlLnBlcnNvbmFDbGljayk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBPcmdDaGFydFBlcnNvbmFEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5PcmdDaGFydFBlcnNvbmFEaXJlY3RpdmUgPSBPcmdDaGFydFBlcnNvbmFEaXJlY3RpdmU7XG52YXIgT3JnQ2hhcnRJbWFnZURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3JnQ2hhcnRJbWFnZURpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IFwiXFxuICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlcnNvbmEtaW1hZ2VBcmVhXFxcIj5cXG4gICAgICA8aSBjbGFzcz1cXFwibXMtUGVyc29uYS1wbGFjZWhvbGRlciBtcy1JY29uIG1zLUljb24tLXBlcnNvblxcXCI+PC9pPlxcbiAgICAgIDxpbWcgY2xhc3M9XFxcIm1zLVBlcnNvbmEtaW1hZ2VcXFwiIG5nLXNyYz1cXFwie3tuZ1NyY319XFxcIiAvPlxcbiAgICA8L2Rpdj5cXG4gICAgXCI7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICBuZ1NyYzogJz0nXG4gICAgICAgIH07XG4gICAgfVxuICAgIE9yZ0NoYXJ0SW1hZ2VEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBPcmdDaGFydEltYWdlRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gT3JnQ2hhcnRJbWFnZURpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLk9yZ0NoYXJ0SW1hZ2VEaXJlY3RpdmUgPSBPcmdDaGFydEltYWdlRGlyZWN0aXZlO1xudmFyIE9yZ0NoYXJ0UHJlc2VuY2VEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9yZ0NoYXJ0UHJlc2VuY2VEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLVBlcnNvbmEtcHJlc2VuY2VcIiA+PC9kaXY+JztcbiAgICB9XG4gICAgT3JnQ2hhcnRQcmVzZW5jZURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE9yZ0NoYXJ0UHJlc2VuY2VEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIE9yZ0NoYXJ0UHJlc2VuY2VEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHJzLCBjdHJsKSB7XG4gICAgICAgIGlmICghc2NvcGUuJHBhcmVudC5wcmVzZW5jZSkge1xuICAgICAgICAgICAgZWxlbS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gT3JnQ2hhcnRQcmVzZW5jZURpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLk9yZ0NoYXJ0UHJlc2VuY2VEaXJlY3RpdmUgPSBPcmdDaGFydFByZXNlbmNlRGlyZWN0aXZlO1xudmFyIE9yZ0NoYXJ0RGV0YWlsc0RpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3JnQ2hhcnREZXRhaWxzRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hLWRldGFpbHNcIiBuZy10cmFuc2NsdWRlID48L2Rpdj4nO1xuICAgIH1cbiAgICBPcmdDaGFydERldGFpbHNEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBPcmdDaGFydERldGFpbHNEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBPcmdDaGFydERldGFpbHNEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5PcmdDaGFydERldGFpbHNEaXJlY3RpdmUgPSBPcmdDaGFydERldGFpbHNEaXJlY3RpdmU7XG52YXIgT3JnQ2hhcnRQcmltYXJ5VGV4dERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3JnQ2hhcnRQcmltYXJ5VGV4dERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtUGVyc29uYS1wcmltYXJ5VGV4dFwiIG5nLXRyYW5zY2x1ZGUgPjwvZGl2Pic7XG4gICAgfVxuICAgIE9yZ0NoYXJ0UHJpbWFyeVRleHREaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBPcmdDaGFydFByaW1hcnlUZXh0RGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gT3JnQ2hhcnRQcmltYXJ5VGV4dERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLk9yZ0NoYXJ0UHJpbWFyeVRleHREaXJlY3RpdmUgPSBPcmdDaGFydFByaW1hcnlUZXh0RGlyZWN0aXZlO1xudmFyIE9yZ0NoYXJ0U2Vjb25kYXJ5VGV4dERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3JnQ2hhcnRTZWNvbmRhcnlUZXh0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hLXNlY29uZGFyeVRleHRcIiBuZy10cmFuc2NsdWRlID48L2Rpdj4nO1xuICAgIH1cbiAgICBPcmdDaGFydFNlY29uZGFyeVRleHREaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBPcmdDaGFydFNlY29uZGFyeVRleHREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBPcmdDaGFydFNlY29uZGFyeVRleHREaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5PcmdDaGFydFNlY29uZGFyeVRleHREaXJlY3RpdmUgPSBPcmdDaGFydFNlY29uZGFyeVRleHREaXJlY3RpdmU7XG52YXIgT3JnQ2hhcnRHcm91cEJ5RmlsdGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPcmdDaGFydEdyb3VwQnlGaWx0ZXIoKSB7XG4gICAgfVxuICAgIE9yZ0NoYXJ0R3JvdXBCeUZpbHRlci5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGtleSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpXVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaW5kZXhPZih2YWx1ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIE9yZ0NoYXJ0R3JvdXBCeUZpbHRlcjtcbn0oKSk7XG5leHBvcnRzLk9yZ0NoYXJ0R3JvdXBCeUZpbHRlciA9IE9yZ0NoYXJ0R3JvdXBCeUZpbHRlcjtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMub3JnY2hhcnQnLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoJ3VpZk9yZ0NoYXJ0JywgT3JnQ2hhcnREaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZk9yZ0NoYXJ0R3JvdXAnLCBPcmdDaGFydEdyb3VwRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZPcmdDaGFydEdyb3VwVGl0bGUnLCBPcmdDaGFydEdyb3VwVGl0bGVEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZk9yZ0NoYXJ0TGlzdCcsIE9yZ0NoYXJ0TGlzdERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmT3JnQ2hhcnRQZXJzb25hJywgT3JnQ2hhcnRQZXJzb25hRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZPcmdDaGFydEltYWdlJywgT3JnQ2hhcnRJbWFnZURpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmT3JnQ2hhcnRQcmVzZW5jZScsIE9yZ0NoYXJ0UHJlc2VuY2VEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZk9yZ0NoYXJ0RGV0YWlscycsIE9yZ0NoYXJ0RGV0YWlsc0RpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmT3JnQ2hhcnRQcmltYXJ5VGV4dCcsIE9yZ0NoYXJ0UHJpbWFyeVRleHREaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZk9yZ0NoYXJ0U2Vjb25kYXJ5VGV4dCcsIE9yZ0NoYXJ0U2Vjb25kYXJ5VGV4dERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmZpbHRlcigndWlmT3JnQ2hhcnRHcm91cEJ5JywgT3JnQ2hhcnRHcm91cEJ5RmlsdGVyLmZhY3RvcnkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9vcmdjaGFydC9vcmdDaGFydERpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgT3JnQ2hhcnRQcmVzZW5jZUVudW07XG4oZnVuY3Rpb24gKE9yZ0NoYXJ0UHJlc2VuY2VFbnVtKSB7XG4gICAgT3JnQ2hhcnRQcmVzZW5jZUVudW1bT3JnQ2hhcnRQcmVzZW5jZUVudW1bXCJhdmFpbGFibGVcIl0gPSAwXSA9IFwiYXZhaWxhYmxlXCI7XG4gICAgT3JnQ2hhcnRQcmVzZW5jZUVudW1bT3JnQ2hhcnRQcmVzZW5jZUVudW1bXCJidXN5XCJdID0gMV0gPSBcImJ1c3lcIjtcbiAgICBPcmdDaGFydFByZXNlbmNlRW51bVtPcmdDaGFydFByZXNlbmNlRW51bVtcImF3YXlcIl0gPSAyXSA9IFwiYXdheVwiO1xuICAgIE9yZ0NoYXJ0UHJlc2VuY2VFbnVtW09yZ0NoYXJ0UHJlc2VuY2VFbnVtW1wiYmxvY2tlZFwiXSA9IDNdID0gXCJibG9ja2VkXCI7XG4gICAgT3JnQ2hhcnRQcmVzZW5jZUVudW1bT3JnQ2hhcnRQcmVzZW5jZUVudW1bXCJkbmRcIl0gPSA0XSA9IFwiZG5kXCI7XG4gICAgT3JnQ2hhcnRQcmVzZW5jZUVudW1bT3JnQ2hhcnRQcmVzZW5jZUVudW1bXCJvZmZsaW5lXCJdID0gNV0gPSBcIm9mZmxpbmVcIjtcbn0pKE9yZ0NoYXJ0UHJlc2VuY2VFbnVtID0gZXhwb3J0cy5PcmdDaGFydFByZXNlbmNlRW51bSB8fCAoZXhwb3J0cy5PcmdDaGFydFByZXNlbmNlRW51bSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL29yZ2NoYXJ0L29yZ0NoYXJ0UHJlc2VuY2VFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSAzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBPcmdDaGFydFNlbGVjdE1vZGVFbnVtO1xuKGZ1bmN0aW9uIChPcmdDaGFydFNlbGVjdE1vZGVFbnVtKSB7XG4gICAgT3JnQ2hhcnRTZWxlY3RNb2RlRW51bVtPcmdDaGFydFNlbGVjdE1vZGVFbnVtW1wic2luZ2xlXCJdID0gMF0gPSBcInNpbmdsZVwiO1xuICAgIE9yZ0NoYXJ0U2VsZWN0TW9kZUVudW1bT3JnQ2hhcnRTZWxlY3RNb2RlRW51bVtcIm11bHRpcGxlXCJdID0gMV0gPSBcIm11bHRpcGxlXCI7XG59KShPcmdDaGFydFNlbGVjdE1vZGVFbnVtID0gZXhwb3J0cy5PcmdDaGFydFNlbGVjdE1vZGVFbnVtIHx8IChleHBvcnRzLk9yZ0NoYXJ0U2VsZWN0TW9kZUVudW0gPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9vcmdjaGFydC9vcmdDaGFydFNlbGVjdE1vZGVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSAzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBPcmdDaGFydFN0eWxlRW51bTtcbihmdW5jdGlvbiAoT3JnQ2hhcnRTdHlsZUVudW0pIHtcbiAgICBPcmdDaGFydFN0eWxlRW51bVtPcmdDaGFydFN0eWxlRW51bVtcInN0YW5kYXJkXCJdID0gMF0gPSBcInN0YW5kYXJkXCI7XG4gICAgT3JnQ2hhcnRTdHlsZUVudW1bT3JnQ2hhcnRTdHlsZUVudW1bXCJzcXVhcmVcIl0gPSAxXSA9IFwic3F1YXJlXCI7XG59KShPcmdDaGFydFN0eWxlRW51bSA9IGV4cG9ydHMuT3JnQ2hhcnRTdHlsZUVudW0gfHwgKGV4cG9ydHMuT3JnQ2hhcnRTdHlsZUVudW0gPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9vcmdjaGFydC9vcmdDaGFydFN0eWxlRW51bS50c1xuLy8gbW9kdWxlIGlkID0gMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIG92ZXJsYXlNb2RlRW51bV8xID0gcmVxdWlyZShcIi4vb3ZlcmxheU1vZGVFbnVtXCIpO1xudmFyIE92ZXJsYXlDb250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPdmVybGF5Q29udHJvbGxlcihsb2cpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgfVxuICAgIHJldHVybiBPdmVybGF5Q29udHJvbGxlcjtcbn0oKSk7XG5PdmVybGF5Q29udHJvbGxlci4kaW5qZWN0ID0gWyckbG9nJ107XG52YXIgT3ZlcmxheURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT3ZlcmxheURpcmVjdGl2ZShsb2cpIHtcbiAgICAgICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLU92ZXJsYXlcIiBuZy1jbGFzcz1cIntcXCdtcy1PdmVybGF5LS1kYXJrXFwnOiB1aWZNb2RlID09IFxcJ2RhcmtcXCd9XCIgbmctdHJhbnNjbHVkZT48L2Rpdj4nO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgdWlmTW9kZTogJ0AnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIE92ZXJsYXlEaXJlY3RpdmUubG9nID0gbG9nO1xuICAgIH1cbiAgICBPdmVybGF5RGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAobG9nKSB7IHJldHVybiBuZXcgT3ZlcmxheURpcmVjdGl2ZShsb2cpOyB9O1xuICAgICAgICBkaXJlY3RpdmUuJGluamVjdCA9IFsnJGxvZyddO1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgT3ZlcmxheURpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZk1vZGUnLCBmdW5jdGlvbiAobmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAob3ZlcmxheU1vZGVFbnVtXzEuT3ZlcmxheU1vZGVbbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBPdmVybGF5RGlyZWN0aXZlLmxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMub3ZlcmxheSAtIFVuc3VwcG9ydGVkIG92ZXJsYXkgbW9kZTogJyArXG4gICAgICAgICAgICAgICAgICAgICdUaGUgb3ZlcmxheSBtb2RlIChcXCcnICsgc2NvcGUudWlmTW9kZSArICdcXCcpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIE9mZmljZSBVSSBGYWJyaWMuICcgK1xuICAgICAgICAgICAgICAgICAgICAnU3VwcG9ydGVkIG9wdGlvbnMgYXJlIGxpc3RlZCBoZXJlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL292ZXJsYXkvb3ZlcmxheU1vZGVFbnVtLnRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE92ZXJsYXlEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5PdmVybGF5RGlyZWN0aXZlID0gT3ZlcmxheURpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMub3ZlcmxheScsIFtcbiAgICAnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cydcbl0pXG4gICAgLmRpcmVjdGl2ZSgndWlmT3ZlcmxheScsIE92ZXJsYXlEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvb3ZlcmxheS9vdmVybGF5RGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSAzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBPdmVybGF5TW9kZTtcbihmdW5jdGlvbiAoT3ZlcmxheU1vZGUpIHtcbiAgICBPdmVybGF5TW9kZVtPdmVybGF5TW9kZVtcImxpZ2h0XCJdID0gMF0gPSBcImxpZ2h0XCI7XG4gICAgT3ZlcmxheU1vZGVbT3ZlcmxheU1vZGVbXCJkYXJrXCJdID0gMV0gPSBcImRhcmtcIjtcbn0pKE92ZXJsYXlNb2RlID0gZXhwb3J0cy5PdmVybGF5TW9kZSB8fCAoZXhwb3J0cy5PdmVybGF5TW9kZSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL292ZXJsYXkvb3ZlcmxheU1vZGVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSA0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgcGFuZWxEaXJlY3RpdmVFbnVtXzEgPSByZXF1aXJlKFwiLi9wYW5lbERpcmVjdGl2ZUVudW1cIik7XG52YXIgUGFuZWxEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhbmVsRGlyZWN0aXZlKCRsb2csICRhbmltYXRlLCAkdGltZW91dCkge1xuICAgICAgICB0aGlzLiRsb2cgPSAkbG9nO1xuICAgICAgICB0aGlzLiRhbmltYXRlID0gJGFuaW1hdGU7XG4gICAgICAgIHRoaXMuJHRpbWVvdXQgPSAkdGltZW91dDtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IFwiPGRpdiBjbGFzcz1cXFwibXMtUGFuZWxcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgIGNsYXNzPVxcXCJtcy1PdmVybGF5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nLWNsaWNrPVxcXCJ1aWZJc0xpZ2h0RGlzbWlzcyAmJiBjbG9zZVBhbmVsKClcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmctY2xhc3M9XFxcInVpZlNob3dPdmVybGF5ID09PSB0cnVlID8gJ21zLU92ZXJsYXktLWRhcmsnIDogJyc7XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QYW5lbC1tYWluXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBhbmVsLWNvbW1hbmRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWlmPVxcXCJ1aWZTaG93Q2xvc2VcXFwiIGNsYXNzPSdtcy1QYW5lbC1jbG9zZUJ1dHRvbicgbmctY2xpY2s9XFxcImNsb3NlUGFuZWwoKVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVpZi1pY29uIHVpZi10eXBlPSd4Jz48L3VpZi1pY29uPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGFuZWwtY29udGVudElubmVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XCI7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFBhbmVsQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHVpZklzTGlnaHREaXNtaXNzOiAnPScsXG4gICAgICAgICAgICB1aWZJc09wZW46ICc9JyxcbiAgICAgICAgICAgIHVpZlNob3dDbG9zZTogJz0nLFxuICAgICAgICAgICAgdWlmU2hvd092ZXJsYXk6ICc9JyxcbiAgICAgICAgICAgIHVpZlR5cGU6ICdAJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBQYW5lbERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCRsb2csICRhbmltYXRlLCAkdGltZW91dCkgeyByZXR1cm4gbmV3IFBhbmVsRGlyZWN0aXZlKCRsb2csICRhbmltYXRlLCAkdGltZW91dCk7IH07XG4gICAgICAgIGRpcmVjdGl2ZS4kaW5qZWN0ID0gWyckbG9nJywgJyRhbmltYXRlJywgJyR0aW1lb3V0J107XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBQYW5lbERpcmVjdGl2ZS5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRycywgdHJhbnNjbHVkZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJlOiB0aGlzLnByZUxpbmtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFBhbmVsRGlyZWN0aXZlLnByb3RvdHlwZS5wcmVMaW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycywgY3RybCwgdHJhbnNjbHVkZSkge1xuICAgICAgICB0cmFuc2NsdWRlKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmVsZW1lbnQoY2xvbmVbaV0pLmhhc0NsYXNzKCdtcy1Db21tYW5kQmFyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsZW1bMF0ucXVlcnlTZWxlY3RvcignZGl2Lm1zLVBhbmVsLWNvbW1hbmRzJykpLnByZXBlbmQoY2xvbmVbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY29wZS51aWZUeXBlID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsZW1bMF0ucXVlcnlTZWxlY3RvcignZGl2Lm1zLVBhbmVsLW1haW4nKSkuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbGVtWzBdLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5tcy1QYW5lbC1jb250ZW50SW5uZXInKSkuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzY29wZS5jbG9zZVBhbmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2NvcGUudWlmSXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gUGFuZWxEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5QYW5lbERpcmVjdGl2ZSA9IFBhbmVsRGlyZWN0aXZlO1xudmFyIFBhbmVsQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFuZWxDb250cm9sbGVyKCRzY29wZSwgJGFuaW1hdGUsICRlbGVtZW50LCAkbG9nLCAkdGltZW91dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kYW5pbWF0ZSA9ICRhbmltYXRlO1xuICAgICAgICB0aGlzLiRlbGVtZW50ID0gJGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgICAgIHRoaXMuJHRpbWVvdXQgPSAkdGltZW91dDtcbiAgICAgICAgdGhpcy51aWZQYW5lbFNpemVDbGFzc2VzID0gKF9hID0ge30sXG4gICAgICAgICAgICBfYVtwYW5lbERpcmVjdGl2ZUVudW1fMS5QYW5lbFR5cGVzLnNtYWxsXSA9ICdtcy1QYW5lbC0tc20nLFxuICAgICAgICAgICAgX2FbcGFuZWxEaXJlY3RpdmVFbnVtXzEuUGFuZWxUeXBlcy5tZWRpdW1dID0gJ21zLVBhbmVsLS1tZCcsXG4gICAgICAgICAgICBfYVtwYW5lbERpcmVjdGl2ZUVudW1fMS5QYW5lbFR5cGVzLmxhcmdlXSA9ICdtcy1QYW5lbC0tbGcnLFxuICAgICAgICAgICAgX2FbcGFuZWxEaXJlY3RpdmVFbnVtXzEuUGFuZWxUeXBlcy5leHRyYWxhcmdlXSA9ICdtcy1QYW5lbC0teGwnLFxuICAgICAgICAgICAgX2FbcGFuZWxEaXJlY3RpdmVFbnVtXzEuUGFuZWxUeXBlcy5leHRyYWV4dHJhbGFyZ2VdID0gJ21zLVBhbmVsLS14eGwnLFxuICAgICAgICAgICAgX2FbcGFuZWxEaXJlY3RpdmVFbnVtXzEuUGFuZWxUeXBlcy5sZWZ0XSA9ICdtcy1QYW5lbC0tbGVmdCcsXG4gICAgICAgICAgICBfYSk7XG4gICAgICAgIGlmICghJHNjb3BlLnVpZlR5cGUpIHtcbiAgICAgICAgICAgICRzY29wZS51aWZUeXBlID0gJ21lZGl1bSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhbmVsRGlyZWN0aXZlRW51bV8xLlBhbmVsVHlwZXNbJHNjb3BlLnVpZlR5cGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGFuZWwgLSB1bnN1cHBvcnRlZCBwYW5lbCB0eXBlOlxcbicgK1xuICAgICAgICAgICAgICAgICd0aGUgdHlwZSBcXCcnICsgJHNjb3BlLnVpZlR5cGUgKyAnXFwnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgbmctT2ZmaWNlIFVJIEZhYnJpYyBhcyB2YWxpZCB0eXBlIGZvciBwYW5lbHMuJyArXG4gICAgICAgICAgICAgICAgJ1N1cHBvcnRlZCB0eXBlcyBjYW4gYmUgZm91bmQgdW5kZXIgUGFuZWxUeXBlcyBlbnVtIGhlcmU6XFxuJyArXG4gICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL3BhbmVsL3BhbmVsLnRzJyk7XG4gICAgICAgICAgICAkc2NvcGUudWlmVHlwZSA9ICdtZWRpdW0nO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzaXplID0gcGFuZWxEaXJlY3RpdmVFbnVtXzEuUGFuZWxUeXBlc1skc2NvcGUudWlmVHlwZV07XG4gICAgICAgICRlbGVtZW50LmFkZENsYXNzKHRoaXMudWlmUGFuZWxTaXplQ2xhc3Nlc1tzaXplXSk7XG4gICAgICAgICRzY29wZS4kd2F0Y2goJ3VpZklzT3BlbicsIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5wYW5lbCAtIGludmFsaWQgYXR0cmlidXRlIHR5cGU6IFxcJ3VpZi1pcy1vcGVuXFwnLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlIHR5cGUgXFwnJyArIHR5cGVvZiBuZXdWYWx1ZSArICdcXCcgaXMgbm90IHN1cHBvcnRlZCBhcyB2YWxpZCB0eXBlIGZvciBcXCd1aWYtaXMtb3BlblxcJyBhdHRyaWJ1dGUgZm9yICcgK1xuICAgICAgICAgICAgICAgICAgICAnPHVpZi1wYW5lbC8+LiBUaGUgdmFsaWQgdHlwZSBpcyBib29sZWFuLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICRhbmltYXRlLmFkZENsYXNzKF90aGlzLiRlbGVtZW50LCAnbXMtUGFuZWwtYW5pbWF0ZUluJyk7XG4gICAgICAgICAgICAgICAgICAgICRlbGVtZW50LmFkZENsYXNzKCdpcy1vcGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcubXMtQ29tbWFuZEJhcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm1zLUNvbW1hbmRCYXInKSkuc2NvcGUoKS4kYnJvYWRjYXN0KCd1aWYtY29tbWFuZC1iYXItcmVzaXplJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICRhbmltYXRlLmFkZENsYXNzKF90aGlzLiRlbGVtZW50LCAnbXMtUGFuZWwtYW5pbWF0ZU91dCcpO1xuICAgICAgICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZWxlbWVudC5yZW1vdmVDbGFzcygnbXMtUGFuZWwtYW5pbWF0ZUluIG1zLVBhbmVsLWFuaW1hdGVPdXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICRlbGVtZW50LnJlbW92ZUNsYXNzKCdpcy1vcGVuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudWlmSXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9hO1xuICAgIH1cbiAgICByZXR1cm4gUGFuZWxDb250cm9sbGVyO1xufSgpKTtcblBhbmVsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnLCAnJGFuaW1hdGUnLCAnJGVsZW1lbnQnLCAnJGxvZycsICckdGltZW91dCddO1xuZXhwb3J0cy5QYW5lbENvbnRyb2xsZXIgPSBQYW5lbENvbnRyb2xsZXI7XG52YXIgUGFuZWxIZWFkZXJEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhbmVsSGVhZGVyRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxwIGNsYXNzPVwibXMtUGFuZWwtaGVhZGVyVGV4dFwiIG5nLXRyYW5zY2x1ZGU+PC9kaXY+JztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHVpZkhlYWRlclRleHQ6ICdAJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBQYW5lbEhlYWRlckRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBhbmVsSGVhZGVyRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gUGFuZWxIZWFkZXJEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5QYW5lbEhlYWRlckRpcmVjdGl2ZSA9IFBhbmVsSGVhZGVyRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5wYW5lbCcsIFtcbiAgICAnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cydcbl0pXG4gICAgLmRpcmVjdGl2ZSgndWlmUGFuZWwnLCBQYW5lbERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmUGFuZWxIZWFkZXInLCBQYW5lbEhlYWRlckRpcmVjdGl2ZS5mYWN0b3J5KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9wYW5lbC9wYW5lbERpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUGFuZWxUeXBlcztcbihmdW5jdGlvbiAoUGFuZWxUeXBlcykge1xuICAgIFBhbmVsVHlwZXNbUGFuZWxUeXBlc1tcInNtYWxsXCJdID0gMF0gPSBcInNtYWxsXCI7XG4gICAgUGFuZWxUeXBlc1tQYW5lbFR5cGVzW1wibWVkaXVtXCJdID0gMV0gPSBcIm1lZGl1bVwiO1xuICAgIFBhbmVsVHlwZXNbUGFuZWxUeXBlc1tcImxhcmdlXCJdID0gMl0gPSBcImxhcmdlXCI7XG4gICAgUGFuZWxUeXBlc1tQYW5lbFR5cGVzW1wiZXh0cmFsYXJnZVwiXSA9IDNdID0gXCJleHRyYWxhcmdlXCI7XG4gICAgUGFuZWxUeXBlc1tQYW5lbFR5cGVzW1wiZXh0cmFleHRyYWxhcmdlXCJdID0gNF0gPSBcImV4dHJhZXh0cmFsYXJnZVwiO1xuICAgIFBhbmVsVHlwZXNbUGFuZWxUeXBlc1tcImxlZnRcIl0gPSA1XSA9IFwibGVmdFwiO1xufSkoUGFuZWxUeXBlcyA9IGV4cG9ydHMuUGFuZWxUeXBlcyB8fCAoZXhwb3J0cy5QYW5lbFR5cGVzID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvcGFuZWwvcGFuZWxEaXJlY3RpdmVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSA0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgcGVyc29uYVN0eWxlRW51bV8xID0gcmVxdWlyZShcIi4uLy4uL2NvcmUvcGVyc29uYVN0eWxlRW51bVwiKTtcbnZhciBzaXplRW51bV8xID0gcmVxdWlyZShcIi4uL3BlcnNvbmEvc2l6ZUVudW1cIik7XG52YXIgaWNvbkVudW1fMSA9IHJlcXVpcmUoXCIuLi9pY29uL2ljb25FbnVtXCIpO1xudmFyIHBlb3BsZVNlYXJjaEV2ZW50TmFtZSA9ICd1aWYtcGVvcGxlLXNlYXJjaCc7XG52YXIgR3JvdXBlZFBlb3BsZURhdGEgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyb3VwZWRQZW9wbGVEYXRhKCkge1xuICAgICAgICB0aGlzLnBlb3BsZSA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gR3JvdXBlZFBlb3BsZURhdGE7XG59KCkpO1xuZXhwb3J0cy5Hcm91cGVkUGVvcGxlRGF0YSA9IEdyb3VwZWRQZW9wbGVEYXRhO1xudmFyIFBlb3BsZVBpY2tlckNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlb3BsZVBpY2tlckNvbnRyb2xsZXIoJHNjb3BlLCAkZmlsdGVyLCAkZWxlbWVudCkge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kZmlsdGVyID0gJGZpbHRlcjtcbiAgICAgICAgdGhpcy4kZWxlbWVudCA9ICRlbGVtZW50O1xuICAgIH1cbiAgICBQZW9wbGVQaWNrZXJDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTZWxlY3RlZFBlcnNvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5zZWxlY3RlZFBlcnNvbnM7XG4gICAgfTtcbiAgICBQZW9wbGVQaWNrZXJDb250cm9sbGVyLnByb3RvdHlwZS5waWNrZXJUeXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdHlwZSA9IHRoaXMuJHNjb3BlLnR5cGU7XG4gICAgICAgIGlmIChhbmd1bGFyLmlzVW5kZWZpbmVkKHR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUGVvcGxlUGlja2VyVHlwZXNbUGVvcGxlUGlja2VyVHlwZXMuZ3JvdXBlZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLnR5cGU7XG4gICAgfTtcbiAgICBQZW9wbGVQaWNrZXJDb250cm9sbGVyLnByb3RvdHlwZS5zZWFyY2hRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLnNlYXJjaFF1ZXJ5O1xuICAgIH07XG4gICAgUGVvcGxlUGlja2VyQ29udHJvbGxlci5wcm90b3R5cGUuc2VhcmNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJpbmRQZW9wbGUodGhpcy4kc2NvcGUuc2VhcmNoUXVlcnkpO1xuICAgICAgICB0aGlzLiRzY29wZS4kYnJvYWRjYXN0KHBlb3BsZVNlYXJjaEV2ZW50TmFtZSwgdGhpcy5zZWFyY2hRdWVyeSgpKTtcbiAgICB9O1xuICAgIFBlb3BsZVBpY2tlckNvbnRyb2xsZXIucHJvdG90eXBlLmJpbmRQZW9wbGUgPSBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHBlb3BsZURhdGEgPSB0aGlzLiRzY29wZS5wZW9wbGVDYWxsYmFjaygpKHF1ZXJ5KTtcbiAgICAgICAgcGVvcGxlRGF0YSA9IHBlb3BsZURhdGEgfHwgW107XG4gICAgICAgIGlmIChwZW9wbGVEYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLmdyb3VwcyA9IHRoaXMuY3JlYXRlUGVvcGxlRGF0YVN0cnVjdHVyZShwZW9wbGVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGVvcGxlRGF0YS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgc2VhcmNoTW9yZUN0cmxfMSA9IGFuZ3VsYXIuZWxlbWVudCh0aGlzLiRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1QZW9wbGVQaWNrZXItc2VhcmNoTW9yZScpKVxuICAgICAgICAgICAgICAgIC5jb250cm9sbGVyKFwiXCIgKyBQZW9wbGVTZWFyY2hNb3JlRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUpO1xuICAgICAgICAgICAgaWYgKHNlYXJjaE1vcmVDdHJsXzEpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hNb3JlQ3RybF8xLmlzU2VhcmNoaW5nKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRoYXRfMSA9IHRoaXM7XG4gICAgICAgICAgICBwZW9wbGVEYXRhXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGF0XzEuJHNjb3BlLmdyb3VwcyA9IF90aGlzLmNyZWF0ZVBlb3BsZURhdGFTdHJ1Y3R1cmUoZGF0YSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoTW9yZUN0cmxfMSkge1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hNb3JlQ3RybF8xLmlzU2VhcmNoaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUGVvcGxlUGlja2VyQ29udHJvbGxlci5wcm90b3R5cGUuY3JlYXRlUGVvcGxlRGF0YVN0cnVjdHVyZSA9IGZ1bmN0aW9uIChwZW9wbGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHBlb3BsZURhdGEgPSBbXTtcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKHBlb3BsZSwgZnVuY3Rpb24gKHBlcnNvbikge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nR3JvdXBzID0gX3RoaXMuJGZpbHRlcignZmlsdGVyJykocGVvcGxlRGF0YSwgeyBncm91cDogcGVyc29uLmdyb3VwIH0pO1xuICAgICAgICAgICAgdmFyIGhhc0dyb3VwID0gZXhpc3RpbmdHcm91cHMubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgaWYgKCFoYXNHcm91cCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdQZW9wbGVEYXRhID0gbmV3IEdyb3VwZWRQZW9wbGVEYXRhKCk7XG4gICAgICAgICAgICAgICAgbmV3UGVvcGxlRGF0YS5ncm91cCA9IHBlcnNvbi5ncm91cDtcbiAgICAgICAgICAgICAgICBuZXdQZW9wbGVEYXRhLnBlb3BsZS5wdXNoKHBlcnNvbik7XG4gICAgICAgICAgICAgICAgcGVvcGxlRGF0YS5wdXNoKG5ld1Blb3BsZURhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nRGF0YSA9IGV4aXN0aW5nR3JvdXBzWzBdO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nRGF0YS5wZW9wbGUucHVzaChwZXJzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBlb3BsZURhdGE7XG4gICAgfTtcbiAgICByZXR1cm4gUGVvcGxlUGlja2VyQ29udHJvbGxlcjtcbn0oKSk7XG5QZW9wbGVQaWNrZXJDb250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckZmlsdGVyJywgJyRlbGVtZW50J107XG5leHBvcnRzLlBlb3BsZVBpY2tlckNvbnRyb2xsZXIgPSBQZW9wbGVQaWNrZXJDb250cm9sbGVyO1xudmFyIFBlb3BsZVBpY2tlclR5cGVzO1xuKGZ1bmN0aW9uIChQZW9wbGVQaWNrZXJUeXBlcykge1xuICAgIFBlb3BsZVBpY2tlclR5cGVzW1Blb3BsZVBpY2tlclR5cGVzW1wiZ3JvdXBlZFwiXSA9IDBdID0gXCJncm91cGVkXCI7XG4gICAgUGVvcGxlUGlja2VyVHlwZXNbUGVvcGxlUGlja2VyVHlwZXNbXCJjb21wYWN0XCJdID0gMV0gPSBcImNvbXBhY3RcIjtcbiAgICBQZW9wbGVQaWNrZXJUeXBlc1tQZW9wbGVQaWNrZXJUeXBlc1tcIm1lbWJlckxpc3RcIl0gPSAyXSA9IFwibWVtYmVyTGlzdFwiO1xuICAgIFBlb3BsZVBpY2tlclR5cGVzW1Blb3BsZVBpY2tlclR5cGVzW1wiZmFjZVBpbGVcIl0gPSAzXSA9IFwiZmFjZVBpbGVcIjtcbn0pKFBlb3BsZVBpY2tlclR5cGVzIHx8IChQZW9wbGVQaWNrZXJUeXBlcyA9IHt9KSk7XG52YXIgUGVvcGxlUGlja2VyRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQZW9wbGVQaWNrZXJEaXJlY3RpdmUoJGRvY3VtZW50LCAkdGltZW91dCwgJGxvZywgJHdpbmRvdykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLiRkb2N1bWVudCA9ICRkb2N1bWVudDtcbiAgICAgICAgdGhpcy4kdGltZW91dCA9ICR0aW1lb3V0O1xuICAgICAgICB0aGlzLiRsb2cgPSAkbG9nO1xuICAgICAgICB0aGlzLiR3aW5kb3cgPSAkd2luZG93O1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ25nTW9kZWwnLCBcIlwiICsgUGVvcGxlUGlja2VyRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWVdO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBQZW9wbGVQaWNrZXJDb250cm9sbGVyO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgZGVsYXk6ICdAdWlmU2VhcmNoRGVsYXknLFxuICAgICAgICAgICAgZmFjZVBpbGVIZWFkZXI6ICdAP3VpZkZhY2VwaWxlSGVhZGVyJyxcbiAgICAgICAgICAgIG5nQ2hhbmdlOiAnJj8nLFxuICAgICAgICAgICAgbmdEaXNhYmxlZDogJz0/JyxcbiAgICAgICAgICAgIG5nTW9kZWw6ICc9JyxcbiAgICAgICAgICAgIG9uU2VsZWN0ZWRQZXJzb25DbGljazogJyY/dWlmU2VsZWN0ZWRQZXJzb25DbGljaycsXG4gICAgICAgICAgICBwZW9wbGVDYWxsYmFjazogJyZ1aWZQZW9wbGUnLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdAPycsXG4gICAgICAgICAgICB0eXBlOiAnQD91aWZUeXBlJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRlbXBsYXRlVHlwZXMgPSB7fTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IGZ1bmN0aW9uICgkZWxlbWVudCwgJGF0dHJzKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9ICRhdHRycy51aWZUeXBlO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQodHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudGVtcGxhdGVUeXBlc1tQZW9wbGVQaWNrZXJUeXBlcy5ncm91cGVkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQZW9wbGVQaWNrZXJUeXBlc1t0eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGVvcGxlcGlja2VyIC0gdW5zdXBwb3J0ZWQgcGVvcGxlIHBpY2tlciB0eXBlOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAndGhlIHR5cGUgXFwnJyArIHR5cGUgKyAnXFwnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgbmctT2ZmaWNlIFVJIEZhYnJpYyBhcyB2YWxpZCB0eXBlIGZvciBwZW9wbGUgcGlja2VyLicgK1xuICAgICAgICAgICAgICAgICAgICAnU3VwcG9ydGVkIHR5cGVzIGNhbiBiZSBmb3VuZCB1bmRlciBQZW9wbGVQaWNrZXJUeXBlcyBlbnVtIGhlcmU6XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vbmdPZmZpY2VVSUZhYnJpYy9uZy1vZmZpY2V1aWZhYnJpYy9ibG9iL21hc3Rlci9zcmMvY29tcG9uZW50cy9wZW9wbGVwaWNrZXIvcGVvcGxlUGlja2VyRGlyZWN0aXZlLnRzJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ1tuZ09mZmljZVVpRmFicmljXSAtIEVycm9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy50ZW1wbGF0ZVR5cGVzW1Blb3BsZVBpY2tlclR5cGVzW3R5cGVdXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5saW5rID0gZnVuY3Rpb24gKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgY3RybHMsICR0cmFuc2NsdWRlKSB7XG4gICAgICAgICAgICB2YXIgbmdNb2RlbEN0cmwgPSBjdHJsc1swXTtcbiAgICAgICAgICAgIHZhciBwZW9wbGVQaWNrZXJDdHJsID0gY3RybHNbMV07XG4gICAgICAgICAgICBfdGhpcy5pbml0RGlzYWJsZWRTdGF0ZSgkZWxlbWVudCwgJHNjb3BlLCAkYXR0cnMpO1xuICAgICAgICAgICAgJHNjb3BlLmZhY2VQaWxlSGVhZGVyID0gJHNjb3BlLmZhY2VQaWxlSGVhZGVyIHx8ICdTdWdnZXN0ZWQgY29udGFjdHMnO1xuICAgICAgICAgICAgJHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ3NlbGVjdGVkUGVyc29ucycsIGZ1bmN0aW9uIChkYXRhLCBkYXRhMiwgZGF0YTMpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemVTZWFyY2hGaWVsZCgkZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKCRzY29wZS5uZ0NoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUubmdDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5nTW9kZWxDdHJsLiR2aWV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkUGVyc29ucyA9IG5nTW9kZWxDdHJsLiR2aWV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRQZXJzb25zID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF90aGlzLnJlc2l6ZVNlYXJjaEZpZWxkKCRlbGVtZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwZW9wbGVQaWNrZXJDdHJsLnNlYXJjaCgpO1xuICAgICAgICAgICAgdmFyIHNlYXJjaFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgJHNjb3BlLm9uU2VhcmNoS2V5VXAgPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyICRzZWFyY2hNb3JlID0gYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1QZW9wbGVQaWNrZXItc2VhcmNoTW9yZScpKTtcbiAgICAgICAgICAgICAgICBpZiAoJHNlYXJjaE1vcmUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5zZWFyY2hRdWVyeSA/ICRlbGVtZW50LmFkZENsYXNzKCdpcy1zZWFyY2hpbmcnKSA6ICRlbGVtZW50LnJlbW92ZUNsYXNzKCdpcy1zZWFyY2hpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNlYXJjaFF1ZXJ5ID8gJHNlYXJjaE1vcmUuYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpIDogJHNlYXJjaE1vcmUucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hbmltYXRlU2VsZWN0ZWRQZW9wbGUoJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoISRzY29wZS5kZWxheSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZWFyY2hUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuJHRpbWVvdXQuY2FuY2VsKHNlYXJjaFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWFyY2hUaW1lb3V0ID0gX3RoaXMuJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBwZW9wbGVQaWNrZXJDdHJsLnNlYXJjaCgpO1xuICAgICAgICAgICAgICAgIH0sICRzY29wZS5kZWxheSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJHNjb3BlLm9uUGVvcGxlUGlja2VyQWN0aXZlID0gZnVuY3Rpb24gKCRldmVudCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNtb290aFNjcm9sbFRvKCRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnR5cGUgIT09IFBlb3BsZVBpY2tlclR5cGVzW1Blb3BsZVBpY2tlclR5cGVzLmZhY2VQaWxlXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJHJlc3VsdHMgPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm1zLVBlb3BsZVBpY2tlci1yZXN1bHRzJykpO1xuICAgICAgICAgICAgICAgICAgICAkcmVzdWx0c1swXS5zdHlsZS53aWR0aCA9ICRlbGVtZW50WzBdLmNsaWVudFdpZHRoIC0gMiArICdweCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRzY29wZS50eXBlID09PSBQZW9wbGVQaWNrZXJUeXBlc1tQZW9wbGVQaWNrZXJUeXBlcy5mYWNlUGlsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYW5pbWF0ZVNlbGVjdGVkUGVvcGxlKCRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICRlbGVtZW50LmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAkc2NvcGUuYWRkUGVyc29uVG9TZWxlY3RlZFBlb3BsZSA9IGZ1bmN0aW9uIChwZXJzb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnNlbGVjdGVkUGVyc29ucy5pbmRleE9mKHBlcnNvbikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKCRhdHRycy51aWZTaW5nbGUpICYmICRzY29wZS5zZWxlY3RlZFBlcnNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRQZXJzb25zLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRzY29wZS5zZWxlY3RlZFBlcnNvbnMucHVzaChwZXJzb24pO1xuICAgICAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXRWaWV3VmFsdWUoJHNjb3BlLnNlbGVjdGVkUGVyc29ucyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJHNjb3BlLnJlbW92ZVBlcnNvbkZyb21TZWxlY3RlZFBlb3BsZSA9IGZ1bmN0aW9uIChwZXJzb24sICRldmVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpbmR4ID0gJHNjb3BlLnNlbGVjdGVkUGVyc29ucy5pbmRleE9mKHBlcnNvbik7XG4gICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdGVkUGVyc29ucy5zcGxpY2UoaW5keCwgMSk7XG4gICAgICAgICAgICAgICAgbmdNb2RlbEN0cmwuJHNldFZpZXdWYWx1ZSgkc2NvcGUuc2VsZWN0ZWRQZXJzb25zKTtcbiAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJHNjb3BlLnJlbW92ZVBlcnNvbkZyb21TZWFyY2hSZXN1bHRzID0gZnVuY3Rpb24gKHBlb3BsZSwgcGVyc29uLCAkZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdmFyIGluZHggPSBwZW9wbGUuaW5kZXhPZihwZXJzb24pO1xuICAgICAgICAgICAgICAgIHBlb3BsZS5zcGxpY2UoaW5keCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgX3RoaXMuJGRvY3VtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5yZW1vdmVDbGFzcygnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICgkc2NvcGUudHlwZSA9PT0gUGVvcGxlUGlja2VyVHlwZXNbUGVvcGxlUGlja2VyVHlwZXMuZmFjZVBpbGVdKSB7XG4gICAgICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmluc2VydEZhY2VQaWxlSGVhZGVyKGNsb25lLCAkc2NvcGUsICRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaW5zZXJ0RmFjZVBpbGVTZWFyY2hNb3JlKGNsb25lLCAkc2NvcGUsICRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzW1Blb3BsZVBpY2tlclR5cGVzLmdyb3VwZWRdID1cbiAgICAgICAgICAgIFwiPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hCb3hcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1wZXJzb25hXFxcIiBuZy1yZXBlYXQ9XFxcInBlcnNvbiBpbiBzZWxlY3RlZFBlcnNvbnMgdHJhY2sgYnkgJGluZGV4XFxcIj5cXG4gICAgICAgICAgICAgIDx1aWYtcGVyc29uYSBuZy1jbGljaz1cXFwib25TZWxlY3RlZFBlcnNvbkNsaWNrKCkocGVyc29uKVxcXCJcXG4gICAgICAgICAgICAgICAgdWlmLXN0eWxlPVxcXCJcIiArIHBlcnNvbmFTdHlsZUVudW1fMS5QZXJzb25hU3R5bGVFbnVtW3BlcnNvbmFTdHlsZUVudW1fMS5QZXJzb25hU3R5bGVFbnVtLnNxdWFyZV0gKyBcIlxcXCJcXG4gICAgICAgICAgICAgICAgdWlmLXNpemU9XFxcIlwiICsgc2l6ZUVudW1fMS5QZXJzb25hU2l6ZVtzaXplRW51bV8xLlBlcnNvbmFTaXplLnhzbWFsbF0gKyBcIlxcXCJcXG4gICAgICAgICAgICAgICAgdWlmLXByZXNlbmNlPVxcXCJ7e3BlcnNvbi5wcmVzZW5jZX19XFxcIlxcbiAgICAgICAgICAgICAgICB1aWYtaW1hZ2UtdXJsPVxcXCJ7e3BlcnNvbi5pY29ufX1cXFwiPlxcbiAgICAgICAgICAgICAgICA8dWlmLXBlcnNvbmEtaW5pdGlhbHMgdWlmLWNvbG9yPVxcXCJ7e3BlcnNvbi5jb2xvcn19XFxcIj57e3BlcnNvbi5pbml0aWFsc319PC91aWYtcGVyc29uYS1pbml0aWFscz5cXG4gICAgICAgICAgICAgICAgPHVpZi1wZXJzb25hLXByaW1hcnktdGV4dD57e3BlcnNvbi5wcmltYXJ5VGV4dH19PC91aWYtcGVyc29uYS1wcmltYXJ5LXRleHQ+XFxuICAgICAgICAgICAgICA8L3VpZi1wZXJzb25hPlxcbiAgICAgICAgICAgICAgPGJ1dHRvblxcbiAgICAgICAgICAgICAgICBuZy1pZj1cXFwiIW5nRGlzYWJsZWRcXFwiXFxuICAgICAgICAgICAgICAgIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgICAgICAgICAgbmctY2xpY2s9XFxcInJlbW92ZVBlcnNvbkZyb21TZWxlY3RlZFBlb3BsZShwZXJzb24sICRldmVudClcXFwiXFxuICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItcGVyc29uYVJlbW92ZVxcXCI+XFxuICAgICAgICAgICAgICAgIDx1aWYtaWNvbiB1aWYtdHlwZT1cXFwiXCIgKyBpY29uRW51bV8xLkljb25FbnVtW2ljb25FbnVtXzEuSWNvbkVudW0ueF0gKyBcIlxcXCI+PC91aWYtaWNvbj5cXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxpbnB1dCBuZy1jbGljaz1cXFwib25QZW9wbGVQaWNrZXJBY3RpdmUoJGV2ZW50KVxcXCJcXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cXFwie3twbGFjZWhvbGRlcn19XFxcIlxcbiAgICAgICAgICAgIG5nLW1vZGVsPVxcXCJzZWFyY2hRdWVyeVxcXCJcXG4gICAgICAgICAgICBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXNlYXJjaEZpZWxkXFxcIlxcbiAgICAgICAgICAgIG5nLWZvY3VzPVxcXCJvblBlb3BsZVBpY2tlckFjdGl2ZSgkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgIG5nLWtleXVwPVxcXCJvblNlYXJjaEtleVVwKCRldmVudClcXFwiXFxuICAgICAgICAgICAgdHlwZT1cXFwidGV4dFxcXCI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRzXFxcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXJlc3VsdEdyb3Vwc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXJlc3VsdEdyb3VwXFxcIiBuZy1yZXBlYXQ9XFxcImdyb3VwRGF0YSBpbiBncm91cHMgfCBvcmRlckJ5Oictb3JkZXInXFxcIj5cXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRHcm91cFRpdGxlXFxcIj57e2dyb3VwRGF0YS5ncm91cC5uYW1lfX08L2Rpdj5cXG4gICAgICAgICAgICAgIDx1aWYtcGVvcGxlLXBpY2tlci1yZXN1bHQtbGlzdFxcbiAgICAgICAgICAgICAgbmctbW9kZWw9XFxcImdyb3VwRGF0YS5wZW9wbGVcXFwiXFxuICAgICAgICAgICAgICB1aWYtcGVyc29uLWNsaWNrPVxcXCJhZGRQZXJzb25Ub1NlbGVjdGVkUGVvcGxlXFxcIlxcbiAgICAgICAgICAgICAgdWlmLXBlcnNvbi1jbG9zZS1jbGljaz1cXFwicmVtb3ZlUGVyc29uRnJvbVNlYXJjaFJlc3VsdHNcXFwiXFxuICAgICAgICAgICAgICB1aWYtc3R5bGU9XFxcIlwiICsgcGVyc29uYVN0eWxlRW51bV8xLlBlcnNvbmFTdHlsZUVudW1bcGVyc29uYVN0eWxlRW51bV8xLlBlcnNvbmFTdHlsZUVudW0uc3F1YXJlXSArIFwiXFxcIlxcbiAgICAgICAgICAgICAgdWlmLXNpemU9XFxcIlwiICsgc2l6ZUVudW1fMS5QZXJzb25hU2l6ZVtzaXplRW51bV8xLlBlcnNvbmFTaXplLm1lZGl1bV0gKyBcIlxcXCI+PC91aWYtcGVvcGxlLXBpY2tlci1yZXN1bHQtbGlzdD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDxuZy10cmFuc2NsdWRlIC8+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzW1Blb3BsZVBpY2tlclR5cGVzLmNvbXBhY3RdID1cbiAgICAgICAgICAgIFwiPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyIG1zLVBlb3BsZVBpY2tlci0tY29tcGFjdFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VhcmNoQm94XFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItcGVyc29uYVxcXCIgbmctcmVwZWF0PVxcXCJwZXJzb24gaW4gc2VsZWN0ZWRQZXJzb25zIHRyYWNrIGJ5ICRpbmRleFxcXCI+XFxuICAgICAgICAgICAgICA8dWlmLXBlcnNvbmEgbmctY2xpY2s9XFxcIm9uU2VsZWN0ZWRQZXJzb25DbGljaygpKHBlcnNvbilcXFwiXFxuICAgICAgICAgICAgICAgIHVpZi1zdHlsZT1cXFwiXCIgKyBwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bVtwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bS5zcXVhcmVdICsgXCJcXFwiXFxuICAgICAgICAgICAgICAgIHVpZi1zaXplPVxcXCJcIiArIHNpemVFbnVtXzEuUGVyc29uYVNpemVbc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS54c21hbGxdICsgXCJcXFwiXFxuICAgICAgICAgICAgICAgIHVpZi1wcmVzZW5jZT1cXFwie3twZXJzb24ucHJlc2VuY2V9fVxcXCJcXG4gICAgICAgICAgICAgICAgdWlmLWltYWdlLXVybD1cXFwie3twZXJzb24uaWNvbn19XFxcIj5cXG4gICAgICAgICAgICAgICAgPHVpZi1wZXJzb25hLWluaXRpYWxzIHVpZi1jb2xvcj1cXFwie3twZXJzb24uY29sb3J9fVxcXCI+e3twZXJzb24uaW5pdGlhbHN9fTwvdWlmLXBlcnNvbmEtaW5pdGlhbHM+XFxuICAgICAgICAgICAgICAgIDx1aWYtcGVyc29uYS1wcmltYXJ5LXRleHQ+e3twZXJzb24ucHJpbWFyeVRleHR9fTwvdWlmLXBlcnNvbmEtcHJpbWFyeS10ZXh0PlxcbiAgICAgICAgICAgICAgPC91aWYtcGVyc29uYT5cXG4gICAgICAgICAgICAgIDxidXR0b25cXG4gICAgICAgICAgICAgICAgbmctaWY9XFxcIiFuZ0Rpc2FibGVkXFxcIlxcbiAgICAgICAgICAgICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgICAgICAgIG5nLWNsaWNrPVxcXCJyZW1vdmVQZXJzb25Gcm9tU2VsZWN0ZWRQZW9wbGUocGVyc29uLCAkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgICAgICBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXBlcnNvbmFSZW1vdmVcXFwiPlxcbiAgICAgICAgICAgICAgICA8dWlmLWljb24gdWlmLXR5cGU9XFxcIlwiICsgaWNvbkVudW1fMS5JY29uRW51bVtpY29uRW51bV8xLkljb25FbnVtLnhdICsgXCJcXFwiPjwvdWlmLWljb24+XFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8aW5wdXQgbmctY2xpY2s9XFxcIm9uUGVvcGxlUGlja2VyQWN0aXZlKCRldmVudClcXFwiXFxuICAgICAgICAgICAgbmctbW9kZWw9XFxcInNlYXJjaFF1ZXJ5XFxcIlxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVxcXCJ7e3BsYWNlaG9sZGVyfX1cXFwiXFxuICAgICAgICAgICAgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hGaWVsZFxcXCJcXG4gICAgICAgICAgICBuZy1mb2N1cz1cXFwib25QZW9wbGVQaWNrZXJBY3RpdmUoJGV2ZW50KVxcXCJcXG4gICAgICAgICAgICBuZy1rZXl1cD1cXFwib25TZWFyY2hLZXlVcCgkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgIHR5cGU9XFxcInRleHRcXFwiPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItcmVzdWx0c1xcXCI+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRHcm91cHNcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRHcm91cFxcXCIgbmctcmVwZWF0PVxcXCJncm91cERhdGEgaW4gZ3JvdXBzIHwgb3JkZXJCeTonLW9yZGVyJ1xcXCI+XFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItcmVzdWx0R3JvdXBUaXRsZVxcXCI+e3tncm91cERhdGEuZ3JvdXAubmFtZX19PC9kaXY+XFxuICAgICAgICAgICAgICA8dWlmLXBlb3BsZS1waWNrZXItcmVzdWx0LWxpc3RcXG4gICAgICAgICAgICAgIG5nLW1vZGVsPVxcXCJncm91cERhdGEucGVvcGxlXFxcIlxcbiAgICAgICAgICAgICAgdWlmLXBpY2tlci10eXBlPVxcXCJcIiArIFBlb3BsZVBpY2tlclR5cGVzW1Blb3BsZVBpY2tlclR5cGVzLmNvbXBhY3RdICsgXCJcXFwiXFxuICAgICAgICAgICAgICB1aWYtcGVyc29uLWNsaWNrPVxcXCJhZGRQZXJzb25Ub1NlbGVjdGVkUGVvcGxlXFxcIlxcbiAgICAgICAgICAgICAgdWlmLXBlcnNvbi1jbG9zZS1jbGljaz1cXFwicmVtb3ZlUGVyc29uRnJvbVNlYXJjaFJlc3VsdHNcXFwiXFxuICAgICAgICAgICAgICB1aWYtc3R5bGU9XFxcIlwiICsgcGVyc29uYVN0eWxlRW51bV8xLlBlcnNvbmFTdHlsZUVudW1bcGVyc29uYVN0eWxlRW51bV8xLlBlcnNvbmFTdHlsZUVudW0uc3F1YXJlXSArIFwiXFxcIlxcbiAgICAgICAgICAgICAgdWlmLXNpemU9XFxcIlwiICsgc2l6ZUVudW1fMS5QZXJzb25hU2l6ZVtzaXplRW51bV8xLlBlcnNvbmFTaXplLnhzbWFsbF0gKyBcIlxcXCI+PC91aWYtcGVvcGxlLXBpY2tlci1yZXN1bHQtbGlzdD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDxuZy10cmFuc2NsdWRlIC8+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzW1Blb3BsZVBpY2tlclR5cGVzLm1lbWJlckxpc3RdID0gXCJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXIgbXMtUGVvcGxlUGlja2VyLS1tZW1iZXJzTGlzdFxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VhcmNoQm94XFxcIj5cXG4gICAgICAgICAgICA8aW5wdXQgbmctY2xpY2s9XFxcIm9uUGVvcGxlUGlja2VyQWN0aXZlKCRldmVudClcXFwiXFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XFxcInt7cGxhY2Vob2xkZXJ9fVxcXCJcXG4gICAgICAgICAgICBuZy1tb2RlbD1cXFwic2VhcmNoUXVlcnlcXFwiXFxuICAgICAgICAgICAgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hGaWVsZFxcXCJcXG4gICAgICAgICAgICBuZy1mb2N1cz1cXFwib25QZW9wbGVQaWNrZXJBY3RpdmUoJGV2ZW50KVxcXCJcXG4gICAgICAgICAgICBuZy1rZXl1cD1cXFwib25TZWFyY2hLZXlVcCgkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgIHR5cGU9XFxcInRleHRcXFwiPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItcmVzdWx0c1xcXCI+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRHcm91cHNcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRHcm91cFxcXCIgbmctcmVwZWF0PVxcXCJncm91cERhdGEgaW4gZ3JvdXBzIHwgb3JkZXJCeTonLW9yZGVyJ1xcXCI+XFxuICAgICAgICAgICAgICA8dWlmLXBlb3BsZS1waWNrZXItcmVzdWx0LWxpc3RcXG4gICAgICAgICAgICAgIG5nLW1vZGVsPVxcXCJncm91cERhdGEucGVvcGxlXFxcIlxcbiAgICAgICAgICAgICAgdWlmLXBlcnNvbi1jbGljaz1cXFwiYWRkUGVyc29uVG9TZWxlY3RlZFBlb3BsZVxcXCJcXG4gICAgICAgICAgICAgIHVpZi1zdHlsZT1cXFwiXCIgKyBwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bVtwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bS5yb3VuZF0gKyBcIlxcXCJcXG4gICAgICAgICAgICAgIHVpZi1zaXplPVxcXCJcIiArIHNpemVFbnVtXzEuUGVyc29uYVNpemVbc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS5tZWRpdW1dICsgXCJcXFwiPjwvdWlmLXBlb3BsZS1waWNrZXItcmVzdWx0LWxpc3Q+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8dWlmLXBlb3BsZS1waWNrZXItc2VsZWN0ZWQgbmctbW9kZWw9XFxcInNlbGVjdGVkUGVyc29uc1xcXCJcXG4gICAgICAgIHVpZi1zZWxlY3RlZC1wZXJzb24tY2xpY2s9XFxcIm9uU2VsZWN0ZWRQZXJzb25DbGljaygpXFxcIlxcbiAgICAgICAgdWlmLXBlcnNvbi1jbG9zZT1cXFwicmVtb3ZlUGVyc29uRnJvbVNlbGVjdGVkUGVvcGxlXFxcIj5cXG4gICAgICAgICAgPG5nLXRyYW5zY2x1ZGU+PC9uZy10cmFuc2NsdWRlPlxcbiAgICAgICAgPC91aWYtcGVvcGxlLXBpY2tlci1zZWxlY3RlZD5cXG4gICAgICA8L2Rpdj5cIjtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGVzW1Blb3BsZVBpY2tlclR5cGVzLmZhY2VQaWxlXSA9IFwiXFxuICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyIG1zLVBlb3BsZVBpY2tlci0tRmFjZXBpbGVcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXNlYXJjaEJveFxcXCI+XFxuICAgICAgICAgICAgPGlucHV0IG5nLWNsaWNrPVxcXCJvblBlb3BsZVBpY2tlckFjdGl2ZSgkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVxcXCJ7e3BsYWNlaG9sZGVyfX1cXFwiXFxuICAgICAgICAgICAgbmctbW9kZWw9XFxcInNlYXJjaFF1ZXJ5XFxcIlxcbiAgICAgICAgICAgIGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VhcmNoRmllbGRcXFwiXFxuICAgICAgICAgICAgbmctZm9jdXM9XFxcIm9uUGVvcGxlUGlja2VyQWN0aXZlKCRldmVudClcXFwiXFxuICAgICAgICAgICAgbmcta2V5dXA9XFxcIm9uU2VhcmNoS2V5VXAoJGV2ZW50KVxcXCJcXG4gICAgICAgICAgICB0eXBlPVxcXCJ0ZXh0XFxcIj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXJlc3VsdHNcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItcGVvcGxlTGlzdEhlYWRlclxcXCI+XFxuICAgICAgICAgICAgICA8c3Bhbj57e2ZhY2VQaWxlSGVhZGVyfX08L3NwYW4+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD1cXFwiZ3JvdXBEYXRhIGluIGdyb3VwcyB8IG9yZGVyQnk6Jy1vcmRlcidcXFwiPlxcbiAgICAgICAgICAgIDx1aWYtcGVvcGxlLXBpY2tlci1yZXN1bHQtbGlzdFxcbiAgICAgICAgICAgIG5nLW1vZGVsPVxcXCJncm91cERhdGEucGVvcGxlXFxcIlxcbiAgICAgICAgICAgIHVpZi1wZXJzb24tY2xpY2s9XFxcImFkZFBlcnNvblRvU2VsZWN0ZWRQZW9wbGVcXFwiXFxuICAgICAgICAgICAgdWlmLXN0eWxlPVxcXCJcIiArIHBlcnNvbmFTdHlsZUVudW1fMS5QZXJzb25hU3R5bGVFbnVtW3BlcnNvbmFTdHlsZUVudW1fMS5QZXJzb25hU3R5bGVFbnVtLnJvdW5kXSArIFwiXFxcIlxcbiAgICAgICAgICAgIHVpZi1zaXplPVxcXCJcIiArIHNpemVFbnVtXzEuUGVyc29uYVNpemVbc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS5zbWFsbF0gKyBcIlxcXCI+PC91aWYtcGVvcGxlLXBpY2tlci1yZXN1bHQtbGlzdD5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInVpZi1zZWFyY2gtbW9yZVxcXCI+PC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDx1aWYtcGVvcGxlLXBpY2tlci1zZWxlY3RlZCBuZy1tb2RlbD1cXFwic2VsZWN0ZWRQZXJzb25zXFxcIlxcbiAgICAgICAgdWlmLXNlbGVjdGVkLXBlcnNvbi1jbGljaz1cXFwib25TZWxlY3RlZFBlcnNvbkNsaWNrKClcXFwiXFxuICAgICAgICB1aWYtcGVyc29uLWNsb3NlPVxcXCJyZW1vdmVQZXJzb25Gcm9tU2VsZWN0ZWRQZW9wbGVcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ1aWYtcGVvcGxlLWhlYWRlclxcXCI+PC9kaXY+XFxuICAgICAgICA8L3VpZi1wZW9wbGUtcGlja2VyLXNlbGVjdGVkPlxcblxcbiAgICAgIDwvZGl2PlwiO1xuICAgIH1cbiAgICBQZW9wbGVQaWNrZXJEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgkZG9jdW1lbnQsICR0aW1lb3V0LCAkbG9nLCAkd2luZG93KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBlb3BsZVBpY2tlckRpcmVjdGl2ZSgkZG9jdW1lbnQsICR0aW1lb3V0LCAkbG9nLCAkd2luZG93KTtcbiAgICAgICAgfTtcbiAgICAgICAgZGlyZWN0aXZlLiRpbmplY3QgPSBbJyRkb2N1bWVudCcsICckdGltZW91dCcsICckbG9nJywgJyR3aW5kb3cnXTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIFBlb3BsZVBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUuaW5pdERpc2FibGVkU3RhdGUgPSBmdW5jdGlvbiAoJGVsZW1lbnQsICRzY29wZSwgJGF0dHJzKSB7XG4gICAgICAgIHZhciAkc2VhcmNoRmllbGQgPSBhbmd1bGFyLmVsZW1lbnQoJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm1zLVBlb3BsZVBpY2tlci1zZWFyY2hGaWVsZCcpKTtcbiAgICAgICAgJGF0dHJzLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgJHNlYXJjaEZpZWxkLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAkc2VhcmNoRmllbGQucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQZW9wbGVQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLmFuaW1hdGVTZWxlY3RlZFBlb3BsZSA9IGZ1bmN0aW9uICgkZWxlbWVudCkge1xuICAgICAgICB2YXIgJHNlbGVjdGVkUGVvcGxlID0gYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1QZW9wbGVQaWNrZXItc2VsZWN0ZWRQZW9wbGUnKSk7XG4gICAgICAgICRzZWxlY3RlZFBlb3BsZS5hZGRDbGFzcygnbXMtdS1zbGlkZURvd25JbjIwJyk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyAkc2VsZWN0ZWRQZW9wbGUucmVtb3ZlQ2xhc3MoJ21zLXUtc2xpZGVEb3duSW4yMCcpOyB9LCAxMDAwKTtcbiAgICB9O1xuICAgIFBlb3BsZVBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUuY3VycmVudFlQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuJHdpbmRvdy5wYWdlWU9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYm9keSA9IGFuZ3VsYXIuZWxlbWVudCh0aGlzLiRkb2N1bWVudFswXSkuZmluZCgnYm9keScpWzBdO1xuICAgICAgICBpZiAoYm9keS5zY3JvbGxUb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBib2R5LnNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuICAgIFBlb3BsZVBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUuZWxtWVBvc2l0aW9uID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHkgPSBlbGVtZW50Lm9mZnNldFRvcDtcbiAgICAgICAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAobm9kZS5vZmZzZXRQYXJlbnQgJiYgbm9kZS5vZmZzZXRQYXJlbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIG5vZGUgPSAobm9kZS5vZmZzZXRQYXJlbnQpO1xuICAgICAgICAgICAgeSArPSBub2RlLm9mZnNldFRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9O1xuICAgIFBlb3BsZVBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUuc21vb3RoU2Nyb2xsVG8gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgc3RhcnRZID0gdGhpcy5jdXJyZW50WVBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBzdG9wWSA9IHRoaXMuZWxtWVBvc2l0aW9uKGVsZW1lbnQpO1xuICAgICAgICB2YXIgZGlzdGFuY2UgPSBzdG9wWSA+IHN0YXJ0WSA/IHN0b3BZIC0gc3RhcnRZIDogc3RhcnRZIC0gc3RvcFk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IDEwMCkge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHN0b3BZKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3BlZWQgPSBNYXRoLnJvdW5kKGRpc3RhbmNlIC8gMzApO1xuICAgICAgICBpZiAoc3BlZWQgPj0gMjApIHtcbiAgICAgICAgICAgIHNwZWVkID0gMjA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ZXAgPSBNYXRoLnJvdW5kKGRpc3RhbmNlIC8gMjUpO1xuICAgICAgICB2YXIgbGVhcFkgPSBzdG9wWSA+IHN0YXJ0WSA/IHN0YXJ0WSArIHN0ZXAgOiBzdGFydFkgLSBzdGVwO1xuICAgICAgICB2YXIgdGltZXIgPSAwO1xuICAgICAgICBpZiAoc3RvcFkgPiBzdGFydFkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydFk7IGkgPCBzdG9wWTsgaSArPSBzdGVwKSB7XG4gICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChsWSwgdCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBsWSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHQgKiBzcGVlZCk7XG4gICAgICAgICAgICAgICAgfSkobGVhcFksIHRpbWVyKTtcbiAgICAgICAgICAgICAgICBsZWFwWSArPSBzdGVwO1xuICAgICAgICAgICAgICAgIGlmIChsZWFwWSA+IHN0b3BZKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYXBZID0gc3RvcFk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRpbWVyKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0WTsgaSA+IHN0b3BZOyBpIC09IHN0ZXApIHtcbiAgICAgICAgICAgIChmdW5jdGlvbiAobFksIHQpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGxZKTtcbiAgICAgICAgICAgICAgICB9LCB0ICogc3BlZWQpO1xuICAgICAgICAgICAgfSkobGVhcFksIHRpbWVyKTtcbiAgICAgICAgICAgIGxlYXBZIC09IHN0ZXA7XG4gICAgICAgICAgICBpZiAobGVhcFkgPCBzdG9wWSkge1xuICAgICAgICAgICAgICAgIGxlYXBZID0gc3RvcFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lcisrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQZW9wbGVQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLmluc2VydEZhY2VQaWxlSGVhZGVyID0gZnVuY3Rpb24gKGNsb25lLCAkc2NvcGUsICRlbGVtZW50KSB7XG4gICAgICAgIHZhciBlbGVtZW50VG9SZXBsYWNlID0gYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy51aWYtcGVvcGxlLWhlYWRlcicpKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoY2xvbmVbaV0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ21zLVBlb3BsZVBpY2tlci1zZWxlY3RlZENvdW50JykpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50VG9SZXBsYWNlLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQZW9wbGVQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLmluc2VydEZhY2VQaWxlU2VhcmNoTW9yZSA9IGZ1bmN0aW9uIChjbG9uZSwgJHNjb3BlLCAkZWxlbWVudCkge1xuICAgICAgICB2YXIgZWxlbWVudFRvUmVwbGFjZSA9IGFuZ3VsYXIuZWxlbWVudCgkZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcudWlmLXNlYXJjaC1tb3JlJykpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChjbG9uZVtpXSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcygnbXMtUGVvcGxlUGlja2VyLXNlYXJjaE1vcmUnKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRUb1JlcGxhY2UucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBlb3BsZVBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUucmVzaXplU2VhcmNoRmllbGQgPSBmdW5jdGlvbiAoJHBlb3BsZVBpY2tlcikge1xuICAgICAgICB2YXIgJHNlYXJjaEJveCA9IGFuZ3VsYXIuZWxlbWVudCgkcGVvcGxlUGlja2VyWzBdLnF1ZXJ5U2VsZWN0b3IoJy5tcy1QZW9wbGVQaWNrZXItc2VhcmNoQm94JykpO1xuICAgICAgICB2YXIgJHNlYXJjaEZpZWxkID0gYW5ndWxhci5lbGVtZW50KCRwZW9wbGVQaWNrZXJbMF0ucXVlcnlTZWxlY3RvcignLm1zLVBlb3BsZVBpY2tlci1zZWFyY2hGaWVsZCcpKTtcbiAgICAgICAgdmFyIHNlYXJjaEJveExlZnRFZGdlID0gJHNlYXJjaEJveC5wcm9wKCdvZmZzZXRMZWZ0Jyk7XG4gICAgICAgIHZhciBzZWFyY2hCb3hXaWR0aCA9ICRzZWFyY2hCb3hbMF0uY2xpZW50V2lkdGg7XG4gICAgICAgIHZhciBzZWFyY2hCb3hSaWdodEVkZ2UgPSBzZWFyY2hCb3hMZWZ0RWRnZSArIHNlYXJjaEJveFdpZHRoO1xuICAgICAgICB2YXIgJHBlcnNvbmFOb2RlcyA9ICRzZWFyY2hCb3hbMF0ucXVlcnlTZWxlY3RvckFsbCgnLm1zLVBlb3BsZVBpY2tlci1wZXJzb25hJyk7XG4gICAgICAgIGlmICgkcGVyc29uYU5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgJHNlYXJjaEZpZWxkWzBdLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciAkbGFzdFBlcnNvbmEgPSBhbmd1bGFyLmVsZW1lbnQoJHBlcnNvbmFOb2Rlc1skcGVyc29uYU5vZGVzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgdmFyIGxhc3RQZXJzb25hTGVmdEVkZ2UgPSAkbGFzdFBlcnNvbmEucHJvcCgnb2Zmc2V0TGVmdCcpO1xuICAgICAgICB2YXIgbGFzdFBlcnNvbmFXaWR0aCA9ICRsYXN0UGVyc29uYVswXS5jbGllbnRXaWR0aDtcbiAgICAgICAgdmFyIGxhc3RQZXJzb25hUmlnaHRFZGdlID0gbGFzdFBlcnNvbmFMZWZ0RWRnZSArIGxhc3RQZXJzb25hV2lkdGg7XG4gICAgICAgIHZhciBuZXdGaWVsZFdpZHRoID0gc2VhcmNoQm94UmlnaHRFZGdlIC0gbGFzdFBlcnNvbmFSaWdodEVkZ2UgLSA1O1xuICAgICAgICBpZiAobmV3RmllbGRXaWR0aCA8IDEwMCkge1xuICAgICAgICAgICAgbmV3RmllbGRXaWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgICRzZWFyY2hGaWVsZFswXS5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICRzZWFyY2hGaWVsZFswXS5zdHlsZS53aWR0aCA9IG5ld0ZpZWxkV2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gUGVvcGxlUGlja2VyRGlyZWN0aXZlO1xufSgpKTtcblBlb3BsZVBpY2tlckRpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lID0gJ3VpZlBlb3BsZVBpY2tlcic7XG5leHBvcnRzLlBlb3BsZVBpY2tlckRpcmVjdGl2ZSA9IFBlb3BsZVBpY2tlckRpcmVjdGl2ZTtcbnZhciBQZW9wbGVQaWNrZXJSZXN1bHRMaXN0RGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQZW9wbGVQaWNrZXJSZXN1bHRMaXN0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gXCJcXG4gIDx1bCBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXJlc3VsdExpc3RcXFwiPlxcbiAgICA8bGkgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRcXFwiIG5nLXJlcGVhdD1cXFwicGVyc29uIGluIHBlb3BsZSB0cmFjayBieSAkaW5kZXhcXFwiPlxcbiAgICAgIDxkaXYgcm9sZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXJlc3VsdEJ0blxcXCJcXG4gICAgICBuZy1jbGFzcz1cXFwieydtcy1QZW9wbGVQaWNrZXItcmVzdWx0QnRuLS1jb21wYWN0JzogcGlja2VyVHlwZSA9PT0gJ2NvbXBhY3QnfVxcXCIgbmctY2xpY2s9XFxcIm9uUGVyc29uQ2xpY2soKShwZXJzb24pXFxcIj5cXG4gICAgICAgIDx1aWYtcGVyc29uYVxcbiAgICAgICAgICB1aWYtc3R5bGU9XFxcInt7cGVyc29uU3R5bGV9fVxcXCJcXG4gICAgICAgICAgdWlmLXNpemU9XFxcInt7cGVyc29uU2l6ZX19XFxcIlxcbiAgICAgICAgICB1aWYtcHJlc2VuY2U9XFxcInt7cGVyc29uLnByZXNlbmNlfX1cXFwiXFxuICAgICAgICAgIHVpZi1pbWFnZS11cmw9XFxcInt7cGVyc29uLmljb259fVxcXCI+XFxuICAgICAgICAgIDx1aWYtcGVyc29uYS1pbml0aWFscyB1aWYtY29sb3I9XFxcInt7cGVyc29uLmNvbG9yfX1cXFwiPnt7cGVyc29uLmluaXRpYWxzfX08L3VpZi1wZXJzb25hLWluaXRpYWxzPlxcbiAgICAgICAgICA8dWlmLXBlcnNvbmEtcHJpbWFyeS10ZXh0Pnt7cGVyc29uLnByaW1hcnlUZXh0fX08L3VpZi1wZXJzb25hLXByaW1hcnktdGV4dD5cXG4gICAgICAgICAgPHVpZi1wZXJzb25hLXNlY29uZGFyeS10ZXh0Pnt7cGVyc29uLnNlY29uZGFyeVRleHR9fTwvdWlmLXBlcnNvbmEtc2Vjb25kYXJ5LXRleHQ+XFxuICAgICAgICA8L3VpZi1wZXJzb25hPlxcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgIG5nLWlmPVxcXCIhcGVyc29uLmFkZGl0aW9uYWxEYXRhICYmIG9uUGVyc29uQ2xvc2VDbGljaygpXFxcIlxcbiAgICAgICAgICBuZy1jbGljaz1cXFwib25QZXJzb25DbG9zZUNsaWNrKCkocGVvcGxlLCBwZXJzb24sICRldmVudClcXFwiXFxuICAgICAgICAgIGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItcmVzdWx0QWN0aW9uIGpzLXJlc3VsdFJlbW92ZVxcXCI+XFxuICAgICAgICAgIDx1aWYtaWNvbiB1aWYtdHlwZT1cXFwiXCIgKyBpY29uRW51bV8xLkljb25FbnVtW2ljb25FbnVtXzEuSWNvbkVudW0ueF0gKyBcIlxcXCI+PC91aWYtaWNvbj5cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgIG5nLWlmPVxcXCJwZXJzb24uYWRkaXRpb25hbERhdGFcXFwiXFxuICAgICAgICAgIG5nLWNsaWNrPVxcXCJleHBhbmRBZGRpdGlvbmFsRGF0YSgkZXZlbnQpXFxcIlxcbiAgICAgICAgICBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXJlc3VsdEFjdGlvbiBqcy1yZXN1bHRSZW1vdmVcXFwiPlxcbiAgICAgICAgICA8dWlmLWljb24gdWlmLXR5cGU9XFxcIlwiICsgaWNvbkVudW1fMS5JY29uRW51bVtpY29uRW51bV8xLkljb25FbnVtLmNoZXZyb25zRG93bl0gKyBcIlxcXCI+PC91aWYtaWNvbj5cXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDxkaXYgbmctaWY9XFxcInBlcnNvbi5hZGRpdGlvbmFsRGF0YVxcXCIgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRBZGRpdGlvbmFsQ29udGVudFxcXCI+XFxuICAgICAgICA8dWlmLXBlb3BsZS1waWNrZXItcmVzdWx0LWxpc3RcXG4gICAgICAgIG5nLW1vZGVsPVxcXCJwZXJzb24uYWRkaXRpb25hbERhdGFcXFwiXFxuICAgICAgICB1aWYtcGVyc29uLWNsaWNrPVxcXCJvblBlcnNvbkNsaWNrKClcXFwiXFxuICAgICAgICB1aWYtcGVyc29uLWNsb3NlLWNsaWNrPVxcXCJvblBlcnNvbkNsb3NlQ2xpY2soKVxcXCJcXG4gICAgICAgIHVpZi1waWNrZXItdHlwZT1cXFwie3twaWNrZXJUeXBlfX1cXFwiXFxuICAgICAgICB1aWYtc3R5bGU9XFxcInt7cGVyc29uU3R5bGV9fVxcXCJcXG4gICAgICAgIHVpZi1zaXplPVxcXCJ7e3BlcnNvblNpemV9fVxcXCI+PC91aWYtcGVvcGxlLXBpY2tlci1yZXN1bHQtbGlzdD5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9saT5cXG4gIDwvdWw+XCI7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICBvblBlcnNvbkNsaWNrOiAnJnVpZlBlcnNvbkNsaWNrJyxcbiAgICAgICAgICAgIG9uUGVyc29uQ2xvc2VDbGljazogJyZ1aWZQZXJzb25DbG9zZUNsaWNrJyxcbiAgICAgICAgICAgIHBlb3BsZTogJz1uZ01vZGVsJyxcbiAgICAgICAgICAgIHBlcnNvblNpemU6ICdAdWlmU2l6ZScsXG4gICAgICAgICAgICBwZXJzb25TdHlsZTogJ0B1aWZTdHlsZScsXG4gICAgICAgICAgICBwaWNrZXJUeXBlOiAnQHVpZlBpY2tlclR5cGUnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubGluayA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIHBlb3BsZVBpY2tlckN0cmwsICR0cmFuc2NsdWRlKSB7XG4gICAgICAgICAgICAkc2NvcGUuZXhwYW5kQWRkaXRpb25hbERhdGEgPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHZhciAkYnV0dG9uID0gYW5ndWxhci5lbGVtZW50KCRldmVudC50YXJnZXQpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJHBhcmVudCA9ICRidXR0b24ucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkcGFyZW50Lmhhc0NsYXNzKCdtcy1QZW9wbGVQaWNrZXItcmVzdWx0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJlbnQudG9nZ2xlQ2xhc3MoJ2lzLWV4cGFuZGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkYnV0dG9uID0gJHBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBQZW9wbGVQaWNrZXJSZXN1bHRMaXN0RGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUGVvcGxlUGlja2VyUmVzdWx0TGlzdERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFBlb3BsZVBpY2tlclJlc3VsdExpc3REaXJlY3RpdmU7XG59KCkpO1xuUGVvcGxlUGlja2VyUmVzdWx0TGlzdERpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lID0gJ3VpZlBlb3BsZVBpY2tlclJlc3VsdExpc3QnO1xuZXhwb3J0cy5QZW9wbGVQaWNrZXJSZXN1bHRMaXN0RGlyZWN0aXZlID0gUGVvcGxlUGlja2VyUmVzdWx0TGlzdERpcmVjdGl2ZTtcbnZhciBQZW9wbGVTZWFyY2hNb3JlQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGVvcGxlU2VhcmNoTW9yZUNvbnRyb2xsZXIoJHNjb3BlLCAkZWxlbWVudCkge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kZWxlbWVudCA9ICRlbGVtZW50O1xuICAgICAgICB0aGlzLnNlYXJjaENhbGxiYWNrcyA9IFtdO1xuICAgIH1cbiAgICBQZW9wbGVTZWFyY2hNb3JlQ29udHJvbGxlci5wcm90b3R5cGUuaXNTZWFyY2hpbmcgPSBmdW5jdGlvbiAoc2VhcmNoaW5nKSB7XG4gICAgICAgIHRoaXMuJHNjb3BlLnByb2Nlc3NpbmcgPSBzZWFyY2hpbmc7XG4gICAgICAgIHNlYXJjaGluZyA/IHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ2lzLXNlYXJjaGluZycpIDogdGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcygnaXMtc2VhcmNoaW5nJyk7XG4gICAgfTtcbiAgICByZXR1cm4gUGVvcGxlU2VhcmNoTW9yZUNvbnRyb2xsZXI7XG59KCkpO1xuUGVvcGxlU2VhcmNoTW9yZUNvbnRyb2xsZXIuJGluamVjdCA9IFsnJHNjb3BlJywgJyRlbGVtZW50J107XG5leHBvcnRzLlBlb3BsZVNlYXJjaE1vcmVDb250cm9sbGVyID0gUGVvcGxlU2VhcmNoTW9yZUNvbnRyb2xsZXI7XG52YXIgUGVvcGxlU2VhcmNoTW9yZURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGVvcGxlU2VhcmNoTW9yZURpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gXCJeXlwiICsgUGVvcGxlUGlja2VyRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFBlb3BsZVNlYXJjaE1vcmVDb250cm9sbGVyO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gXCJcXG4gIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hNb3JlIGpzLXNlYXJjaE1vcmVcXFwiXFxuICAgIG5nLWNsYXNzPVxcXCJ7J21zLVBlb3BsZVBpY2tlci1zZWFyY2hNb3JlLS1kaXNjb25uZWN0ZWQnOiBkaXNjb25uZWN0ZWR9XFxcIj5cXG4gICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIG5nLWlmPVxcXCJwaWNrZXJUeXBlID09PSAnXCIgKyBQZW9wbGVQaWNrZXJUeXBlc1tQZW9wbGVQaWNrZXJUeXBlcy5ncm91cGVkXSArIFwiJyAmJiAhZGlzY29ubmVjdGVkXFxcIlxcbiAgICAgIG5nLWNsaWNrPVxcXCJvblNlYXJjaCgkZXZlbnQpXFxcIiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXNlYXJjaE1vcmVCdG5cXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hNb3JlSWNvblxcXCI+XFxuICAgICAgICA8dWlmLWljb24gbmctaWY9XFxcIiFkaXNjb25uZWN0ZWRcXFwiIHVpZi10eXBlPVxcXCJcIiArIGljb25FbnVtXzEuSWNvbkVudW1baWNvbkVudW1fMS5JY29uRW51bS5zZWFyY2hdICsgXCJcXFwiPjwvdWlmLWljb24+XFxuICAgICAgICA8dWlmLWljb24gbmctaWY9XFxcImRpc2Nvbm5lY3RlZFxcXCIgdWlmLXR5cGU9XFxcIlwiICsgaWNvbkVudW1fMS5JY29uRW51bVtpY29uRW51bV8xLkljb25FbnVtLmFsZXJ0XSArIFwiXFxcIj48L3VpZi1pY29uPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDxuZy10cmFuc2NsdWRlIC8+XFxuICAgIDwvYnV0dG9uPlxcbiAgICA8ZGl2IHJvbGU9XFxcImJ1dHRvblxcXCIgbmctaWY9XFxcInBpY2tlclR5cGUgPT09ICdcIiArIFBlb3BsZVBpY2tlclR5cGVzW1Blb3BsZVBpY2tlclR5cGVzLmNvbXBhY3RdICsgXCInICYmICFkaXNjb25uZWN0ZWRcXFwiXFxuICAgICAgbmctY2xpY2s9XFxcIm9uU2VhcmNoKCRldmVudClcXFwiIGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VhcmNoTW9yZUJ0biBtcy1QZW9wbGVQaWNrZXItc2VhcmNoTW9yZUJ0bi0tY29tcGFjdFxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXNlYXJjaE1vcmVJY29uXFxcIj5cXG4gICAgICAgIDx1aWYtaWNvbiBuZy1pZj1cXFwiIWRpc2Nvbm5lY3RlZFxcXCIgdWlmLXR5cGU9XFxcIlwiICsgaWNvbkVudW1fMS5JY29uRW51bVtpY29uRW51bV8xLkljb25FbnVtLnNlYXJjaF0gKyBcIlxcXCI+PC91aWYtaWNvbj5cXG4gICAgICAgIDx1aWYtaWNvbiBuZy1pZj1cXFwiZGlzY29ubmVjdGVkXFxcIiB1aWYtdHlwZT1cXFwiXCIgKyBpY29uRW51bV8xLkljb25FbnVtW2ljb25FbnVtXzEuSWNvbkVudW0uYWxlcnRdICsgXCJcXFwiPjwvdWlmLWljb24+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPG5nLXRyYW5zY2x1ZGUgLz5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgcm9sZT1cXFwiYnV0dG9uXFxcIiBuZy1pZj1cXFwicGlja2VyVHlwZSA9PT0gJ1wiICsgUGVvcGxlUGlja2VyVHlwZXNbUGVvcGxlUGlja2VyVHlwZXMuZmFjZVBpbGVdICsgXCInICYmICFkaXNjb25uZWN0ZWRcXFwiXFxuICAgICAgbmctY2xpY2s9XFxcIm9uU2VhcmNoKCRldmVudClcXFwiIGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VhcmNoTW9yZUJ0biBtcy1QZW9wbGVQaWNrZXItc2VhcmNoTW9yZUJ0bi0tY29tcGFjdFxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXNlYXJjaE1vcmVJY29uXFxcIj5cXG4gICAgICAgIDx1aWYtaWNvbiBuZy1pZj1cXFwiIWRpc2Nvbm5lY3RlZFxcXCIgdWlmLXR5cGU9XFxcIlwiICsgaWNvbkVudW1fMS5JY29uRW51bVtpY29uRW51bV8xLkljb25FbnVtLnNlYXJjaF0gKyBcIlxcXCI+PC91aWYtaWNvbj5cXG4gICAgICAgIDx1aWYtaWNvbiBuZy1pZj1cXFwiZGlzY29ubmVjdGVkXFxcIiB1aWYtdHlwZT1cXFwiXCIgKyBpY29uRW51bV8xLkljb25FbnVtW2ljb25FbnVtXzEuSWNvbkVudW0uYWxlcnRdICsgXCJcXFwiPjwvdWlmLWljb24+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPG5nLXRyYW5zY2x1ZGUgLz5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgcm9sZT1cXFwiYnV0dG9uXFxcIiBuZy1pZj1cXFwiZGlzY29ubmVjdGVkXFxcIiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXNlYXJjaE1vcmVCdG5cXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hNb3JlSWNvblxcXCI+XFxuICAgICAgICA8dWlmLWljb24gdWlmLXR5cGU9XFxcIlwiICsgaWNvbkVudW1fMS5JY29uRW51bVtpY29uRW51bV8xLkljb25FbnVtLmFsZXJ0XSArIFwiXFxcIj48L3VpZi1pY29uPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDxuZy10cmFuc2NsdWRlIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8dWlmLXNwaW5uZXIgbmctc2hvdz1cXFwicHJvY2Vzc2luZ1xcXCI+PC91aWYtc3Bpbm5lcj5cXG4gIDwvZGl2PlwiO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgZGlzY29ubmVjdGVkOiAnPXVpZkRpc2Nvbm5lY3RlZCdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5saW5rID0gZnVuY3Rpb24gKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgcGVvcGxlUGlja2VyQ3RybCwgJHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgICAgICRzY29wZS5waWNrZXJUeXBlID0gcGVvcGxlUGlja2VyQ3RybC5waWNrZXJUeXBlKCk7XG4gICAgICAgICAgICAkc2NvcGUub25TZWFyY2ggPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHBlb3BsZVBpY2tlckN0cmwuc2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QocGVvcGxlU2VhcmNoRXZlbnROYW1lLCBwZW9wbGVQaWNrZXJDdHJsLnNlYXJjaFF1ZXJ5KCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgUGVvcGxlU2VhcmNoTW9yZURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBlb3BsZVNlYXJjaE1vcmVEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBQZW9wbGVTZWFyY2hNb3JlRGlyZWN0aXZlO1xufSgpKTtcblBlb3BsZVNlYXJjaE1vcmVEaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSA9ICd1aWZQZW9wbGVTZWFyY2hNb3JlJztcbmV4cG9ydHMuUGVvcGxlU2VhcmNoTW9yZURpcmVjdGl2ZSA9IFBlb3BsZVNlYXJjaE1vcmVEaXJlY3RpdmU7XG52YXIgUHJpbWFyeVRleHRDb250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQcmltYXJ5VGV4dENvbnRyb2xsZXIoJHNjb3BlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuJHNjb3BlID0gJHNjb3BlO1xuICAgICAgICB0aGlzLiRzY29wZS4kb24ocGVvcGxlU2VhcmNoRXZlbnROYW1lLCBmdW5jdGlvbiAoJGV2ZW50LCBxdWVyeSkge1xuICAgICAgICAgICAgX3RoaXMuJHNjb3BlLnNlYXJjaFF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJpbWFyeVRleHRDb250cm9sbGVyO1xufSgpKTtcblByaW1hcnlUZXh0Q29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnXTtcbmV4cG9ydHMuUHJpbWFyeVRleHRDb250cm9sbGVyID0gUHJpbWFyeVRleHRDb250cm9sbGVyO1xudmFyIFByaW1hcnlUZXh0RGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQcmltYXJ5VGV4dERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gW1wiXl5cIiArIFBlb3BsZVNlYXJjaE1vcmVEaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSwgXCJeXlwiICsgUGVvcGxlUGlja2VyRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWVdO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBQcmltYXJ5VGV4dENvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIlxcbiAgPGRpdiBuZy1zaG93PVxcXCIhJHBhcmVudC4kcGFyZW50LmRpc2Nvbm5lY3RlZFxcXCIgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hNb3JlUHJpbWFyeVxcXCI+XFxuICAgIDxkaXYgbmctc2hvdz1cXFwiJHBhcmVudC4kcGFyZW50LnByb2Nlc3NpbmdcXFwiPnt7c2VhcmNoaW5nRm9yVGV4dH19IHt7c2VhcmNoUXVlcnl9fTwvZGl2PlxcbiAgICA8bmctdHJhbnNjbHVkZSBuZy1zaG93PVxcXCIhJHBhcmVudC4kcGFyZW50LnByb2Nlc3NpbmdcXFwiPjwvbmctdHJhbnNjbHVkZT5cXG4gIDwvZGl2PlwiO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgc2VhcmNoaW5nRm9yVGV4dDogJ0A/dWlmU2VhcmNoRm9yVGV4dCdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5saW5rID0gZnVuY3Rpb24gKCRzY29wZSwgJGVsZW1lbnQsICRhdHRycywgY3RybHMsICR0cmFuc2NsdWRlKSB7XG4gICAgICAgICAgICAkc2NvcGUuc2VhcmNoaW5nRm9yVGV4dCA9ICRzY29wZS5zZWFyY2hpbmdGb3JUZXh0IHx8ICdTZWFyY2hpbmcgZm9yJztcbiAgICAgICAgfTtcbiAgICB9XG4gICAgUHJpbWFyeVRleHREaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQcmltYXJ5VGV4dERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFByaW1hcnlUZXh0RGlyZWN0aXZlO1xufSgpKTtcblByaW1hcnlUZXh0RGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUgPSAndWlmUHJpbWFyeVRleHQnO1xuZXhwb3J0cy5QcmltYXJ5VGV4dERpcmVjdGl2ZSA9IFByaW1hcnlUZXh0RGlyZWN0aXZlO1xudmFyIFNlY29uZGFyeVRleHREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNlY29uZGFyeVRleHREaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIlxcbiAgPGRpdiBuZy1zaG93PVxcXCIhJHBhcmVudC4kcGFyZW50LmRpc2Nvbm5lY3RlZFxcXCIgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hNb3JlU2Vjb25kYXJ5XFxcIj5cXG4gICAgPG5nLXRyYW5zY2x1ZGU+PC9uZy10cmFuc2NsdWRlPlxcbiAgPC9kaXY+XCI7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB0cnVlO1xuICAgIH1cbiAgICBTZWNvbmRhcnlUZXh0RGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFNlY29uZGFyeVRleHREaXJlY3RpdmU7XG59KCkpO1xuU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lID0gJ3VpZlNlY29uZGFyeVRleHQnO1xuZXhwb3J0cy5TZWNvbmRhcnlUZXh0RGlyZWN0aXZlID0gU2Vjb25kYXJ5VGV4dERpcmVjdGl2ZTtcbnZhciBEaXNjb25uZWN0ZWRUZXh0RGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaXNjb25uZWN0ZWRUZXh0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gXCJcXG4gIDxkaXYgbmctc2hvdz1cXFwiJHBhcmVudC4kcGFyZW50LmRpc2Nvbm5lY3RlZFxcXCIgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWFyY2hNb3JlUHJpbWFyeVxcXCI+XFxuICAgIDxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT5cXG4gIDwvZGl2PlwiO1xuICAgICAgICB0aGlzLnNjb3BlID0gdHJ1ZTtcbiAgICB9XG4gICAgRGlzY29ubmVjdGVkVGV4dERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERpc2Nvbm5lY3RlZFRleHREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBEaXNjb25uZWN0ZWRUZXh0RGlyZWN0aXZlO1xufSgpKTtcbkRpc2Nvbm5lY3RlZFRleHREaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSA9ICd1aWZEaXNjb25uZWN0ZWRUZXh0JztcbmV4cG9ydHMuRGlzY29ubmVjdGVkVGV4dERpcmVjdGl2ZSA9IERpc2Nvbm5lY3RlZFRleHREaXJlY3RpdmU7XG52YXIgUGVvcGxlUGlja2VyU2VsZWN0ZWREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlb3BsZVBpY2tlclNlbGVjdGVkRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gXCJcXG4gICAgPGRpdiBjbGFzcz1cXFwibXMtUGVvcGxlUGlja2VyLXNlbGVjdGVkXFxcIiBuZy1jbGFzcz1cXFwieydpcy1hY3RpdmUnOiBzZWxlY3RlZFBlb3BsZSAmJiBzZWxlY3RlZFBlb3BsZS5sZW5ndGggPiAwfVxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VsZWN0ZWRIZWFkZXJcXFwiPlxcbiAgICAgICAgICAgIDxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPHVsIGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VsZWN0ZWRQZW9wbGVcXFwiPlxcbiAgICAgICAgICA8bGkgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1zZWxlY3RlZFBlcnNvblxcXCIgbmctcmVwZWF0PVxcXCJwZXJzb24gaW4gc2VsZWN0ZWRQZW9wbGUgdHJhY2sgYnkgJGluZGV4XFxcIj5cXG4gICAgICAgICAgICA8dWlmLXBlcnNvbmEgbmctY2xpY2s9XFxcIm9uU2VsZWN0ZWRQZXJzb25DbGljaygpKHBlcnNvbilcXFwiXFxuICAgICAgICAgICAgICB1aWYtc3R5bGU9XFxcIlwiICsgcGVyc29uYVN0eWxlRW51bV8xLlBlcnNvbmFTdHlsZUVudW1bcGVyc29uYVN0eWxlRW51bV8xLlBlcnNvbmFTdHlsZUVudW0ucm91bmRdICsgXCJcXFwiXFxuICAgICAgICAgICAgICB1aWYtc2l6ZT1cXFwiXCIgKyBzaXplRW51bV8xLlBlcnNvbmFTaXplW3NpemVFbnVtXzEuUGVyc29uYVNpemUuc21hbGxdICsgXCJcXFwiXFxuICAgICAgICAgICAgICB1aWYtcHJlc2VuY2U9XFxcInt7cGVyc29uLnByZXNlbmNlfX1cXFwiXFxuICAgICAgICAgICAgICB1aWYtaW1hZ2UtdXJsPVxcXCJ7e3BlcnNvbi5pY29ufX1cXFwiPlxcbiAgICAgICAgICAgICAgPHVpZi1wZXJzb25hLWluaXRpYWxzIHVpZi1jb2xvcj1cXFwie3twZXJzb24uY29sb3J9fVxcXCI+e3twZXJzb24uaW5pdGlhbHN9fTwvdWlmLXBlcnNvbmEtaW5pdGlhbHM+XFxuICAgICAgICAgICAgICA8dWlmLXBlcnNvbmEtcHJpbWFyeS10ZXh0Pnt7cGVyc29uLnByaW1hcnlUZXh0fX08L3VpZi1wZXJzb25hLXByaW1hcnktdGV4dD5cXG4gICAgICAgICAgICAgIDx1aWYtcGVyc29uYS1zZWNvbmRhcnktdGV4dD57e3BlcnNvbi5zZWNvbmRhcnlUZXh0fX08L3VpZi1wZXJzb25hLXNlY29uZGFyeS10ZXh0PlxcbiAgICAgICAgICAgIDwvdWlmLXBlcnNvbmE+XFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgICAgICAgICAgICBuZy1jbGljaz1cXFwicmVtb3ZlUGVyc29uRnJvbVNlbGVjdGVkUGVvcGxlKCkocGVyc29uLCAkZXZlbnQpXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcIm1zLVBlb3BsZVBpY2tlci1yZXN1bHRBY3Rpb24ganMtcmVzdWx0UmVtb3ZlXFxcIj5cXG4gICAgICAgICAgICAgIDx1aWYtaWNvbiB1aWYtdHlwZT1cXFwiXCIgKyBpY29uRW51bV8xLkljb25FbnVtW2ljb25FbnVtXzEuSWNvbkVudW0ueF0gKyBcIlxcXCI+PC91aWYtaWNvbj5cXG4gICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgPC9saT5cXG4gICAgICAgIDwvdWw+XFxuICAgIDwvZGl2PlwiO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgb25TZWxlY3RlZFBlcnNvbkNsaWNrOiAnJj91aWZTZWxlY3RlZFBlcnNvbkNsaWNrJyxcbiAgICAgICAgICAgIHJlbW92ZVBlcnNvbkZyb21TZWxlY3RlZFBlb3BsZTogJyZ1aWZQZXJzb25DbG9zZScsXG4gICAgICAgICAgICBzZWxlY3RlZFBlb3BsZTogJz1uZ01vZGVsJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBQZW9wbGVQaWNrZXJTZWxlY3RlZERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBlb3BsZVBpY2tlclNlbGVjdGVkRGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gUGVvcGxlUGlja2VyU2VsZWN0ZWREaXJlY3RpdmU7XG59KCkpO1xuUGVvcGxlUGlja2VyU2VsZWN0ZWREaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSA9ICd1aWZQZW9wbGVQaWNrZXJTZWxlY3RlZCc7XG5leHBvcnRzLlBlb3BsZVBpY2tlclNlbGVjdGVkRGlyZWN0aXZlID0gUGVvcGxlUGlja2VyU2VsZWN0ZWREaXJlY3RpdmU7XG52YXIgU2VsZWN0ZWRQZW9wbGVIZWFkZXJEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNlbGVjdGVkUGVvcGxlSGVhZGVyRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBcIl5eXCIgKyBQZW9wbGVQaWNrZXJEaXJlY3RpdmUuZGlyZWN0aXZlTmFtZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBcIjxzcGFuIGNsYXNzPVxcXCJtcy1QZW9wbGVQaWNrZXItc2VsZWN0ZWRDb3VudFxcXCIgbmctdHJhbnNjbHVkZT48L3NwYW4+XCI7XG4gICAgICAgIHRoaXMubGluayA9IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIHBlb3BsZVBpY2tlckN0cmwsICR0cmFuc2NsdWRlKSB7XG4gICAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRQZXJzb25zID0gcGVvcGxlUGlja2VyQ3RybC5nZXRTZWxlY3RlZFBlcnNvbnMoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRQZW9wbGVIZWFkZXJEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBTZWxlY3RlZFBlb3BsZUhlYWRlckRpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFNlbGVjdGVkUGVvcGxlSGVhZGVyRGlyZWN0aXZlO1xufSgpKTtcblNlbGVjdGVkUGVvcGxlSGVhZGVyRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUgPSAndWlmU2VsZWN0ZWRQZW9wbGVIZWFkZXInO1xuZXhwb3J0cy5TZWxlY3RlZFBlb3BsZUhlYWRlckRpcmVjdGl2ZSA9IFNlbGVjdGVkUGVvcGxlSGVhZGVyRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5wZW9wbGVwaWNrZXInLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoUGVvcGxlUGlja2VyRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUsIFBlb3BsZVBpY2tlckRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZShQcmltYXJ5VGV4dERpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lLCBQcmltYXJ5VGV4dERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZShTZWNvbmRhcnlUZXh0RGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUsIFNlY29uZGFyeVRleHREaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoUGVvcGxlUGlja2VyUmVzdWx0TGlzdERpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lLCBQZW9wbGVQaWNrZXJSZXN1bHRMaXN0RGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKERpc2Nvbm5lY3RlZFRleHREaXJlY3RpdmUuZGlyZWN0aXZlTmFtZSwgRGlzY29ubmVjdGVkVGV4dERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZShQZW9wbGVQaWNrZXJTZWxlY3RlZERpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lLCBQZW9wbGVQaWNrZXJTZWxlY3RlZERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZShTZWxlY3RlZFBlb3BsZUhlYWRlckRpcmVjdGl2ZS5kaXJlY3RpdmVOYW1lLCBTZWxlY3RlZFBlb3BsZUhlYWRlckRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZShQZW9wbGVTZWFyY2hNb3JlRGlyZWN0aXZlLmRpcmVjdGl2ZU5hbWUsIFBlb3BsZVNlYXJjaE1vcmVEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvcGVvcGxlcGlja2VyL3Blb3BsZVBpY2tlckRpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gNDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIHBlcnNvbmFTdHlsZUVudW1fMSA9IHJlcXVpcmUoXCIuLi8uLi9jb3JlL3BlcnNvbmFTdHlsZUVudW1cIik7XG52YXIgcGVyc29uYVByZXNlbmNlRW51bV8xID0gcmVxdWlyZShcIi4uLy4uL2NvcmUvcGVyc29uYVByZXNlbmNlRW51bVwiKTtcbnZhciBwZXJzb25hSW5pdGlhbHNDb2xvckVudW1fMSA9IHJlcXVpcmUoXCIuLi8uLi9jb3JlL3BlcnNvbmFJbml0aWFsc0NvbG9yRW51bVwiKTtcbnZhciBzaXplRW51bV8xID0gcmVxdWlyZShcIi4vc2l6ZUVudW1cIik7XG52YXIgUGVyc29uYVRleHREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNvbmFUZXh0RGlyZWN0aXZlKGRpcmVjdGl2ZVR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVUeXBlID0gZGlyZWN0aXZlVHlwZTtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVDbGFzc2VzID0ge1xuICAgICAgICAgICAgJ29wdGlvbmFsJzogJ21zLVBlcnNvbmEtb3B0aW9uYWxUZXh0JyxcbiAgICAgICAgICAgICdwcmltYXJ5JzogJ21zLVBlcnNvbmEtcHJpbWFyeVRleHQnLFxuICAgICAgICAgICAgJ3NlY29uZGFyeSc6ICdtcy1QZXJzb25hLXNlY29uZGFyeVRleHQnLFxuICAgICAgICAgICAgJ3RlcnRpYXJ5JzogJ21zLVBlcnNvbmEtdGVydGlhcnlUZXh0J1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gZnVuY3Rpb24gKCRlbGVtZW50LCAkYXR0cnMpIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3RpdmVUZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwiJyArIF90aGlzLmF2YWlsYWJsZUNsYXNzZXNbX3RoaXMuZGlyZWN0aXZlVHlwZV0gKyAnXCIgbmctdHJhbnNjbHVkZT48L2Rpdj4nO1xuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZVRlbXBsYXRlO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoYW5ndWxhci5pc1VuZGVmaW5lZCh0aGlzLmF2YWlsYWJsZUNsYXNzZXNbdGhpcy5kaXJlY3RpdmVUeXBlXSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlVHlwZSA9ICdvcHRpb25hbCc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUGVyc29uYVRleHREaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUGVyc29uYVRleHREaXJlY3RpdmUodHlwZSk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gUGVyc29uYVRleHREaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5QZXJzb25hVGV4dERpcmVjdGl2ZSA9IFBlcnNvbmFUZXh0RGlyZWN0aXZlO1xudmFyIFBlcnNvbmFJbml0aWFsc0RpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGVyc29uYUluaXRpYWxzRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gWydedWlmUGVyc29uYSddO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgJ3VpZkNvbG9yJzogJ0AnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLVBlcnNvbmEtaW5pdGlhbHMgbXMtUGVyc29uYS1pbml0aWFscy0te3t1aWZDb2xvcn19XCIgbmctdHJhbnNjbHVkZT48L2Rpdj4gJztcbiAgICAgICAgdGhpcy5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY3RybHMpIHtcbiAgICAgICAgICAgIHZhciBwZXJzb25hQ29udHJvbGxlciA9IGN0cmxzWzBdO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQoYXR0cnMudWlmQ29sb3IpKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUudWlmQ29sb3IgPSBwZXJzb25hSW5pdGlhbHNDb2xvckVudW1fMS5QZXJzb25hSW5pdGlhbHNDb2xvcltwZXJzb25hSW5pdGlhbHNDb2xvckVudW1fMS5QZXJzb25hSW5pdGlhbHNDb2xvci5ibHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaCgndWlmQ29sb3InLCBmdW5jdGlvbiAobmV3Q29sb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc1VuZGVmaW5lZChwZXJzb25hSW5pdGlhbHNDb2xvckVudW1fMS5QZXJzb25hSW5pdGlhbHNDb2xvcltuZXdDb2xvcl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlcnNvbmFDb250cm9sbGVyLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLnBlcnNvbmEgLSBcIicgKyBuZXdDb2xvciArICdcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdWlmQ29sb3IuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIEl0IHNob3VsZCBiZSBsaWdodEJsdWUsIGJsdWUsIGRhcmtCbHVlLCB0ZWFsLCBsaWdodEdyZWVuLCBncmVlbiwnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgZGFya0dyZWVuLCBsaWdodFBpbmssIHBpbmssIG1hZ2VudGEsIHB1cnBsZSwgYmxhY2ssIG9yYW5nZSwgcmVkIG9yIGRhcmtSZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIFBlcnNvbmFJbml0aWFsc0RpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBlcnNvbmFJbml0aWFsc0RpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFBlcnNvbmFJbml0aWFsc0RpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLlBlcnNvbmFJbml0aWFsc0RpcmVjdGl2ZSA9IFBlcnNvbmFJbml0aWFsc0RpcmVjdGl2ZTtcbnZhciBQZXJzb25hRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQZXJzb25hRGlyZWN0aXZlKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ3VpZlBlcnNvbmEnXTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gUGVyc29uYUNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICAndWlmSW1hZ2VVcmwnOiAnQCcsXG4gICAgICAgICAgICAndWlmUHJlc2VuY2UnOiAnQCcsXG4gICAgICAgICAgICAndWlmU2l6ZSc6ICdAJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hXCIgbmctY2xhc3M9XCJnZXRQZXJzb25hQ2xhc3NlcygpXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLVBlcnNvbmEtaW1hZ2VBcmVhXCIgbmctc2hvdz1cImdldEltYWdlQXJlYVZpc2liaWxpdHkoKVwiPicgK1xuICAgICAgICAgICAgJzxpbWcgY2xhc3M9XCJtcy1QZXJzb25hLWltYWdlXCIgbmctc3JjPVwie3t1aWZJbWFnZVVybH19XCIgbmctaWY9XCJ1aWZJbWFnZVVybFwiPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hLXByZXNlbmNlXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLVBlcnNvbmEtZGV0YWlsc1wiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHRoaXMudWlmU2l6ZUNsYXNzZXMgPSAoX2EgPSB7fSxcbiAgICAgICAgICAgIF9hW3NpemVFbnVtXzEuUGVyc29uYVNpemUudGlueV0gPSAnbXMtUGVyc29uYS0tdGlueScsXG4gICAgICAgICAgICBfYVtzaXplRW51bV8xLlBlcnNvbmFTaXplLnhzbWFsbF0gPSAnbXMtUGVyc29uYS0teHMnLFxuICAgICAgICAgICAgX2Fbc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS5zbWFsbF0gPSAnbXMtUGVyc29uYS0tc20nLFxuICAgICAgICAgICAgX2Fbc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS5sYXJnZV0gPSAnbXMtUGVyc29uYS0tbGcnLFxuICAgICAgICAgICAgX2Fbc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS54bGFyZ2VdID0gJ21zLVBlcnNvbmEtLXhsJyxcbiAgICAgICAgICAgIF9hKTtcbiAgICAgICAgdGhpcy51aWZQcmVzZW5jZUNsYXNzZXMgPSAoX2IgPSB7fSxcbiAgICAgICAgICAgIF9iW3BlcnNvbmFQcmVzZW5jZUVudW1fMS5QcmVzZW5jZUVudW0uYXZhaWxhYmxlXSA9ICdtcy1QZXJzb25hLS1hdmFpbGFibGUnLFxuICAgICAgICAgICAgX2JbcGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bS5hd2F5XSA9ICdtcy1QZXJzb25hLS1hd2F5JyxcbiAgICAgICAgICAgIF9iW3BlcnNvbmFQcmVzZW5jZUVudW1fMS5QcmVzZW5jZUVudW0uYmxvY2tlZF0gPSAnbXMtUGVyc29uYS0tYmxvY2tlZCcsXG4gICAgICAgICAgICBfYltwZXJzb25hUHJlc2VuY2VFbnVtXzEuUHJlc2VuY2VFbnVtLmJ1c3ldID0gJ21zLVBlcnNvbmEtLWJ1c3knLFxuICAgICAgICAgICAgX2JbcGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bS5kbmRdID0gJ21zLVBlcnNvbmEtLWRuZCcsXG4gICAgICAgICAgICBfYltwZXJzb25hUHJlc2VuY2VFbnVtXzEuUHJlc2VuY2VFbnVtLm9mZmxpbmVdID0gJ21zLVBlcnNvbmEtLW9mZmxpbmUnLFxuICAgICAgICAgICAgX2IpO1xuICAgICAgICB0aGlzLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycywgdHJhbnNjbHVkZSkge1xuICAgICAgICAgICAgdmFyIHBlcnNvbmFDb250cm9sbGVyID0gY29udHJvbGxlcnNbMF07XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoYXR0cnMudWlmU2l6ZSkgJiYgYW5ndWxhci5pc1VuZGVmaW5lZChzaXplRW51bV8xLlBlcnNvbmFTaXplW2F0dHJzLnVpZlNpemVdKSkge1xuICAgICAgICAgICAgICAgIHBlcnNvbmFDb250cm9sbGVyLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLnBlcnNvbmEgLSBcIicgK1xuICAgICAgICAgICAgICAgICAgICBhdHRycy51aWZTaXplICsgJ1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB1aWZTaXplLiBJdCBzaG91bGQgYmUgdGlueSwgeHNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeGxhcmdlLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdHRycy51aWZTdHlsZSkgJiYgYW5ndWxhci5pc1VuZGVmaW5lZChwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bVthdHRycy51aWZTdHlsZV0pKSB7XG4gICAgICAgICAgICAgICAgcGVyc29uYUNvbnRyb2xsZXIuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGVyc29uYSAtIFwiJyArXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLnVpZlN0eWxlICsgJ1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB1aWZTdHlsZS4gSXQgc2hvdWxkIGJlIHJvdW5kIG9yIHNxdWFyZS4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoYXR0cnMudWlmUHJlc2VuY2UpICYmIGFuZ3VsYXIuaXNVbmRlZmluZWQocGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bVthdHRycy51aWZQcmVzZW5jZV0pKSB7XG4gICAgICAgICAgICAgICAgcGVyc29uYUNvbnRyb2xsZXIuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGVyc29uYSAtIFwiJyArXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLnVpZlByZXNlbmNlICsgJ1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB1aWZQcmVzZW5jZS4gSXQgc2hvdWxkIGJlIGF2YWlsYWJsZSwgYXdheSwgYmxvY2tlZCwgYnVzeSwgZG5kIG9yIG9mZmxpbmUuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuZ2V0SW1hZ2VBcmVhVmlzaWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHNpemVFbnVtXzEuUGVyc29uYVNpemVbYXR0cnMudWlmU2l6ZV0gIT09IHNpemVFbnVtXzEuUGVyc29uYVNpemUudGlueSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2NvcGUuZ2V0UGVyc29uYUNsYXNzZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcnNvbmFDbGFzc2VzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSBzaXplRW51bV8xLlBlcnNvbmFTaXplW2F0dHJzLnVpZlNpemVdO1xuICAgICAgICAgICAgICAgIHZhciBwcmVzZW5jZSA9IGFuZ3VsYXIuaXNEZWZpbmVkKGF0dHJzLnVpZlByZXNlbmNlKSA/IHBlcnNvbmFQcmVzZW5jZUVudW1fMS5QcmVzZW5jZUVudW1bYXR0cnMudWlmUHJlc2VuY2VdIDogcGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bS5vZmZsaW5lO1xuICAgICAgICAgICAgICAgIGlmIChwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bVthdHRycy51aWZTdHlsZV0gPT09IHBlcnNvbmFTdHlsZUVudW1fMS5QZXJzb25hU3R5bGVFbnVtLnNxdWFyZSkge1xuICAgICAgICAgICAgICAgICAgICBwZXJzb25hQ2xhc3Nlcy5wdXNoKCdtcy1QZXJzb25hLS1zcXVhcmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNpemVDbGFzcyA9IF90aGlzLnVpZlNpemVDbGFzc2VzW3NpemVdO1xuICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChzaXplQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlcnNvbmFDbGFzc2VzLnB1c2goc2l6ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGVyc29uYUNsYXNzZXMucHVzaChfdGhpcy51aWZQcmVzZW5jZUNsYXNzZXNbcHJlc2VuY2VdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVyc29uYUNsYXNzZXMuam9pbignICcpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYW5zY2x1ZGUoZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRldGFpbHNXcmFwcGVyID0gYW5ndWxhci5lbGVtZW50KGVsZW1lbnRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbXMtUGVyc29uYS1kZXRhaWxzJykpO1xuICAgICAgICAgICAgICAgIHZhciBpbWFnZUFyZWEgPSBhbmd1bGFyLmVsZW1lbnQoZWxlbWVudFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtcy1QZXJzb25hLWltYWdlQXJlYScpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWdOYW1lID0gY2xvbmVbaV0udGFnTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVSUYtUEVSU09OQS1QUklNQVJZLVRFWFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlGLVBFUlNPTkEtU0VDT05EQVJZLVRFWFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlGLVBFUlNPTkEtVEVSVElBUlktVEVYVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVSUYtUEVSU09OQS1PUFRJT05BTC1URVhUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzV3JhcHBlci5hcHBlbmQoY2xvbmVbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlGLVBFUlNPTkEtSU5JVElBTFMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlQXJlYS5wcmVwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICB9XG4gICAgUGVyc29uYURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBlcnNvbmFEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBQZXJzb25hRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuUGVyc29uYURpcmVjdGl2ZSA9IFBlcnNvbmFEaXJlY3RpdmU7XG52YXIgUGVyc29uYUNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNvbmFDb250cm9sbGVyKCRsb2cpIHtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICB9XG4gICAgcmV0dXJuIFBlcnNvbmFDb250cm9sbGVyO1xufSgpKTtcblBlcnNvbmFDb250cm9sbGVyLiRpbmplY3QgPSBbJyRsb2cnXTtcbmV4cG9ydHMuUGVyc29uYUNvbnRyb2xsZXIgPSBQZXJzb25hQ29udHJvbGxlcjtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGVyc29uYScsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBlcnNvbmEnLCBQZXJzb25hRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZQZXJzb25hSW5pdGlhbHMnLCBQZXJzb25hSW5pdGlhbHNEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBlcnNvbmFQcmltYXJ5VGV4dCcsIFBlcnNvbmFUZXh0RGlyZWN0aXZlLmZhY3RvcnkoJ3ByaW1hcnknKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZQZXJzb25hU2Vjb25kYXJ5VGV4dCcsIFBlcnNvbmFUZXh0RGlyZWN0aXZlLmZhY3RvcnkoJ3NlY29uZGFyeScpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBlcnNvbmFUZXJ0aWFyeVRleHQnLCBQZXJzb25hVGV4dERpcmVjdGl2ZS5mYWN0b3J5KCd0ZXJ0aWFyeScpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBlcnNvbmFPcHRpb25hbFRleHQnLCBQZXJzb25hVGV4dERpcmVjdGl2ZS5mYWN0b3J5KCcnKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3BlcnNvbmEvcGVyc29uYURpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gNDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIHNpemVFbnVtXzEgPSByZXF1aXJlKFwiLi9zaXplRW51bVwiKTtcbnZhciBwbGFjZWhvbGRlckVudW1fMSA9IHJlcXVpcmUoXCIuL3BsYWNlaG9sZGVyRW51bVwiKTtcbnZhciBwZXJzb25hU3R5bGVFbnVtXzEgPSByZXF1aXJlKFwiLi4vLi4vY29yZS9wZXJzb25hU3R5bGVFbnVtXCIpO1xudmFyIHBlcnNvbmFQcmVzZW5jZUVudW1fMSA9IHJlcXVpcmUoXCIuLi8uLi9jb3JlL3BlcnNvbmFQcmVzZW5jZUVudW1cIik7XG52YXIgUGVyc29uYUNhcmREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNvbmFDYXJkRGlyZWN0aXZlKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ3VpZlBlcnNvbmFDYXJkJ107XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFBlcnNvbmFDYXJkQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgICd1aWZJbWFnZVVybCc6ICdAJyxcbiAgICAgICAgICAgICd1aWZQcmVzZW5jZSc6ICdAJyxcbiAgICAgICAgICAgICd1aWZTaXplJzogJ0AnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIm1zLVBlcnNvbmFDYXJkXCIgbmctY2xhc3M9XCJnZXRQZXJzb25hQ2FyZENsYXNzZXMoKVwiPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hQ2FyZC1wZXJzb25hXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLVBlcnNvbmFcIiBuZy1jbGFzcz1cImdldFBlcnNvbmFDbGFzc2VzKClcIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwibXMtUGVyc29uYS1pbWFnZUFyZWFcIj4nICtcbiAgICAgICAgICAgICc8dWlmLWljb24gdWlmLXR5cGU9XCJwZXJzb25cIj48L3VpZi1pY29uPicgK1xuICAgICAgICAgICAgJzxpbWcgY2xhc3M9XCJtcy1QZXJzb25hLWltYWdlXCIgbmctc3JjPVwie3t1aWZJbWFnZVVybH19XCIgbmctaWY9XCJ1aWZJbWFnZVVybFwiPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hLXByZXNlbmNlXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLVBlcnNvbmEtZGV0YWlsc1wiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzx1bCBjbGFzcz1cIm1zLVBlcnNvbmFDYXJkLWFjdGlvbnNcIj4nICtcbiAgICAgICAgICAgICc8bGkgbmctcmVwZWF0PVwiYWN0aW9uIGluIHBlcnNvbmFDYXJkQWN0aW9uc1wiIG5nLWNsYXNzPVwiZ2V0QWN0aW9uQ2xhc3NlcyhhY3Rpb24pXCIgbmctY2xpY2s9XCJzZWxlY3RBY3Rpb24oJGV2ZW50LCBhY3Rpb24pXCI+JyArXG4gICAgICAgICAgICAnPHVpZi1pY29uIHVpZi10eXBlPXt7YWN0aW9uLmljb259fSBuZy1pZj1cImFjdGlvbi5wbGFjZWhvbGRlciAhPSBcXCdvdmVyZmxvd1xcJ1wiPjwvdWlmLWljb24+JyArXG4gICAgICAgICAgICAnPC9saT4nICtcbiAgICAgICAgICAgICc8L3VsPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hQ2FyZC1hY3Rpb25EZXRhaWxCb3hcIj4nICtcbiAgICAgICAgICAgICc8dWwgbmctY2xhc3M9XCJkZXRhaWxDbGFzc1wiPjwvdWw+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgdGhpcy5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycywgY29udHJvbGxlcnMsIHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgICAgIHZhciBwZXJzb25hQ2FyZENvbnRyb2xsZXIgPSBjb250cm9sbGVyc1swXTtcbiAgICAgICAgICAgIHZhciBpY29uID0gZWxlbWVudC5maW5kKCd1aWYtaWNvbicpO1xuICAgICAgICAgICAgaWNvbi5hZGRDbGFzcygnbXMtUGVyc29uYS1wbGFjZWhvbGRlcicpO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKGF0dHJzLnVpZlNpemUpICYmIGFuZ3VsYXIuaXNVbmRlZmluZWQoc2l6ZUVudW1fMS5QZXJzb25hU2l6ZVthdHRycy51aWZTaXplXSkpIHtcbiAgICAgICAgICAgICAgICBwZXJzb25hQ2FyZENvbnRyb2xsZXIuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGVyc29uYWNhcmQgLSBcIicgK1xuICAgICAgICAgICAgICAgICAgICBhdHRycy51aWZTaXplICsgJ1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB1aWZTaXplLiBJdCBzaG91bGQgYmUgeHNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeGxhcmdlLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdHRycy51aWZTdHlsZSkgJiYgYW5ndWxhci5pc1VuZGVmaW5lZChwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bVthdHRycy51aWZTdHlsZV0pKSB7XG4gICAgICAgICAgICAgICAgcGVyc29uYUNhcmRDb250cm9sbGVyLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLnBlcnNvbmFjYXJkIC0gXCInICtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMudWlmU3R5bGUgKyAnXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHVpZlN0eWxlLiBJdCBzaG91bGQgYmUgcm91bmQgb3Igc3F1YXJlLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdHRycy51aWZQcmVzZW5jZSkgJiYgYW5ndWxhci5pc1VuZGVmaW5lZChwZXJzb25hUHJlc2VuY2VFbnVtXzEuUHJlc2VuY2VFbnVtW2F0dHJzLnVpZlByZXNlbmNlXSkpIHtcbiAgICAgICAgICAgICAgICBwZXJzb25hQ2FyZENvbnRyb2xsZXIuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGVyc29uYWNhcmQgLSBcIicgK1xuICAgICAgICAgICAgICAgICAgICBhdHRycy51aWZQcmVzZW5jZSArICdcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdWlmUHJlc2VuY2UuIEl0IHNob3VsZCBiZSBhdmFpbGFibGUsIGF3YXksIGJsb2NrZWQsIGJ1c3ksIGRuZCBvciBvZmZsaW5lLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmdldEFjdGlvbkNsYXNzZXMgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFjdGlvbkNsYXNzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlckVudW1fMS5QbGFjZWhvbGRlckVudW1bYWN0aW9uLnBsYWNlaG9sZGVyXTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgcGxhY2Vob2xkZXJFbnVtXzEuUGxhY2Vob2xkZXJFbnVtLnRvcHJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ2xhc3Nlcy5wdXNoKCdtcy1QZXJzb25hQ2FyZC1hY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNsYXNzZXMucHVzaCgnbXMtUGVyc29uYUNhcmQtb3JnQ2hhcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHBsYWNlaG9sZGVyRW51bV8xLlBsYWNlaG9sZGVyRW51bS5yZWd1bGFyOlxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ2xhc3Nlcy5wdXNoKCdtcy1QZXJzb25hQ2FyZC1hY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ2xhc3Nlcy5wdXNoKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbkNsYXNzZXMuam9pbignICcpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNjb3BlLmdldFBlcnNvbmFDbGFzc2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBwZXJzb25hQ2xhc3NlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bVthdHRycy51aWZTdHlsZV0gPT09IHBlcnNvbmFTdHlsZUVudW1fMS5QZXJzb25hU3R5bGVFbnVtLnNxdWFyZSkge1xuICAgICAgICAgICAgICAgICAgICBwZXJzb25hQ2xhc3Nlcy5wdXNoKCdtcy1QZXJzb25hLS1zcXVhcmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoIChzaXplRW51bV8xLlBlcnNvbmFTaXplW2F0dHJzLnVpZlNpemVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS54c21hbGw6XG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hQ2xhc3Nlcy5wdXNoKCdtcy1QZXJzb25hLS14cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2l6ZUVudW1fMS5QZXJzb25hU2l6ZS5zbWFsbDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFDbGFzc2VzLnB1c2goJ21zLVBlcnNvbmEtLXNtJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzaXplRW51bV8xLlBlcnNvbmFTaXplLmxhcmdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYUNsYXNzZXMucHVzaCgnbXMtUGVyc29uYS0tbGcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHNpemVFbnVtXzEuUGVyc29uYVNpemUueGxhcmdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYUNsYXNzZXMucHVzaCgnbXMtUGVyc29uYS0teGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bVthdHRycy51aWZQcmVzZW5jZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBwZXJzb25hUHJlc2VuY2VFbnVtXzEuUHJlc2VuY2VFbnVtLmF2YWlsYWJsZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFDbGFzc2VzLnB1c2goJ21zLVBlcnNvbmEtLWF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgcGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bS5hd2F5OlxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYUNsYXNzZXMucHVzaCgnbXMtUGVyc29uYS0tYXdheScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgcGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bS5ibG9ja2VkOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYUNsYXNzZXMucHVzaCgnbXMtUGVyc29uYS0tYmxvY2tlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgcGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bS5idXN5OlxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYUNsYXNzZXMucHVzaCgnbXMtUGVyc29uYS0tYnVzeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgcGVyc29uYVByZXNlbmNlRW51bV8xLlByZXNlbmNlRW51bS5kbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hQ2xhc3Nlcy5wdXNoKCdtcy1QZXJzb25hLS1kbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYUNsYXNzZXMucHVzaCgnbXMtUGVyc29uYS0tb2ZmbGluZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwZXJzb25hQ2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2NvcGUuZ2V0UGVyc29uYUNhcmRDbGFzc2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwZXJzb25hU3R5bGVFbnVtXzEuUGVyc29uYVN0eWxlRW51bVthdHRycy51aWZTdHlsZV0gPT09IHBlcnNvbmFTdHlsZUVudW1fMS5QZXJzb25hU3R5bGVFbnVtLnNxdWFyZSA/ICdtcy1QZXJzb25hQ2FyZC0tc3F1YXJlJyA6ICcnO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYW5zY2x1ZGUoZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRldGFpbHNXcmFwcGVyID0gYW5ndWxhci5lbGVtZW50KGVsZW1lbnRbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbXMtUGVyc29uYS1kZXRhaWxzJykpO1xuICAgICAgICAgICAgICAgIHZhciBhY3Rpb25EZXRhaWxzQm94TGlzdCA9IGFuZ3VsYXIuZWxlbWVudChlbGVtZW50WzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21zLVBlcnNvbmFDYXJkLWFjdGlvbkRldGFpbEJveCcpKVxuICAgICAgICAgICAgICAgICAgICAuZmluZCgndWwnKS5lcSgwKTtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aW9uc0xpc3QgPSBhbmd1bGFyLmVsZW1lbnQoZWxlbWVudFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtcy1QZXJzb25hQ2FyZC1hY3Rpb25zJykpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZ05hbWUgPSBjbG9uZVtpXS50YWdOYW1lO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRi1QRVJTT05BLUNBUkQtUFJJTUFSWS1URVhUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRi1QRVJTT05BLUNBUkQtU0VDT05EQVJZLVRFWFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlGLVBFUlNPTkEtQ0FSRC1URVJUSUFSWS1URVhUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRi1QRVJTT05BLUNBUkQtT1BUSU9OQUwtVEVYVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsc1dyYXBwZXIuYXBwZW5kKGNsb25lW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRi1QRVJTT05BLUNBUkQtQUNUSU9OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3JhcHBlZEFjdGlvbiA9IGFuZ3VsYXIuZWxlbWVudChjbG9uZVtpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gd3JhcHBlZEFjdGlvbi5hdHRyKCd1aWYtcGxhY2Vob2xkZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2Vob2xkZXJFbnVtXzEuUGxhY2Vob2xkZXJFbnVtW3BsYWNlaG9sZGVyXSA9PT0gcGxhY2Vob2xkZXJFbnVtXzEuUGxhY2Vob2xkZXJFbnVtLm92ZXJmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNMaXN0LmFwcGVuZCh3cmFwcGVkQWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRldGFpbHNCb3hMaXN0LmFwcGVuZChfdGhpcy5wcm9jZXNzQWN0aW9uKHdyYXBwZWRBY3Rpb24sIHNjb3BlLCBwZXJzb25hQ2FyZENvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIFBlcnNvbmFDYXJkRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUGVyc29uYUNhcmREaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIFBlcnNvbmFDYXJkRGlyZWN0aXZlLnByb3RvdHlwZS5wcm9jZXNzQWN0aW9uID0gZnVuY3Rpb24gKGNsb25lLCBzY29wZSwgcGVyc29uYUNhcmRDb250cm9sbGVyKSB7XG4gICAgICAgIHZhciBjbGFzc1RvQWRkID0gJyc7XG4gICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGNsb25lLmF0dHIoJ3VpZi1wbGFjZWhvbGRlcicpO1xuICAgICAgICB2YXIgaWNvbiA9IGNsb25lLmF0dHIoJ3VpZi1pY29uJyk7XG4gICAgICAgIHZhciBhY3Rpb25Ub0FkZCA9IG5ldyBQZXJzb25hQ2FyZEFjdGlvbihpY29uLCBwbGFjZWhvbGRlcik7XG4gICAgICAgIHN3aXRjaCAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIGNhc2UgcGxhY2Vob2xkZXJFbnVtXzEuUGxhY2Vob2xkZXJFbnVtW3BsYWNlaG9sZGVyRW51bV8xLlBsYWNlaG9sZGVyRW51bS5yZWd1bGFyXTpcbiAgICAgICAgICAgICAgICBjbGFzc1RvQWRkID0gJ2RldGFpbC0nICsgKCsrc2NvcGUucmVndWxhckFjdGlvbnNDb3VudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHBsYWNlaG9sZGVyRW51bV8xLlBsYWNlaG9sZGVyRW51bVtwbGFjZWhvbGRlckVudW1fMS5QbGFjZWhvbGRlckVudW0udG9wcmlnaHRdOlxuICAgICAgICAgICAgICAgIGNsYXNzVG9BZGQgPSAnZGV0YWlsLTUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjbG9uZS5maW5kKCdsaScpLmVxKDApLmFkZENsYXNzKGNsYXNzVG9BZGQpO1xuICAgICAgICBhY3Rpb25Ub0FkZC5kZXRhaWxDbGFzcyA9IGNsYXNzVG9BZGQ7XG4gICAgICAgIHBlcnNvbmFDYXJkQ29udHJvbGxlci5hZGRBY3Rpb24oYWN0aW9uVG9BZGQpO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfTtcbiAgICByZXR1cm4gUGVyc29uYUNhcmREaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5QZXJzb25hQ2FyZERpcmVjdGl2ZSA9IFBlcnNvbmFDYXJkRGlyZWN0aXZlO1xudmFyIFBlcnNvbmFDYXJkQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGVyc29uYUNhcmRDb250cm9sbGVyKCRsb2csICRzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLiRsb2cgPSAkbG9nO1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy5kZXRhaWxDc3MgPSB7XG4gICAgICAgICAgICAxOiAnQ2hhdCcsXG4gICAgICAgICAgICAyOiAnUGhvbmUnLFxuICAgICAgICAgICAgMzogJ1ZpZGVvJyxcbiAgICAgICAgICAgIDQ6ICdNYWlsJyxcbiAgICAgICAgICAgIDU6ICdPcmcnXG4gICAgICAgIH07XG4gICAgICAgICRzY29wZS5wZXJzb25hQ2FyZEFjdGlvbnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgJHNjb3BlLnJlZ3VsYXJBY3Rpb25zQ291bnQgPSAwO1xuICAgICAgICAkc2NvcGUuZGV0YWlsQ2xhc3MgPSAnbXMtUGVyc29uYUNhcmQtZGV0YWlsQ2hhdCc7XG4gICAgICAgICRzY29wZS5zZWxlY3RBY3Rpb24gPSBmdW5jdGlvbiAoJGV2ZW50LCBhY3Rpb24pIHtcbiAgICAgICAgICAgICRzY29wZS5wZXJzb25hQ2FyZEFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhY3Rpb24uaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIGRldGFpbE51bWJlciA9ICsoYWN0aW9uLmRldGFpbENsYXNzLmNoYXJBdChhY3Rpb24uZGV0YWlsQ2xhc3MubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgJHNjb3BlLmRldGFpbENsYXNzID0gJ21zLVBlcnNvbmFDYXJkLWRldGFpbCcgKyBfdGhpcy5kZXRhaWxDc3NbZGV0YWlsTnVtYmVyXTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgUGVyc29uYUNhcmRDb250cm9sbGVyLnByb3RvdHlwZS5hZGRBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uVG9BZGQpIHtcbiAgICAgICAgaWYgKHRoaXMuJHNjb3BlLnBlcnNvbmFDYXJkQWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGFjdGlvblRvQWRkLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRzY29wZS5wZXJzb25hQ2FyZEFjdGlvbnMucHVzaChhY3Rpb25Ub0FkZCk7XG4gICAgfTtcbiAgICByZXR1cm4gUGVyc29uYUNhcmRDb250cm9sbGVyO1xufSgpKTtcblBlcnNvbmFDYXJkQ29udHJvbGxlci4kaW5qZWN0ID0gWyckbG9nJywgJyRzY29wZSddO1xuZXhwb3J0cy5QZXJzb25hQ2FyZENvbnRyb2xsZXIgPSBQZXJzb25hQ2FyZENvbnRyb2xsZXI7XG52YXIgUGVyc29uYUNhcmRBY3Rpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNvbmFDYXJkQWN0aW9uKGljb24sIHBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgcmV0dXJuIFBlcnNvbmFDYXJkQWN0aW9uO1xufSgpKTtcbnZhciBQZXJzb25hQ2FyZFRleHREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNvbmFDYXJkVGV4dERpcmVjdGl2ZShkaXJlY3RpdmVUeXBlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlVHlwZSA9IGRpcmVjdGl2ZVR5cGU7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjb3BlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlQ2xhc3NlcyA9IHtcbiAgICAgICAgICAgICdvcHRpb25hbCc6ICdtcy1QZXJzb25hLW9wdGlvbmFsVGV4dCcsXG4gICAgICAgICAgICAncHJpbWFyeSc6ICdtcy1QZXJzb25hLXByaW1hcnlUZXh0JyxcbiAgICAgICAgICAgICdzZWNvbmRhcnknOiAnbXMtUGVyc29uYS1zZWNvbmRhcnlUZXh0JyxcbiAgICAgICAgICAgICd0ZXJ0aWFyeSc6ICdtcy1QZXJzb25hLXRlcnRpYXJ5VGV4dCdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IGZ1bmN0aW9uICgkZWxlbWVudCwgJGF0dHJzKSB7XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlVGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cIicgKyBfdGhpcy5hdmFpbGFibGVDbGFzc2VzW190aGlzLmRpcmVjdGl2ZVR5cGVdICsgJ1wiIG5nLXRyYW5zY2x1ZGU+PC9kaXY+JztcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQodGhpcy5hdmFpbGFibGVDbGFzc2VzW3RoaXMuZGlyZWN0aXZlVHlwZV0pKSB7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZVR5cGUgPSAnb3B0aW9uYWwnO1xuICAgICAgICB9XG4gICAgfVxuICAgIFBlcnNvbmFDYXJkVGV4dERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQZXJzb25hQ2FyZFRleHREaXJlY3RpdmUodHlwZSk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICByZXR1cm4gUGVyc29uYUNhcmRUZXh0RGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuUGVyc29uYUNhcmRUZXh0RGlyZWN0aXZlID0gUGVyc29uYUNhcmRUZXh0RGlyZWN0aXZlO1xudmFyIFBlcnNvbmFDYXJkQWN0aW9uRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQZXJzb25hQ2FyZEFjdGlvbkRpcmVjdGl2ZSgkbG9nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuJGxvZyA9ICRsb2c7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSAnXj91aWZQZXJzb25hQ2FyZCc7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IGZ1bmN0aW9uIChpbnN0YW5jZUVsZW1lbnQsIGFjdGlvbkF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoYWN0aW9uQXR0cnMudWlmUGxhY2Vob2xkZXIpICYmIGFuZ3VsYXIuaXNVbmRlZmluZWQocGxhY2Vob2xkZXJFbnVtXzEuUGxhY2Vob2xkZXJFbnVtW2FjdGlvbkF0dHJzLnVpZlBsYWNlaG9sZGVyXSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5wZXJzb25hY2FyZCAtICcgK1xuICAgICAgICAgICAgICAgICAgICAnXCInICsgYWN0aW9uQXR0cnMudWlmUGxhY2Vob2xkZXIgKyAnXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHVpZlBsYWNlaG9sZGVyLiBJdCBzaG91bGQgYmUgcmVndWxhciwgdG9wcmlnaHQgb3Igb3ZlcmZsb3cuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyRW51bV8xLlBsYWNlaG9sZGVyRW51bVthY3Rpb25BdHRycy51aWZQbGFjZWhvbGRlcl0gPT09IHBsYWNlaG9sZGVyRW51bV8xLlBsYWNlaG9sZGVyRW51bS5vdmVyZmxvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiAnPGxpIGNsYXNzPVwibXMtUGVyc29uYUNhcmQtb3ZlcmZsb3dcIiBuZy10cmFuc2NsdWRlPjwvbGk+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnPGxpIGNsYXNzPVwibXMtUGVyc29uYUNhcmQtYWN0aW9uRGV0YWlsc1wiIG5nLXRyYW5zY2x1ZGU+PC9saT4nO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBQZXJzb25hQ2FyZEFjdGlvbkRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCRsb2cpIHsgcmV0dXJuIG5ldyBQZXJzb25hQ2FyZEFjdGlvbkRpcmVjdGl2ZSgkbG9nKTsgfTtcbiAgICAgICAgZGlyZWN0aXZlLiRpbmplY3QgPSBbJyRsb2cnXTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBQZXJzb25hQ2FyZEFjdGlvbkRpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLlBlcnNvbmFDYXJkQWN0aW9uRGlyZWN0aXZlID0gUGVyc29uYUNhcmRBY3Rpb25EaXJlY3RpdmU7XG52YXIgUGVyc29uYUNhcmREZXRhaWxMYWJlbERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGVyc29uYUNhcmREZXRhaWxMYWJlbERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxzcGFuIGNsYXNzPVwibXMtUGVyc29uYUNhcmQtZGV0YWlsTGFiZWxcIiBuZy10cmFuc2NsdWRlPjwvc3Bhbj4nO1xuICAgIH1cbiAgICBQZXJzb25hQ2FyZERldGFpbExhYmVsRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUGVyc29uYUNhcmREZXRhaWxMYWJlbERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFBlcnNvbmFDYXJkRGV0YWlsTGFiZWxEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5QZXJzb25hQ2FyZERldGFpbExhYmVsRGlyZWN0aXZlID0gUGVyc29uYUNhcmREZXRhaWxMYWJlbERpcmVjdGl2ZTtcbnZhciBQZXJzb25hQ2FyZERldGFpbExpbmVEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNvbmFDYXJkRGV0YWlsTGluZURpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1QZXJzb25hQ2FyZC1kZXRhaWxMaW5lXCIgbmctdHJhbnNjbHVkZT48L2Rpdj4nO1xuICAgIH1cbiAgICBQZXJzb25hQ2FyZERldGFpbExpbmVEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQZXJzb25hQ2FyZERldGFpbExpbmVEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBQZXJzb25hQ2FyZERldGFpbExpbmVEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5QZXJzb25hQ2FyZERldGFpbExpbmVEaXJlY3RpdmUgPSBQZXJzb25hQ2FyZERldGFpbExpbmVEaXJlY3RpdmU7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLnBlcnNvbmFjYXJkJywgWydvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ10pXG4gICAgLmRpcmVjdGl2ZSgndWlmUGVyc29uYUNhcmQnLCBQZXJzb25hQ2FyZERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmUGVyc29uYUNhcmRBY3Rpb24nLCBQZXJzb25hQ2FyZEFjdGlvbkRpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmUGVyc29uYUNhcmREZXRhaWxMYWJlbCcsIFBlcnNvbmFDYXJkRGV0YWlsTGFiZWxEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBlcnNvbmFDYXJkRGV0YWlsTGluZScsIFBlcnNvbmFDYXJkRGV0YWlsTGluZURpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmUGVyc29uYUNhcmRQcmltYXJ5VGV4dCcsIFBlcnNvbmFDYXJkVGV4dERpcmVjdGl2ZS5mYWN0b3J5KCdwcmltYXJ5JykpXG4gICAgLmRpcmVjdGl2ZSgndWlmUGVyc29uYUNhcmRTZWNvbmRhcnlUZXh0JywgUGVyc29uYUNhcmRUZXh0RGlyZWN0aXZlLmZhY3RvcnkoJ3NlY29uZGFyeScpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBlcnNvbmFDYXJkVGVydGlhcnlUZXh0JywgUGVyc29uYUNhcmRUZXh0RGlyZWN0aXZlLmZhY3RvcnkoJ3RlcnRpYXJ5JykpXG4gICAgLmRpcmVjdGl2ZSgndWlmUGVyc29uYUNhcmRPcHRpb25hbFRleHQnLCBQZXJzb25hQ2FyZFRleHREaXJlY3RpdmUuZmFjdG9yeSgnJykpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9wZXJzb25hY2FyZC9wZXJzb25hY2FyZERpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgUGxhY2Vob2xkZXJFbnVtO1xuKGZ1bmN0aW9uIChQbGFjZWhvbGRlckVudW0pIHtcbiAgICBQbGFjZWhvbGRlckVudW1bUGxhY2Vob2xkZXJFbnVtW1wicmVndWxhclwiXSA9IDBdID0gXCJyZWd1bGFyXCI7XG4gICAgUGxhY2Vob2xkZXJFbnVtW1BsYWNlaG9sZGVyRW51bVtcInRvcHJpZ2h0XCJdID0gMV0gPSBcInRvcHJpZ2h0XCI7XG4gICAgUGxhY2Vob2xkZXJFbnVtW1BsYWNlaG9sZGVyRW51bVtcIm92ZXJmbG93XCJdID0gMl0gPSBcIm92ZXJmbG93XCI7XG59KShQbGFjZWhvbGRlckVudW0gPSBleHBvcnRzLlBsYWNlaG9sZGVyRW51bSB8fCAoZXhwb3J0cy5QbGFjZWhvbGRlckVudW0gPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9wZXJzb25hY2FyZC9wbGFjZWhvbGRlckVudW0udHNcbi8vIG1vZHVsZSBpZCA9IDQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFBlcnNvbmFTaXplO1xuKGZ1bmN0aW9uIChQZXJzb25hU2l6ZSkge1xuICAgIFBlcnNvbmFTaXplW1BlcnNvbmFTaXplW1wieHNtYWxsXCJdID0gMF0gPSBcInhzbWFsbFwiO1xuICAgIFBlcnNvbmFTaXplW1BlcnNvbmFTaXplW1wic21hbGxcIl0gPSAxXSA9IFwic21hbGxcIjtcbiAgICBQZXJzb25hU2l6ZVtQZXJzb25hU2l6ZVtcIm1lZGl1bVwiXSA9IDJdID0gXCJtZWRpdW1cIjtcbiAgICBQZXJzb25hU2l6ZVtQZXJzb25hU2l6ZVtcImxhcmdlXCJdID0gM10gPSBcImxhcmdlXCI7XG4gICAgUGVyc29uYVNpemVbUGVyc29uYVNpemVbXCJ4bGFyZ2VcIl0gPSA0XSA9IFwieGxhcmdlXCI7XG59KShQZXJzb25hU2l6ZSA9IGV4cG9ydHMuUGVyc29uYVNpemUgfHwgKGV4cG9ydHMuUGVyc29uYVNpemUgPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy9wZXJzb25hY2FyZC9zaXplRW51bS50c1xuLy8gbW9kdWxlIGlkID0gNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIHBpdm90U2l6ZUVudW1fMSA9IHJlcXVpcmUoXCIuL3Bpdm90U2l6ZUVudW1cIik7XG52YXIgcGl2b3RUeXBlRW51bV8xID0gcmVxdWlyZShcIi4vcGl2b3RUeXBlRW51bVwiKTtcbnZhciBQaXZvdENvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBpdm90Q29udHJvbGxlcigkbG9nLCAkc2NvcGUpIHtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy4kc2NvcGUgPSAkc2NvcGU7XG4gICAgICAgICRzY29wZS5waXZvdENsaWNrID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAkc2NvcGUudWlmUGl2b3RzLmZvckVhY2goZnVuY3Rpb24gKHBpdm90SXRlbSwgcGl2b3RJbmRleCkge1xuICAgICAgICAgICAgICAgIHBpdm90SXRlbS5zZWxlY3RlZCA9IHBpdm90SW5kZXggPT09IGluZGV4O1xuICAgICAgICAgICAgICAgIGlmIChwaXZvdEl0ZW0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnVpZlNlbGVjdGVkID0gcGl2b3RJdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gUGl2b3RDb250cm9sbGVyO1xufSgpKTtcblBpdm90Q29udHJvbGxlci4kaW5qZWN0ID0gWyckbG9nJywgJyRzY29wZSddO1xuZXhwb3J0cy5QaXZvdENvbnRyb2xsZXIgPSBQaXZvdENvbnRyb2xsZXI7XG52YXIgUGl2b3RJdGVtID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQaXZvdEl0ZW0odGl0bGUpIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gUGl2b3RJdGVtO1xufSgpKTtcbmV4cG9ydHMuUGl2b3RJdGVtID0gUGl2b3RJdGVtO1xudmFyIFBpdm90RWxsaXBzaXNEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBpdm90RWxsaXBzaXNEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxsaSBjbGFzcz1cIm1zLVBpdm90LWxpbmsgbXMtUGl2b3QtbGluay0tb3ZlcmZsb3dcIj4nICtcbiAgICAgICAgICAgICc8dWlmLWljb24gdWlmLXR5cGU9XCJlbGxpcHNpc1wiIGNsYXNzPVwibXMtUGl2b3QtZWxsaXBzaXNcIj48L3VpZi1pY29uPicgK1xuICAgICAgICAgICAgJzxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT4nICtcbiAgICAgICAgICAgICc8L2xpPic7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBmYWxzZTtcbiAgICB9XG4gICAgUGl2b3RFbGxpcHNpc0RpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBpdm90RWxsaXBzaXNEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBQaXZvdEVsbGlwc2lzRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuUGl2b3RFbGxpcHNpc0RpcmVjdGl2ZSA9IFBpdm90RWxsaXBzaXNEaXJlY3RpdmU7XG52YXIgUGl2b3REaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBpdm90RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gUGl2b3RDb250cm9sbGVyO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ3VpZlBpdm90J107XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPHVsIGNsYXNzPVwibXMtUGl2b3RcIiBuZy1jbGFzcz1cImdldENsYXNzZXMoKVwiID4nICtcbiAgICAgICAgICAgICc8c3BhbiBuZy1yZXBlYXQtc3RhcnQ9XCJwaXZvdCBpbiB1aWZQaXZvdHNcIj48L3NwYW4+JyArXG4gICAgICAgICAgICAnPGxpIGNsYXNzPVwibXMtUGl2b3QtbGlua1wiIG5nLWNsaWNrPVwicGl2b3RDbGljaygkaW5kZXgpXCIgJyArXG4gICAgICAgICAgICAnbmctY2xhc3M9XCJ7XFwnaXMtc2VsZWN0ZWRcXCc6IHBpdm90LnNlbGVjdGVkfVwiPnt7cGl2b3QudGl0bGV9fTwvbGk+ICcgK1xuICAgICAgICAgICAgJzxzcGFuIG5nLXJlcGVhdC1lbmQ+PC9zcGFuPicgK1xuICAgICAgICAgICAgJzxuZy10cmFuc2NsdWRlPjwvbmctdHJhbnNjbHVkZT4nICtcbiAgICAgICAgICAgICc8L3VsPic7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICB1aWZQaXZvdHM6ICc9PycsXG4gICAgICAgICAgICB1aWZTZWxlY3RlZDogJz0/JyxcbiAgICAgICAgICAgIHVpZlNpemU6ICdAJyxcbiAgICAgICAgICAgIHVpZlR5cGU6ICdAJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBQaXZvdERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBpdm90RGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBQaXZvdERpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSwgaW50YW5jZUVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycykge1xuICAgICAgICB2YXIgcGl2b3RDb250cm9sbGVyID0gY29udHJvbGxlcnNbMF07XG4gICAgICAgIHNjb3BlLiR3YXRjaCgndWlmU2l6ZScsIGZ1bmN0aW9uIChuZXdTaXplKSB7XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQobmV3U2l6ZSkgJiYgYW5ndWxhci5pc1VuZGVmaW5lZChwaXZvdFNpemVFbnVtXzEuUGl2b3RTaXplW25ld1NpemVdKSkge1xuICAgICAgICAgICAgICAgIHBpdm90Q29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5waXZvdCAtIFVuc3VwcG9ydGVkIHNpemU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAnXCInICsgbmV3U2l6ZSArICdcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdWlmU2l6ZS4gSXQgc2hvdWxkIGJlIHJlZ3VsYXIgb3IgbGFyZ2UuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZlR5cGUnLCBmdW5jdGlvbiAobmV3VHlwZSkge1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5ld1R5cGUpICYmIGFuZ3VsYXIuaXNVbmRlZmluZWQocGl2b3RUeXBlRW51bV8xLlBpdm90VHlwZVtuZXdUeXBlXSkpIHtcbiAgICAgICAgICAgICAgICBwaXZvdENvbnRyb2xsZXIuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMucGl2b3QgLSBVbnN1cHBvcnRlZCBzaXplOiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiJyArIG5ld1R5cGUgKyAnXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHVpZlR5cGUuIEl0IHNob3VsZCBiZSByZWd1bGFyIG9yIHRhYnMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZlNlbGVjdGVkJywgZnVuY3Rpb24gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnVpZlBpdm90cy5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50UGl2b3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpdm90LnNlbGVjdGVkID0gY3VycmVudFBpdm90LnRpdGxlID09PSBuZXdWYWx1ZS50aXRsZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRQaXZvdHMgPSBzY29wZS51aWZQaXZvdHMuZmlsdGVyKGZ1bmN0aW9uIChjdXJyZW50UGl2b3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQaXZvdC5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRQaXZvdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHNlbGVjdGVkUGl2b3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpdm90c1tpXS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGUuZ2V0Q2xhc3NlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjbGFzc2VzID0gJyc7XG4gICAgICAgICAgICBjbGFzc2VzICs9IHBpdm90VHlwZUVudW1fMS5QaXZvdFR5cGVbc2NvcGUudWlmVHlwZV0gPT09IHBpdm90VHlwZUVudW1fMS5QaXZvdFR5cGUudGFicyA/ICdtcy1QaXZvdC0tdGFicycgOiAnJztcbiAgICAgICAgICAgIGNsYXNzZXMgKz0gcGl2b3RTaXplRW51bV8xLlBpdm90U2l6ZVtzY29wZS51aWZTaXplXSA9PT0gcGl2b3RTaXplRW51bV8xLlBpdm90U2l6ZS5sYXJnZSA/ICcgbXMtUGl2b3QtLWxhcmdlJyA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gUGl2b3REaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5QaXZvdERpcmVjdGl2ZSA9IFBpdm90RGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5waXZvdCcsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBpdm90JywgUGl2b3REaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlBpdm90RWxsaXBzaXMnLCBQaXZvdEVsbGlwc2lzRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3Bpdm90L3Bpdm90RGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSA0OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBQaXZvdFNpemU7XG4oZnVuY3Rpb24gKFBpdm90U2l6ZSkge1xuICAgIFBpdm90U2l6ZVtQaXZvdFNpemVbXCJyZWd1bGFyXCJdID0gMF0gPSBcInJlZ3VsYXJcIjtcbiAgICBQaXZvdFNpemVbUGl2b3RTaXplW1wibGFyZ2VcIl0gPSAxXSA9IFwibGFyZ2VcIjtcbn0pKFBpdm90U2l6ZSA9IGV4cG9ydHMuUGl2b3RTaXplIHx8IChleHBvcnRzLlBpdm90U2l6ZSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3Bpdm90L3Bpdm90U2l6ZUVudW0udHNcbi8vIG1vZHVsZSBpZCA9IDQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFBpdm90VHlwZTtcbihmdW5jdGlvbiAoUGl2b3RUeXBlKSB7XG4gICAgUGl2b3RUeXBlW1Bpdm90VHlwZVtcInJlZ3VsYXJcIl0gPSAwXSA9IFwicmVndWxhclwiO1xuICAgIFBpdm90VHlwZVtQaXZvdFR5cGVbXCJ0YWJzXCJdID0gMV0gPSBcInRhYnNcIjtcbn0pKFBpdm90VHlwZSA9IGV4cG9ydHMuUGl2b3RUeXBlIHx8IChleHBvcnRzLlBpdm90VHlwZSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3Bpdm90L3Bpdm90VHlwZUVudW0udHNcbi8vIG1vZHVsZSBpZCA9IDUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBQcm9ncmVzc0luZGljYXRvckRpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUobG9nKSB7XG4gICAgICAgIHRoaXMubG9nID0gbG9nO1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1Qcm9ncmVzc0luZGljYXRvclwiPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1Qcm9ncmVzc0luZGljYXRvci1pdGVtTmFtZVwiPnt7dWlmTmFtZX19PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLVByb2dyZXNzSW5kaWNhdG9yLWl0ZW1Qcm9ncmVzc1wiPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1Qcm9ncmVzc0luZGljYXRvci1wcm9ncmVzc1RyYWNrXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cIm1zLVByb2dyZXNzSW5kaWNhdG9yLXByb2dyZXNzQmFyXCIgbmctc3R5bGU9XCJ7d2lkdGg6IHVpZlBlcmNlbnRDb21wbGV0ZStcXCclXFwnfVwiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJtcy1Qcm9ncmVzc0luZGljYXRvci1pdGVtRGVzY3JpcHRpb25cIj57e3VpZkRlc2NyaXB0aW9ufX08L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB0aGlzLnNjb3BlID0ge1xuICAgICAgICAgICAgdWlmRGVzY3JpcHRpb246ICdAJyxcbiAgICAgICAgICAgIHVpZk5hbWU6ICdAJyxcbiAgICAgICAgICAgIHVpZlBlcmNlbnRDb21wbGV0ZTogJ0AnXG4gICAgICAgIH07XG4gICAgICAgIFByb2dyZXNzSW5kaWNhdG9yRGlyZWN0aXZlLmxvZyA9IGxvZztcbiAgICB9XG4gICAgUHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uIChsb2cpIHsgcmV0dXJuIG5ldyBQcm9ncmVzc0luZGljYXRvckRpcmVjdGl2ZShsb2cpOyB9O1xuICAgICAgICBkaXJlY3RpdmUuJGluamVjdCA9IFsnJGxvZyddO1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgUHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgICAgc2NvcGUuJHdhdGNoKCd1aWZQZXJjZW50Q29tcGxldGUnLCBmdW5jdGlvbiAobmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCB8fCBuZXdWYWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBzY29wZS51aWZQZXJjZW50Q29tcGxldGUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBuZXdQZXJjZW50Q29tcGxldGUgPSBwYXJzZUZsb2F0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc05hTihuZXdQZXJjZW50Q29tcGxldGUpIHx8IG5ld1BlcmNlbnRDb21wbGV0ZSA8IDAgfHwgbmV3UGVyY2VudENvbXBsZXRlID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgUHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUubG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5wcm9ncmVzc2luZGljYXRvciAtICcgK1xuICAgICAgICAgICAgICAgICAgICAnUGVyY2VudCBjb21wbGV0ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwLicpO1xuICAgICAgICAgICAgICAgIHNjb3BlLnVpZlBlcmNlbnRDb21wbGV0ZSA9IE1hdGgubWF4KE1hdGgubWluKG5ld1BlcmNlbnRDb21wbGV0ZSwgMTAwKSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFByb2dyZXNzSW5kaWNhdG9yRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuUHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUgPSBQcm9ncmVzc0luZGljYXRvckRpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMucHJvZ3Jlc3NpbmRpY2F0b3InLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlByb2dyZXNzSW5kaWNhdG9yJywgUHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUuZmFjdG9yeSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvcHJvZ3Jlc3NpbmRpY2F0b3IvcHJvZ3Jlc3NJbmRpY2F0b3JEaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDUxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBTZWFyY2hCb3hEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNlYXJjaEJveERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8ZGl2IGNsYXNzPVwibXMtU2VhcmNoQm94XCIgbmctY2xhc3M9XCJ7XFwnaXMtYWN0aXZlXFwnOmlzQWN0aXZlLCBcXCdpcy1kaXNhYmxlZFxcJzppc0Rpc2FibGVkfVwiPicgK1xuICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cIm1zLVNlYXJjaEJveC1maWVsZFwiIG5nLWZvY3VzPVwiaW5wdXRGb2N1cygpXCIgbmctYmx1cj1cImlucHV0Qmx1cigpXCInICtcbiAgICAgICAgICAgICcgbmctbW9kZWw9XCJ2YWx1ZVwiIG5nLWNoYW5nZT1cImlucHV0Q2hhbmdlKClcIiBpZD1cInt7OjpcXCdzZWFyY2hCb3hfXFwnKyRpZH19XCIgbmctZGlzYWJsZWQ9XCJpc0Rpc2FibGVkXCIgLz4nICtcbiAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9XCJtcy1TZWFyY2hCb3gtbGFiZWxcIiBmb3I9XCJ7ezo6XFwnc2VhcmNoQm94X1xcJyskaWR9fVwiIG5nLWhpZGU9XCJpc0xhYmVsSGlkZGVuXCI+JyArXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJtcy1TZWFyY2hCb3gtaWNvbiBtcy1JY29uIG1zLUljb24tLXNlYXJjaFwiID48L2k+IHt7cGxhY2Vob2xkZXJ9fTwvbGFiZWw+JyArXG4gICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz1cIm1zLVNlYXJjaEJveC1jbG9zZUJ1dHRvblwiIG5nLW1vdXNlZG93bj1cImJ0bk1vdXNlZG93bigpXCIgdHlwZT1cImJ1dHRvblwiPjxpIGNsYXNzPVwibXMtSWNvbiBtcy1JY29uLS14XCI+PC9pPjwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHRoaXMucmVxdWlyZSA9IFsnP25nTW9kZWwnXTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnPT8nLFxuICAgICAgICAgICAgdmFsdWU6ICc9P25nTW9kZWwnXG4gICAgICAgIH07XG4gICAgfVxuICAgIFNlYXJjaEJveERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFNlYXJjaEJveERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgU2VhcmNoQm94RGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycywgY29udHJvbGxlcnMpIHtcbiAgICAgICAgdmFyIG5nTW9kZWxDdHJsO1xuICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoY29udHJvbGxlcnMpICYmIGNvbnRyb2xsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsID0gY29udHJvbGxlcnNbMF07XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUuaXNGb2N1cyA9IGZhbHNlO1xuICAgICAgICBzY29wZS5pc0NhbmNlbCA9IGZhbHNlO1xuICAgICAgICBzY29wZS5pc0xhYmVsSGlkZGVuID0gZmFsc2U7XG4gICAgICAgIHNjb3BlLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHNjb3BlLmlucHV0Rm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5pc0ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHNjb3BlLmlzTGFiZWxIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgc2NvcGUuaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBzY29wZS5pbnB1dENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChuZ01vZGVsQ3RybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXREaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzY29wZS5pbnB1dEJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaXNDYW5jZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAobmdNb2RlbEN0cmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmdNb2RlbEN0cmwuJHNldFZpZXdWYWx1ZSgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzY29wZS5pc0xhYmVsSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoc2NvcGUudmFsdWUpID09PSAndW5kZWZpbmVkJyB8fCBzY29wZS52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5pc0xhYmVsSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5pc0ZvY3VzID0gc2NvcGUuaXNDYW5jZWwgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChuZ01vZGVsQ3RybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXRUb3VjaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLmJ0bk1vdXNlZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNjb3BlLmlzQ2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKCd2YWx1ZScsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIGlmICghc2NvcGUuaXNGb2N1cykge1xuICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5pc0xhYmVsSGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmlzTGFiZWxIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2NvcGUudmFsdWUgPSB2YWw7XG4gICAgICAgICAgICAgICAgaWYgKG5nTW9kZWxDdHJsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXRWaWV3VmFsdWUodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnZhbHVlID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNjb3BlLiR3YXRjaCgncGxhY2Vob2xkZXInLCBmdW5jdGlvbiAoc2VhcmNoKSB7XG4gICAgICAgICAgICBzY29wZS5wbGFjZWhvbGRlciA9IHNlYXJjaDtcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJzLiRvYnNlcnZlKCdkaXNhYmxlZCcsIGZ1bmN0aW9uIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgc2NvcGUuaXNEaXNhYmxlZCA9ICEhZGlzYWJsZWQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFNlYXJjaEJveERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLlNlYXJjaEJveERpcmVjdGl2ZSA9IFNlYXJjaEJveERpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMuc2VhcmNoYm94JywgWydvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzJ10pXG4gICAgLmRpcmVjdGl2ZSgndWlmU2VhcmNoYm94JywgU2VhcmNoQm94RGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3NlYXJjaGJveC9zZWFyY2hib3hEaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFuZ3VsYXIgPSByZXF1aXJlKFwiYW5ndWxhclwiKTtcbnZhciBzcGlubmVyU2l6ZUVudW1fMSA9IHJlcXVpcmUoXCIuL3NwaW5uZXJTaXplRW51bVwiKTtcbnZhciBTcGlubmVyRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTcGlubmVyRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJtcy1TcGlubmVyXCI+PC9kaXY+JztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gU3Bpbm5lckNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB7XG4gICAgICAgICAgICAnbmdTaG93JzogJz0nLFxuICAgICAgICAgICAgJ3VpZlNpemUnOiAnQCdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgU3Bpbm5lckRpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFNwaW5uZXJEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIFNwaW5uZXJEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXIsICR0cmFuc2NsdWRlKSB7XG4gICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChhdHRycy51aWZTaXplKSkge1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNVbmRlZmluZWQoc3Bpbm5lclNpemVFbnVtXzEuU3Bpbm5lclNpemVbYXR0cnMudWlmU2l6ZV0pKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy5zcGlubmVyIC0gVW5zdXBwb3J0ZWQgc2l6ZTogJyArXG4gICAgICAgICAgICAgICAgICAgICdTcGlubmVyIHNpemUgKFxcJycgKyBhdHRycy51aWZTaXplICsgJ1xcJykgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgT2ZmaWNlIFVJIEZhYnJpYy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcGlubmVyU2l6ZUVudW1fMS5TcGlubmVyU2l6ZVthdHRycy51aWZTaXplXSA9PT0gc3Bpbm5lclNpemVFbnVtXzEuU3Bpbm5lclNpemUubGFyZ2UpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuYWRkQ2xhc3MoJ21zLVNwaW5uZXItLWxhcmdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0dHJzLm5nU2hvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBzY29wZS4kd2F0Y2goJ25nU2hvdycsIGZ1bmN0aW9uIChuZXdWaXNpYmxlLCBvbGRWaXNpYmxlLCBzcGlubmVyU2NvcGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBzcGlubmVyU2NvcGUuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNwaW5uZXJTY29wZS5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzY29wZS5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgICR0cmFuc2NsdWRlKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgICAgaWYgKGNsb25lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlciA9IGFuZ3VsYXIuZWxlbWVudCgnPGRpdj48L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZENsYXNzKCdtcy1TcGlubmVyLWxhYmVsJykuYXBwZW5kKGNsb25lKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuYXBwZW5kKHdyYXBwZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGUuaW5pdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIFNwaW5uZXJEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5TcGlubmVyRGlyZWN0aXZlID0gU3Bpbm5lckRpcmVjdGl2ZTtcbnZhciBTcGlubmVyQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3Bpbm5lckNvbnRyb2xsZXIoJHNjb3BlLCAkZWxlbWVudCwgJGludGVydmFsLCAkbG9nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuJHNjb3BlID0gJHNjb3BlO1xuICAgICAgICB0aGlzLiRlbGVtZW50ID0gJGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuJGludGVydmFsID0gJGludGVydmFsO1xuICAgICAgICB0aGlzLiRsb2cgPSAkbG9nO1xuICAgICAgICB0aGlzLl9vZmZzZXRTaXplID0gMC4xNzk7XG4gICAgICAgIHRoaXMuX251bUNpcmNsZXMgPSA4O1xuICAgICAgICB0aGlzLl9hbmltYXRpb25TcGVlZCA9IDkwO1xuICAgICAgICB0aGlzLl9jaXJjbGVzID0gW107XG4gICAgICAgICRzY29wZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuX3BhcmVudFNpemUgPSBzcGlubmVyU2l6ZUVudW1fMS5TcGlubmVyU2l6ZVtfdGhpcy4kc2NvcGUudWlmU2l6ZV0gPT09IHNwaW5uZXJTaXplRW51bV8xLlNwaW5uZXJTaXplLmxhcmdlID8gMjggOiAyMDtcbiAgICAgICAgICAgIF90aGlzLmNyZWF0ZUNpcmNsZXNBbmRBcnJhbmdlKCk7XG4gICAgICAgICAgICBfdGhpcy5zZXRJbml0aWFsT3BhY2l0eSgpO1xuICAgICAgICB9O1xuICAgICAgICAkc2NvcGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5fYW5pbWF0aW9uSW50ZXJ2YWwgPSAkaW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gX3RoaXMuX2NpcmNsZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmFkZUNpcmNsZShfdGhpcy5fY2lyY2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgX3RoaXMuX2FuaW1hdGlvblNwZWVkKTtcbiAgICAgICAgfTtcbiAgICAgICAgJHNjb3BlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKF90aGlzLl9hbmltYXRpb25JbnRlcnZhbCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIFNwaW5uZXJDb250cm9sbGVyLnByb3RvdHlwZS5jcmVhdGVDaXJjbGVzQW5kQXJyYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX3BhcmVudFNpemUgKiB0aGlzLl9vZmZzZXRTaXplO1xuICAgICAgICB2YXIgc3RlcCA9ICgyICogTWF0aC5QSSkgLyB0aGlzLl9udW1DaXJjbGVzO1xuICAgICAgICB2YXIgaSA9IHRoaXMuX251bUNpcmNsZXM7XG4gICAgICAgIHZhciByYWRpdXMgPSAodGhpcy5fcGFyZW50U2l6ZSAtIG9mZnNldCkgKiAwLjU7XG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIHZhciBjaXJjbGUgPSB0aGlzLmNyZWF0ZUNpcmNsZSgpO1xuICAgICAgICAgICAgdmFyIHggPSBNYXRoLnJvdW5kKHRoaXMuX3BhcmVudFNpemUgKiAwLjUgKyByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSkgLSBjaXJjbGVbMF0uY2xpZW50V2lkdGggKiAwLjUpIC0gb2Zmc2V0ICogMC41O1xuICAgICAgICAgICAgdmFyIHkgPSBNYXRoLnJvdW5kKHRoaXMuX3BhcmVudFNpemUgKiAwLjUgKyByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSkgLSBjaXJjbGVbMF0uY2xpZW50SGVpZ2h0ICogMC41KSAtIG9mZnNldCAqIDAuNTtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuYXBwZW5kKGNpcmNsZSk7XG4gICAgICAgICAgICBjaXJjbGUuY3NzKCdsZWZ0JywgKHggKyAncHgnKSk7XG4gICAgICAgICAgICBjaXJjbGUuY3NzKCd0b3AnLCAoeSArICdweCcpKTtcbiAgICAgICAgICAgIGFuZ2xlICs9IHN0ZXA7XG4gICAgICAgICAgICB2YXIgY2lyY2xlT2JqZWN0ID0gbmV3IENpcmNsZU9iamVjdChjaXJjbGUsIGkpO1xuICAgICAgICAgICAgdGhpcy5fY2lyY2xlcy5wdXNoKGNpcmNsZU9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNwaW5uZXJDb250cm9sbGVyLnByb3RvdHlwZS5jcmVhdGVDaXJjbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjaXJjbGUgPSBhbmd1bGFyLmVsZW1lbnQoJzxkaXY+PC9kaXY+Jyk7XG4gICAgICAgIHZhciBkb3RTaXplID0gKHRoaXMuX3BhcmVudFNpemUgKiB0aGlzLl9vZmZzZXRTaXplKSArICdweCc7XG4gICAgICAgIGNpcmNsZS5hZGRDbGFzcygnbXMtU3Bpbm5lci1jaXJjbGUnKS5jc3MoJ3dpZHRoJywgZG90U2l6ZSkuY3NzKCdoZWlnaHQnLCBkb3RTaXplKTtcbiAgICAgICAgcmV0dXJuIGNpcmNsZTtcbiAgICB9O1xuICAgIFNwaW5uZXJDb250cm9sbGVyLnByb3RvdHlwZS5zZXRJbml0aWFsT3BhY2l0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG9wY2FpdHlUb1NldDtcbiAgICAgICAgdGhpcy5fZmFkZUluY3JlbWVudCA9IDEgLyB0aGlzLl9udW1DaXJjbGVzO1xuICAgICAgICB0aGlzLl9jaXJjbGVzLmZvckVhY2goZnVuY3Rpb24gKGNpcmNsZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIG9wY2FpdHlUb1NldCA9IChfdGhpcy5fZmFkZUluY3JlbWVudCAqIChpbmRleCArIDEpKTtcbiAgICAgICAgICAgIGNpcmNsZS5vcGFjaXR5ID0gb3BjYWl0eVRvU2V0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNwaW5uZXJDb250cm9sbGVyLnByb3RvdHlwZS5mYWRlQ2lyY2xlID0gZnVuY3Rpb24gKGNpcmNsZSkge1xuICAgICAgICB2YXIgbmV3T3BhY2l0eSA9IGNpcmNsZS5vcGFjaXR5IC0gdGhpcy5fZmFkZUluY3JlbWVudDtcbiAgICAgICAgaWYgKG5ld09wYWNpdHkgPD0gMCkge1xuICAgICAgICAgICAgbmV3T3BhY2l0eSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgY2lyY2xlLm9wYWNpdHkgPSBuZXdPcGFjaXR5O1xuICAgIH07XG4gICAgcmV0dXJuIFNwaW5uZXJDb250cm9sbGVyO1xufSgpKTtcblNwaW5uZXJDb250cm9sbGVyLiRpbmplY3QgPSBbJyRzY29wZScsICckZWxlbWVudCcsICckaW50ZXJ2YWwnLCAnJGxvZyddO1xudmFyIENpcmNsZU9iamVjdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2lyY2xlT2JqZWN0KGNpcmNsZUVsZW1lbnQsIGNpcmNsZUluZGV4KSB7XG4gICAgICAgIHRoaXMuY2lyY2xlRWxlbWVudCA9IGNpcmNsZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuY2lyY2xlSW5kZXggPSBjaXJjbGVJbmRleDtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENpcmNsZU9iamVjdC5wcm90b3R5cGUsIFwib3BhY2l0eVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICsodGhpcy5jaXJjbGVFbGVtZW50LmNzcygnb3BhY2l0eScpKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAob3BhY2l0eSkge1xuICAgICAgICAgICAgdGhpcy5jaXJjbGVFbGVtZW50LmNzcygnb3BhY2l0eScsIG9wYWNpdHkpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gQ2lyY2xlT2JqZWN0O1xufSgpKTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMuc3Bpbm5lcicsIFsnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cyddKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlNwaW5uZXInLCBTcGlubmVyRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3NwaW5uZXIvc3Bpbm5lckRpcmVjdGl2ZS50c1xuLy8gbW9kdWxlIGlkID0gNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgU3Bpbm5lclNpemU7XG4oZnVuY3Rpb24gKFNwaW5uZXJTaXplKSB7XG4gICAgU3Bpbm5lclNpemVbU3Bpbm5lclNpemVbXCJzbWFsbFwiXSA9IDBdID0gXCJzbWFsbFwiO1xuICAgIFNwaW5uZXJTaXplW1NwaW5uZXJTaXplW1wibGFyZ2VcIl0gPSAxXSA9IFwibGFyZ2VcIjtcbn0pKFNwaW5uZXJTaXplID0gZXhwb3J0cy5TcGlubmVyU2l6ZSB8fCAoZXhwb3J0cy5TcGlubmVyU2l6ZSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3NwaW5uZXIvc3Bpbm5lclNpemVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSA1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBhbmd1bGFyID0gcmVxdWlyZShcImFuZ3VsYXJcIik7XG52YXIgdGFibGVSb3dTZWxlY3RNb2RlRW51bV8xID0gcmVxdWlyZShcIi4vdGFibGVSb3dTZWxlY3RNb2RlRW51bVwiKTtcbnZhciB0YWJsZVR5cGVFbnVtXzEgPSByZXF1aXJlKFwiLi90YWJsZVR5cGVFbnVtXCIpO1xudmFyIFRhYmxlQ29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFibGVDb250cm9sbGVyKCRzY29wZSwgJGxvZykge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICAgICAgdGhpcy4kc2NvcGUub3JkZXJCeSA9IG51bGw7XG4gICAgICAgIHRoaXMuJHNjb3BlLm9yZGVyQXNjID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4kc2NvcGUucm93cyA9IFtdO1xuICAgICAgICBpZiAoIXRoaXMuJHNjb3BlLnNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGFibGVDb250cm9sbGVyLnByb3RvdHlwZSwgXCJvcmRlckJ5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUub3JkZXJCeTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9yZGVyQnkgPSBwcm9wZXJ0eTtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRhYmxlQ29udHJvbGxlci5wcm90b3R5cGUsIFwib3JkZXJBc2NcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5vcmRlckFzYztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAob3JkZXJBc2MpIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLm9yZGVyQXNjID0gb3JkZXJBc2M7XG4gICAgICAgICAgICB0aGlzLiRzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUYWJsZUNvbnRyb2xsZXIucHJvdG90eXBlLCBcInJvd1NlbGVjdE1vZGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5yb3dTZWxlY3RNb2RlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChyb3dTZWxlY3RNb2RlKSB7XG4gICAgICAgICAgICBpZiAodGFibGVSb3dTZWxlY3RNb2RlRW51bV8xLlRhYmxlUm93U2VsZWN0TW9kZUVudW1bcm93U2VsZWN0TW9kZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5lcnJvcignRXJyb3IgW25nT2ZmaWNlVWlGYWJyaWNdIG9mZmljZXVpZmFicmljLmNvbXBvbmVudHMudGFibGUuICcgK1xuICAgICAgICAgICAgICAgICAgICAnXFwnJyArIHJvd1NlbGVjdE1vZGUgKyAnXFwnIGlzIG5vdCBhIHZhbGlkIG9wdGlvbiBmb3IgXFwndWlmLXJvdy1zZWxlY3QtbW9kZVxcJy4gJyArXG4gICAgICAgICAgICAgICAgICAgICdWYWxpZCBvcHRpb25zIGFyZSBub25lfHNpbmdsZXxtdWx0aXBsZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLnJvd1NlbGVjdE1vZGUgPSByb3dTZWxlY3RNb2RlO1xuICAgICAgICAgICAgdGhpcy4kc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGFibGVDb250cm9sbGVyLnByb3RvdHlwZSwgXCJyb3dzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kc2NvcGUucm93cztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAocm93cykge1xuICAgICAgICAgICAgdGhpcy4kc2NvcGUucm93cyA9IHJvd3M7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUYWJsZUNvbnRyb2xsZXIucHJvdG90eXBlLCBcInNlbGVjdGVkSXRlbXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRzY29wZS5zZWxlY3RlZEl0ZW1zO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gVGFibGVDb250cm9sbGVyO1xufSgpKTtcblRhYmxlQ29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnLCAnJGxvZyddO1xudmFyIFRhYmxlRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUYWJsZURpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBsYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8dGFibGUgbmctY2xhc3M9XCJbXFwnbXMtVGFibGVcXCcsIHRhYmxlVHlwZUNsYXNzXVwiIG5nLXRyYW5zY2x1ZGU+PC90YWJsZT4nO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBUYWJsZUNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuY29udHJvbGxlckFzID0gJ3RhYmxlJztcbiAgICB9XG4gICAgVGFibGVEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBUYWJsZURpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgVGFibGVEaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgaWYgKGF0dHJzLnVpZlNlbGVjdGVkSXRlbXMgIT09IHVuZGVmaW5lZCAmJiBhdHRycy51aWZTZWxlY3RlZEl0ZW1zICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0ZWRJdGVtcyA9IG51bGw7XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zID0gc2NvcGUuJGV2YWwoYXR0cnMudWlmU2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtcyA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkSXRlbXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5zZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRJdGVtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXR0cnMudWlmUm93U2VsZWN0TW9kZSAhPT0gdW5kZWZpbmVkICYmIGF0dHJzLnVpZlJvd1NlbGVjdE1vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0YWJsZVJvd1NlbGVjdE1vZGVFbnVtXzEuVGFibGVSb3dTZWxlY3RNb2RlRW51bVthdHRycy51aWZSb3dTZWxlY3RNb2RlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy50YWJsZS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdcXCcnICsgYXR0cnMudWlmUm93U2VsZWN0TW9kZSArICdcXCcgaXMgbm90IGEgdmFsaWQgb3B0aW9uIGZvciBcXCd1aWYtcm93LXNlbGVjdC1tb2RlXFwnLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1ZhbGlkIG9wdGlvbnMgYXJlIG5vbmV8c2luZ2xlfG11bHRpcGxlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NvcGUucm93U2VsZWN0TW9kZSA9IGF0dHJzLnVpZlJvd1NlbGVjdE1vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLnJvd1NlbGVjdE1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2NvcGUucm93U2VsZWN0TW9kZSA9IHRhYmxlUm93U2VsZWN0TW9kZUVudW1fMS5UYWJsZVJvd1NlbGVjdE1vZGVFbnVtW3RhYmxlUm93U2VsZWN0TW9kZUVudW1fMS5UYWJsZVJvd1NlbGVjdE1vZGVFbnVtLm5vbmVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRycy51aWZUYWJsZVR5cGUgIT09IHVuZGVmaW5lZCAmJiBhdHRycy51aWZUYWJsZVR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0YWJsZVR5cGVFbnVtXzEuVGFibGVUeXBlRW51bVthdHRycy51aWZUYWJsZVR5cGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRsb2cuZXJyb3IoJ0Vycm9yIFtuZ09mZmljZVVpRmFicmljXSBvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLnRhYmxlLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1xcJycgKyBhdHRycy51aWZUYWJsZVR5cGUgKyAnXFwnIGlzIG5vdCBhIHZhbGlkIG9wdGlvbiBmb3IgXFwndWlmLXRhYmxlLXR5cGVcXCcuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVmFsaWQgb3B0aW9ucyBhcmUgZml4ZWR8Zmx1aWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY29wZS50YWJsZVR5cGUgPSBhdHRycy51aWZUYWJsZVR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLnRhYmxlVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzY29wZS50YWJsZVR5cGUgPSB0YWJsZVR5cGVFbnVtXzEuVGFibGVUeXBlRW51bVt0YWJsZVR5cGVFbnVtXzEuVGFibGVUeXBlRW51bS5mbHVpZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLnRhYmxlVHlwZSA9PT0gdGFibGVUeXBlRW51bV8xLlRhYmxlVHlwZUVudW1bdGFibGVUeXBlRW51bV8xLlRhYmxlVHlwZUVudW0uZml4ZWRdKSB7XG4gICAgICAgICAgICBzY29wZS50YWJsZVR5cGVDbGFzcyA9ICdtcy1UYWJsZS0tZml4ZWQnO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5UYWJsZURpcmVjdGl2ZSA9IFRhYmxlRGlyZWN0aXZlO1xudmFyIFRhYmxlUm93Q29udHJvbGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFibGVSb3dDb250cm9sbGVyKCRzY29wZSwgJGxvZykge1xuICAgICAgICB0aGlzLiRzY29wZSA9ICRzY29wZTtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRhYmxlUm93Q29udHJvbGxlci5wcm90b3R5cGUsIFwiaXRlbVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLml0ZW07XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLml0ZW0gPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy4kc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGFibGVSb3dDb250cm9sbGVyLnByb3RvdHlwZSwgXCJzZWxlY3RlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlLnNlbGVjdGVkO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy4kc2NvcGUuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgICAgICAgIHRoaXMuJHNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIFRhYmxlUm93Q29udHJvbGxlcjtcbn0oKSk7XG5UYWJsZVJvd0NvbnRyb2xsZXIuJGluamVjdCA9IFsnJHNjb3BlJywgJyRsb2cnXTtcbnZhciBUYWJsZVJvd0RpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFibGVSb3dEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPHRyIG5nLXRyYW5zY2x1ZGU+PC90cj4nO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSAnXnVpZlRhYmxlJztcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIGl0ZW06ICc9dWlmSXRlbSdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gVGFibGVSb3dDb250cm9sbGVyO1xuICAgIH1cbiAgICBUYWJsZVJvd0RpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFRhYmxlUm93RGlyZWN0aXZlKCk7IH07XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfTtcbiAgICBUYWJsZVJvd0RpcmVjdGl2ZS5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChzY29wZSwgaW5zdGFuY2VFbGVtZW50LCBhdHRycywgdGFibGUpIHtcbiAgICAgICAgaWYgKGF0dHJzLnVpZlNlbGVjdGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGF0dHJzLnVpZlNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0ZWRTdHJpbmcgPSBhdHRycy51aWZTZWxlY3RlZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkU3RyaW5nICE9PSAndHJ1ZScgJiYgc2VsZWN0ZWRTdHJpbmcgIT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICB0YWJsZS4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy50YWJsZS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdcXCcnICsgYXR0cnMudWlmU2VsZWN0ZWQgKyAnXFwnIGlzIG5vdCBhIHZhbGlkIGJvb2xlYW4gdmFsdWUuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVmFsaWQgb3B0aW9ucyBhcmUgdHJ1ZXxmYWxzZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFN0cmluZyA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLml0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGFibGUucm93cy5wdXNoKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBzY29wZS5yb3dDbGljayA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWQgPSAhc2NvcGUuc2VsZWN0ZWQ7XG4gICAgICAgICAgICBzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKCdzZWxlY3RlZCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUsIHRhYmxlUm93U2NvcGUpIHtcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZS5yb3dTZWxlY3RNb2RlID09PSB0YWJsZVJvd1NlbGVjdE1vZGVFbnVtXzEuVGFibGVSb3dTZWxlY3RNb2RlRW51bVt0YWJsZVJvd1NlbGVjdE1vZGVFbnVtXzEuVGFibGVSb3dTZWxlY3RNb2RlRW51bS5zaW5nbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5yb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUucm93c1tpXSAhPT0gdGFibGVSb3dTY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5yb3dzW2ldLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoMCwgdGFibGUuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlbGVjdGVkSXRlbXMucHVzaCh0YWJsZVJvd1Njb3BlLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpdGVtQWxyZWFkeVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJsZS5zZWxlY3RlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5zZWxlY3RlZEl0ZW1zW2ldID09PSB0YWJsZVJvd1Njb3BlLml0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1BbHJlYWR5U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtQWxyZWFkeVNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlbGVjdGVkSXRlbXMucHVzaCh0YWJsZVJvd1Njb3BlLml0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQuYWRkQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlLnNlbGVjdGVkSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlLnNlbGVjdGVkSXRlbXNbaV0gPT09IHRhYmxlUm93U2NvcGUuaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2lzLXNlbGVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGFibGUucm93U2VsZWN0TW9kZSAhPT0gdGFibGVSb3dTZWxlY3RNb2RlRW51bV8xLlRhYmxlUm93U2VsZWN0TW9kZUVudW1bdGFibGVSb3dTZWxlY3RNb2RlRW51bV8xLlRhYmxlUm93U2VsZWN0TW9kZUVudW0ubm9uZV0gJiZcbiAgICAgICAgICAgIHNjb3BlLml0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaW5zdGFuY2VFbGVtZW50Lm9uKCdjbGljaycsIHNjb3BlLnJvd0NsaWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFibGUucm93U2VsZWN0TW9kZSA9PT0gdGFibGVSb3dTZWxlY3RNb2RlRW51bV8xLlRhYmxlUm93U2VsZWN0TW9kZUVudW1bdGFibGVSb3dTZWxlY3RNb2RlRW51bV8xLlRhYmxlUm93U2VsZWN0TW9kZUVudW0ubm9uZV0pIHtcbiAgICAgICAgICAgIGluc3RhbmNlRWxlbWVudC5jc3MoJ2N1cnNvcicsICdkZWZhdWx0Jyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUYWJsZVJvd0RpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLlRhYmxlUm93RGlyZWN0aXZlID0gVGFibGVSb3dEaXJlY3RpdmU7XG52YXIgVGFibGVSb3dTZWxlY3REaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYmxlUm93U2VsZWN0RGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzx0ZCBjbGFzcz1cIm1zLVRhYmxlLXJvd0NoZWNrXCI+PC90ZD4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcXVpcmUgPSBbJ151aWZUYWJsZScsICc/XnVpZlRhYmxlSGVhZCcsICdedWlmVGFibGVSb3cnXTtcbiAgICB9XG4gICAgVGFibGVSb3dTZWxlY3REaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBUYWJsZVJvd1NlbGVjdERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgVGFibGVSb3dTZWxlY3REaXJlY3RpdmUucHJvdG90eXBlLmxpbmsgPSBmdW5jdGlvbiAoc2NvcGUsIGluc3RhbmNlRWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzKSB7XG4gICAgICAgIHZhciB0aGVhZCA9IGNvbnRyb2xsZXJzWzFdO1xuICAgICAgICBpZiAodGhlYWQpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbGVtID0gYW5ndWxhci5lbGVtZW50KCc8dGggY2xhc3M9XCJtcy1UYWJsZS1yb3dDaGVja1wiPjwvdGg+Jyk7XG4gICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbSk7XG4gICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQgPSBuZXdFbGVtO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLnJvd1NlbGVjdENsaWNrID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgdGFibGUgPSBjb250cm9sbGVyc1swXTtcbiAgICAgICAgICAgIHZhciByb3cgPSBjb250cm9sbGVyc1syXTtcbiAgICAgICAgICAgIGlmICh0YWJsZS5yb3dTZWxlY3RNb2RlICE9PSB0YWJsZVJvd1NlbGVjdE1vZGVFbnVtXzEuVGFibGVSb3dTZWxlY3RNb2RlRW51bVt0YWJsZVJvd1NlbGVjdE1vZGVFbnVtXzEuVGFibGVSb3dTZWxlY3RNb2RlRW51bS5tdWx0aXBsZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm93Lml0ZW0gPT09IHVuZGVmaW5lZCB8fCByb3cuaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBzaG91bGRTZWxlY3RBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlLnJvd3NbaV0uc2VsZWN0ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNlbGVjdEFsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlLnJvd3NbaV0uc2VsZWN0ZWQgIT09IHNob3VsZFNlbGVjdEFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucm93c1tpXS5zZWxlY3RlZCA9IHNob3VsZFNlbGVjdEFsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2VFbGVtZW50Lm9uKCdjbGljaycsIHNjb3BlLnJvd1NlbGVjdENsaWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZVJvd1NlbGVjdERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLlRhYmxlUm93U2VsZWN0RGlyZWN0aXZlID0gVGFibGVSb3dTZWxlY3REaXJlY3RpdmU7XG52YXIgVGFibGVDZWxsRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUYWJsZUNlbGxEaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPHRkIG5nLXRyYW5zY2x1ZGU+PC90ZD4nO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgIH1cbiAgICBUYWJsZUNlbGxEaXJlY3RpdmUuZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBUYWJsZUNlbGxEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUNlbGxEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5UYWJsZUNlbGxEaXJlY3RpdmUgPSBUYWJsZUNlbGxEaXJlY3RpdmU7XG52YXIgVGFibGVIZWFkZXJEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYmxlSGVhZGVyRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnJlc3RyaWN0ID0gJ0UnO1xuICAgICAgICB0aGlzLnRyYW5zY2x1ZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzx0aCBuZy10cmFuc2NsdWRlPjwvdGg+JztcbiAgICAgICAgdGhpcy5yZXF1aXJlID0gJ151aWZUYWJsZSc7XG4gICAgfVxuICAgIFRhYmxlSGVhZGVyRGlyZWN0aXZlLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgVGFibGVIZWFkZXJEaXJlY3RpdmUoKTsgfTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICB9O1xuICAgIFRhYmxlSGVhZGVyRGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBpbnN0YW5jZUVsZW1lbnQsIGF0dHJzLCB0YWJsZSkge1xuICAgICAgICBzY29wZS5oZWFkZXJDbGljayA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKHRhYmxlLm9yZGVyQnkgPT09IGF0dHJzLnVpZk9yZGVyQnkpIHtcbiAgICAgICAgICAgICAgICB0YWJsZS5vcmRlckFzYyA9ICF0YWJsZS5vcmRlckFzYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhYmxlLm9yZGVyQnkgPSBhdHRycy51aWZPcmRlckJ5O1xuICAgICAgICAgICAgICAgIHRhYmxlLm9yZGVyQXNjID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKCd0YWJsZS5vcmRlckJ5JywgZnVuY3Rpb24gKG5ld09yZGVyQnksIG9sZE9yZGVyQnksIHRhYmxlSGVhZGVyU2NvcGUpIHtcbiAgICAgICAgICAgIGlmIChvbGRPcmRlckJ5ICE9PSBuZXdPcmRlckJ5ICYmXG4gICAgICAgICAgICAgICAgbmV3T3JkZXJCeSA9PT0gYXR0cnMudWlmT3JkZXJCeSkge1xuICAgICAgICAgICAgICAgIHZhciBjZWxscyA9IGluc3RhbmNlRWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9jaGlsZHJlbiA9IGNlbGxzLmVxKGkpLmNoaWxkcmVuKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9zb3J0ZXIgPSBfY2hpbGRyZW4uZXEoX2NoaWxkcmVuLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zb3J0ZXIuaGFzQ2xhc3MoJ3VpZi1zb3J0LW9yZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc29ydGVyLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluc3RhbmNlRWxlbWVudC5hcHBlbmQoJzxzcGFuIGNsYXNzPVwidWlmLXNvcnQtb3JkZXJcIj4mbmJzcDtcXFxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibXMtSWNvbiBtcy1JY29uLS1jYXJldERvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9zcGFuPicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGUuJHdhdGNoKCd0YWJsZS5vcmRlckFzYycsIGZ1bmN0aW9uIChuZXdPcmRlckFzYywgb2xkT3JkZXJBc2MsIHRhYmxlSGVhZGVyU2NvcGUpIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9zb3J0ZXIgPSBpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5lcShpbnN0YW5jZUVsZW1lbnQuY2hpbGRyZW4oKS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBpZiAoX3NvcnRlci5oYXNDbGFzcygndWlmLXNvcnQtb3JkZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2xkQ3NzQ2xhc3MgPSBvbGRPcmRlckFzYyA/ICdtcy1JY29uLS1jYXJldERvd24nIDogJ21zLUljb24tLWNhcmV0VXAnO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Q3NzQ2xhc3MgPSBuZXdPcmRlckFzYyA/ICdtcy1JY29uLS1jYXJldERvd24nIDogJ21zLUljb24tLWNhcmV0VXAnO1xuICAgICAgICAgICAgICAgICAgICBfc29ydGVyLmNoaWxkcmVuKCkuZXEoMCkucmVtb3ZlQ2xhc3Mob2xkQ3NzQ2xhc3MpLmFkZENsYXNzKG5ld0Nzc0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoJ3VpZk9yZGVyQnknIGluIGF0dHJzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUVsZW1lbnQub24oJ2NsaWNrJywgc2NvcGUuaGVhZGVyQ2xpY2spO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVIZWFkZXJEaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5UYWJsZUhlYWRlckRpcmVjdGl2ZSA9IFRhYmxlSGVhZGVyRGlyZWN0aXZlO1xudmFyIFRhYmxlSGVhZENvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYmxlSGVhZENvbnRyb2xsZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBUYWJsZUhlYWRDb250cm9sbGVyO1xufSgpKTtcbnZhciBUYWJsZUhlYWREaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYmxlSGVhZERpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8dGhlYWQgbmctdHJhbnNjbHVkZT48L3RoZWFkPic7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFRhYmxlSGVhZENvbnRyb2xsZXI7XG4gICAgfVxuICAgIFRhYmxlSGVhZERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFRhYmxlSGVhZERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlSGVhZERpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLlRhYmxlSGVhZERpcmVjdGl2ZSA9IFRhYmxlSGVhZERpcmVjdGl2ZTtcbnZhciBUYWJsZUJvZHlEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYmxlQm9keURpcmVjdGl2ZSgpIHtcbiAgICAgICAgdGhpcy5yZXN0cmljdCA9ICdFJztcbiAgICAgICAgdGhpcy50cmFuc2NsdWRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9ICc8dGJvZHkgbmctdHJhbnNjbHVkZT48L3Rib2R5Pic7XG4gICAgICAgIHRoaXMucmVwbGFjZSA9IHRydWU7XG4gICAgfVxuICAgIFRhYmxlQm9keURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFRhYmxlQm9keURpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlQm9keURpcmVjdGl2ZTtcbn0oKSk7XG5leHBvcnRzLlRhYmxlQm9keURpcmVjdGl2ZSA9IFRhYmxlQm9keURpcmVjdGl2ZTtcbmV4cG9ydHMubW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMudGFibGUnLCBbJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXSlcbiAgICAuZGlyZWN0aXZlKCd1aWZUYWJsZScsIFRhYmxlRGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZUYWJsZVJvdycsIFRhYmxlUm93RGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZUYWJsZVJvd1NlbGVjdCcsIFRhYmxlUm93U2VsZWN0RGlyZWN0aXZlLmZhY3RvcnkoKSlcbiAgICAuZGlyZWN0aXZlKCd1aWZUYWJsZUNlbGwnLCBUYWJsZUNlbGxEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlRhYmxlSGVhZGVyJywgVGFibGVIZWFkZXJEaXJlY3RpdmUuZmFjdG9yeSgpKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlRhYmxlSGVhZCcsIFRhYmxlSGVhZERpcmVjdGl2ZS5mYWN0b3J5KCkpXG4gICAgLmRpcmVjdGl2ZSgndWlmVGFibGVCb2R5JywgVGFibGVCb2R5RGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3RhYmxlL3RhYmxlRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSA1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBUYWJsZVJvd1NlbGVjdE1vZGVFbnVtO1xuKGZ1bmN0aW9uIChUYWJsZVJvd1NlbGVjdE1vZGVFbnVtKSB7XG4gICAgVGFibGVSb3dTZWxlY3RNb2RlRW51bVtUYWJsZVJvd1NlbGVjdE1vZGVFbnVtW1wibm9uZVwiXSA9IDBdID0gXCJub25lXCI7XG4gICAgVGFibGVSb3dTZWxlY3RNb2RlRW51bVtUYWJsZVJvd1NlbGVjdE1vZGVFbnVtW1wic2luZ2xlXCJdID0gMV0gPSBcInNpbmdsZVwiO1xuICAgIFRhYmxlUm93U2VsZWN0TW9kZUVudW1bVGFibGVSb3dTZWxlY3RNb2RlRW51bVtcIm11bHRpcGxlXCJdID0gMl0gPSBcIm11bHRpcGxlXCI7XG59KShUYWJsZVJvd1NlbGVjdE1vZGVFbnVtID0gZXhwb3J0cy5UYWJsZVJvd1NlbGVjdE1vZGVFbnVtIHx8IChleHBvcnRzLlRhYmxlUm93U2VsZWN0TW9kZUVudW0gPSB7fSkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy90YWJsZS90YWJsZVJvd1NlbGVjdE1vZGVFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSA1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBUYWJsZVR5cGVFbnVtO1xuKGZ1bmN0aW9uIChUYWJsZVR5cGVFbnVtKSB7XG4gICAgVGFibGVUeXBlRW51bVtUYWJsZVR5cGVFbnVtW1wiZmx1aWRcIl0gPSAwXSA9IFwiZmx1aWRcIjtcbiAgICBUYWJsZVR5cGVFbnVtW1RhYmxlVHlwZUVudW1bXCJmaXhlZFwiXSA9IDFdID0gXCJmaXhlZFwiO1xufSkoVGFibGVUeXBlRW51bSA9IGV4cG9ydHMuVGFibGVUeXBlRW51bSB8fCAoZXhwb3J0cy5UYWJsZVR5cGVFbnVtID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGVUeXBlRW51bS50c1xuLy8gbW9kdWxlIGlkID0gNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIHVpZlR5cGVFbnVtXzEgPSByZXF1aXJlKFwiLi91aWZUeXBlRW51bVwiKTtcbnZhciBUZXh0RmllbGRDb250cm9sbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZXh0RmllbGRDb250cm9sbGVyKCRsb2cpIHtcbiAgICAgICAgdGhpcy4kbG9nID0gJGxvZztcbiAgICB9XG4gICAgcmV0dXJuIFRleHRGaWVsZENvbnRyb2xsZXI7XG59KCkpO1xuVGV4dEZpZWxkQ29udHJvbGxlci4kaW5qZWN0ID0gWyckbG9nJ107XG52YXIgVGV4dEZpZWxkRGlyZWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZXh0RmllbGREaXJlY3RpdmUoKSB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFRleHRGaWVsZENvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSAnPGRpdiBuZy1jbGFzcz1cIntcXCdpcy1hY3RpdmVcXCc6IGlzQWN0aXZlLCBcXCdtcy1UZXh0RmllbGRcXCc6IHRydWUsICcgK1xuICAgICAgICAgICAgJ1xcJ21zLVRleHRGaWVsZC0tdW5kZXJsaW5lZFxcJzogdWlmVW5kZXJsaW5lZCwgXFwnbXMtVGV4dEZpZWxkLS1wbGFjZWhvbGRlclxcJzogcGxhY2Vob2xkZXIsICcgK1xuICAgICAgICAgICAgJ1xcJ2lzLXJlcXVpcmVkXFwnOiByZXF1aXJlZCwgXFwnaXMtZGlzYWJsZWRcXCc6IGRpc2FibGVkLCBcXCdtcy1UZXh0RmllbGQtLW11bHRpbGluZVxcJyA6IHVpZk11bHRpbGluZSB9XCI+JyArXG4gICAgICAgICAgICAnPGxhYmVsIG5nLXNob3c9XCJsYWJlbFNob3duXCIgY2xhc3M9XCJtcy1MYWJlbFwiIG5nLWNsaWNrPVwibGFiZWxDbGljaygpXCI+e3t1aWZMYWJlbCB8fCBwbGFjZWhvbGRlcn19PC9sYWJlbD4nICtcbiAgICAgICAgICAgICc8aW5wdXQgbmctbW9kZWw9XCJuZ01vZGVsXCIgbmctY2hhbmdlPVwiaW5wdXRDaGFuZ2UoKVwiIG5nLWJsdXI9XCJpbnB1dEJsdXIoKVwiIG5nLWZvY3VzPVwiaW5wdXRGb2N1cygpXCIgbmctY2xpY2s9XCJpbnB1dENsaWNrKClcIiAnICtcbiAgICAgICAgICAgICdjbGFzcz1cIm1zLVRleHRGaWVsZC1maWVsZFwiIG5nLXNob3c9XCIhdWlmTXVsdGlsaW5lXCIgbmctZGlzYWJsZWQ9XCJkaXNhYmxlZFwiIHR5cGU9XCJ7e3VpZlR5cGV9fVwiJyArXG4gICAgICAgICAgICAnbWluPVwie3ttaW59fVwiIG1heD1cInt7bWF4fX1cIiBzdGVwPVwie3tzdGVwfX1cIiAvPicgK1xuICAgICAgICAgICAgJzx0ZXh0YXJlYSBuZy1tb2RlbD1cIm5nTW9kZWxcIiBuZy1ibHVyPVwiaW5wdXRCbHVyKClcIiBuZy1mb2N1cz1cImlucHV0Rm9jdXMoKVwiIG5nLWNsaWNrPVwiaW5wdXRDbGljaygpXCIgJyArXG4gICAgICAgICAgICAnY2xhc3M9XCJtcy1UZXh0RmllbGQtZmllbGRcIiBuZy1zaG93PVwidWlmTXVsdGlsaW5lXCIgbmctZGlzYWJsZWQ9XCJkaXNhYmxlZFwiPjwvdGV4dGFyZWE+JyArXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtcy1UZXh0RmllbGQtZGVzY3JpcHRpb25cIj57e3VpZkRlc2NyaXB0aW9ufX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIG1heDogJ0AnLFxuICAgICAgICAgICAgbWluOiAnQCcsXG4gICAgICAgICAgICBuZ0NoYW5nZTogJz0/JyxcbiAgICAgICAgICAgIG5nTW9kZWw6ICc9PycsXG4gICAgICAgICAgICBuZ1JlcXVpcmVkOiAnPD8nLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdAJyxcbiAgICAgICAgICAgIHN0ZXA6ICdAJyxcbiAgICAgICAgICAgIHVpZkRlc2NyaXB0aW9uOiAnQCcsXG4gICAgICAgICAgICB1aWZMYWJlbDogJ0AnLFxuICAgICAgICAgICAgdWlmVHlwZTogJ0AnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucmVxdWlyZSA9IFsndWlmVGV4dGZpZWxkJywgJz9uZ01vZGVsJ107XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgfVxuICAgIFRleHRGaWVsZERpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFRleHRGaWVsZERpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgVGV4dEZpZWxkRGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBpbnN0YW5jZUVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycykge1xuICAgICAgICB2YXIgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWzBdO1xuICAgICAgICB2YXIgbmdNb2RlbCA9IGNvbnRyb2xsZXJzWzFdO1xuICAgICAgICBzY29wZS5kaXNhYmxlZCA9ICdkaXNhYmxlZCcgaW4gYXR0cnM7XG4gICAgICAgIHNjb3BlLiR3YXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBpbnN0YW5jZUVsZW1lbnQuYXR0cignZGlzYWJsZWQnKTsgfSwgKGZ1bmN0aW9uIChuZXdWYWx1ZSkgeyBzY29wZS5kaXNhYmxlZCA9IHR5cGVvZiBuZXdWYWx1ZSAhPT0gJ3VuZGVmaW5lZCc7IH0pKTtcbiAgICAgICAgc2NvcGUubGFiZWxTaG93biA9IHRydWU7XG4gICAgICAgIHNjb3BlLnJlcXVpcmVkID0gJ3JlcXVpcmVkJyBpbiBhdHRycztcbiAgICAgICAgc2NvcGUudWlmTXVsdGlsaW5lID0gYXR0cnMudWlmTXVsdGlsaW5lID09PSAndHJ1ZSc7XG4gICAgICAgIHNjb3BlLnVpZlR5cGUgPSBhdHRycy51aWZUeXBlO1xuICAgICAgICBzY29wZS4kd2F0Y2goJ3VpZlR5cGUnLCBmdW5jdGlvbiAobmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5ld1ZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmICh1aWZUeXBlRW51bV8xLklucHV0VHlwZUVudW1bbmV3VmFsdWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kbG9nLmVycm9yKCdFcnJvciBbbmdPZmZpY2VVaUZhYnJpY10gb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy50ZXh0ZmllbGQgLSBVbnN1cHBvcnRlZCB0eXBlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgdHlwZSAoXFwnJyArIHNjb3BlLnVpZlR5cGUgKyAnXFwnKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBPZmZpY2UgVUkgRmFicmljLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTdXBwb3J0ZWQgb3B0aW9ucyBhcmUgbGlzdGVkIGhlcmU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9uZ09mZmljZVVJRmFicmljL25nLW9mZmljZXVpZmFicmljL2Jsb2IvbWFzdGVyL3NyYy9jb21wb25lbnRzL3RleHRmaWVsZC91aWZUeXBlRW51bS50cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3BlLnVpZlR5cGUgPSB1aWZUeXBlRW51bV8xLklucHV0VHlwZUVudW0udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNjb3BlLiR3YXRjaCgnbmdSZXF1aXJlZCcsIGZ1bmN0aW9uIChuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBuZXdWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5yZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2NvcGUudWlmVW5kZXJsaW5lZCA9ICd1aWZVbmRlcmxpbmVkJyBpbiBhdHRycztcbiAgICAgICAgc2NvcGUuaW5wdXRGb2N1cyA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKHNjb3BlLnBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUubGFiZWxTaG93biA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBzY29wZS5pbnB1dEJsdXIgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IGluc3RhbmNlRWxlbWVudC5maW5kKCdpbnB1dCcpO1xuICAgICAgICAgICAgaWYgKHNjb3BlLnBsYWNlaG9sZGVyICYmIGlucHV0LnZhbCgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsU2hvd24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChuZ01vZGVsKSAmJiBuZ01vZGVsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXRUb3VjaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLmxhYmVsQ2xpY2sgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5wbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHNjb3BlLnVpZk11bHRpbGluZSA/IGluc3RhbmNlRWxlbWVudC5maW5kKCd0ZXh0YXJlYScpXG4gICAgICAgICAgICAgICAgICAgIDogaW5zdGFuY2VFbGVtZW50LmZpbmQoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgaW5wdXRbMF0uZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUuaW5wdXRDaGFuZ2UgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChuZ01vZGVsKSAmJiBuZ01vZGVsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZ01vZGVsLiRzZXREaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAobmdNb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBuZ01vZGVsLiRyZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLnBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmxhYmVsU2hvd24gPSAhbmdNb2RlbC4kdmlld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUZXh0RmllbGREaXJlY3RpdmU7XG59KCkpO1xuZXhwb3J0cy5UZXh0RmllbGREaXJlY3RpdmUgPSBUZXh0RmllbGREaXJlY3RpdmU7XG5leHBvcnRzLm1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdvZmZpY2V1aWZhYnJpYy5jb21wb25lbnRzLnRleHRmaWVsZCcsIFtcbiAgICAnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cydcbl0pXG4gICAgLmRpcmVjdGl2ZSgndWlmVGV4dGZpZWxkJywgVGV4dEZpZWxkRGlyZWN0aXZlLmZhY3RvcnkoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3RleHRmaWVsZC90ZXh0RmllbGREaXJlY3RpdmUudHNcbi8vIG1vZHVsZSBpZCA9IDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIElucHV0VHlwZUVudW07XG4oZnVuY3Rpb24gKElucHV0VHlwZUVudW0pIHtcbiAgICBJbnB1dFR5cGVFbnVtW0lucHV0VHlwZUVudW1bXCJ0ZXh0XCJdID0gMF0gPSBcInRleHRcIjtcbiAgICBJbnB1dFR5cGVFbnVtW0lucHV0VHlwZUVudW1bXCJwYXNzd29yZFwiXSA9IDFdID0gXCJwYXNzd29yZFwiO1xuICAgIElucHV0VHlwZUVudW1bSW5wdXRUeXBlRW51bVtcImVtYWlsXCJdID0gMl0gPSBcImVtYWlsXCI7XG4gICAgSW5wdXRUeXBlRW51bVtJbnB1dFR5cGVFbnVtW1widXJsXCJdID0gM10gPSBcInVybFwiO1xuICAgIElucHV0VHlwZUVudW1bSW5wdXRUeXBlRW51bVtcInRlbFwiXSA9IDRdID0gXCJ0ZWxcIjtcbiAgICBJbnB1dFR5cGVFbnVtW0lucHV0VHlwZUVudW1bXCJyYW5nZVwiXSA9IDVdID0gXCJyYW5nZVwiO1xuICAgIElucHV0VHlwZUVudW1bSW5wdXRUeXBlRW51bVtcIm51bWJlclwiXSA9IDZdID0gXCJudW1iZXJcIjtcbn0pKElucHV0VHlwZUVudW0gPSBleHBvcnRzLklucHV0VHlwZUVudW0gfHwgKGV4cG9ydHMuSW5wdXRUeXBlRW51bSA9IHt9KSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9jb21wb25lbnRzL3RleHRmaWVsZC91aWZUeXBlRW51bS50c1xuLy8gbW9kdWxlIGlkID0gNTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgYW5ndWxhciA9IHJlcXVpcmUoXCJhbmd1bGFyXCIpO1xudmFyIFRvZ2dsZURpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVG9nZ2xlRGlyZWN0aXZlKCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gJzxkaXYgbmctY2xhc3M9XCJbXFwnbXMtVG9nZ2xlXFwnLCB0ZXh0TG9jYXRpb24sIHtcXCdpcy1kaXNhYmxlZFxcJzogZGlzYWJsZWR9XVwiPicgK1xuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwibXMtVG9nZ2xlLWRlc2NyaXB0aW9uXCI+PG5nLXRyYW5zY2x1ZGUvPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ7ezo6JGlkfX1cIiBjbGFzcz1cIm1zLVRvZ2dsZS1pbnB1dFwiICcgK1xuICAgICAgICAgICAgJ25nLW1vZGVsPVwibmdNb2RlbFwiIG5nLWNoYW5nZT1cImNoZWNrYm94Q2hhbmdlKCk7bmdDaGFuZ2UoKVwiIG5nLWRpc2FibGVkPVwiZGlzYWJsZWRcIiAnICtcbiAgICAgICAgICAgICduZy1hdHRyLW5nLXRydWUtdmFsdWU9XCJ7e25nVHJ1ZVZhbHVlIHx8IHVuZGVmaW5lZH19XCIgbmctYXR0ci1uZy1mYWxzZS12YWx1ZT1cInt7bmdGYWxzZVZhbHVlIHx8IHVuZGVmaW5lZH19XCIgLz4nICtcbiAgICAgICAgICAgICc8bGFiZWwgZm9yPVwie3s6OiRpZH19XCIgY2xhc3M9XCJtcy1Ub2dnbGUtZmllbGRcIj4nICtcbiAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cIm1zLUxhYmVsIG1zLUxhYmVsLS1vZmZcIj57e3VpZkxhYmVsT2ZmfX08L3NwYW4+JyArXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtcy1MYWJlbCBtcy1MYWJlbC0tb25cIj57e3VpZkxhYmVsT259fTwvc3Bhbj4nICtcbiAgICAgICAgICAgICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHRoaXMucmVzdHJpY3QgPSAnRSc7XG4gICAgICAgIHRoaXMudHJhbnNjbHVkZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVxdWlyZSA9IFsnP25nTW9kZWwnXTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHtcbiAgICAgICAgICAgIG5nQ2hhbmdlOiAnJj8nLFxuICAgICAgICAgICAgbmdGYWxzZVZhbHVlOiAnQD8nLFxuICAgICAgICAgICAgbmdNb2RlbDogJz0/JyxcbiAgICAgICAgICAgIG5nVHJ1ZVZhbHVlOiAnQD8nLFxuICAgICAgICAgICAgdWlmTGFiZWxPZmY6ICdAJyxcbiAgICAgICAgICAgIHVpZkxhYmVsT246ICdAJyxcbiAgICAgICAgICAgIHVpZlRleHRMb2NhdGlvbjogJ0AnXG4gICAgICAgIH07XG4gICAgfVxuICAgIFRvZ2dsZURpcmVjdGl2ZS5mYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFRvZ2dsZURpcmVjdGl2ZSgpOyB9O1xuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH07XG4gICAgVG9nZ2xlRGlyZWN0aXZlLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycywgY3RybHMpIHtcbiAgICAgICAgdmFyIG5nTW9kZWxDdHJsO1xuICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQoY3RybHMpICYmIGN0cmxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsID0gY3RybHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLnVpZlRleHRMb2NhdGlvbikge1xuICAgICAgICAgICAgdmFyIGxvYyA9IHNjb3BlLnVpZlRleHRMb2NhdGlvbjtcbiAgICAgICAgICAgIGxvYyA9IGxvYy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGxvYy5zbGljZSgxKTtcbiAgICAgICAgICAgIHNjb3BlLnRleHRMb2NhdGlvbiA9ICcgbXMtVG9nZ2xlLS10ZXh0JyArIGxvYztcbiAgICAgICAgfVxuICAgICAgICBzY29wZS4kd2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gZWxlbS5hdHRyKCdkaXNhYmxlZCcpOyB9LCAoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7IHNjb3BlLmRpc2FibGVkID0gdHlwZW9mIG5ld1ZhbHVlICE9PSAndW5kZWZpbmVkJzsgfSkpO1xuICAgICAgICBzY29wZS5kaXNhYmxlZCA9ICdkaXNhYmxlZCcgaW4gYXR0cnM7XG4gICAgICAgIHNjb3BlLmNoZWNrYm94Q2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKG5nTW9kZWxDdHJsKSAmJiBuZ01vZGVsQ3RybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXREaXJ0eSgpO1xuICAgICAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRzZXRUb3VjaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gVG9nZ2xlRGlyZWN0aXZlO1xufSgpKTtcbmV4cG9ydHMuVG9nZ2xlRGlyZWN0aXZlID0gVG9nZ2xlRGlyZWN0aXZlO1xuZXhwb3J0cy5tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnb2ZmaWNldWlmYWJyaWMuY29tcG9uZW50cy50b2dnbGUnLCBbXG4gICAgJ29mZmljZXVpZmFicmljLmNvbXBvbmVudHMnXG5dKVxuICAgIC5kaXJlY3RpdmUoJ3VpZlRvZ2dsZScsIFRvZ2dsZURpcmVjdGl2ZS5mYWN0b3J5KCkpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY29tcG9uZW50cy90b2dnbGUvdG9nZ2xlRGlyZWN0aXZlLnRzXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBQZXJzb25hSW5pdGlhbHNDb2xvcjtcbihmdW5jdGlvbiAoUGVyc29uYUluaXRpYWxzQ29sb3IpIHtcbiAgICBQZXJzb25hSW5pdGlhbHNDb2xvcltQZXJzb25hSW5pdGlhbHNDb2xvcltcImxpZ2h0Qmx1ZVwiXSA9IDBdID0gXCJsaWdodEJsdWVcIjtcbiAgICBQZXJzb25hSW5pdGlhbHNDb2xvcltQZXJzb25hSW5pdGlhbHNDb2xvcltcImJsdWVcIl0gPSAxXSA9IFwiYmx1ZVwiO1xuICAgIFBlcnNvbmFJbml0aWFsc0NvbG9yW1BlcnNvbmFJbml0aWFsc0NvbG9yW1wiZGFya0JsdWVcIl0gPSAyXSA9IFwiZGFya0JsdWVcIjtcbiAgICBQZXJzb25hSW5pdGlhbHNDb2xvcltQZXJzb25hSW5pdGlhbHNDb2xvcltcInRlYWxcIl0gPSAzXSA9IFwidGVhbFwiO1xuICAgIFBlcnNvbmFJbml0aWFsc0NvbG9yW1BlcnNvbmFJbml0aWFsc0NvbG9yW1wibGlnaHRHcmVlblwiXSA9IDRdID0gXCJsaWdodEdyZWVuXCI7XG4gICAgUGVyc29uYUluaXRpYWxzQ29sb3JbUGVyc29uYUluaXRpYWxzQ29sb3JbXCJncmVlblwiXSA9IDVdID0gXCJncmVlblwiO1xuICAgIFBlcnNvbmFJbml0aWFsc0NvbG9yW1BlcnNvbmFJbml0aWFsc0NvbG9yW1wiZGFya0dyZWVuXCJdID0gNl0gPSBcImRhcmtHcmVlblwiO1xuICAgIFBlcnNvbmFJbml0aWFsc0NvbG9yW1BlcnNvbmFJbml0aWFsc0NvbG9yW1wibGlnaHRQaW5rXCJdID0gN10gPSBcImxpZ2h0UGlua1wiO1xuICAgIFBlcnNvbmFJbml0aWFsc0NvbG9yW1BlcnNvbmFJbml0aWFsc0NvbG9yW1wicGlua1wiXSA9IDhdID0gXCJwaW5rXCI7XG4gICAgUGVyc29uYUluaXRpYWxzQ29sb3JbUGVyc29uYUluaXRpYWxzQ29sb3JbXCJtYWdlbnRhXCJdID0gOV0gPSBcIm1hZ2VudGFcIjtcbiAgICBQZXJzb25hSW5pdGlhbHNDb2xvcltQZXJzb25hSW5pdGlhbHNDb2xvcltcInB1cnBsZVwiXSA9IDEwXSA9IFwicHVycGxlXCI7XG4gICAgUGVyc29uYUluaXRpYWxzQ29sb3JbUGVyc29uYUluaXRpYWxzQ29sb3JbXCJibGFja1wiXSA9IDExXSA9IFwiYmxhY2tcIjtcbiAgICBQZXJzb25hSW5pdGlhbHNDb2xvcltQZXJzb25hSW5pdGlhbHNDb2xvcltcIm9yYW5nZVwiXSA9IDEyXSA9IFwib3JhbmdlXCI7XG4gICAgUGVyc29uYUluaXRpYWxzQ29sb3JbUGVyc29uYUluaXRpYWxzQ29sb3JbXCJyZWRcIl0gPSAxM10gPSBcInJlZFwiO1xuICAgIFBlcnNvbmFJbml0aWFsc0NvbG9yW1BlcnNvbmFJbml0aWFsc0NvbG9yW1wiZGFya1JlZFwiXSA9IDE0XSA9IFwiZGFya1JlZFwiO1xufSkoUGVyc29uYUluaXRpYWxzQ29sb3IgPSBleHBvcnRzLlBlcnNvbmFJbml0aWFsc0NvbG9yIHx8IChleHBvcnRzLlBlcnNvbmFJbml0aWFsc0NvbG9yID0ge30pKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvcmUvcGVyc29uYUluaXRpYWxzQ29sb3JFbnVtLnRzXG4vLyBtb2R1bGUgaWQgPSA2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9