ngx-bootstrap-treeview
Version:
Ngx Bootstrap Treeview - Simple library to visualize, search and interact with tree data
922 lines • 90.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter, ViewChildren, QueryList, ElementRef, Renderer2, NgZone, ChangeDetectorRef, ViewChild } from '@angular/core';
import { Tree } from '../../models/tree.model';
import { faSquare, faCheckSquare, faFolder, faFolderOpen, faMinus, faCheck } from '@fortawesome/free-solid-svg-icons';
import { trigger, style, transition, animate, keyframes } from '@angular/animations';
import { Leaf } from '../../models/leaf.model';
import { LeafClickedEvent } from '../../models/leaf-clicked-event.model';
import { NgxBootstrapTreeviewMapper } from '../../utils/ngx-bootstrap-treeview-mapper';
import { ContextMenuService } from '../../services/context-menu.service';
var NgxBootstrapTreeviewComponent = /** @class */ (function () {
function NgxBootstrapTreeviewComponent(_host, _renderer, _zone, _changeDetector, _contextMenuService) {
this._host = _host;
this._renderer = _renderer;
this._zone = _zone;
this._changeDetector = _changeDetector;
this._contextMenuService = _contextMenuService;
this.contextMenus = {
leafMenu: {},
branchMenu: {},
rootMenu: {}
};
this.disableSelectedElements = false;
this.emptyFolderLabel = 'This folder is empty';
this.isAnimationDisabled = false;
this.isFirstLevel = true;
// This one is true IF AND ONLY IF we're at the top level, be it a root or a branch.
// This is because a branch where isFirstLevel = true is not always our first treeview instance
this.isFirstInstance = true;
this.preselectedItems = [];
// Icons inputs
this.openedFolderIcon = faFolderOpen;
this.closedFolderIcon = faFolder;
this.unselectedLeafIcon = faSquare;
this.selectedLeafIcon = faCheckSquare;
this.anyChildrenSelectedIcon = faMinus;
this.allChildrenSelectedIcon = faCheck;
this.filterString = '';
this.matchBranches = true;
this.branchClicked = new EventEmitter();
this.leafClicked = new EventEmitter();
this.selectedLeaves = [];
}
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
// We throw an exception if we have item or items but no mapper indicating how to handle them
if (!this.mapper && (this.item || this.items)) {
throw new Error('"item" or "items" are invalid parameters if you don\'t provide a mapper');
}
// If we have a mapper, it will handle "item" and "items"
if (this.mapper) {
if (this.items) {
this.trees = this.items.map(function (item) { return _this.mapper.mapTree(item); });
}
if (this.item) {
this.tree = this.mapper.mapTree(this.item);
}
}
// If we want to display one or more trees
if (this.trees && this.trees.length > 1) {
this.isRoot = true;
this.isBranch = this.isLeaf = false;
// return;
}
else if (this.trees) {
// Otherwise, we have trees but with less than 2 elements, we assign it to tree
// So ngOnInit() can keep going normaly
this.tree = this.trees[0];
}
if (this.tree && (this.tree.children || this.tree.loadChildren)) {
this.isBranch = true;
}
else {
this.isBranch = false;
}
this._resetDisplayedData();
if (!this.isRoot) {
this.isLeaf = !this.isBranch;
}
this.leavesCount = this.countLeaves(this.tree);
if (this.preselectedItems) {
this.preselectedItems.forEach(function (value) {
_this.select(value);
});
}
};
/**
* @param {?} changes
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
// The this.tree || this.trees is used to avoid anerror since ngOnChanges is called before ngOnInit()
if ('filterString' in changes && (this.displayedTree || this.displayedTrees)) {
this._zone.runOutsideAngular(function () {
if (_this._filterTrigger) {
clearTimeout(_this._filterTrigger);
_this._filterTrigger = null;
}
_this._filterTrigger = setTimeout(function () {
_this._zone.run(function () {
if (_this.displayedTrees) {
_this.displayedTrees = _this._filterTrees();
}
else if (_this.displayedTree) {
_this.displayedTree = _this._filterTree(_this.displayedTree);
}
_this._changeDetector.detectChanges();
if (_this.filterString) {
_this.unfoldAll();
}
else {
_this._resetDisplayedData();
_this.foldAll();
}
});
}, 250);
});
}
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onClick = /**
* @return {?}
*/
function () {
if (this.isLeaf) {
this.onLeafClicked();
}
if (this.isBranch) {
if (this.loggingService) {
this.loggingService.log("\uD83C\uDF34 Branche cliqu\u00E9e: " + this.tree.label);
}
this.onBranchClicked();
}
};
/**
* @param {?} leafClickedEvent
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onChildLeafClicked = /**
* @param {?} leafClickedEvent
* @return {?}
*/
function (leafClickedEvent) {
if (this.loggingService && this.isBranch) {
this.loggingService.log("\u27A1 Event entrant dans le parent " + this.tree.label + ":", leafClickedEvent);
}
else if (this.loggingService && this.isRoot) {
this.loggingService.log("\u27A1 Event entrant dans la racine:", leafClickedEvent);
}
// When a child leaf is clicked, we check our selectedLeaves to select or unselect the clicked one
if (!this._leafExistsIn(this.selectedLeaves, leafClickedEvent.leaf)) {
this._selectLeaf(leafClickedEvent.leaf);
}
else {
this._unselectLeaf(leafClickedEvent.leaf);
}
// Now that the leaf is selected/unselected, we merge our selectedLeaves with the ones of the event
leafClickedEvent.selectedLeaves = this.selectedLeaves;
if (this.isBranch && this.loggingService) {
this.loggingService.log("\u2B05 Event sortant de " + this.tree.label + " vers un parent:", leafClickedEvent);
}
else if (this.loggingService && this.isRoot) {
this.loggingService.log("\u2B05 Event sortant de la racine:", leafClickedEvent);
}
this.leafClicked.emit(leafClickedEvent);
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onLeafClicked = /**
* @return {?}
*/
function () {
if (this.loggingService) {
this.loggingService.log('🍂 Feuille cliqué:', this.tree.label);
}
if (!this.disableSelectedElements || !this.isOpened) {
this._leafToggle();
}
};
/**
* @param {?} tree
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.countLeaves = /**
* @param {?} tree
* @return {?}
*/
function (tree) {
var _this = this;
/** @type {?} */
var leavesCount = 0;
if (tree && (!tree.children || tree.loadChildren)) {
leavesCount = 1;
}
else if (tree) {
tree.children.forEach(function (child) {
leavesCount += _this.countLeaves(child);
});
}
return leavesCount;
};
/**
* @param {?} value
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.select = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this.isLeaf && this.tree.value === value && !this.isOpened) {
this._leafToggle();
}
else if (this.isRoot || this.isBranch) {
this.children.forEach(function (child) {
child.select(value);
});
}
};
/**
* @param {?} value
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.unselect = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this.isLeaf && this.tree.value === value && this.isOpened) {
this._leafToggle();
}
else if (this.isRoot || this.isBranch) {
this.children.forEach(function (child) {
child.unselect(value);
});
}
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onBranchClicked = /**
* @return {?}
*/
function () {
this._branchToggle();
this.branchClicked.emit(this.tree);
};
/**
* @param {?} branch
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onChildBranchClicked = /**
* @param {?} branch
* @return {?}
*/
function (branch) {
var _this = this;
this.branchClicked.emit(branch);
if (this.rootsContainer) {
requestAnimationFrame(function () {
// We use requestAnimationFrame because we want this to be processed once rerendering is complete
_this.rootsContainer.nativeElement.style.height = _this.computeHeight() + 'px';
});
}
};
/**
* @param {?} event
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onContextMenu = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
event.preventDefault();
this._contextMenuService.fire({
target: this.tree,
event: event
});
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onElementAdded = /**
* @return {?}
*/
function () {
this.leavesCount = this.countLeaves(this.tree);
return true;
};
/**
* @param {?} event
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.onRootContextMenu = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
event.preventDefault();
this._contextMenuService.fire({
event: event,
target: null
});
};
/**
* @param {?=} id
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.fold = /**
* @param {?=} id
* @return {?}
*/
function (id) {
if (!id) {
this._fold();
}
else {
this._foldId(id);
}
};
/**
* @param {?=} id
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.unfold = /**
* @param {?=} id
* @return {?}
*/
function (id) {
if (!id) {
this._unfold();
}
else {
this._unfoldId(id);
}
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.show = /**
* @return {?}
*/
function () {
/** @type {?} */
var domElement = this._host.nativeElement;
this._renderer.removeClass(domElement, 'd-none');
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.hide = /**
* @return {?}
*/
function () {
/** @type {?} */
var domElement = this._host.nativeElement;
this._renderer.addClass(domElement, 'd-none');
};
/**
* @param {?} filterString
* @param {?=} item
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.filter = /**
* @param {?} filterString
* @param {?=} item
* @return {?}
*/
function (filterString, item) {
var _this = this;
if (this.isRoot) {
this.children.forEach(function (child) {
child.filter(_this.filterString);
});
}
else {
if (!item) {
item = this.tree;
}
/** @type {?} */
var matchingElementsCount = this.countFilteredItems(filterString, item);
if (matchingElementsCount === 0) {
this.hide();
}
else {
this.show();
if (filterString !== '') {
this._unfold();
}
else {
this._fold();
}
}
}
};
/**
* @param {?} filterString
* @param {?} item
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.countFilteredItems = /**
* @param {?} filterString
* @param {?} item
* @return {?}
*/
function (filterString, item) {
var _this = this;
/** @type {?} */
var matchingElementsCount = 0;
if (item.children) {
if (!filterString.length) {
return 1;
}
matchingElementsCount = item.children.reduce(function (acc, child) { return acc + _this.countFilteredItems(filterString, child); }, 0);
}
else {
/** @type {?} */
var regex = new RegExp(filterString, 'i');
if (regex.test(item.label)) {
matchingElementsCount++;
}
}
return matchingElementsCount;
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.unfoldAll = /**
* @return {?}
*/
function () {
// A branch will unfold itself
if (this.isBranch && !this.isOpened) {
this._branchToggle();
this._changeDetector.detectChanges();
}
// If we're not a leaf, we unfold all of our children
if (!this.isLeaf) {
this.children.forEach(function (child) {
child.unfoldAll();
});
}
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.foldAll = /**
* @return {?}
*/
function () {
// A branch will fold itself
if (this.isBranch && this.isOpened) {
this._branchToggle();
}
// If we're not a leaf, we unfold all of our children
if (!this.isLeaf) {
this.children.forEach(function (child) {
child.foldAll();
});
}
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype.computeHeight = /**
* @return {?}
*/
function () {
if (!this.isRoot) {
return this.treeview.nativeElement.scrollHeight;
}
return this.children.reduce(function (prevValue, currentValue) {
return prevValue + currentValue.computeHeight();
}, 0);
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._unfold = /**
* @return {?}
*/
function () {
if (this.isBranch && !this.isOpened) {
this._branchToggle();
}
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._fold = /**
* @return {?}
*/
function () {
if (this.isBranch && this.isOpened) {
this._branchToggle();
}
};
/**
* @param {?} id
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._unfoldId = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (this.isBranch && this.tree.value === id && !this.isOpened) {
this._branchToggle();
}
else if (this.isBranch && this.children.length) {
this.children.forEach(function (child) {
child.unfold(id);
});
}
};
/**
* @param {?} id
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._foldId = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (this.isBranch && this.tree.value === id && this.isOpened) {
this._branchToggle();
}
else if (this.isBranch && this.children.length) {
this.children.forEach(function (child) {
child.fold(id);
});
}
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._leafToggle = /**
* @return {?}
*/
function () {
this.isOpened = !this.isOpened;
/** @type {?} */
var leaf = new Leaf(this.tree);
if (this.isOpened) {
this._selectLeaf(leaf);
}
else {
this._unselectLeaf(leaf);
}
/** @type {?} */
var event = new LeafClickedEvent(leaf, this.selectedLeaves);
this.leafClicked.emit(event);
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._branchToggle = /**
* @return {?}
*/
function () {
this.isOpened = !this.isOpened;
};
/**
* @param {?} leaf
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._selectLeaf = /**
* @param {?} leaf
* @return {?}
*/
function (leaf) {
if (!this.isRoot && this.loggingService) {
this.loggingService.log("\u2714\uFE0F Feuille s\u00E9lectionn\u00E9e dans " + this.tree.label + ":", leaf);
}
else if (this.loggingService) {
this.loggingService.log("\u2714\uFE0F Feuille s\u00E9lectionn\u00E9e dans la racine:", leaf);
}
if (!this._leafExistsIn(this.selectedLeaves, leaf)) {
this.selectedLeaves = tslib_1.__spread(this.selectedLeaves, [leaf]);
}
};
/**
* @param {?} leaf
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._unselectLeaf = /**
* @param {?} leaf
* @return {?}
*/
function (leaf) {
if (!this.isRoot && this.loggingService) {
this.loggingService.log("\u274C Feuille d\u00E9s\u00E9lectionn\u00E9e dans " + this.tree.label + ":", leaf);
}
else if (this.loggingService) {
this.loggingService.log("\u274C Feuille d\u00E9s\u00E9lectionn\u00E9e dans la racine:", leaf);
}
/** @type {?} */
var index = this._leafIndex(this.selectedLeaves, leaf);
if (index !== -1) {
this.selectedLeaves.splice(index, 1);
}
};
// Function used to check if a given leaf does exist in sleectedLeaves array
// We use this because of the new Leaf(), which causes reference comparison of Array.indexOf() not to work
// Function used to check if a given leaf does exist in sleectedLeaves array
// We use this because of the new Leaf(), which causes reference comparison of Array.indexOf() not to work
/**
* @param {?} leaves
* @param {?} leaf
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._leafIndex =
// Function used to check if a given leaf does exist in sleectedLeaves array
// We use this because of the new Leaf(), which causes reference comparison of Array.indexOf() not to work
/**
* @param {?} leaves
* @param {?} leaf
* @return {?}
*/
function (leaves, leaf) {
/** @type {?} */
var result = -1;
leaves.forEach(function (selectedLeaf, index) {
if (selectedLeaf.value === leaf.value && selectedLeaf.label === leaf.label) {
result = index;
}
});
return result;
};
/**
* @param {?} leaves
* @param {?} leaf
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._leafExistsIn = /**
* @param {?} leaves
* @param {?} leaf
* @return {?}
*/
function (leaves, leaf) {
return this._leafIndex(leaves, leaf) !== -1;
};
/**
* @param {?} tree
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._copyTree = /**
* @param {?} tree
* @return {?}
*/
function (tree) {
var _this = this;
/** @type {?} */
var isTree = !!tree.children;
/** @type {?} */
var result = {
value: tree.value,
label: tree.label,
data: tree.data
};
if (isTree) {
/** @type {?} */
var children = tree.children.map(function (child) { return _this._copyTree(child); });
return tslib_1.__assign({}, result, { children: children });
}
else {
return result;
}
};
/**
* @param {?} trees
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._copyTrees = /**
* @param {?} trees
* @return {?}
*/
function (trees) {
var _this = this;
return trees.map(function (tree) { return _this._copyTree(tree); });
};
/**
* @param {?=} trees
* @param {?=} filterString
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._filterTrees = /**
* @param {?=} trees
* @param {?=} filterString
* @return {?}
*/
function (trees, filterString) {
var _this = this;
if (trees === void 0) { trees = this.trees; }
if (filterString === void 0) { filterString = this.filterString; }
/** @type {?} */
var copies = this._copyTrees(trees);
if (filterString !== '') {
/** @type {?} */
var displayedTrees = copies
.map(function (copy) {
return _this._filterTree(copy, filterString);
})
.filter(function (filteredCopy) { return !!filteredCopy; });
return displayedTrees;
}
else {
return copies;
}
};
// This method alters tree.children and returns true if any elements matched the filter string
// This method alters tree.children and returns true if any elements matched the filter string
/**
* @param {?} tree
* @param {?=} filterString
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._filterTree =
// This method alters tree.children and returns true if any elements matched the filter string
/**
* @param {?} tree
* @param {?=} filterString
* @return {?}
*/
function (tree, filterString) {
var _this = this;
if (filterString === void 0) { filterString = this.filterString; }
/** @type {?} */
var regex = new RegExp(filterString, 'i');
if (!tree.children) {
// Leaf handling
return regex.test(tree.label) ? tree : null;
}
else if (tree.children && tree.children.length) {
if (this.matchBranches && regex.test(tree.label)) {
return tree;
}
// Non empty branches handling
tree.children = tree.children.map(function (child) { return _this._filterTree(child); }).filter(function (child) { return !!child; });
return tree.children.length ? tree : null;
}
return null;
};
/**
* @return {?}
*/
NgxBootstrapTreeviewComponent.prototype._resetDisplayedData = /**
* @return {?}
*/
function () {
if (this.tree) {
this.displayedTree = this._copyTree(this.tree);
}
else if (this.trees) {
this.displayedTrees = this._copyTrees(this.trees);
}
};
NgxBootstrapTreeviewComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'ngx-bootstrap-treeview',
template: "<!-- This part is used if we have a single tree inputed to our component -->\r\n<ul\r\n [ngClass]=\"{\r\n branch: displayedTree.children,\r\n leaf: !displayedTree.children,\r\n opened: isOpened,\r\n 'pl-0': isFirstLevel,\r\n disabled: isLeaf && isOpened && disableSelectedElements\r\n }\"\r\n *ngIf=\"displayedTree\"\r\n class=\"mb-0\"\r\n #treeview\r\n>\r\n <li>\r\n <a [routerLink]=\"[]\" (click)=\"onClick()\" (contextmenu)=\"onContextMenu($event)\">\r\n <!-- Icons if we're reprensenting a branch -->\r\n <span class=\"icon\">\r\n <!-- Folder closed, no children selected -->\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"closedFolderIcon\"\r\n *ngIf=\"displayedTree.children && !isOpened && !selectedLeaves.length\"\r\n ></fa-icon>\r\n\r\n <!-- Folder closed, children selected but not all -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children &&\r\n !isOpened &&\r\n selectedLeaves.length > 0 &&\r\n selectedLeaves.length < this.leavesCount\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"closedFolderIcon\"></fa-icon>\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"anyChildrenSelectedIcon\" transform=\"shrink-6 down-1\"></fa-icon>\r\n </fa-layers>\r\n\r\n <!-- Folder closed, all children selected -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children && !isOpened && selectedLeaves.length === leavesCount && leavesCount > 0\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"closedFolderIcon\"></fa-icon>\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"allChildrenSelectedIcon\" transform=\"shrink-8 down-1\"></fa-icon>\r\n </fa-layers>\r\n\r\n <!-- Folder opened, no children selected -->\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"openedFolderIcon\"\r\n *ngIf=\"displayedTree.children && isOpened && !selectedLeaves.length\"\r\n ></fa-icon>\r\n\r\n <!-- Folder opened, children selected but not all -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children &&\r\n isOpened &&\r\n selectedLeaves.length > 0 &&\r\n selectedLeaves.length < this.leavesCount\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"openedFolderIcon\"></fa-icon>\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"anyChildrenSelectedIcon\"\r\n transform=\"shrink-8 down-3 right-2\"\r\n class=\"opened-folder-mask\"\r\n ></fa-icon>\r\n </fa-layers>\r\n <!-- Folder opened, all children selected -->\r\n <fa-layers\r\n [fixedWidth]=\"true\"\r\n *ngIf=\"\r\n displayedTree.children && isOpened && selectedLeaves.length === leavesCount && leavesCount > 0\r\n \"\r\n >\r\n <fa-icon [fixedWidth]=\"true\" [icon]=\"openedFolderIcon\"></fa-icon>\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"allChildrenSelectedIcon\"\r\n transform=\"shrink-12 down-3 right-1\"\r\n class=\"opened-folder-mask\"\r\n ></fa-icon>\r\n </fa-layers>\r\n <!-- /branch icons -->\r\n\r\n <!-- Icons if we're reprensenting a leaf -->\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"unselectedLeafIcon\"\r\n *ngIf=\"!displayedTree.children && !isOpened\"\r\n ></fa-icon>\r\n <fa-icon\r\n [fixedWidth]=\"true\"\r\n [icon]=\"selectedLeafIcon\"\r\n *ngIf=\"!displayedTree.children && isOpened\"\r\n ></fa-icon>\r\n </span>\r\n <span class=\"label\">\r\n {{ displayedTree.label }}\r\n </span>\r\n </a>\r\n\r\n <div\r\n *ngIf=\"displayedTree.children && isOpened\"\r\n class=\"children\"\r\n [@.disabled]=\"isAnimationDisabled\"\r\n [@childrenAnimationTrigger]\r\n >\r\n <ul *ngIf=\"displayedTree.children.length === 0\">\r\n <li>\r\n <i>{{ emptyFolderLabel }}</i>\r\n </li>\r\n </ul>\r\n <ng-container *ngFor=\"let branch of displayedTree.children\">\r\n <ngx-bootstrap-treeview\r\n *ngIf=\"onElementAdded()\"\r\n [tree]=\"branch\"\r\n (branchClicked)=\"onChildBranchClicked($event)\"\r\n (leafClicked)=\"onChildLeafClicked($event)\"\r\n [selectedLeafIcon]=\"selectedLeafIcon\"\r\n [unselectedLeafIcon]=\"unselectedLeafIcon\"\r\n [openedFolderIcon]=\"openedFolderIcon\"\r\n [closedFolderIcon]=\"closedFolderIcon\"\r\n [canSelectBranch]=\"canSelectBranch\"\r\n [anyChildrenSelectedIcon]=\"anyChildrenSelectedIcon\"\r\n [allChildrenSelectedIcon]=\"allChildrenSelectedIcon\"\r\n [loggingService]=\"loggingService\"\r\n [isFirstInstance]=\"false\"\r\n [isFirstLevel]=\"false\"\r\n [disableSelectedElements]=\"disableSelectedElements\"\r\n [emptyFolderLabel]=\"emptyFolderLabel\"\r\n >\r\n </ngx-bootstrap-treeview>\r\n </ng-container>\r\n </div>\r\n </li>\r\n</ul>\r\n<!-- END Single tree provided -->\r\n\r\n<!-- Context menu, only shown once, so either on root or on branch if first level -->\r\n<ngx-bootstrap-treeview-context-menu\r\n *ngIf=\"contextMenus && isFirstInstance\"\r\n [config]=\"contextMenus\"\r\n [rootContextMenu]=\"contextMenus.rootMenu\"\r\n [branchContextMenu]=\"contextMenus.branchMenu\"\r\n [leafContextMenu]=\"contextMenus.leafMenu\"\r\n>\r\n</ngx-bootstrap-treeview-context-menu>\r\n\r\n<!-- If we provided an array of trees as an input, this part will be called -->\r\n<div *ngIf=\"displayedTrees\" (contextmenu)=\"onRootContextMenu($event)\" #rootsContainer>\r\n <ngx-bootstrap-treeview\r\n *ngFor=\"let displayedTree of displayedTrees\"\r\n [tree]=\"displayedTree\"\r\n (branchClicked)=\"onChildBranchClicked($event)\"\r\n (leafClicked)=\"onChildLeafClicked($event)\"\r\n [selectedLeafIcon]=\"selectedLeafIcon\"\r\n [unselectedLeafIcon]=\"unselectedLeafIcon\"\r\n [openedFolderIcon]=\"openedFolderIcon\"\r\n [closedFolderIcon]=\"closedFolderIcon\"\r\n [canSelectBranch]=\"canSelectBranch\"\r\n [anyChildrenSelectedIcon]=\"anyChildrenSelectedIcon\"\r\n [allChildrenSelectedIcon]=\"allChildrenSelectedIcon\"\r\n [loggingService]=\"loggingService\"\r\n [disableSelectedElements]=\"disableSelectedElements\"\r\n [isAnimationDisabled]=\"isAnimationDisabled\"\r\n [isFirstInstance]=\"false\"\r\n [emptyFolderLabel]=\"emptyFolderLabel\"\r\n ></ngx-bootstrap-treeview>\r\n</div>\r\n<!-- End multiple trees provided -->\r\n",
animations: [
trigger('childrenAnimationTrigger', [
transition(':leave', [animate('0.25s', style({ transform: 'translateX(-100%)', display: 'none' }))]),
transition(':enter', [
animate('0.25s', keyframes([
style({ transform: 'translateX(-100%)', display: 'block', offset: 0 }),
style({ transform: 'translateX(0%)', offset: 1 })
]))
])
])
],
styles: ["ul{list-style-type:none;overflow:visible;float:left;clear:left}ul li{position:relative;display:inline-block}ul fa-icon,ul fa-layers fa-icon{color:#000}ul fa-layers fa-icon:not(:first-child) ::ng-deep svg[data-prefix=fas]{color:#fff}ul fa-layers fa-icon.opened-folder-mask ::ng-deep svg{-webkit-transform:skew(-45deg,0);transform:skew(-45deg,0)}:host{display:block}:host>div{position:relative}"]
}] }
];
/** @nocollapse */
NgxBootstrapTreeviewComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: NgZone },
{ type: ChangeDetectorRef },
{ type: ContextMenuService }
]; };
NgxBootstrapTreeviewComponent.propDecorators = {
canSelectBranch: [{ type: Input }],
contextMenus: [{ type: Input }],
disableSelectedElements: [{ type: Input }],
emptyFolderLabel: [{ type: Input }],
isAnimationDisabled: [{ type: Input }],
isFirstLevel: [{ type: Input }],
isFirstInstance: [{ type: Input }],
isOpened: [{ type: Input }],
item: [{ type: Input }],
items: [{ type: Input }],
loggingService: [{ type: Input }],
mapper: [{ type: Input }],
preselectedItems: [{ type: Input }],
tree: [{ type: Input }],
trees: [{ type: Input }],
openedFolderIcon: [{ type: Input }],
closedFolderIcon: [{ type: Input }],
unselectedLeafIcon: [{ type: Input }],
selectedLeafIcon: [{ type: Input }],
anyChildrenSelectedIcon: [{ type: Input }],
allChildrenSelectedIcon: [{ type: Input }],
filterString: [{ type: Input }],
matchBranches: [{ type: Input }],
branchClicked: [{ type: Output }],
leafClicked: [{ type: Output }],
children: [{ type: ViewChildren, args: [NgxBootstrapTreeviewComponent,] }],
treeview: [{ type: ViewChild, args: ['treeview',] }],
rootsContainer: [{ type: ViewChild, args: ['rootsContainer',] }]
};
return NgxBootstrapTreeviewComponent;
}());
export { NgxBootstrapTreeviewComponent };
if (false) {
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.canSelectBranch;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.contextMenus;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.disableSelectedElements;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.emptyFolderLabel;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isAnimationDisabled;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isFirstLevel;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isFirstInstance;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isOpened;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.item;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.items;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.loggingService;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.mapper;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.preselectedItems;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.tree;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.trees;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.openedFolderIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.closedFolderIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.unselectedLeafIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.selectedLeafIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.anyChildrenSelectedIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.allChildrenSelectedIcon;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.filterString;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.matchBranches;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.branchClicked;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.leafClicked;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.children;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.treeview;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.rootsContainer;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.selectedLeaves;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.leavesCount;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isBranch;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isLeaf;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.isRoot;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.displayedTrees;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype.displayedTree;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._filterTrigger;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._host;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._renderer;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._zone;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._changeDetector;
/** @type {?} */
NgxBootstrapTreeviewComponent.prototype._contextMenuService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJvb3RzdHJhcC10cmVldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3LyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9uZ3gtYm9vdHN0cmFwLXRyZWV2aWV3L25neC1ib290c3RyYXAtdHJlZXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixTQUFTLEVBR1QsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9DLE9BQU8sRUFDSCxRQUFRLEVBQ1IsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osT0FBTyxFQUNQLE9BQU8sRUFFVixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQVMsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXpFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXZGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXpFO0lBbUlJLHVDQUNZLEtBQThCLEVBQzlCLFNBQW9CLEVBQ3BCLEtBQWEsRUFDYixlQUFrQyxFQUNsQyxtQkFBdUM7UUFKdkMsVUFBSyxHQUFMLEtBQUssQ0FBeUI7UUFDOUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2Isb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUEvRzVDLGlCQUFZLEdBQXFDO1lBQ3BELFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLEVBQUU7WUFDZCxRQUFRLEVBQUUsRUFBRTtTQUNmLENBQUM7UUFHSyw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFHaEMscUJBQWdCLEdBQUcsc0JBQXNCLENBQUM7UUFHMUMsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRzVCLGlCQUFZLEdBQUcsSUFBSSxDQUFDOzs7UUFLcEIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFrQnZCLHFCQUFnQixHQUFVLEVBQUUsQ0FBQzs7UUFVN0IscUJBQWdCLEdBQW1CLFlBQVksQ0FBQztRQUdoRCxxQkFBZ0IsR0FBbUIsUUFBUSxDQUFDO1FBRzVDLHVCQUFrQixHQUFtQixRQUFRLENBQUM7UUFHOUMscUJBQWdCLEdBQW1CLGFBQWEsQ0FBQztRQUdqRCw0QkFBdUIsR0FBbUIsT0FBTyxDQUFDO1FBR2xELDRCQUF1QixHQUFtQixPQUFPLENBQUM7UUFHbEQsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFHbEIsa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFHckIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBR3pDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFXbkQsbUJBQWMsR0FBVyxFQUFFLENBQUM7SUF5QmhDLENBQUM7Ozs7SUFFSixnREFBUTs7O0lBQVI7UUFBQSxpQkErQ0M7UUE5Q0csNkZBQTZGO1FBQzdGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO1NBQzlGO1FBRUQseURBQXlEO1FBQ3pELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQXpCLENBQXlCLENBQUMsQ0FBQzthQUNsRTtZQUVELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QztTQUNKO1FBRUQsMENBQTBDO1FBQzFDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQyxVQUFVO1NBQ2I7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbkIsK0VBQStFO1lBQy9FLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN6QjtRQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDaEM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9DLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO2dCQUMvQixLQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDOzs7OztJQUVELG1EQUFXOzs7O0lBQVgsVUFBWSxPQUFzQjtRQUFsQyxpQkE2QkM7UUE1QkcscUdBQXFHO1FBQ3JHLElBQUksY0FBYyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3pCLElBQUksS0FBSSxDQUFDLGNBQWMsRUFBRTtvQkFDckIsWUFBWSxDQUFDLEtBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDbEMsS0FBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7aUJBQzlCO2dCQUVELEtBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO29CQUM3QixLQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzt3QkFDWCxJQUFJLEtBQUksQ0FBQyxjQUFjLEVBQUU7NEJBQ3JCLEtBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFDO3lCQUM3Qzs2QkFBTSxJQUFJLEtBQUksQ0FBQyxhQUFhLEVBQUU7NEJBQzNCLEtBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQzdEO3dCQUVELEtBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBRXJDLElBQUksS0FBSSxDQUFDLFlBQVksRUFBRTs0QkFDbkIsS0FBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3lCQUNwQjs2QkFBTTs0QkFDSCxLQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzs0QkFDM0IsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3lCQUNsQjtvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7OztJQUVNLCtDQUFPOzs7SUFBZDtRQUNJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN4QjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsd0NBQXVCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBTyxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDOzs7OztJQUVNLDBEQUFrQjs7OztJQUF6QixVQUEwQixnQkFBa0M7UUFDeEQsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMseUNBQWtDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUNuRzthQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHNDQUFpQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDaEY7UUFFRCxrR0FBa0c7UUFDbEcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNDO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdDO1FBRUQsbUdBQW1HO1FBQ25HLGdCQUFnQixDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRXRELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLDZCQUFzQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUsscUJBQWtCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUN0RzthQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLG9DQUErQixFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDOUU7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7SUFFTSxxREFBYTs7O0lBQXBCO1FBQ0ksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEU7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEI7SUFDTCxDQUFDOzs7OztJQUVNLG1EQUFXOzs7O0lBQWxCLFVBQW1CLElBQVU7UUFBN0IsaUJBV0M7O1lBVk8sV0FBVyxHQUFHLENBQUM7UUFDbkIsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQy9DLFdBQVcsR0FBRyxDQUFDLENBQUM7U0FDbkI7YUFBTSxJQUFJLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsS0FBSztnQkFDdkIsV0FBVyxJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRU0sOENBQU07Ozs7SUFBYixVQUFjLEtBQVU7UUFDcEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDNUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFvQztnQkFDdkQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7Ozs7SUFFTSxnREFBUTs7OztJQUFmLFVBQWdCLEtBQVU7UUFDdEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBb0M7Z0JBQ3ZELEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Ozs7SUFFTSx1REFBZTs7O0lBQXRCO1FBQ0ksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDOzs7OztJQUVNLDREQUFvQjs7OztJQUEzQixVQUE0QixNQUFZO1FBQXhDLGlCQVNDO1FBUkcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLHFCQUFxQixDQUFDO2dCQUNsQixpR0FBaUc7Z0JBQ2pHLEtBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQztZQUNqRixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7Ozs7SUFFTSxxREFBYTs7OztJQUFwQixVQUFxQixLQUFpQjtRQUNsQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2pCLEtBQUssRUFBRSxLQUFLO1NBQ2YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7OztJQUVNLHNEQUFjOzs7SUFBckI7UUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9DLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Ozs7O0lBRU0seURBQWlCOzs7O0lBQXhCLFVBQXlCLEtBQWlCO1FBQ3RDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLE9BQUE7WUFDTCxNQUFNLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBRU0sNENBQUk7Ozs7SUFBWCxVQUFZLEVBQW9CO1FBQzVCLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDTCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDaEI7YUFBTTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDcEI7SUFDTCxDQUFDOzs7OztJQUVNLDhDQUFNOzs7O0lBQWIsVUFBYyxFQUFvQjtRQUM5QixJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ0wsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQzs7OztJQUVNLDRDQUFJOzs7SUFBWDs7WUFDVSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1FBRTNDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDOzs7O0lBRU0sNENBQUk7OztJQUFYOztZQUNVLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7UUFFM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7OztJQUVNLDhDQUFNOzs7OztJQUFiLFVBQWMsWUFBb0IsRUFBRSxJQUFXO1FBQS9DLGlCQXdCQztRQXZCRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEtBQW9DO2dCQUN2RCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNQLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3BCOztnQkFFSyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztZQUV6RSxJQUFJLHFCQUFxQixLQUFLLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUVaLElBQUksWUFBWSxLQUFLLEVBQUUsRUFBRTtvQkFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUNsQjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ2hCO2FBQ0o7U0FDSjtJQUNMLENBQUM7Ozs7OztJQUVNLDBEQUFrQjs7Ozs7SUFBekIsVUFBMEIsWUFBb0IsRUFBRSxJQUFVO1FBQTFELGlCQXFCQzs7WUFwQk8scUJBQXFCLEdBQUcsQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsT0FBTyxDQUFDLENBQUM7YUFDWjtZQUVELHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUN4QyxVQUFDLEdBQVcsRUFBRSxLQUFXLElBQUssT0FBQSxHQUFHLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsRUFBbEQsQ0FBa0QsRUFDaEYsQ0FBQyxDQUNKLENBQUM7U0FDTDthQUFNOztnQkFDRyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQztZQUUzQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN4QixxQkFBcUIsRUFBRSxDQUFDO2FBQzNCO1NBQ0o7UUFFRCxPQUFPLHFCQUFxQixDQUFDO0lBQ2pDLENBQUM7Ozs7SUFFTSxpREFBUzs7O0lBQWhCO1FBQ0ksOEJBQThCO1FBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDeEM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEtBQW9DO2dCQUN2RCxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Ozs7SUFFTSwrQ0FBTzs7O0lBQWQ7UUFDSSw0QkFBNEI7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO1FBRUQscURBQXFEO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFvQztnQkFDdkQsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDOzs7O0lBRU0scURBQWE7OztJQUFwQjtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7U0FDbkQ7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUMsU0FBaUIsRUFBRSxZQUEyQztZQUN2RixPQUFPLFNBQVMsR0FBRyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQzs7OztJQUVPLCtDQUFPOzs7SUFBZjtRQUNJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQzs7OztJQUVPLDZDQUFLOzs7SUFBYjtRQUNJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN4QjtJQUNMLENBQUM7Ozs7O0lBRU8saURBQVM7Ozs7SUFBakIsVUFBa0IsRUFBbUI7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDM0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBb0M7Z0JBQ3ZELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Ozs7O0lBRU8sK0NBQU87Ozs7SUFBZixVQUFnQixFQUFtQjtRQUMvQixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBb0M7Z0JBQ3ZELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7Ozs7SUFFTyxtREFBVzs7O0lBQW5CO1FBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7O1lBRXpCLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7YUFBTTtZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUI7O1lBRUssS0FBSyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQzs7OztJQUVPLHFEQUFhOzs7SUFBckI7UUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDOzs7OztJQUVPLG1EQUFXOzs7O0lBQW5CLFVBQW9CLElBQVU7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxzREFBZ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyRjthQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyw2REFBeUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM1RTtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDaEQsSUFBSSxDQUFDLGNBQWMsb0JBQU8sSUFBSSxDQUFDLGNBQWMsR0FBRSxJQUFJLEVBQUMsQ0FBQztTQUN4RDtJQUNMLENBQUM7Ozs7O0lBRU8scURBQWE7Ozs7SUFBckIsVUFBc0IsSUFBVTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHVEQUFpQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssTUFBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RGO2FBQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLDhEQUEwQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdFOztZQUVLLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDO1FBQ3hELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0wsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSwwR0FBMEc7Ozs7Ozs7O0lBQ2xHLGtEQUFVOzs7Ozs7OztJQUFsQixVQUFtQixNQUFjLEVBQUUsSUFBVTs7WUFDckMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVmLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBQyxZQUFZLEVBQUUsS0FBSztZQUMvQixJQUFJLFlBQVksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3hFLE1BQU0sR0FBRyxLQUFLLENBQUM7YUFDbEI7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Ozs7OztJQUVPLHFEQUFhOzs7OztJQUFyQixVQUFzQixNQUFjLEVBQUUsSUFBVTtRQUM1QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7Ozs7O0lBRU8saURBQVM7Ozs7SUFBakIsVUFBa0IsSUFBVTtRQUE1QixpQkFtQkM7O1lBbEJTLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7O1lBRXhCLE1BQU0sR0FBRztZQUNYLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2xCO1FBRUQsSUFBSSxNQUFNLEVBQUU7O2dCQUNGLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQXJCLENBQXFCLENBQUM7WUFFbEUsNEJBQ08sTUFBTSxJQUNULFFBQVEsVUFBQSxJQUNWO1NBQ0w7YUFBTTtZQUNILE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQzs7Ozs7SUFFTyxrREFBVTs7OztJQUFsQixVQUFtQixLQUFhO1FBQWhDLGlCQUVDO1FBREcsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBVSxJQUFLLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO0lBQzNELENBQUM7Ozs7OztJQUVPLG9EQUFZOzs7OztJQUFwQixVQUFxQixLQUFrQixFQUFFLFlBQWdDO1FBQXpFLGlCQWNDO1FBZG9CLHNCQUFBLEVBQUEsUUFBUSxJQUFJLENBQUMsS0FBSztRQUFFLDZCQUFBLEVBQUEsZUFBZSxJQUFJLENBQUMsWUFBWTs7WUFDL0QsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBRXJDLElBQUksWUFBWSxLQUFLLEVBQUUsRUFBRTs7Z0JBQ2YsY0FBYyxHQUFHLE1BQU07aUJBQ3hCLEdBQUcsQ0FBQyxVQUFBLElBQUk7Z0JBQ0wsT0FBTyxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUM7aUJBQ0QsTUFBTSxDQUFDLFVBQUEsWUFBWSxJQUFJLE9BQUEsQ0FBQyxDQUFDLFlBQVksRUFBZCxDQUFjLENBQUM7WUFFM0MsT0FBTyxjQUFjLENBQUM7U0FDekI7YUFBTTtZQUNILE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQUVELDhGQUE4Rjs7Ozs7OztJQUN0RixtREFBVzs7Ozs7OztJQUFuQixVQUFvQixJQUFVLEVBQUUsWUFBZ0M7UUFBaEUsaUJBa0JDO1FBbEIrQiw2QkFBQSxFQUFBLGVBQWUsSUFBSSxDQUFDLFlBQVk7O1lBQ3RELEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO1FBRTNDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLGdCQUFnQjtZQUNoQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUMvQzthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUM5QyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlDLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFFRCw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFDLEtBQVcsSUFBSyxPQUFBLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQXZCLENBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxDQUFDLENBQUMsS0FBSyxFQUFQLENBQU8sQ0FBQyxDQUFDO1lBRXJHLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQzdDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzs7OztJQUVPLDJEQUFtQjs7O0lBQTNCO1FBQ0ksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsRDthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JEO0lBQ0wsQ0FBQzs7Z0JBaG5CSixTQUFTLFNBQUM7O29CQUVQLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLHUvUEFBc0Q7b0JBRXRELFVBQVUsRUFBRTt3QkFDUixPQUFPLENBQUMsMEJBQTBCLEVBQUU7NEJBQ2hDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3BHLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ2pCLE9BQU8sQ0FDSCxPQUFPLEVBQ1AsU0FBUyxDQUFDO29DQUNOLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztvQ0FDdEUsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztpQ0FDcEQsQ0FBQyxDQUNMOzZCQUNKLENBQUM7eUJBQ0wsQ0FBQztxQkFDTDs7aUJBQ0o7Ozs7Z0JBN0NHLFVBQVU7Z0JBQ1YsU0FBUztnQkFHVCxNQUFNO2dCQUNOLGlCQUFpQjtnQkFtQlosa0JBQWtCOzs7a0NBdUJ0QixLQUFLOytCQUdMLEtBQUs7MENBT0wsS0FBSzttQ0FHTCxLQUFLO3NDQUdMLEtBQUs7K0JBR0wsS0FBSztrQ0FLTCxLQUFLOzJCQUdMLEtBQUs7dUJBR0wsS0FBSzt3QkFHTCxLQUFLO2lDQUdMLEtBQUs7eUJBR0wsS0FBSzttQ0FHTCxLQUFLO3VCQUdMLEtBQUs7d0JBR0wsS0FBSzttQ0FJTCxLQUFLO21DQUdMLEtBQUs7cUNBR0wsS0FBSzttQ0FHTCxLQUFLOzBDQUdMLEtBQUs7MENBR0wsS0FBSzsrQkFHTCxLQUFLO2dDQUdMLEtBQUs7Z0NBR0wsTUFBTTs4QkFHTixNQUFNOzJCQUdOLFlBQVksU0FBQyw2QkFBNkI7MkJBRzFDLFNBQVMsU0FBQyxVQUFVO2lDQUdwQixTQUFTLFNBQUMsZ0JBQWdCOztJQW9nQi9CLG9DQUFDO0NBQUEsQUFqbkJELElBaW5CQztTQTdsQlksNkJBQTZCOzs7SUFDdEMsd0RBQ2dDOztJQUVoQyxxREFLRTs7SUFFRixnRUFDdUM7O0lBRXZDLHlEQUNpRDs7SUFFakQsNERBQ21DOztJQUVuQyxxREFDMkI7O0lBSTNCLHdEQUM4Qjs7SUFFOUIsaURBQ3lCOztJQUV6Qiw2Q0FDb0I7O0lBRXBCLDhDQUN1Qjs7SUFFdkIsdURBQ3VDOztJQUV2QywrQ0FDMEQ7O0lBRTFELHlEQUNvQzs7SUFFcEMsNkNBQ2tCOztJQUVsQiw4Q0FDcUI7O0lBR3JCLHlEQUN1RDs7SUFFdkQseURBQ21EOztJQUVuRCwyREFDcUQ7O0lBRXJELHlEQUN3RDs7SUFFeEQsZ0VBQ3lEOztJQUV6RCxnRUFDeUQ7O0lBRXpELHFEQUN5Qjs7SUFFekIsc0RBQzRCOztJQUU1QixzREFDZ0Q7O0lBRWhELG9EQUMwRDs7SUFFMUQsaURBQzBEOztJQUUxRCxpREFDOEM7O0lBRTlDLHVEQUNrRDs7SUFFbEQsdURBQW1DOztJQUVuQyxvREFBMkI7O0lBRzNCLGlEQUF5Qjs7SUFHekIsK0NBQXVCOztJQUd2QiwrQ0FBdUI7O0lBRXZCLHVEQUE4Qjs7SUFFOUIsc0RBQTJCOztJQUUzQix1REFBNEI7O0lBR3hCLDhDQUFzQzs7SUFDdEMsa0RBQTRCOztJQUM1Qiw4Q0FBcUI7O0lBQ3JCLHdEQUEwQzs7SUFDMUMsNERBQStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIE9uSW5pdCxcclxuICAgIElucHV0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgVmlld0NoaWxkcmVuLFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmVlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RyZWUubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gICAgZmFTcXVhcmUsXHJcbiAgICBmYUNoZWNrU3F1YXJlLFxyXG4gICAgZmFGb2xkZXIsXHJcbiAgICBmYUZvbGRlck9wZW4sXHJcbiAgICBmYU1pbnVzLFxyXG4gICAgZmFDaGVjayxcclxuICAgIEljb25EZWZpbml0aW9uXHJcbn0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlLCBrZXlmcmFtZXMgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgTGVhZiB9IGZyb20gJy4uLy4uL21vZGVscy9sZWFmLm1vZGVsJztcclxuaW1wb3J0IHsgTGVhZkNsaWNrZWRFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9sZWFmLWNsaWNrZWQtZXZlbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBJTG9nZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lMb2dnaW5nU2VydmljZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBOZ3hCb290c3RyYXBUcmVldmlld01hcHBlciB9IGZyb20gJy4uLy4uL3V0aWxzL25neC1ib290c3RyYXAtdHJlZXZpZXctbWFwcGVyJztcclxuaW1wb3J0IHsgTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb250ZXh0TWVudXMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmd4LWJvb3RzdHJhcC10cmVldmlldy1jb250ZXh0LW1lbnVzLm1vZGVsJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29udGV4dC1tZW51LnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ25neC1ib290c3RyYXAtdHJlZXZpZXcnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL25neC1ib290c3RyYXAtdHJlZXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd4LWJvb3RzdHJhcC10cmVldmlldy5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgYW5pbWF0aW9uczogW1xyXG4gICAgICAgIHRyaWdnZXIoJ2NoaWxkcmVuQW5pbWF0aW9uVHJpZ2dlcicsIFtcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW2FuaW1hdGUoJzAuMjVzJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKScsIGRpc3BsYXk6ICdub25lJyB9KSldKSxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xyXG4gICAgICAgICAgICAgICAgYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgICAgICAnMC4yNXMnLFxyXG4gICAgICAgICAgICAgICAgICAgIGtleWZyYW1lcyhbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMTAwJSknLCBkaXNwbGF5OiAnYmxvY2snLCBvZmZzZXQ6IDAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwJSknLCBvZmZzZXQ6IDEgfSlcclxuICAgICAgICAgICAgICAgICAgICBdKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBdKVxyXG4gICAgICAgIF0pXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hCb290c3RyYXBUcmVldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2FuU2VsZWN0QnJhbmNoOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY29udGV4dE1lbnVzOiBOZ3hCb290c3RyYXBUcmVldmlld0NvbnRleHRNZW51cyA9IHtcclxuICAgICAgICBsZWFmTWVudToge30sXHJcbiAgICAgICAgYnJhbmNoTWVudToge30sXHJcbiAgICAgICAgcm9vdE1lbnU6IHt9XHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGlzYWJsZVNlbGVjdGVkRWxlbWVudHMgPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGVtcHR5Rm9sZGVyTGFiZWwgPSAnVGhpcyBmb2xkZXIgaXMgZW1wdHknO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXNBbmltYXRpb25EaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXNGaXJzdExldmVsID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBUaGlzIG9uZSBpcyB0cnVlIElGIEFORCBPTkxZIElGIHdlJ3JlIGF0IHRoZSB0b3AgbGV2ZWwsIGJlIGl0IGEgcm9vdCBvciBhIGJyYW5jaC5cclxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBhIGJyYW5jaCB3aGVyZSBpc0ZpcnN0TGV2ZWwgPSB0cnVlIGlzIG5vdCBhbHdheXMgb3VyIGZpcnN0IHRyZWV2aWV3IGluc3RhbmNlXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzRmlyc3RJbnN0YW5jZSA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpc09wZW5lZDogYm9vbGVhbjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGl0ZW06IE9iamVjdDtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGl0ZW1zOiBPYmplY3RbXTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxvZ2dpbmdTZXJ2aWNlOiBJTG9nZ2luZ1NlcnZpY2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBtYXBwZXI6IE5neEJvb3RzdHJhcFRyZWV2aWV3TWFwcGVyPE9iamVjdCwgT2JqZWN0PjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHByZXNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0cmVlOiBUcmVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdHJlZXM6IFRyZWVbXTtcclxuXHJcbiAgICAvLyBJY29ucyBpbnB1dHNcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgb3BlbmVkRm9sZGVySWNvbjogSWNvbkRlZmluaXRpb24gPSBmYUZvbGRlck9wZW47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjbG9zZWRGb2xkZXJJY29uOiBJY29uRGVmaW5pdGlvbiA9IGZhRm9sZGVyO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdW5zZWxlY3RlZExlYWZJY29uOiBJY29uRGVmaW5pdGlvbiA9IGZhU3F1YXJlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VsZWN0ZWRMZWFmSWNvbjogSWNvbkRlZmluaXRpb24gPSBmYUNoZWNrU3F1YXJlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYW55Q2hpbGRyZW5TZWxlY3RlZEljb246IEljb25EZWZpbml0aW9uID0gZmFNaW51cztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGFsbENoaWxkcmVuU2VsZWN0ZWRJY29uOiBJY29uRGVmaW5pdGlvbiA9IGZhQ2hlY2s7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmaWx0ZXJTdHJpbmcgPSAnJztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG1hdGNoQnJhbmNoZXMgPSB0cnVlO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGJyYW5jaENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgbGVhZkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPExlYWZDbGlja2VkRXZlbnQ+KCk7XHJcblxyXG4gICAgQFZpZXdDaGlsZHJlbihOZ3hCb290c3RyYXBUcmVldmlld0NvbXBvbmVudClcclxuICAgIHB1YmxpYyBjaGlsZHJlbjogUXVlcnlMaXN0PE5neEJvb3RzdHJhcFRyZWV2aWV3Q29tcG9uZW50PjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCd0cmVldmlldycpXHJcbiAgICBwdWJsaWMgdHJlZXZpZXc6IEVsZW1lbnRSZWY8SFRNTFVMaXN0RWxlbWVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgncm9vdHNDb250YWluZXInKVxyXG4gICAgcHVibGljIHJvb3RzQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgICBwdWJsaWMgc2VsZWN0ZWRMZWF2ZXM6IExlYWZbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBsZWF2ZXNDb3VudDogbnVtYmVyO1xyXG5cclxuICAgIC8vIElmIG91ciBcInRyZWVcIiBwcm9wZXJ0eSBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgc2V0IHRvIHRydWVcclxuICAgIHB1YmxpYyBpc0JyYW5jaDogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBJZiBvdXIgXCJ0cmVlXCIgcHJvcGVydHkgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIG9uZSBpcyBzZXQgdG8gdHJ1ZVxyXG4gICAgcHVibGljIGlzTGVhZjogYm9vbGVhbjtcclxuXHJcbiAgICAvLyBJZiB3ZSBoYXZlIFwidHJlZXNcIiBwcm9wZXJ0eSBzZXQgYW5kIGl0IGhhcyBtb3JlIHRoYW4gb25lIHRyZWUsIHRoaXMgaXMgc2V0IHRvIHRydWVcclxuICAgIHB1YmxpYyBpc1Jvb3Q6IGJvb2xlYW47XHJcblxyXG4gICAgcHVibGljIGRpc3BsYXllZFRyZWVzOiBUcmVlW107XHJcblxyXG4gICAgcHVibGljIGRpc3BsYXllZFRyZWU6IFRyZWU7XHJcblxyXG4gICAgcHJpdmF0ZSBfZmlsdGVyVHJpZ2dlcjogYW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX2hvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxyXG4gICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxyXG4gICAgICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIF9jb250ZXh0TWVudVNlcnZpY2U6IENvbnRleHRNZW51U2VydmljZVxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIFdlIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZSBoYXZlIGl0ZW0gb3IgaXRlbXMgYnV0IG5vIG1hcHBlciBpbmRpY2F0aW5nIGhvdyB0byBoYW5kbGUgdGhlbVxyXG4gICAgICAgIGlmICghdGhpcy5tYXBwZXIgJiYgKHRoaXMuaXRlbSB8fCB0aGlzLml0ZW1zKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiaXRlbVwiIG9yIFwiaXRlbXNcIiBhcmUgaW52YWxpZCBwYXJhbWV0ZXJzIGlmIHlvdSBkb25cXCd0IHByb3ZpZGUgYSBtYXBwZXInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBtYXBwZXIsIGl0IHdpbGwgaGFuZGxlIFwiaXRlbVwiIGFuZCBcIml0ZW1zXCJcclxuICAgICAgICBpZiAodGhpcy5tYXBwZXIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJlZXMgPSB0aGlzLml0ZW1zLm1hcChpdGVtID0+IHRoaXMubWFwcGVyLm1hcFRyZWUoaXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWUgPSB0aGlzLm1hcHBlci5tYXBUcmVlKHRoaXMuaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlIHdhbnQgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSB0cmVlc1xyXG4gICAgICAgIGlmICh0aGlzLnRyZWVzICYmIHRoaXMudHJlZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzUm9vdCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuaXNCcmFuY2ggPSB0aGlzLmlzTGVhZiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyZWVzKSB7XHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0cmVlcyBidXQgd2l0aCBsZXNzIHRoYW4gMiBlbGVtZW50cywgd2UgYXNzaWduIGl0IHRvIHRyZWVcclxuICAgICAgICAgICAgLy8gU28gbmdPbkluaXQoKSBjYW4ga2VlcCBnb2luZyBub3JtYWx5XHJcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRoaXMudHJlZXNbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy50cmVlICYmICh0aGlzLnRyZWUuY2hpbGRyZW4gfHwgdGhpcy50cmVlLmxvYWRDaGlsZHJlbikpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0JyYW5jaCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0JyYW5jaCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcmVzZXREaXNwbGF5ZWREYXRhKCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc1Jvb3QpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0xlYWYgPSAhdGhpcy5pc0JyYW5jaDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGVhdmVzQ291bnQgPSB0aGlzLmNvdW50TGVhdmVzKHRoaXMudHJlZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByZXNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVzZWxlY3RlZEl0ZW1zLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QodmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIC8vIFRoZSB0aGlzLnRyZWUgfHwgdGhpcy50cmVlcyBpcyB1c2VkIHRvIGF2b2lkIGFuZXJyb3Igc2luY2UgbmdPbkNoYW5nZXMgaXMgY2FsbGVkIGJlZm9yZSBuZ09uSW5pdCgpXHJcbiAgICAgICAgaWYgKCdmaWx0ZXJTdHJpbmcnIGluIGNoYW5nZXMgJiYgKHRoaXMuZGlzcGxheWVkVHJlZSB8fCB0aGlzLmRpc3BsYXllZFRyZWVzKSkge1xyXG4gICAgICAgICAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9maWx0ZXJUcmlnZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbHRlclRyaWdnZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlclRyaWdnZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlclRyaWdnZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXllZFRyZWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXllZFRyZWVzID0gdGhpcy5fZmlsdGVyVHJlZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpc3BsYXllZFRyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkVHJlZSA9IHRoaXMuX2ZpbHRlclRyZWUodGhpcy5kaXNwbGF5ZWRUcmVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuZm9sZEFsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXREaXNwbGF5ZWREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbGRBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSwgMjUwKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGVhZikge1xyXG4gICAgICAgICAgICB0aGlzLm9uTGVhZkNsaWNrZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQnJhbmNoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ2dpbmdTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZyhg8J+MtCBCcmFuY2hlIGNsaXF1w6llOiAke3RoaXMudHJlZS5sYWJlbH1gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5vbkJyYW5jaENsaWNrZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ2hpbGRMZWFmQ2xpY2tlZChsZWFmQ2xpY2tlZEV2ZW50OiBMZWFmQ2xpY2tlZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubG9nZ2luZ1NlcnZpY2UgJiYgdGhpcy5pc0JyYW5jaCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZyhg4p6hIEV2ZW50IGVudHJhbnQgZGFucyBsZSBwYXJlbnQgJHt0aGlzLnRyZWUubGFiZWx9OmAsIGxlYWZDbGlja2VkRXZlbnQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dnaW5nU2VydmljZSAmJiB0aGlzLmlzUm9vdCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZyhg4p6hIEV2ZW50IGVudHJhbnQgZGFucyBsYSByYWNpbmU6YCwgbGVhZkNsaWNrZWRFdmVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBXaGVuIGEgY2hpbGQgbGVhZiBpcyBjbGlja2VkLCB3ZSBjaGVjayBvdXIgc2VsZWN0ZWRMZWF2ZXMgdG8gc2VsZWN0IG9yIHVuc2VsZWN0IHRoZSBjbGlja2VkIG9uZVxyXG4gICAgICAgIGlmICghdGhpcy5fbGVhZkV4aXN0c0luKHRoaXMuc2VsZWN0ZWRMZWF2ZXMsIGxlYWZDbGlja2VkRXZlbnQubGVhZikpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0TGVhZihsZWFmQ2xpY2tlZEV2ZW50LmxlYWYpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Vuc2VsZWN0TGVhZihsZWFmQ2xpY2tlZEV2ZW50LmxlYWYpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTm93IHRoYXQgdGhlIGxlYWYgaXMgc2VsZWN0ZWQvdW5zZWxlY3RlZCwgd2UgbWVyZ2Ugb3VyIHNlbGVjdGVkTGVhdmVzIHdpdGggdGhlIG9uZXMgb2YgdGhlIGV2ZW50XHJcbiAgICAgICAgbGVhZkNsaWNrZWRFdmVudC5zZWxlY3RlZExlYXZlcyA9IHRoaXMuc2VsZWN0ZWRMZWF2ZXM7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQnJhbmNoICYmIHRoaXMubG9nZ2luZ1NlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5sb2coYOKshSBFdmVudCBzb3J0YW50IGRlICR7dGhpcy50cmVlLmxhYmVsfSB2ZXJzIHVuIHBhcmVudDpgLCBsZWFmQ2xpY2tlZEV2ZW50KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9nZ2luZ1NlcnZpY2UgJiYgdGhpcy5pc1Jvb3QpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5sb2coYOKshSBFdmVudCBzb3J0YW50IGRlIGxhIHJhY2luZTpgLCBsZWFmQ2xpY2tlZEV2ZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGVhZkNsaWNrZWQuZW1pdChsZWFmQ2xpY2tlZEV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25MZWFmQ2xpY2tlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5sb2dnaW5nU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZygn8J+NgiBGZXVpbGxlIGNsaXF1w6k6JywgdGhpcy50cmVlLmxhYmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlU2VsZWN0ZWRFbGVtZW50cyB8fCAhdGhpcy5pc09wZW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9sZWFmVG9nZ2xlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb3VudExlYXZlcyh0cmVlOiBUcmVlKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgbGVhdmVzQ291bnQgPSAwO1xyXG4gICAgICAgIGlmICh0cmVlICYmICghdHJlZS5jaGlsZHJlbiB8fCB0cmVlLmxvYWRDaGlsZHJlbikpIHtcclxuICAgICAgICAgICAgbGVhdmVzQ291bnQgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHJlZSkge1xyXG4gICAgICAgICAgICB0cmVlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGVhdmVzQ291bnQgKz0gdGhpcy5jb3VudExlYXZlcyhjaGlsZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxlYXZlc0NvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZWxlY3QodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGVhZiAmJiB0aGlzLnRyZWUudmFsdWUgPT09IHZhbHVlICYmICF0aGlzLmlzT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xlYWZUb2dnbGUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNSb290IHx8IHRoaXMuaXNCcmFuY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb21wb25lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoaWxkLnNlbGVjdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdW5zZWxlY3QodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGVhZiAmJiB0aGlzLnRyZWUudmFsdWUgPT09IHZhbHVlICYmIHRoaXMuaXNPcGVuZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGVhZlRvZ2dsZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Jvb3QgfHwgdGhpcy5pc0JyYW5jaCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBOZ3hCb290c3RyYXBUcmVldmlld0NvbXBvbmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQudW5zZWxlY3QodmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQnJhbmNoQ2xpY2tlZCgpIHtcclxuICAgICAgICB0aGlzLl9icmFuY2hUb2dnbGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5icmFuY2hDbGlja2VkLmVtaXQodGhpcy50cmVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DaGlsZEJyYW5jaENsaWNrZWQoYnJhbmNoOiBUcmVlKSB7XHJcbiAgICAgICAgdGhpcy5icmFuY2hDbGlja2VkLmVtaXQoYnJhbmNoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucm9vdHNDb250YWluZXIpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFdlIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gYmUgcHJvY2Vzc2VkIG9uY2UgcmVyZW5kZXJpbmcgaXMgY29tcGxldGVcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdHNDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNvbXB1dGVIZWlnaHQoKSArICdweCc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZXh0TWVudShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRleHRNZW51U2VydmljZS5maXJlKHtcclxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLnRyZWUsXHJcbiAgICAgICAgICAgIGV2ZW50OiBldmVudFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkVsZW1lbnRBZGRlZCgpOiBib29sZWFuIHtcclxuICAgICAgICB0aGlzLmxlYXZlc0NvdW50ID0gdGhpcy5jb3VudExlYXZlcyh0aGlzLnRyZWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Sb290Q29udGV4dE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb250ZXh0TWVudVNlcnZpY2UuZmlyZSh7XHJcbiAgICAgICAgICAgIGV2ZW50LFxyXG4gICAgICAgICAgICB0YXJnZXQ6IG51bGxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZm9sZChpZD86IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9sZCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvbGRJZChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bmZvbGQoaWQ/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VuZm9sZCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VuZm9sZElkKGlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3coKSB7XHJcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3MoZG9tRWxlbWVudCwgJ2Qtbm9uZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlKCkge1xyXG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSB0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGRvbUVsZW1lbnQsICdkLW5vbmUnKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyKGZpbHRlclN0cmluZzogc3RyaW5nLCBpdGVtPzogVHJlZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzUm9vdCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBOZ3hCb290c3RyYXBUcmVldmlld0NvbXBvbmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQuZmlsdGVyKHRoaXMuZmlsdGVyU3RyaW5nKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtID0gdGhpcy50cmVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ0VsZW1lbnRzQ291bnQgPSB0aGlzLmNvdW50RmlsdGVyZWRJdGVtcyhmaWx0ZXJTdHJpbmcsIGl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nRWxlbWVudHNDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyU3RyaW5nICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZm9sZCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2xkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvdW50RmlsdGVyZWRJdGVtcyhmaWx0ZXJTdHJpbmc6IHN0cmluZywgaXRlbTogVHJlZSk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IG1hdGNoaW5nRWxlbWVudHNDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGlmICghZmlsdGVyU3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG1hdGNoaW5nRWxlbWVudHNDb3VudCA9IGl0ZW0uY2hpbGRyZW4ucmVkdWNlKFxyXG4gICAgICAgICAgICAgICAgKGFjYzogbnVtYmVyLCBjaGlsZDogVHJlZSkgPT4gYWNjICsgdGhpcy5jb3VudEZpbHRlcmVkSXRlbXMoZmlsdGVyU3RyaW5nLCBjaGlsZCksXHJcbiAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGZpbHRlclN0cmluZywgJ2knKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KGl0ZW0ubGFiZWwpKSB7XHJcbiAgICAgICAgICAgICAgICBtYXRjaGluZ0VsZW1lbnRzQ291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoaW5nRWxlbWVudHNDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdW5mb2xkQWxsKCkge1xyXG4gICAgICAgIC8vIEEgYnJhbmNoIHdpbGwgdW5mb2xkIGl0c2VsZlxyXG4gICAgICAgIGlmICh0aGlzLmlzQnJhbmNoICYmICF0aGlzLmlzT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JyYW5jaFRvZ2dsZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSdyZSBub3QgYSBsZWFmLCB3ZSB1bmZvbGQgYWxsIG9mIG91ciBjaGlsZHJlblxyXG4gICAgICAgIGlmICghdGhpcy5pc0xlYWYpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb21wb25lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoaWxkLnVuZm9sZEFsbCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvbGRBbGwoKSB7XHJcbiAgICAgICAgLy8gQSBicmFuY2ggd2lsbCBmb2xkIGl0c2VsZlxyXG4gICAgICAgIGlmICh0aGlzLmlzQnJhbmNoICYmIHRoaXMuaXNPcGVuZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYnJhbmNoVG9nZ2xlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSdyZSBub3QgYSBsZWFmLCB3ZSB1bmZvbGQgYWxsIG9mIG91ciBjaGlsZHJlblxyXG4gICAgICAgIGlmICghdGhpcy5pc0xlYWYpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb21wb25lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNoaWxkLmZvbGRBbGwoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb21wdXRlSGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm9vdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVldmlldy5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnJlZHVjZSgocHJldlZhbHVlOiBudW1iZXIsIGN1cnJlbnRWYWx1ZTogTmd4Qm9vdHN0cmFwVHJlZXZpZXdDb21wb25lbnQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHByZXZWYWx1ZSArIGN1cnJlbnRWYWx1ZS5jb21wdXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdW5mb2xkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQnJhbmNoICYmICF0aGlzLmlzT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JyYW5jaFRvZ2dsZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9mb2xkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQnJhbmNoICYmIHRoaXMuaXNPcGVuZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYnJhbmNoVG9nZ2xlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VuZm9sZElkKGlkOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0JyYW5jaCAmJiB0aGlzLnRyZWUudmFsdWUgPT09IGlkICYmICF0aGlzLmlzT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JyYW5jaFRvZ2dsZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYW5jaCAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBOZ3hCb290c3RyYXBUcmVldmlld0NvbXBvbmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQudW5mb2xkKGlkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2ZvbGRJZChpZDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNCcmFuY2ggJiYgdGhpcy50cmVlLnZhbHVlID09PSBpZCAmJiB0aGlzLmlzT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2JyYW5jaFRvZ2dsZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0JyYW5jaCAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBOZ3hCb290c3RyYXBUcmVldmlld0NvbXBvbmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQuZm9sZChpZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sZWFmVG9nZ2xlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNPcGVuZWQgPSAhdGhpcy5pc09wZW5lZDtcclxuXHJcbiAgICAgICAgY29uc3QgbGVhZiA9IG5ldyBMZWFmKHRoaXMudHJlZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdExlYWYobGVhZik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdW5zZWxlY3RMZWFmKGxlYWYpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTGVhZkNsaWNrZWRFdmVudChsZWFmLCB0aGlzLnNlbGVjdGVkTGVhdmVzKTtcclxuXHJcbiAgICAgICAgdGhpcy5sZWFmQ2xpY2tlZC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9icmFuY2hUb2dnbGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc09wZW5lZCA9ICF0aGlzLmlzT3BlbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdExlYWYobGVhZjogTGVhZikge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1Jvb3QgJiYgdGhpcy5sb2dnaW5nU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmxvZyhg4pyU77iPIEZldWlsbGUgc8OpbGVjdGlvbm7DqWUgZGFucyAke3RoaXMudHJlZS5sYWJlbH06YCwgbGVhZik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2dpbmdTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UubG9nKGDinJTvuI8gRmV1aWxsZSBzw6lsZWN0aW9ubsOpZSBkYW5zIGxhIHJhY2luZTpgLCBsZWFmKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fbGVhZkV4aXN0c0luKHRoaXMuc2VsZWN0ZWRMZWF2ZXMsIGxlYWYpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMZWF2ZXMgPSBbLi4udGhpcy5zZWxlY3RlZExlYXZlcywgbGVhZl07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Vuc2VsZWN0TGVhZihsZWFmOiBMZWFmKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUm9vdCAmJiB0aGlzLmxvZ2dpbmdTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UubG9nKGDinYwgRmV1aWxsZSBkw6lzw6lsZWN0aW9ubsOpZSBkYW5zICR7dGhpcy50cmVlLmxhYmVsfTpgLCBsZWFmKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9nZ2luZ1NlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5sb2coYOKdjCBGZXVpbGxlIGTDqXPDqWxlY3Rpb25uw6llIGRhbnMgbGEgcmFjaW5lOmAsIGxlYWYpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9sZWFmSW5kZXgodGhpcy5zZWxlY3RlZExlYXZlcywgbGVhZik7XHJcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTGVhdmVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgaWYgYSBnaXZlbiBsZWFmIGRvZXMgZXhpc3QgaW4gc2xlZWN0ZWRMZWF2ZXMgYXJyYXlcclxuICAgIC8vIFdlIHVzZSB0aGlzIGJlY2F1c2Ugb2YgdGhlIG5ldyBMZWFmKCksIHdoaWNoIGNhdXNlcyByZWZlcmVuY2UgY29tcGFyaXNvbiBvZiBBcnJheS5pbmRleE9mKCkgbm90IHRvIHdvcmtcclxuICAgIHByaXZhdGUgX2xlYWZJbmRleChsZWF2ZXM6IExlYWZbXSwgbGVhZjogTGVhZik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IC0xO1xyXG5cclxuICAgICAgICBsZWF2ZXMuZm9yRWFjaCgoc2VsZWN0ZWRMZWFmLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRMZWFmLnZhbHVlID09PSBsZWFmLnZhbHVlICYmIHNlbGVjdGVkTGVhZi5sYWJlbCA9PT0gbGVhZi5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sZWFmRXhpc3RzSW4obGVhdmVzOiBMZWFmW10sIGxlYWY6IExlYWYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGVhZkluZGV4KGxlYXZlcywgbGVhZikgIT09IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NvcHlUcmVlKHRyZWU6IFRyZWUpIHtcclxuICAgICAgICBjb25zdCBpc1RyZWUgPSAhIXRyZWUuY2hpbGRyZW47XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgdmFsdWU6IHRyZWUudmFsdWUsXHJcbiAgICAgICAgICAgIGxhYmVsOiB0cmVlLmxhYmVsLFxyXG4gICAgICAgICAgICBkYXRhOiB0cmVlLmRhdGFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoaXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdHJlZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4gdGhpcy5fY29weVRyZWUoY2hpbGQpKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5yZXN1bHQsXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2NvcHlUcmVlcyh0cmVlczogVHJlZVtdKTogVHJlZVtdIHtcclxuICAgICAgICByZXR1cm4gdHJlZXMubWFwKCh0cmVlOiBUcmVlKSA9PiB0aGlzLl9jb3B5VHJlZSh0cmVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZmlsdGVyVHJlZXModHJlZXMgPSB0aGlzLnRyZWVzLCBmaWx0ZXJTdHJpbmcgPSB0aGlzLmZpbHRlclN0cmluZyk6IFRyZWVbXSB7XHJcbiAgICAgICAgY29uc3QgY29waWVzID0gdGhpcy5fY29weVRyZWVzKHRyZWVzKTtcclxuXHJcbiAgICAgICAgaWYgKGZpbHRlclN0cmluZyAhPT0gJycpIHtcclxuICAgICAgICAgICAgY29uc3QgZGlzcGxheWVkVHJlZXMgPSBjb3BpZXNcclxuICAgICAgICAgICAgICAgIC5tYXAoY29weSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclRyZWUoY29weSwgZmlsdGVyU3RyaW5nKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZpbHRlcmVkQ29weSA9PiAhIWZpbHRlcmVkQ29weSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGlzcGxheWVkVHJlZXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvcGllcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBtZXRob2QgYWx0ZXJzIHRyZWUuY2hpbGRyZW4gYW5kIHJldHVybnMgdHJ1ZSBpZiBhbnkgZWxlbWVudHMgbWF0Y2hlZCB0aGUgZmlsdGVyIHN0cmluZ1xyXG4gICAgcHJpdmF0ZSBfZmlsdGVyVHJlZSh0cmVlOiBUcmVlLCBmaWx0ZXJTdHJpbmcgPSB0aGlzLmZpbHRlclN0cmluZyk6IFRyZWUge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChmaWx0ZXJTdHJpbmcsICdpJyk7XHJcblxyXG4gICAgICAgIGlmICghdHJlZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAvLyBMZWFmIGhhbmRsaW5nXHJcbiAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHRyZWUubGFiZWwpID8gdHJlZSA6IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0cmVlLmNoaWxkcmVuICYmIHRyZWUuY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoQnJhbmNoZXMgJiYgcmVnZXgudGVzdCh0cmVlLmxhYmVsKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE5vbiBlbXB0eSBicmFuY2hlcyBoYW5kbGluZ1xyXG4gICAgICAgICAgICB0cmVlLmNoaWxkcmVuID0gdHJlZS5jaGlsZHJlbi5tYXAoKGNoaWxkOiBUcmVlKSA9PiB0aGlzLl9maWx0ZXJUcmVlKGNoaWxkKSkuZmlsdGVyKGNoaWxkID0+ICEhY2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRyZWUuY2hpbGRyZW4ubGVuZ3RoID8gdHJlZSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9yZXNldERpc3BsYXllZERhdGEoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFRyZWUgPSB0aGlzLl9jb3B5VHJlZSh0aGlzLnRyZWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmVlcykge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFRyZWVzID0gdGhpcy5fY29weVRyZWVzKHRoaXMudHJlZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=