@eui/components 18.2.16-snapshot-1756489547144 → 18.2.16-snapshot-1757660834309
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/directives/package.json +3 -0
- package/docs/components/EuiTreeComponent.html +1 -1
- package/docs/js/search/search_index.js +2 -2
- package/docs/properties.html +1 -1
- package/esm2022/eui-autocomplete/eui-autocomplete.component.mjs +3 -3
- package/esm2022/eui-avatar/eui-avatar.component.mjs +2 -2
- package/esm2022/eui-button-v2/eui-button-v2.component.mjs +2 -2
- package/esm2022/eui-card/eui-card.component.mjs +2 -2
- package/esm2022/eui-dashboard-card/eui-dashboard-card.component.mjs +2 -2
- package/esm2022/eui-select/eui-select.component.mjs +2 -2
- package/esm2022/eui-table/eui-table.component.mjs +2 -2
- package/esm2022/eui-textarea/eui-textarea.component.mjs +2 -2
- package/esm2022/eui-tree/eui-tree.component.mjs +3 -3
- package/eui-accordion/package.json +3 -0
- package/eui-alert/package.json +3 -0
- package/eui-autocomplete/eui-autocomplete.component.d.ts.map +1 -1
- package/eui-autocomplete/package.json +3 -0
- package/eui-avatar/package.json +3 -0
- package/eui-badge/package.json +3 -0
- package/eui-block-content/package.json +3 -0
- package/eui-block-document/package.json +3 -0
- package/eui-breadcrumb/package.json +3 -0
- package/eui-button/package.json +3 -0
- package/eui-button-group/package.json +3 -0
- package/eui-button-v2/package.json +3 -0
- package/eui-card/package.json +3 -0
- package/eui-chip/package.json +3 -0
- package/eui-chip-list/package.json +3 -0
- package/eui-dashboard-button/package.json +3 -0
- package/eui-dashboard-card/package.json +3 -0
- package/eui-date-range-selector/package.json +3 -0
- package/eui-datepicker/package.json +3 -0
- package/eui-dialog/package.json +3 -0
- package/eui-dimmer/package.json +3 -0
- package/eui-disable-content/package.json +3 -0
- package/eui-discussion-thread/package.json +3 -0
- package/eui-dropdown/package.json +3 -0
- package/eui-feedback-message/package.json +3 -0
- package/eui-fieldset/package.json +3 -0
- package/eui-file-upload/package.json +3 -0
- package/eui-growl/package.json +3 -0
- package/eui-icon/package.json +3 -0
- package/eui-icon-button/package.json +3 -0
- package/eui-icon-button-expander/package.json +3 -0
- package/eui-icon-color/package.json +3 -0
- package/eui-icon-input/package.json +3 -0
- package/eui-icon-state/package.json +3 -0
- package/eui-icon-toggle/package.json +3 -0
- package/eui-input-checkbox/package.json +3 -0
- package/eui-input-group/package.json +3 -0
- package/eui-input-number/package.json +3 -0
- package/eui-input-radio/package.json +3 -0
- package/eui-input-text/package.json +3 -0
- package/eui-label/package.json +3 -0
- package/eui-language-selector/package.json +3 -0
- package/eui-list/package.json +3 -0
- package/eui-menu/package.json +3 -0
- package/eui-message-box/package.json +3 -0
- package/eui-navbar/package.json +3 -0
- package/eui-overlay/package.json +3 -0
- package/eui-page/package.json +3 -0
- package/eui-paginator/package.json +3 -0
- package/eui-popover/package.json +3 -0
- package/eui-progress-bar/package.json +3 -0
- package/eui-progress-circle/package.json +3 -0
- package/eui-select/package.json +3 -0
- package/eui-sidebar-menu/package.json +3 -0
- package/eui-skeleton/package.json +3 -0
- package/eui-slide-toggle/package.json +3 -0
- package/eui-split-button/package.json +3 -0
- package/eui-table/package.json +3 -0
- package/eui-table-v2/package.json +3 -0
- package/eui-tabs/package.json +3 -0
- package/eui-textarea/package.json +3 -0
- package/eui-timebar/package.json +3 -0
- package/eui-timeline/package.json +3 -0
- package/eui-timepicker/package.json +3 -0
- package/eui-tree/package.json +3 -0
- package/eui-tree-list/package.json +3 -0
- package/eui-user-profile/package.json +3 -0
- package/eui-wizard/package.json +3 -0
- package/externals/charts/package.json +3 -0
- package/externals/eui-editor/package.json +3 -0
- package/externals/helpers/package.json +3 -0
- package/externals/quill/package.json +3 -0
- package/externals/search/favourite-queries/package.json +3 -0
- package/fesm2022/eui-components-eui-autocomplete.mjs +2 -2
- package/fesm2022/eui-components-eui-autocomplete.mjs.map +1 -1
- package/fesm2022/eui-components-eui-avatar.mjs +2 -2
- package/fesm2022/eui-components-eui-button-v2.mjs +2 -2
- package/fesm2022/eui-components-eui-button-v2.mjs.map +1 -1
- package/fesm2022/eui-components-eui-card.mjs +2 -2
- package/fesm2022/eui-components-eui-card.mjs.map +1 -1
- package/fesm2022/eui-components-eui-dashboard-card.mjs +2 -2
- package/fesm2022/eui-components-eui-select.mjs +2 -2
- package/fesm2022/eui-components-eui-select.mjs.map +1 -1
- package/fesm2022/eui-components-eui-table.mjs +2 -2
- package/fesm2022/eui-components-eui-table.mjs.map +1 -1
- package/fesm2022/eui-components-eui-textarea.mjs +2 -2
- package/fesm2022/eui-components-eui-textarea.mjs.map +1 -1
- package/fesm2022/eui-components-eui-tree.mjs +2 -2
- package/fesm2022/eui-components-eui-tree.mjs.map +1 -1
- package/layout/package.json +3 -0
- package/package.json +27 -27
- package/pipes/package.json +3 -0
- package/shared/package.json +3 -0
- package/validators/package.json +3 -0
@@ -850,11 +850,11 @@ export class EuiTreeComponent {
|
|
850
850
|
return scrolled.getElementRef().nativeElement === this.cdkScrollableRef.getElementRef().nativeElement;
|
851
851
|
}
|
852
852
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EuiTreeComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ScrollDispatcher }], target: i0.ɵɵFactoryTarget.Component }); }
|
853
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: EuiTreeComponent, selector: "eui-tree", inputs: { e2eAttr: "e2eAttr", nodes: "nodes", nodeTemplateRef: "nodeTemplateRef", nodeContentMetadataTemplateRef: "nodeContentMetadataTemplateRef", rightContextMenuTemplateRef: "rightContextMenuTemplateRef", customNodeSelectFn: "customNodeSelectFn", expandedIconClass: "expandedIconClass", collapsedIconClass: "collapsedIconClass", expandedSvgIconClass: "expandedSvgIconClass", collapsedSvgIconClass: "collapsedSvgIconClass", isClickTogglingNode: ["isClickTogglingNode", "isClickTogglingNode", booleanAttribute], isMultiselect: ["isMultiselect", "isMultiselect", booleanAttribute], isSingleSelect: ["isSingleSelect", "isSingleSelect", booleanAttribute], isRecursiveSelection: ["isRecursiveSelection", "isRecursiveSelection", booleanAttribute], isRecursiveParentSelection: ["isRecursiveParentSelection", "isRecursiveParentSelection", booleanAttribute], showUnderlinedLinks: ["showUnderlinedLinks", "showUnderlinedLinks", booleanAttribute], showLines: ["showLines", "showLines", booleanAttribute], autoTranslate: ["autoTranslate", "autoTranslate", booleanAttribute], highlightPath: ["highlightPath", "highlightPath", booleanAttribute] }, outputs: { selectionChange: "selectionChange", nodeClick: "nodeClick", nodeToggle: "nodeToggle" }, host: { properties: { "class": "this.cssClasses", "attr.data-e2e": "this.e2eAttr" } }, viewQueries: [{ propertyName: "cdkScrollableRef", first: true, predicate: ["cdkScrollableRef"], descendants: true, read: CdkScrollable }, { propertyName: "treeComponentInstance", first: true, predicate: ["treeComponentInstance"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"eui-ul-rep eui-tree__wrapper\" cdkScrollable #cdkScrollableRef>\n <cdk-tree\n #treeComponentInstance\n [dataSource]=\"cdkArrayDataSource\"\n [treeControl]=\"cdkTreeControl\"\n [trackBy]=\"trackBy\"\n *ngIf=\"renderTree\"\n class=\"eui-cdk-tree\">\n <!-- There are two states of generic cdk-nested-tree-node declarations.\n First one is without child. No sub rendering.\n -->\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let treeRunTimeItemModel\" class=\"eui-cdk-nested-tree-node\">\n <div *ngIf=\"treeRunTimeItemModel\"\n class=\"eui-li-rep eui-tree-node\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div class=\"eui-tree-node-wrapper\"\n (click)=\"onNodeClick(treeRunTimeItemModel, $event)\">\n <div class=\"eui-tree-node-wrapper__container\">\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel?.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path\n }\">\n </ng-container>\n </div>\n </div>\n </div>\n </cdk-nested-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node\n *cdkTreeNodeDef=\"let treeRunTimeItemModel; when: hasChild\"\n class=\"eui-cdk-nested-tree-node eui-cdk-nested-tree-node--with-child\">\n <div\n class=\"eui-li-rep eui-tree-node eui-tree-node--with-child\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n *ngIf=\"treeRunTimeItemModel\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div\n class=\"eui-tree-node-wrapper\">\n <!--Here wraps the node, and listen for node clicks.-->\n <div (click)=\"onNodeClick(treeRunTimeItemModel, $event)\" class=\"eui-tree-node-wrapper__container\">\n <!-- Expand/collapse action button -->\n <button\n euiButton\n euiIconButton\n euiBasicButton\n euiRounded\n euiSizeS\n type=\"button\"\n [attr.aria-label]=\"'Toggle ' + getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\"\n (click)=\"onNodeToggle(treeRunTimeItemModel)\"\n cdkTreeNodeToggle\n class=\"eui-tree-node__button\">\n <eui-icon-svg\n *ngIf=\"!cdkTreeControl.isExpanded(treeRunTimeItemModel) && !collapsedIconClass\"\n [icon]=\"expandedSvgIconClass\"></eui-icon-svg>\n <eui-icon-svg\n *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel) && !expandedIconClass\"\n [icon]=\"collapsedSvgIconClass\"></eui-icon-svg>\n </button>\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path,\n children: getTreeItem(treeRunTimeItemModel?.path)?.children\n }\">\n </ng-container>\n </div>\n </div>\n <!--uses cdkTreeNodeOutlet to render children nodes, CdkTreeControl is used to control isExpanded state.-->\n <div class=\"eui-ul-rep eui-tree-node\" role=\"group\" *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n</div>\n\n<ng-template #nodeTemplateDefault let-node let-onSelect=\"onSelect\" let-id=\"id\" let-path=\"path\">\n <ng-container *ngIf=\"node\">\n <div class=\"eui-tree-node-wrapper__container-left\" [class.eui-tree-node-wrapper__container-left--selected]=\"node?.isSelected\">\n <!--input checkbox area-->\n <input\n euiInputCheckBox\n *ngIf=\"node && node.selectable\"\n type=\"checkbox\"\n id=\"{{ id }}\"\n [checked]=\"!!node?.isSelected\"\n [indeterminate]=\"!!node?.isIndeterminate\"\n (change)=\"onSelect($event)\" />\n\n <!--icon area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.iconSvgName\">\n <eui-icon-svg\n icon=\"{{ node?.treeContentBlock?.iconSvgName }}\"\n fillColor=\"{{ node?.treeContentBlock?.iconTypeClass || 'neutral' }}\"\n size=\"s\"\n class=\"eui-u-mr-xs\">\n </eui-icon-svg>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.chips\">\n <eui-chip\n *ngFor=\"let chip of node.treeContentBlock.chips\"\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mr-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--badge (typeLabel & typeClass) area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.typeLabel\" [ngSwitch]=\"node?.treeContentBlock?.typeClass\">\n <eui-badge euiSizeM [euiVariant]=\"node?.treeContentBlock?.typeClass || 'primary'\" class=\"eui-u-flex-no-shrink eui-u-mr-xs\">\n {{ node?.treeContentBlock?.typeLabel }}\n </eui-badge>\n </ng-container>\n </div>\n\n <!--label area-->\n <div class=\"eui-tree-node-wrapper__container-middle\">\n <label\n *ngIf=\"!node?.treeContentBlock?.url && !node?.treeContentBlock?.urlExternal\"\n euiLabel\n for=\"{{ id }}\"\n class=\"eui-u-text-truncate eui-u-p-2xs\"\n [class.eui-label--selected]=\"\n highlightPath\n ? getRunTimeSelectionRecursiveState(path)?.selectionRecursiveState === 'indeterminate' || node?.isSelected\n : node?.isSelected\n \"\n [class.eui-u-cursor-pointer]=\"node?.selectable\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </label>\n <label *ngIf=\"node?.treeContentBlock?.url\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link\"\n [class.eui-u-text-link-standalone]=\"!showUnderlinedLinks\"\n [routerLink]=\"node?.treeContentBlock?.url\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n <label *ngIf=\"node?.treeContentBlock?.urlExternal\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link-external\"\n [class.eui-u-text-link-external-standalone]=\"!showUnderlinedLinks\"\n href=\"{{ node?.treeContentBlock?.urlExternal }}\"\n target=\"{{ node?.treeContentBlock?.urlExternalTarget || 'blank' }}\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n </div>\n\n <div *ngIf=\"node?.treeContentBlock?.rightContent\" class=\"eui-tree-node-wrapper__container-right\">\n <!--badges area-->\n <ng-container *ngFor=\"let badge of node.treeContentBlock.rightContent?.badges\">\n <eui-badge euiOutline [euiVariant]=\"badge.typeClass || 'secondary'\" class=\"eui-u-ml-xs\">\n <span euiLabel>{{ badge.label }}</span>\n </eui-badge>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngFor=\"let chip of node.treeContentBlock.rightContent?.chips\">\n <eui-chip\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mb-none eui-u-ml-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--Context menu-->\n <ng-container *ngIf=\"node.treeContentBlock.rightContent?.contextMenuMetaData && rightContextMenuTemplateRef\">\n <eui-dropdown class=\"eui-u-ml-xs\">\n <button euiButton euiSizeS euiRounded euiIconButton euiBasicButton euiSecondary [attr.aria-label]=\"'Options menu'\">\n <eui-icon-svg icon=\"ellipsis-vertical:sharp\"></eui-icon-svg>\n </button>\n <eui-dropdown-content>\n <ng-template\n [ngTemplateOutlet]=\"rightContextMenuTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.rightContent?.contextMenuMetaData,\n metadata: node?.treeContentBlock?.rightContent?.contextMenuMetaData\n }\">\n </ng-template>\n </eui-dropdown-content>\n </eui-dropdown>\n </ng-container>\n </div>\n\n <!--metadata, uses the help of ng template to generate dynamic expand variable without handling state -->\n <ng-container\n *ngIf=\"node.treeContentBlock?.metadata && nodeContentMetadataTemplateRef\"\n [ngTemplateOutlet]=\"nodeContentMetadataContainer\"\n [ngTemplateOutletContext]=\"{\n $implicit: { expanded: false }\n }\">\n </ng-container>\n <ng-template #nodeContentMetadataContainer let-metaDataContainer>\n <button\n euiButton\n euiBasicButton\n euiIconButton\n euiRounded\n euiSizeS\n type=\"button\"\n aria-label=\"expand collapse tree item\"\n (click)=\"metaDataContainer.expanded = !metaDataContainer.expanded\">\n <eui-icon-svg [icon]=\"metaDataContainer.expanded ? 'chevron-down:sharp' : 'chevron-forward:sharp'\"></eui-icon-svg>\n </button>\n <div *ngIf=\"metaDataContainer.expanded\" class=\"eui-tree-node__metacontent\">\n <!--passing metadata of the node content to provided template-ref:nodeContentMetadataTemplateRef-->\n <ng-template\n [ngTemplateOutlet]=\"nodeContentMetadataTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.metadata,\n metadata: node?.treeContentBlock?.metadata\n }\">\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n", styles: [".eui-18 .eui-tree{display:flex;overflow-x:hidden;overflow-y:auto;position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper{display:flex;list-style:none;margin:0;overflow-y:auto;padding:var(--eui-s-2xs);position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar{display:inherit;height:8px;width:8px;background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb{background-color:var(--eui-c-neutral-lightest);border-radius:5rem}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb:hover{background-color:var(--eui-c-neutral-lighter)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-track{background-color:var(--eui-c-neutral-bg-light);border-radius:0}@-moz-document url-prefix(){.eui-18 .eui-tree .eui-tree__wrapper{scrollbar-color:var(--eui-c-neutral-lighter) var(--eui-c-neutral-bg-light);scrollbar-width:auto}}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{display:flex;width:auto}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-xl)}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node--with-child{display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__metacontent{display:flex}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__button{margin-left:calc(-3 * var(--eui-s-2xs))}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper{align-items:center;display:flex;min-height:var(--eui-s-2xl);width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper:hover{background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container{align-items:center;display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-left{align-items:center;display:flex;justify-content:flex-start}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-middle{align-items:center;display:flex;justify-content:flex-start;overflow:hidden;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-right{align-items:center;display:flex;justify-content:flex-end;margin-left:auto}.eui-18 .eui-tree:not(.eui-tree--with-children) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{padding-inline-start:2px}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-2xs)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:before{border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";height:calc(100% - var(--eui-s-m) - var(--eui-s-xl));position:absolute;top:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:first-child:before{height:calc(100% - var(--eui-s-m) - var(--eui-s-2xs));top:0}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep{padding-inline-start:var(--eui-s-s);position:relative}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep:before:not(.eui-tree-node--first){border-top:1px solid var(--eui-c-neutral-lightest);content:\"\";display:block;height:0;left:0;position:absolute;top:var(--eui-s-m);width:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node:not(.eui-tree-node--with-child):before{position:relative;left:0;display:inline-flex;width:var(--eui-s-2xl);border-bottom:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node.eui-tree-node--with-child:before{position:absolute;left:calc(1 * var(--eui-s-2xl) + var(--eui-s-2xs));display:inline-flex;width:var(--eui-s-s);border-bottom:1px solid var(--eui-c-neutral-lightest);border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node--last:before{height:auto;top:var(--eui-s-m)}.eui-18 .eui-tree:not(.eui-tree--show-lines) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-3xl)}.eui-18 .eui-tree:not(.eui-tree--show-lines).eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-m)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.EuiInputCheckboxComponent, selector: "input[euiInputCheckBox]", inputs: ["indeterminate", "isInvalid", "checked"], outputs: ["indeterminateChange"] }, { kind: "directive", type: i5.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i5.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "directive", type: i5.CdkTreeNodeToggle, selector: "[cdkTreeNodeToggle]", inputs: ["cdkTreeNodeToggleRecursive"] }, { kind: "component", type: i5.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "levelAccessor", "childrenAccessor", "trackBy", "expansionKey"], exportAs: ["cdkTree"] }, { kind: "directive", type: i5.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "component", type: i6.EuiButtonComponent, selector: "button[euiButton], a[euiButton]", inputs: ["e2eAttr", "id", "euiBasicButton", "euiButtonCall", "euiBlockButton", "euiIconButton", "euiLineWrap", "isChecked", "euiDisabled"], outputs: ["buttonClick"] }, { kind: "component", type: i7.EuiIconSvgComponent, selector: "eui-icon-svg, span[euiIconSvg], i[euiIconSvg]", inputs: ["icon", "fillColor", "set", "size", "style", "iconUrl", "transform", "euiVariant", "aria-label", "ariaHidden", "focusable", "isLoading", "isInputIcon", "euiStart", "euiEnd"] }, { kind: "component", type: i8.EuiLabelComponent, selector: "label[euiLabel], span[euiLabel], div[euiLabel], a[euiLabel], eui-label, label[euiSublabel], span[euiSublabel], div[euiSublabel], a[euiSublabel], eui-sublabel", inputs: ["euiRequired", "euiReadonly", "euiSublabel"] }, { kind: "component", type: i9.EuiBadgeComponent, selector: "div[euiBadge], span[euiBadge], eui-badge", inputs: ["e2eAttr", "aria-label", "maxCharCount", "charReplacement", "euiIconBadge", "euiDottedBadge"] }, { kind: "component", type: i10.EuiChipComponent, selector: "eui-chip, span[euiChip], li[euiChip]", inputs: ["ariaLabel", "e2eAttr", "euiInternalId", "tooltipMessage", "id", "data", "isChipRemovable", "isSquared", "isFilled"], outputs: ["remove"] }, { kind: "component", type: i11.EuiDropdownComponent, selector: "eui-dropdown", inputs: ["e2eAttr", "tabIndex", "width", "position", "subDropdownPosition", "isBlock", "isDropDownRightAligned", "hasClosedOnClickInside", "isLabelUpdatedFromSelectedItem", "isExpandOnHover", "hasTabNavigation", "isRightClickEnabled", "euiDisabled"], outputs: ["expand"] }, { kind: "directive", type: i11.EuiDropdownContentDirective, selector: "eui-dropdown-content" }, { kind: "directive", type: i1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
853
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: EuiTreeComponent, selector: "eui-tree", inputs: { e2eAttr: "e2eAttr", nodes: "nodes", nodeTemplateRef: "nodeTemplateRef", nodeContentMetadataTemplateRef: "nodeContentMetadataTemplateRef", rightContextMenuTemplateRef: "rightContextMenuTemplateRef", customNodeSelectFn: "customNodeSelectFn", expandedIconClass: "expandedIconClass", collapsedIconClass: "collapsedIconClass", expandedSvgIconClass: "expandedSvgIconClass", collapsedSvgIconClass: "collapsedSvgIconClass", isClickTogglingNode: ["isClickTogglingNode", "isClickTogglingNode", booleanAttribute], isMultiselect: ["isMultiselect", "isMultiselect", booleanAttribute], isSingleSelect: ["isSingleSelect", "isSingleSelect", booleanAttribute], isRecursiveSelection: ["isRecursiveSelection", "isRecursiveSelection", booleanAttribute], isRecursiveParentSelection: ["isRecursiveParentSelection", "isRecursiveParentSelection", booleanAttribute], showUnderlinedLinks: ["showUnderlinedLinks", "showUnderlinedLinks", booleanAttribute], showLines: ["showLines", "showLines", booleanAttribute], autoTranslate: ["autoTranslate", "autoTranslate", booleanAttribute], highlightPath: ["highlightPath", "highlightPath", booleanAttribute] }, outputs: { selectionChange: "selectionChange", nodeClick: "nodeClick", nodeToggle: "nodeToggle" }, host: { properties: { "class": "this.cssClasses", "attr.data-e2e": "this.e2eAttr" } }, viewQueries: [{ propertyName: "cdkScrollableRef", first: true, predicate: ["cdkScrollableRef"], descendants: true, read: CdkScrollable }, { propertyName: "treeComponentInstance", first: true, predicate: ["treeComponentInstance"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"eui-ul-rep eui-tree__wrapper\" cdkScrollable #cdkScrollableRef>\n <cdk-tree\n #treeComponentInstance\n [dataSource]=\"cdkArrayDataSource\"\n [treeControl]=\"cdkTreeControl\"\n [trackBy]=\"trackBy\"\n *ngIf=\"renderTree\"\n class=\"eui-cdk-tree\">\n <!-- There are two states of generic cdk-nested-tree-node declarations.\n First one is without child. No sub rendering.\n -->\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let treeRunTimeItemModel\" class=\"eui-cdk-nested-tree-node\">\n <div *ngIf=\"treeRunTimeItemModel\"\n class=\"eui-li-rep eui-tree-node\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div class=\"eui-tree-node-wrapper\"\n (click)=\"onNodeClick(treeRunTimeItemModel, $event)\">\n <div class=\"eui-tree-node-wrapper__container\">\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel?.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path\n }\">\n </ng-container>\n </div>\n </div>\n </div>\n </cdk-nested-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node\n *cdkTreeNodeDef=\"let treeRunTimeItemModel; when: hasChild\"\n class=\"eui-cdk-nested-tree-node eui-cdk-nested-tree-node--with-child\">\n <div\n class=\"eui-li-rep eui-tree-node eui-tree-node--with-child\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n *ngIf=\"treeRunTimeItemModel\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div\n class=\"eui-tree-node-wrapper\">\n <!--Here wraps the node, and listen for node clicks.-->\n <div (click)=\"onNodeClick(treeRunTimeItemModel, $event)\" class=\"eui-tree-node-wrapper__container\">\n <!-- Expand/collapse action button -->\n <button\n tabindex=\"0\"\n euiButton\n euiIconButton\n euiBasicButton\n euiRounded\n euiSizeS\n type=\"button\"\n [attr.aria-label]=\"'Toggle ' + getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\"\n (click)=\"onNodeToggle(treeRunTimeItemModel)\"\n cdkTreeNodeToggle\n class=\"eui-tree-node__button\">\n <eui-icon-svg\n *ngIf=\"!cdkTreeControl.isExpanded(treeRunTimeItemModel) && !collapsedIconClass\"\n [icon]=\"expandedSvgIconClass\"></eui-icon-svg>\n <eui-icon-svg\n *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel) && !expandedIconClass\"\n [icon]=\"collapsedSvgIconClass\"></eui-icon-svg>\n </button>\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path,\n children: getTreeItem(treeRunTimeItemModel?.path)?.children\n }\">\n </ng-container>\n </div>\n </div>\n <!--uses cdkTreeNodeOutlet to render children nodes, CdkTreeControl is used to control isExpanded state.-->\n <div class=\"eui-ul-rep eui-tree-node\" role=\"group\" *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n</div>\n\n<ng-template #nodeTemplateDefault let-node let-onSelect=\"onSelect\" let-id=\"id\" let-path=\"path\">\n <ng-container *ngIf=\"node\">\n <div class=\"eui-tree-node-wrapper__container-left\" [class.eui-tree-node-wrapper__container-left--selected]=\"node?.isSelected\">\n <!--input checkbox area-->\n <input\n euiInputCheckBox\n *ngIf=\"node && node.selectable\"\n type=\"checkbox\"\n id=\"{{ id }}\"\n [checked]=\"!!node?.isSelected\"\n [indeterminate]=\"!!node?.isIndeterminate\"\n (change)=\"onSelect($event)\" />\n\n <!--icon area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.iconSvgName\">\n <eui-icon-svg\n icon=\"{{ node?.treeContentBlock?.iconSvgName }}\"\n fillColor=\"{{ node?.treeContentBlock?.iconTypeClass || 'neutral' }}\"\n size=\"s\"\n class=\"eui-u-mr-xs\">\n </eui-icon-svg>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.chips\">\n <eui-chip\n *ngFor=\"let chip of node.treeContentBlock.chips\"\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mr-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--badge (typeLabel & typeClass) area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.typeLabel\" [ngSwitch]=\"node?.treeContentBlock?.typeClass\">\n <eui-badge euiSizeM [euiVariant]=\"node?.treeContentBlock?.typeClass || 'primary'\" class=\"eui-u-flex-no-shrink eui-u-mr-xs\">\n {{ node?.treeContentBlock?.typeLabel }}\n </eui-badge>\n </ng-container>\n </div>\n\n <!--label area-->\n <div class=\"eui-tree-node-wrapper__container-middle\">\n <label\n *ngIf=\"!node?.treeContentBlock?.url && !node?.treeContentBlock?.urlExternal\"\n euiLabel\n for=\"{{ id }}\"\n class=\"eui-u-text-truncate eui-u-p-2xs\"\n [class.eui-label--selected]=\"\n highlightPath\n ? getRunTimeSelectionRecursiveState(path)?.selectionRecursiveState === 'indeterminate' || node?.isSelected\n : node?.isSelected\n \"\n [class.eui-u-cursor-pointer]=\"node?.selectable\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </label>\n <label *ngIf=\"node?.treeContentBlock?.url\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link\"\n [class.eui-u-text-link-standalone]=\"!showUnderlinedLinks\"\n [routerLink]=\"node?.treeContentBlock?.url\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n <label *ngIf=\"node?.treeContentBlock?.urlExternal\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link-external\"\n [class.eui-u-text-link-external-standalone]=\"!showUnderlinedLinks\"\n href=\"{{ node?.treeContentBlock?.urlExternal }}\"\n target=\"{{ node?.treeContentBlock?.urlExternalTarget || 'blank' }}\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n </div>\n\n <div *ngIf=\"node?.treeContentBlock?.rightContent\" class=\"eui-tree-node-wrapper__container-right\">\n <!--badges area-->\n <ng-container *ngFor=\"let badge of node.treeContentBlock.rightContent?.badges\">\n <eui-badge euiOutline [euiVariant]=\"badge.typeClass || 'secondary'\" class=\"eui-u-ml-xs\">\n <span euiLabel>{{ badge.label }}</span>\n </eui-badge>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngFor=\"let chip of node.treeContentBlock.rightContent?.chips\">\n <eui-chip\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mb-none eui-u-ml-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--Context menu-->\n <ng-container *ngIf=\"node.treeContentBlock.rightContent?.contextMenuMetaData && rightContextMenuTemplateRef\">\n <eui-dropdown class=\"eui-u-ml-xs\">\n <button euiButton euiSizeS euiRounded euiIconButton euiBasicButton euiSecondary [attr.aria-label]=\"'Options menu'\">\n <eui-icon-svg icon=\"ellipsis-vertical:sharp\"></eui-icon-svg>\n </button>\n <eui-dropdown-content>\n <ng-template\n [ngTemplateOutlet]=\"rightContextMenuTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.rightContent?.contextMenuMetaData,\n metadata: node?.treeContentBlock?.rightContent?.contextMenuMetaData\n }\">\n </ng-template>\n </eui-dropdown-content>\n </eui-dropdown>\n </ng-container>\n </div>\n\n <!--metadata, uses the help of ng template to generate dynamic expand variable without handling state -->\n <ng-container\n *ngIf=\"node.treeContentBlock?.metadata && nodeContentMetadataTemplateRef\"\n [ngTemplateOutlet]=\"nodeContentMetadataContainer\"\n [ngTemplateOutletContext]=\"{\n $implicit: { expanded: false }\n }\">\n </ng-container>\n <ng-template #nodeContentMetadataContainer let-metaDataContainer>\n <button\n euiButton\n euiBasicButton\n euiIconButton\n euiRounded\n euiSizeS\n type=\"button\"\n aria-label=\"expand collapse tree item\"\n (click)=\"metaDataContainer.expanded = !metaDataContainer.expanded\">\n <eui-icon-svg [icon]=\"metaDataContainer.expanded ? 'chevron-down:sharp' : 'chevron-forward:sharp'\"></eui-icon-svg>\n </button>\n <div *ngIf=\"metaDataContainer.expanded\" class=\"eui-tree-node__metacontent\">\n <!--passing metadata of the node content to provided template-ref:nodeContentMetadataTemplateRef-->\n <ng-template\n [ngTemplateOutlet]=\"nodeContentMetadataTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.metadata,\n metadata: node?.treeContentBlock?.metadata\n }\">\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n", styles: [".eui-18 .eui-tree{display:flex;overflow-x:hidden;overflow-y:auto;position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper{display:flex;list-style:none;margin:0;overflow-y:auto;padding:var(--eui-s-2xs);position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar{display:inherit;height:8px;width:8px;background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb{background-color:var(--eui-c-neutral-lightest);border-radius:5rem}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb:hover{background-color:var(--eui-c-neutral-lighter)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-track{background-color:var(--eui-c-neutral-bg-light);border-radius:0}@-moz-document url-prefix(){.eui-18 .eui-tree .eui-tree__wrapper{scrollbar-color:var(--eui-c-neutral-lighter) var(--eui-c-neutral-bg-light);scrollbar-width:auto}}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{display:flex;width:auto}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-xl)}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node--with-child{display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__metacontent{display:flex}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__button{margin-left:calc(-3 * var(--eui-s-2xs))}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper{align-items:center;display:flex;min-height:var(--eui-s-2xl);width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper:hover{background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container{align-items:center;display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-left{align-items:center;display:flex;justify-content:flex-start}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-middle{align-items:center;display:flex;justify-content:flex-start;overflow:hidden;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-right{align-items:center;display:flex;justify-content:flex-end;margin-left:auto}.eui-18 .eui-tree:not(.eui-tree--with-children) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{padding-inline-start:2px}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-2xs)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:before{border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";height:calc(100% - var(--eui-s-m) - var(--eui-s-xl));position:absolute;top:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:first-child:before{height:calc(100% - var(--eui-s-m) - var(--eui-s-2xs));top:0}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep{padding-inline-start:var(--eui-s-s);position:relative}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep:before:not(.eui-tree-node--first){border-top:1px solid var(--eui-c-neutral-lightest);content:\"\";display:block;height:0;left:0;position:absolute;top:var(--eui-s-m);width:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node:not(.eui-tree-node--with-child):before{position:relative;left:0;display:inline-flex;width:var(--eui-s-2xl);border-bottom:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node.eui-tree-node--with-child:before{position:absolute;left:calc(1 * var(--eui-s-2xl) + var(--eui-s-2xs));display:inline-flex;width:var(--eui-s-s);border-bottom:1px solid var(--eui-c-neutral-lightest);border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node--last:before{height:auto;top:var(--eui-s-m)}.eui-18 .eui-tree:not(.eui-tree--show-lines) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-3xl)}.eui-18 .eui-tree:not(.eui-tree--show-lines).eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-m)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.EuiInputCheckboxComponent, selector: "input[euiInputCheckBox]", inputs: ["indeterminate", "isInvalid", "checked"], outputs: ["indeterminateChange"] }, { kind: "directive", type: i5.CdkNestedTreeNode, selector: "cdk-nested-tree-node", exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i5.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "directive", type: i5.CdkTreeNodeToggle, selector: "[cdkTreeNodeToggle]", inputs: ["cdkTreeNodeToggleRecursive"] }, { kind: "component", type: i5.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "levelAccessor", "childrenAccessor", "trackBy", "expansionKey"], exportAs: ["cdkTree"] }, { kind: "directive", type: i5.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "component", type: i6.EuiButtonComponent, selector: "button[euiButton], a[euiButton]", inputs: ["e2eAttr", "id", "euiBasicButton", "euiButtonCall", "euiBlockButton", "euiIconButton", "euiLineWrap", "isChecked", "euiDisabled"], outputs: ["buttonClick"] }, { kind: "component", type: i7.EuiIconSvgComponent, selector: "eui-icon-svg, span[euiIconSvg], i[euiIconSvg]", inputs: ["icon", "fillColor", "set", "size", "style", "iconUrl", "transform", "euiVariant", "aria-label", "ariaHidden", "focusable", "isLoading", "isInputIcon", "euiStart", "euiEnd"] }, { kind: "component", type: i8.EuiLabelComponent, selector: "label[euiLabel], span[euiLabel], div[euiLabel], a[euiLabel], eui-label, label[euiSublabel], span[euiSublabel], div[euiSublabel], a[euiSublabel], eui-sublabel", inputs: ["euiRequired", "euiReadonly", "euiSublabel"] }, { kind: "component", type: i9.EuiBadgeComponent, selector: "div[euiBadge], span[euiBadge], eui-badge", inputs: ["e2eAttr", "aria-label", "maxCharCount", "charReplacement", "euiIconBadge", "euiDottedBadge"] }, { kind: "component", type: i10.EuiChipComponent, selector: "eui-chip, span[euiChip], li[euiChip]", inputs: ["ariaLabel", "e2eAttr", "euiInternalId", "tooltipMessage", "id", "data", "isChipRemovable", "isSquared", "isFilled"], outputs: ["remove"] }, { kind: "component", type: i11.EuiDropdownComponent, selector: "eui-dropdown", inputs: ["e2eAttr", "tabIndex", "width", "position", "subDropdownPosition", "isBlock", "isDropDownRightAligned", "hasClosedOnClickInside", "isLabelUpdatedFromSelectedItem", "isExpandOnHover", "hasTabNavigation", "isRightClickEnabled", "euiDisabled"], outputs: ["expand"] }, { kind: "directive", type: i11.EuiDropdownContentDirective, selector: "eui-dropdown-content" }, { kind: "directive", type: i1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
854
854
|
}
|
855
855
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EuiTreeComponent, decorators: [{
|
856
856
|
type: Component,
|
857
|
-
args: [{ selector: 'eui-tree', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"eui-ul-rep eui-tree__wrapper\" cdkScrollable #cdkScrollableRef>\n <cdk-tree\n #treeComponentInstance\n [dataSource]=\"cdkArrayDataSource\"\n [treeControl]=\"cdkTreeControl\"\n [trackBy]=\"trackBy\"\n *ngIf=\"renderTree\"\n class=\"eui-cdk-tree\">\n <!-- There are two states of generic cdk-nested-tree-node declarations.\n First one is without child. No sub rendering.\n -->\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let treeRunTimeItemModel\" class=\"eui-cdk-nested-tree-node\">\n <div *ngIf=\"treeRunTimeItemModel\"\n class=\"eui-li-rep eui-tree-node\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div class=\"eui-tree-node-wrapper\"\n (click)=\"onNodeClick(treeRunTimeItemModel, $event)\">\n <div class=\"eui-tree-node-wrapper__container\">\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel?.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path\n }\">\n </ng-container>\n </div>\n </div>\n </div>\n </cdk-nested-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node\n *cdkTreeNodeDef=\"let treeRunTimeItemModel; when: hasChild\"\n class=\"eui-cdk-nested-tree-node eui-cdk-nested-tree-node--with-child\">\n <div\n class=\"eui-li-rep eui-tree-node eui-tree-node--with-child\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n *ngIf=\"treeRunTimeItemModel\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div\n class=\"eui-tree-node-wrapper\">\n <!--Here wraps the node, and listen for node clicks.-->\n <div (click)=\"onNodeClick(treeRunTimeItemModel, $event)\" class=\"eui-tree-node-wrapper__container\">\n <!-- Expand/collapse action button -->\n <button\n euiButton\n euiIconButton\n euiBasicButton\n euiRounded\n euiSizeS\n type=\"button\"\n [attr.aria-label]=\"'Toggle ' + getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\"\n (click)=\"onNodeToggle(treeRunTimeItemModel)\"\n cdkTreeNodeToggle\n class=\"eui-tree-node__button\">\n <eui-icon-svg\n *ngIf=\"!cdkTreeControl.isExpanded(treeRunTimeItemModel) && !collapsedIconClass\"\n [icon]=\"expandedSvgIconClass\"></eui-icon-svg>\n <eui-icon-svg\n *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel) && !expandedIconClass\"\n [icon]=\"collapsedSvgIconClass\"></eui-icon-svg>\n </button>\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path,\n children: getTreeItem(treeRunTimeItemModel?.path)?.children\n }\">\n </ng-container>\n </div>\n </div>\n <!--uses cdkTreeNodeOutlet to render children nodes, CdkTreeControl is used to control isExpanded state.-->\n <div class=\"eui-ul-rep eui-tree-node\" role=\"group\" *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n</div>\n\n<ng-template #nodeTemplateDefault let-node let-onSelect=\"onSelect\" let-id=\"id\" let-path=\"path\">\n <ng-container *ngIf=\"node\">\n <div class=\"eui-tree-node-wrapper__container-left\" [class.eui-tree-node-wrapper__container-left--selected]=\"node?.isSelected\">\n <!--input checkbox area-->\n <input\n euiInputCheckBox\n *ngIf=\"node && node.selectable\"\n type=\"checkbox\"\n id=\"{{ id }}\"\n [checked]=\"!!node?.isSelected\"\n [indeterminate]=\"!!node?.isIndeterminate\"\n (change)=\"onSelect($event)\" />\n\n <!--icon area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.iconSvgName\">\n <eui-icon-svg\n icon=\"{{ node?.treeContentBlock?.iconSvgName }}\"\n fillColor=\"{{ node?.treeContentBlock?.iconTypeClass || 'neutral' }}\"\n size=\"s\"\n class=\"eui-u-mr-xs\">\n </eui-icon-svg>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.chips\">\n <eui-chip\n *ngFor=\"let chip of node.treeContentBlock.chips\"\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mr-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--badge (typeLabel & typeClass) area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.typeLabel\" [ngSwitch]=\"node?.treeContentBlock?.typeClass\">\n <eui-badge euiSizeM [euiVariant]=\"node?.treeContentBlock?.typeClass || 'primary'\" class=\"eui-u-flex-no-shrink eui-u-mr-xs\">\n {{ node?.treeContentBlock?.typeLabel }}\n </eui-badge>\n </ng-container>\n </div>\n\n <!--label area-->\n <div class=\"eui-tree-node-wrapper__container-middle\">\n <label\n *ngIf=\"!node?.treeContentBlock?.url && !node?.treeContentBlock?.urlExternal\"\n euiLabel\n for=\"{{ id }}\"\n class=\"eui-u-text-truncate eui-u-p-2xs\"\n [class.eui-label--selected]=\"\n highlightPath\n ? getRunTimeSelectionRecursiveState(path)?.selectionRecursiveState === 'indeterminate' || node?.isSelected\n : node?.isSelected\n \"\n [class.eui-u-cursor-pointer]=\"node?.selectable\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </label>\n <label *ngIf=\"node?.treeContentBlock?.url\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link\"\n [class.eui-u-text-link-standalone]=\"!showUnderlinedLinks\"\n [routerLink]=\"node?.treeContentBlock?.url\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n <label *ngIf=\"node?.treeContentBlock?.urlExternal\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link-external\"\n [class.eui-u-text-link-external-standalone]=\"!showUnderlinedLinks\"\n href=\"{{ node?.treeContentBlock?.urlExternal }}\"\n target=\"{{ node?.treeContentBlock?.urlExternalTarget || 'blank' }}\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n </div>\n\n <div *ngIf=\"node?.treeContentBlock?.rightContent\" class=\"eui-tree-node-wrapper__container-right\">\n <!--badges area-->\n <ng-container *ngFor=\"let badge of node.treeContentBlock.rightContent?.badges\">\n <eui-badge euiOutline [euiVariant]=\"badge.typeClass || 'secondary'\" class=\"eui-u-ml-xs\">\n <span euiLabel>{{ badge.label }}</span>\n </eui-badge>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngFor=\"let chip of node.treeContentBlock.rightContent?.chips\">\n <eui-chip\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mb-none eui-u-ml-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--Context menu-->\n <ng-container *ngIf=\"node.treeContentBlock.rightContent?.contextMenuMetaData && rightContextMenuTemplateRef\">\n <eui-dropdown class=\"eui-u-ml-xs\">\n <button euiButton euiSizeS euiRounded euiIconButton euiBasicButton euiSecondary [attr.aria-label]=\"'Options menu'\">\n <eui-icon-svg icon=\"ellipsis-vertical:sharp\"></eui-icon-svg>\n </button>\n <eui-dropdown-content>\n <ng-template\n [ngTemplateOutlet]=\"rightContextMenuTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.rightContent?.contextMenuMetaData,\n metadata: node?.treeContentBlock?.rightContent?.contextMenuMetaData\n }\">\n </ng-template>\n </eui-dropdown-content>\n </eui-dropdown>\n </ng-container>\n </div>\n\n <!--metadata, uses the help of ng template to generate dynamic expand variable without handling state -->\n <ng-container\n *ngIf=\"node.treeContentBlock?.metadata && nodeContentMetadataTemplateRef\"\n [ngTemplateOutlet]=\"nodeContentMetadataContainer\"\n [ngTemplateOutletContext]=\"{\n $implicit: { expanded: false }\n }\">\n </ng-container>\n <ng-template #nodeContentMetadataContainer let-metaDataContainer>\n <button\n euiButton\n euiBasicButton\n euiIconButton\n euiRounded\n euiSizeS\n type=\"button\"\n aria-label=\"expand collapse tree item\"\n (click)=\"metaDataContainer.expanded = !metaDataContainer.expanded\">\n <eui-icon-svg [icon]=\"metaDataContainer.expanded ? 'chevron-down:sharp' : 'chevron-forward:sharp'\"></eui-icon-svg>\n </button>\n <div *ngIf=\"metaDataContainer.expanded\" class=\"eui-tree-node__metacontent\">\n <!--passing metadata of the node content to provided template-ref:nodeContentMetadataTemplateRef-->\n <ng-template\n [ngTemplateOutlet]=\"nodeContentMetadataTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.metadata,\n metadata: node?.treeContentBlock?.metadata\n }\">\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n", styles: [".eui-18 .eui-tree{display:flex;overflow-x:hidden;overflow-y:auto;position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper{display:flex;list-style:none;margin:0;overflow-y:auto;padding:var(--eui-s-2xs);position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar{display:inherit;height:8px;width:8px;background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb{background-color:var(--eui-c-neutral-lightest);border-radius:5rem}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb:hover{background-color:var(--eui-c-neutral-lighter)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-track{background-color:var(--eui-c-neutral-bg-light);border-radius:0}@-moz-document url-prefix(){.eui-18 .eui-tree .eui-tree__wrapper{scrollbar-color:var(--eui-c-neutral-lighter) var(--eui-c-neutral-bg-light);scrollbar-width:auto}}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{display:flex;width:auto}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-xl)}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node--with-child{display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__metacontent{display:flex}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__button{margin-left:calc(-3 * var(--eui-s-2xs))}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper{align-items:center;display:flex;min-height:var(--eui-s-2xl);width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper:hover{background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container{align-items:center;display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-left{align-items:center;display:flex;justify-content:flex-start}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-middle{align-items:center;display:flex;justify-content:flex-start;overflow:hidden;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-right{align-items:center;display:flex;justify-content:flex-end;margin-left:auto}.eui-18 .eui-tree:not(.eui-tree--with-children) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{padding-inline-start:2px}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-2xs)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:before{border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";height:calc(100% - var(--eui-s-m) - var(--eui-s-xl));position:absolute;top:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:first-child:before{height:calc(100% - var(--eui-s-m) - var(--eui-s-2xs));top:0}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep{padding-inline-start:var(--eui-s-s);position:relative}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep:before:not(.eui-tree-node--first){border-top:1px solid var(--eui-c-neutral-lightest);content:\"\";display:block;height:0;left:0;position:absolute;top:var(--eui-s-m);width:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node:not(.eui-tree-node--with-child):before{position:relative;left:0;display:inline-flex;width:var(--eui-s-2xl);border-bottom:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node.eui-tree-node--with-child:before{position:absolute;left:calc(1 * var(--eui-s-2xl) + var(--eui-s-2xs));display:inline-flex;width:var(--eui-s-s);border-bottom:1px solid var(--eui-c-neutral-lightest);border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node--last:before{height:auto;top:var(--eui-s-m)}.eui-18 .eui-tree:not(.eui-tree--show-lines) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-3xl)}.eui-18 .eui-tree:not(.eui-tree--show-lines).eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-m)}\n"] }]
|
857
|
+
args: [{ selector: 'eui-tree', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"eui-ul-rep eui-tree__wrapper\" cdkScrollable #cdkScrollableRef>\n <cdk-tree\n #treeComponentInstance\n [dataSource]=\"cdkArrayDataSource\"\n [treeControl]=\"cdkTreeControl\"\n [trackBy]=\"trackBy\"\n *ngIf=\"renderTree\"\n class=\"eui-cdk-tree\">\n <!-- There are two states of generic cdk-nested-tree-node declarations.\n First one is without child. No sub rendering.\n -->\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let treeRunTimeItemModel\" class=\"eui-cdk-nested-tree-node\">\n <div *ngIf=\"treeRunTimeItemModel\"\n class=\"eui-li-rep eui-tree-node\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div class=\"eui-tree-node-wrapper\"\n (click)=\"onNodeClick(treeRunTimeItemModel, $event)\">\n <div class=\"eui-tree-node-wrapper__container\">\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel?.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path\n }\">\n </ng-container>\n </div>\n </div>\n </div>\n </cdk-nested-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node\n *cdkTreeNodeDef=\"let treeRunTimeItemModel; when: hasChild\"\n class=\"eui-cdk-nested-tree-node eui-cdk-nested-tree-node--with-child\">\n <div\n class=\"eui-li-rep eui-tree-node eui-tree-node--with-child\"\n [class.eui-tree-node--first]=\"treeRunTimeItemModel?.path === '0'\"\n [class.eui-tree-node--last]=\"treeRunTimeItemModel.last\"\n *ngIf=\"treeRunTimeItemModel\"\n title=\"{{\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.tooltipLabel ||\n getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\n }}\">\n <div\n class=\"eui-tree-node-wrapper\">\n <!--Here wraps the node, and listen for node clicks.-->\n <div (click)=\"onNodeClick(treeRunTimeItemModel, $event)\" class=\"eui-tree-node-wrapper__container\">\n <!-- Expand/collapse action button -->\n <button\n tabindex=\"0\"\n euiButton\n euiIconButton\n euiBasicButton\n euiRounded\n euiSizeS\n type=\"button\"\n [attr.aria-label]=\"'Toggle ' + getTreeItem(treeRunTimeItemModel?.path)?.node?.treeContentBlock?.label\"\n (click)=\"onNodeToggle(treeRunTimeItemModel)\"\n cdkTreeNodeToggle\n class=\"eui-tree-node__button\">\n <eui-icon-svg\n *ngIf=\"!cdkTreeControl.isExpanded(treeRunTimeItemModel) && !collapsedIconClass\"\n [icon]=\"expandedSvgIconClass\"></eui-icon-svg>\n <eui-icon-svg\n *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel) && !expandedIconClass\"\n [icon]=\"collapsedSvgIconClass\"></eui-icon-svg>\n </button>\n <!--\n Renders node in default or provided template's context.\n Generates onSelect with onSelectFn for developers to send the events from their custom check events.\n Provides id to be used on generic template\n -->\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplateRef || nodeTemplateDefault\"\n [ngTemplateOutletContext]=\"{\n $implicit: getTreeItem(treeRunTimeItemModel.path)?.node,\n onSelect: onSelectFn(treeRunTimeItemModel.path),\n id: uid + treeRunTimeItemModel.path,\n path: treeRunTimeItemModel.path,\n children: getTreeItem(treeRunTimeItemModel?.path)?.children\n }\">\n </ng-container>\n </div>\n </div>\n <!--uses cdkTreeNodeOutlet to render children nodes, CdkTreeControl is used to control isExpanded state.-->\n <div class=\"eui-ul-rep eui-tree-node\" role=\"group\" *ngIf=\"cdkTreeControl.isExpanded(treeRunTimeItemModel)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n</div>\n\n<ng-template #nodeTemplateDefault let-node let-onSelect=\"onSelect\" let-id=\"id\" let-path=\"path\">\n <ng-container *ngIf=\"node\">\n <div class=\"eui-tree-node-wrapper__container-left\" [class.eui-tree-node-wrapper__container-left--selected]=\"node?.isSelected\">\n <!--input checkbox area-->\n <input\n euiInputCheckBox\n *ngIf=\"node && node.selectable\"\n type=\"checkbox\"\n id=\"{{ id }}\"\n [checked]=\"!!node?.isSelected\"\n [indeterminate]=\"!!node?.isIndeterminate\"\n (change)=\"onSelect($event)\" />\n\n <!--icon area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.iconSvgName\">\n <eui-icon-svg\n icon=\"{{ node?.treeContentBlock?.iconSvgName }}\"\n fillColor=\"{{ node?.treeContentBlock?.iconTypeClass || 'neutral' }}\"\n size=\"s\"\n class=\"eui-u-mr-xs\">\n </eui-icon-svg>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.chips\">\n <eui-chip\n *ngFor=\"let chip of node.treeContentBlock.chips\"\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mr-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--badge (typeLabel & typeClass) area-->\n <ng-container *ngIf=\"node?.treeContentBlock?.typeLabel\" [ngSwitch]=\"node?.treeContentBlock?.typeClass\">\n <eui-badge euiSizeM [euiVariant]=\"node?.treeContentBlock?.typeClass || 'primary'\" class=\"eui-u-flex-no-shrink eui-u-mr-xs\">\n {{ node?.treeContentBlock?.typeLabel }}\n </eui-badge>\n </ng-container>\n </div>\n\n <!--label area-->\n <div class=\"eui-tree-node-wrapper__container-middle\">\n <label\n *ngIf=\"!node?.treeContentBlock?.url && !node?.treeContentBlock?.urlExternal\"\n euiLabel\n for=\"{{ id }}\"\n class=\"eui-u-text-truncate eui-u-p-2xs\"\n [class.eui-label--selected]=\"\n highlightPath\n ? getRunTimeSelectionRecursiveState(path)?.selectionRecursiveState === 'indeterminate' || node?.isSelected\n : node?.isSelected\n \"\n [class.eui-u-cursor-pointer]=\"node?.selectable\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </label>\n <label *ngIf=\"node?.treeContentBlock?.url\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link\"\n [class.eui-u-text-link-standalone]=\"!showUnderlinedLinks\"\n [routerLink]=\"node?.treeContentBlock?.url\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n <label *ngIf=\"node?.treeContentBlock?.urlExternal\" euiLabel for=\"{{ id }}\" class=\"eui-u-text-truncate eui-u-p-2xs\">\n <a\n class=\"eui-u-text-link-external\"\n [class.eui-u-text-link-external-standalone]=\"!showUnderlinedLinks\"\n href=\"{{ node?.treeContentBlock?.urlExternal }}\"\n target=\"{{ node?.treeContentBlock?.urlExternalTarget || 'blank' }}\">\n {{ autoTranslate ? (node?.treeContentBlock?.label | translate) : node?.treeContentBlock?.label }}\n </a>\n </label>\n </div>\n\n <div *ngIf=\"node?.treeContentBlock?.rightContent\" class=\"eui-tree-node-wrapper__container-right\">\n <!--badges area-->\n <ng-container *ngFor=\"let badge of node.treeContentBlock.rightContent?.badges\">\n <eui-badge euiOutline [euiVariant]=\"badge.typeClass || 'secondary'\" class=\"eui-u-ml-xs\">\n <span euiLabel>{{ badge.label }}</span>\n </eui-badge>\n </ng-container>\n\n <!--chips area-->\n <ng-container *ngFor=\"let chip of node.treeContentBlock.rightContent?.chips\">\n <eui-chip\n euiSizeS\n [euiVariant]=\"chip.typeClass || 'secondary'\"\n [euiOutline]=\"chip.isOutline\"\n class=\"eui-chip--rounded eui-u-mb-none eui-u-ml-xs\">\n <span euiLabel>{{ chip.label }}</span>\n </eui-chip>\n </ng-container>\n\n <!--Context menu-->\n <ng-container *ngIf=\"node.treeContentBlock.rightContent?.contextMenuMetaData && rightContextMenuTemplateRef\">\n <eui-dropdown class=\"eui-u-ml-xs\">\n <button euiButton euiSizeS euiRounded euiIconButton euiBasicButton euiSecondary [attr.aria-label]=\"'Options menu'\">\n <eui-icon-svg icon=\"ellipsis-vertical:sharp\"></eui-icon-svg>\n </button>\n <eui-dropdown-content>\n <ng-template\n [ngTemplateOutlet]=\"rightContextMenuTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.rightContent?.contextMenuMetaData,\n metadata: node?.treeContentBlock?.rightContent?.contextMenuMetaData\n }\">\n </ng-template>\n </eui-dropdown-content>\n </eui-dropdown>\n </ng-container>\n </div>\n\n <!--metadata, uses the help of ng template to generate dynamic expand variable without handling state -->\n <ng-container\n *ngIf=\"node.treeContentBlock?.metadata && nodeContentMetadataTemplateRef\"\n [ngTemplateOutlet]=\"nodeContentMetadataContainer\"\n [ngTemplateOutletContext]=\"{\n $implicit: { expanded: false }\n }\">\n </ng-container>\n <ng-template #nodeContentMetadataContainer let-metaDataContainer>\n <button\n euiButton\n euiBasicButton\n euiIconButton\n euiRounded\n euiSizeS\n type=\"button\"\n aria-label=\"expand collapse tree item\"\n (click)=\"metaDataContainer.expanded = !metaDataContainer.expanded\">\n <eui-icon-svg [icon]=\"metaDataContainer.expanded ? 'chevron-down:sharp' : 'chevron-forward:sharp'\"></eui-icon-svg>\n </button>\n <div *ngIf=\"metaDataContainer.expanded\" class=\"eui-tree-node__metacontent\">\n <!--passing metadata of the node content to provided template-ref:nodeContentMetadataTemplateRef-->\n <ng-template\n [ngTemplateOutlet]=\"nodeContentMetadataTemplateRef\"\n [ngTemplateOutletContext]=\"{\n $implicit: node?.treeContentBlock?.metadata,\n metadata: node?.treeContentBlock?.metadata\n }\">\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n", styles: [".eui-18 .eui-tree{display:flex;overflow-x:hidden;overflow-y:auto;position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper{display:flex;list-style:none;margin:0;overflow-y:auto;padding:var(--eui-s-2xs);position:relative;width:100%}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar{display:inherit;height:8px;width:8px;background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb{background-color:var(--eui-c-neutral-lightest);border-radius:5rem}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-thumb:hover{background-color:var(--eui-c-neutral-lighter)}.eui-18 .eui-tree .eui-tree__wrapper::-webkit-scrollbar-track{background-color:var(--eui-c-neutral-bg-light);border-radius:0}@-moz-document url-prefix(){.eui-18 .eui-tree .eui-tree__wrapper{scrollbar-color:var(--eui-c-neutral-lighter) var(--eui-c-neutral-bg-light);scrollbar-width:auto}}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{display:flex;width:auto}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-xl)}.eui-18 .eui-tree .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node--with-child{display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node{display:flex;flex-direction:column;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__metacontent{display:flex}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node__button{margin-left:calc(-3 * var(--eui-s-2xs))}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper{align-items:center;display:flex;min-height:var(--eui-s-2xl);width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper:hover{background-color:var(--eui-c-neutral-bg-light)}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container{align-items:center;display:flex;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-left{align-items:center;display:flex;justify-content:flex-start}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-middle{align-items:center;display:flex;justify-content:flex-start;overflow:hidden;width:100%}.eui-18 .eui-tree .eui-tree__wrapper .eui-tree-node-wrapper__container-right{align-items:center;display:flex;justify-content:flex-end;margin-left:auto}.eui-18 .eui-tree:not(.eui-tree--with-children) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node{padding-inline-start:2px}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-2xs)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:before{border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";height:calc(100% - var(--eui-s-m) - var(--eui-s-xl));position:absolute;top:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-ul-rep:first-child:before{height:calc(100% - var(--eui-s-m) - var(--eui-s-2xs));top:0}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep{padding-inline-start:var(--eui-s-s);position:relative}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep:before:not(.eui-tree-node--first){border-top:1px solid var(--eui-c-neutral-lightest);content:\"\";display:block;height:0;left:0;position:absolute;top:var(--eui-s-m);width:var(--eui-s-xl)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node:not(.eui-tree-node--with-child):before{position:relative;left:0;display:inline-flex;width:var(--eui-s-2xl);border-bottom:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node.eui-tree-node--with-child:before{position:absolute;left:calc(1 * var(--eui-s-2xl) + var(--eui-s-2xs));display:inline-flex;width:var(--eui-s-s);border-bottom:1px solid var(--eui-c-neutral-lightest);border-left:1px solid var(--eui-c-neutral-lightest);content:\"\";margin-left:calc(-2 * var(--eui-s-l) + var(--eui-s-2xs));top:var(--eui-s-m)}.eui-18 .eui-tree.eui-tree--show-lines.eui-tree--with-children div.eui-li-rep.eui-tree-node--last:before{height:auto;top:var(--eui-s-m)}.eui-18 .eui-tree:not(.eui-tree--show-lines) .eui-tree__wrapper .eui-cdk-tree .eui-cdk-nested-tree-node:not(.eui-cdk-nested-tree-node--with-child){padding-inline-start:var(--eui-s-3xl)}.eui-18 .eui-tree:not(.eui-tree--show-lines).eui-tree--with-children div.eui-ul-rep{padding-inline-start:var(--eui-s-m)}\n"] }]
|
858
858
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.ScrollDispatcher }], propDecorators: { cssClasses: [{
|
859
859
|
type: HostBinding,
|
860
860
|
args: ['class']
|
@@ -972,4 +972,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
972
972
|
exports: [EuiTreeComponent],
|
973
973
|
}]
|
974
974
|
}] });
|
975
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpLXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZXVpLXRyZWUvZXVpLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZXVpLXRyZWUvZXVpLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixZQUFZLEVBQ1osTUFBTSxFQUNOLGlCQUFpQixFQU1qQixXQUFXLEVBRVgsZ0JBQWdCLEVBQ2hCLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFRSCxpQkFBaUIsRUFFakIsd0JBQXdCLEdBQzNCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBVyxNQUFNLG1CQUFtQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxF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QVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFNUIsZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07O0FBcTVCWCxNQUFNLE9BQU8sYUFBYTsrR0FBYixhQUFhO2dIQUFiLGFBQWEsaUJBNTdCYixnQkFBZ0IsYUEyNkJyQixZQUFZO1lBQ1osWUFBWTtZQUNaLFdBQVc7WUFDWCxlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLGFBQWE7WUFDYixlQUFlO1lBQ2YsYUFBYTtZQUNiLGNBQWM7WUFDZCxjQUFjO1lBQ2QsYUFBYTtZQUNiLGlCQUFpQjtZQUNqQixlQUFlLGFBdjdCVixnQkFBZ0I7Z0hBNDdCaEIsYUFBYSxZQWpCbEIsWUFBWTtZQUNaLFlBQVk7WUFDWixXQUFXO1lBQ1gsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixhQUFhO1lBQ2IsZUFBZTtZQUNmLGFBQWE7WUFDYixjQUFjO1lBQ2QsY0FBYztZQUNkLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsZUFBZTs7NEZBS1YsYUFBYTtrQkFuQnpCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFO3dCQUNMLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2Ysc0JBQXNCO3dCQUN0QixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixpQkFBaUI7d0JBQ2pCLGVBQWU7cUJBQ2xCO29CQUNELFlBQVksRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUNoQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBIb3N0QmluZGluZyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICAgIFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlLFxuICAgIFRyZWVEYXRhTW9kZWwsXG4gICAgVHJlZUl0ZW1Nb2RlbCxcbiAgICBUcmVlRGF0YVJ1blRpbWVNb2RlbCxcbiAgICBUcmVlSXRlbVJ1blRpbWVNb2RlbCxcbiAgICBUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsLFxuICAgIEV1aVRyZWVTZWxlY3Rpb25DaGFuZ2VzLFxuICAgIEV1aVRyZWVQYWdpbmF0aW9uLFxuICAgIEN1c3RvbU5vZGVTZWxlY3RGbixcbiAgICBDdXN0b21Ob2RlU2VsZWN0Rm5IZWxwZXIsXG59IGZyb20gJy4vZXVpLXRyZWUubW9kZWwnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFdWlJbnB1dENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGV1aS9jb21wb25lbnRzL2V1aS1pbnB1dC1jaGVja2JveCc7XG5pbXBvcnQgeyBFdWlCdXR0b25Nb2R1bGUgfSBmcm9tICdAZXVpL2NvbXBvbmVudHMvZXVpLWJ1dHRvbic7XG5pbXBvcnQgeyBFdWlJY29uTW9kdWxlIH0gZnJvbSAnQGV1aS9jb21wb25lbnRzL2V1aS1pY29uJztcbmltcG9ydCB7IEV1aUxhYmVsTW9kdWxlIH0gZnJvbSAnQGV1aS9jb21wb25lbnRzL2V1aS1sYWJlbCc7XG5pbXBvcnQgeyBFdWlCYWRnZU1vZHVsZSB9IGZyb20gJ0BldWkvY29tcG9uZW50cy9ldWktYmFkZ2UnO1xuaW1wb3J0IHsgRXVpQ2hpcE1vZHVsZSB9IGZyb20gJ0BldWkvY29tcG9uZW50cy9ldWktY2hpcCc7XG5pbXBvcnQgeyBFdWlEcm9wZG93bk1vZHVsZSB9IGZyb20gJ0BldWkvY29tcG9uZW50cy9ldWktZHJvcGRvd24nO1xuaW1wb3J0IHsgTmVzdGVkVHJlZUNvbnRyb2wsIENka1RyZWVNb2R1bGUsIENka1RyZWUgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBBcnJheURhdGFTb3VyY2UsIFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlLCBTY3JvbGxEaXNwYXRjaGVyLCBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdldWktdHJlZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2V1aS10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zdHlsZXMvX2luZGV4LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBFdWlUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gICAgcHVibGljIGdldCBjc3NDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENzc0NsYXNzZXMoKTtcbiAgICB9XG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZTJlJykgQElucHV0KCkgZTJlQXR0ciA9ICdldWktdHJlZSc7XG4gICAgQElucHV0KCkgbm9kZXM6IFRyZWVEYXRhTW9kZWw7XG4gICAgLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgQElucHV0KCkgbm9kZVRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIEBJbnB1dCgpIG5vZGVDb250ZW50TWV0YWRhdGFUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBASW5wdXQoKSByaWdodENvbnRleHRNZW51VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgY3VzdG9tTm9kZVNlbGVjdEZuOiBDdXN0b21Ob2RlU2VsZWN0Rm47XG4gICAgLyoqIEBkZXByZWNhdGVkIFRoaXMgd2lsbCBiZSByZW1vdmVkIGluIG5leHQgdmVyc2lvbiBvZiBldWkgaW4gZmF2b3Igb2YgZXhwYW5kZWRTdmdJY29uQ2xhc3MgKi9cbiAgICBASW5wdXQoKSBleHBhbmRlZEljb25DbGFzczogc3RyaW5nO1xuICAgIC8qKiBAZGVwcmVjYXRlZCBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IHZlcnNpb24gb2YgZXVpIGluIGZhdm9yIG9mIGNvbGxhcHNlZFN2Z0ljb25DbGFzcyAqL1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlZEljb25DbGFzczogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGV4cGFuZGVkU3ZnSWNvbkNsYXNzID0gJ2NoZXZyb24tZm9yd2FyZDpzaGFycCc7XG4gICAgQElucHV0KCkgY29sbGFwc2VkU3ZnSWNvbkNsYXNzID0gJ2NoZXZyb24tZG93bjpzaGFycCc7XG5cbiAgICBAVmlld0NoaWxkKCdjZGtTY3JvbGxhYmxlUmVmJywgeyByZWFkOiBDZGtTY3JvbGxhYmxlIH0pIGNka1Njcm9sbGFibGVSZWY6IENka1Njcm9sbGFibGU7XG4gICAgQFZpZXdDaGlsZCgndHJlZUNvbXBvbmVudEluc3RhbmNlJykgcHVibGljIHRyZWVDb21wb25lbnRJbnN0YW5jZTogQ2RrVHJlZTxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaXNDbGlja1RvZ2dsaW5nTm9kZSA9IGZhbHNlO1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBpc011bHRpc2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGlzU2luZ2xlU2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGlzUmVjdXJzaXZlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGlzUmVjdXJzaXZlUGFyZW50U2VsZWN0aW9uID0gdHJ1ZTtcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1VuZGVybGluZWRMaW5rcyA9IGZhbHNlO1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TGluZXMgPSB0cnVlO1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhdXRvVHJhbnNsYXRlID0gdHJ1ZTtcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaGlnaGxpZ2h0UGF0aCA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXVpVHJlZVNlbGVjdGlvbkNoYW5nZXM+KCk7XG4gICAgQE91dHB1dCgpIG5vZGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUl0ZW1Nb2RlbD4oKTtcbiAgICBAT3V0cHV0KCkgbm9kZVRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUl0ZW1Nb2RlbD4oKTtcbiAgICBjZGtBcnJheURhdGFTb3VyY2U6IEFycmF5RGF0YVNvdXJjZTxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG4gICAgY2RrVHJlZUNvbnRyb2w6IE5lc3RlZFRyZWVDb250cm9sPFRyZWVJdGVtUnVuVGltZU1vZGVsPjtcbiAgICByZW5kZXJUcmVlOiBib29sZWFuO1xuICAgIHB1YmxpYyB1aWQ6IHN0cmluZyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMDApLnRvU3RyaW5nKCk7XG4gICAgcHJvdGVjdGVkIF9pc011bHRpTGV2ZWw7XG4gICAgcHJpdmF0ZSBwcm9jZXNzZWROb2RlczogVHJlZURhdGFNb2RlbDtcbiAgICBwcml2YXRlIHRyZWVEYXRhUnVuVGltZTogVHJlZURhdGFSdW5UaW1lTW9kZWw7XG4gICAgcHJpdmF0ZSB0cmVlRGF0YVJ1blRpbWVCYWNrdXA6IFRyZWVEYXRhUnVuVGltZU1vZGVsO1xuICAgIHByaXZhdGUgcnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlOiBBcnJheTxUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsPjtcbiAgICBwcml2YXRlIHNlbGVjdGlvbk1vZGVsOiBTZWxlY3Rpb25Nb2RlbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG4gICAgcHJpdmF0ZSB0ZW1wU2VsZWN0aW9uTW9kZWw6IFNlbGVjdGlvbk1vZGVsPFRyZWVJdGVtUnVuVGltZU1vZGVsPjtcbiAgICBwcml2YXRlIHNlbGVjdGlvbk1vZGVsU3VicztcbiAgICBwcml2YXRlIHNjcm9sbERpc3BhdGNoZXJTdWJzO1xuICAgIHByaXZhdGUgX3NlbGVjdGlvbjtcbiAgICBwcml2YXRlIHRyZWVQYWdpbmF0aW9uOiBFdWlUcmVlUGFnaW5hdGlvbjxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBzY3JvbGxEaXNwYXRjaGVyOiBTY3JvbGxEaXNwYXRjaGVyKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdFRyZWUoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydub2RlcyddPy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ25vZGVzJ10/LnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pbml0VHJlZSgpO1xuICAgICAgICAgICAgaWYodGhpcy50cmVlQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb21wb25lbnRJbnN0YW5jZT8ucmVuZGVyTm9kZUNoYW5nZXMoW10pO1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNvbXBvbmVudEluc3RhbmNlPy5yZW5kZXJOb2RlQ2hhbmdlcyh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWxTdWJzKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsU3Vicy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWxlY3Rpb24oKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XG4gICAgfVxuXG4gICAgZ2V0UHJvY2Vzc2VkTm9kZXMoKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZE5vZGVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpOiBhbnkge1xuICAgICAgICByZXR1cm4gaXRlbS5wYXRoO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHRyYWNrQnlDb250cm9sKGl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgZ2V0VHJlZUl0ZW0ocGF0aDogc3RyaW5nKTogVHJlZUl0ZW1Nb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IG5vZGVBcnIgPSB0aGlzLnByb2Nlc3NlZE5vZGVzO1xuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgaWYgKG5vZGVBcnIgJiYgQXJyYXkuaXNBcnJheShub2RlQXJyKSkge1xuICAgICAgICAgICAgaW5kZXhBcnI/LmZvckVhY2goKHBhdGhJbmRleDogbnVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGluZGV4QXJyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUFyciA9IG5vZGVBcnIgJiYgbm9kZUFycltwYXRoSW5kZXhdPy5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZUFycltwYXRoSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGV4cGFuZEFsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5leHBhbmRBbGwoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBleHBhbmRBdChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRQYXJlbnRQYXRocyhwYXRoKS5yZXZlcnNlKCkuZm9yRWFjaCgocGFyZW50UGF0aCk9PntcbiAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhcmVudFBhdGgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY29sbGFwc2VBbGwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuY29sbGFwc2VBbGwoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJUZXJtKGZpbHRlcklucHV0OiBzdHJpbmcsIGZpbHRlcktleT86IHN0cmluZywgc2hvd0NoaWxkcmVuT2ZNYXRjaGVkSXRlbXM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChmaWx0ZXJJbnB1dCAhPT0gJycgJiYgZmlsdGVySW5wdXQgIT09IG51bGwgJiYgdHlwZW9mIGZpbHRlcklucHV0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSB0aGlzLmZpbHRlclRyZWVEYXRhKHN0cnVjdHVyZWRDbG9uZSh0aGlzLnRyZWVEYXRhUnVuVGltZUJhY2t1cCksIGZpbHRlcktleSB8fCAnbGFiZWwnLCBmaWx0ZXJJbnB1dCwgc2hvd0NoaWxkcmVuT2ZNYXRjaGVkSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSB0aGlzLmFwcGx5UnVuVGltZUxhc3RJdGVtcyh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICB0aGlzLmNka0FycmF5RGF0YVNvdXJjZSA9IG5ldyBBcnJheURhdGFTb3VyY2UodGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oKG5vZGUpID0+IG5vZGU/LmNoaWxkcmVuLCB7IHRyYWNrQnk6IHRoaXMudHJhY2tCeUNvbnRyb2wgfSk7XG4gICAgICAgICAgICB0aGlzLmNka1RyZWVDb250cm9sLmRhdGFOb2RlcyA9IHRoaXMudHJlZURhdGFSdW5UaW1lO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTWF0Y2hlZCh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICAvLyB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy50cmVlRGF0YVJ1blRpbWVCYWNrdXApO1xuICAgICAgICAgICAgdGhpcy5jZGtBcnJheURhdGFTb3VyY2UgPSBuZXcgQXJyYXlEYXRhU291cmNlKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwgeyB0cmFja0J5OiB0aGlzLnRyYWNrQnlDb250cm9sIH0pO1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5kYXRhTm9kZXMgPSB0aGlzLnRyZWVEYXRhUnVuVGltZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0QWxsU2VsZWN0aW9uKGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnRlbXBTZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZCxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAoYSwgYikgPT4gYT8ucGF0aCA9PT0gYj8ucGF0aCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRJc0NoZWNrZWRGb3JBbGwodGhpcy50cmVlRGF0YVJ1blRpbWUsIGlzQ2hlY2tlZCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKC4uLnRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUcmVlSXRlbShnaXZlblRyZWVJdGVtOiBUcmVlSXRlbU1vZGVsLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJlZUl0ZW0gPSBzdHJ1Y3R1cmVkQ2xvbmUoZ2l2ZW5UcmVlSXRlbSk7XG4gICAgICAgIGlmICh0cmVlSXRlbSAmJiBwYXRoKSB7XG4gICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPFRyZWVJdGVtUnVuVGltZU1vZGVsPihcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIChhLCBiKSA9PiBhPy5wYXRoID09PSBiPy5wYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldFRyZWVEYXRhKHBhdGgsIHRoaXMucHJvY2Vzc0lucHV0cyhbdHJlZUl0ZW1dKVswXSk7XG4gICAgICAgIGNvbnN0IHBhdGhBcnIgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQocGF0aEFyci5wb3AoKSwgMTApO1xuICAgICAgICBjb25zdCB0cmVlSXRlbVJ1bnRpbWUgPSB0aGlzLmNhbGN1bGF0ZVJ1blRpbWVTdGF0ZSh0cmVlSXRlbSwgaW5kZXgsIHBhdGhBcnIuam9pbignLicpKTtcbiAgICAgICAgaWYgKHRyZWVJdGVtUnVudGltZT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRyZWVJdGVtUnVudGltZS5jaGlsZHJlbiA9IHRoaXMuYXBwbHlSdW5UaW1lTGFzdEl0ZW1zKHRyZWVJdGVtUnVudGltZS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUcmVlRGF0YVJ1blRpbWVCYWNrdXAocGF0aCwgdHJlZUl0ZW1SdW50aW1lKTtcbiAgICAgICAgdGhpcy5zZXRUcmVlRGF0YVJ1blRpbWUocGF0aCwgdHJlZUl0ZW1SdW50aW1lKTtcbiAgICAgICAgLy8gaXRlbVJlY3Vyc2l2ZVNlbGVjdGlvblN0YXRlXG4gICAgICAgIGNvbnN0IGl0ZW1SZWN1cnNpdmVTZWxlY3Rpb25TdGF0ZSA9IHRoaXMuY2FsY3VsYXRlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKHRyZWVJdGVtKTtcbiAgICAgICAgdGhpcy5zZXRSdW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGVUcmVlKHBhdGgsIGl0ZW1SZWN1cnNpdmVTZWxlY3Rpb25TdGF0ZSk7XG4gICAgICAgIHRoaXMuc3luY1N0YXRlQ2hhbmdlc0F0UGF0aChwYXRoKTtcbiAgICAgICAgaWYgKHRoaXMuY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlSXRlbVJ1bnRpbWUpICYmICF0cmVlSXRlbS5ub2RlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wudG9nZ2xlKHRyZWVJdGVtUnVudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlSXRlbVJ1bnRpbWUpICYmIHRyZWVJdGVtLm5vZGUuaXNFeHBhbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5leHBhbmQodHJlZUl0ZW1SdW50aW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlckluaXRpYWxFeHBhbmQodGhpcy5nZXRSdW5UaW1lVHJlZUl0ZW0ocGF0aCk/LmNoaWxkcmVuKTtcbiAgICAgICAgdGhpcy5nZXRJbml0aWFsU2VsZWN0aW9uKHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpPy5jaGlsZHJlbik/LmZvckVhY2goKHJ1blRpbWVJdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRyZWVJdGVtKHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHJ1blRpbWVJdGVtLnBhdGgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKC4uLnRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKTtcbiAgICAgICAgLy8gUmVuZGVyaW5nXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnRyZWVDb21wb25lbnRJbnN0YW5jZS5yZW5kZXJOb2RlQ2hhbmdlcyhbXSk7XG4gICAgICAgIHRoaXMudHJlZUNvbXBvbmVudEluc3RhbmNlLnJlbmRlck5vZGVDaGFuZ2VzKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25Ob2RlQ2xpY2sodHJlZVJ1blRpbWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCwgZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc011bHRpc2VsZWN0IHx8IGUucG9pbnRlcklkICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlQ2xpY2suZW1pdCh0aGlzLmdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbT8ucGF0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDbGlja1RvZ2dsaW5nTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC50b2dnbGUodHJlZVJ1blRpbWVJdGVtKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlVG9nZ2xlKHRyZWVSdW5UaW1lSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk5vZGVUb2dnbGUodHJlZVJ1blRpbWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbT8ucGF0aCkubm9kZS5pc0V4cGFuZGVkID0gdGhpcy5jZGtUcmVlQ29udHJvbC5pc0V4cGFuZGVkKHRyZWVSdW5UaW1lSXRlbSk7XG4gICAgICAgIHRoaXMubm9kZVRvZ2dsZS5lbWl0KHRoaXMuZ2V0VHJlZUl0ZW0odHJlZVJ1blRpbWVJdGVtPy5wYXRoKSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbm9kZVNlbGVjdGVkKGV2dDogYW55LCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0VHJlZUl0ZW0ocGF0aCk7XG4gICAgICAgIGNvbnN0IHJ1blRpbWVCYWNrdXBUcmVlSXRlbSA9IHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHBhdGgpO1xuICAgICAgICBjb25zdCByZW5kZXJlZFJ1blRpbWVUcmVlSXRlbSA9IHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpO1xuICAgICAgICBjb25zdCBub2RlID0gaXRlbT8ubm9kZTtcbiAgICAgICAgdGhpcy50ZW1wU2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKGEsIGIpID0+IGE/LnBhdGggPT09IGI/LnBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHBhdGgsaXRlbSxydW5UaW1lVHJlZUl0ZW0sIHJlbmRlcmVkUnVuVGltZVRyZWVJdGVtKTtcbiAgICAgICAgaWYodGhpcy5jdXN0b21Ob2RlU2VsZWN0Rm4pe1xuICAgICAgICAgICAgdGhpcy5jdXN0b21Ob2RlU2VsZWN0Rm4ocGF0aCwgZXZ0LnRhcmdldC5jaGVja2VkLCBpdGVtLCBuZXcgQ3VzdG9tTm9kZVNlbGVjdEZuSGVscGVyKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKC4uLnRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKTtcbiAgICAgICAgfSAgZWxzZSBpZiAoIW5vZGU/LnNlbGVjdENvbmZpZz8uc2luZ2xlU2VsZWN0KSB7XG4gICAgICAgICAgICBub2RlLmlzU2VsZWN0ZWQgPSBldnQudGFyZ2V0LmNoZWNrZWQ7XG4gICAgICAgICAgICBub2RlLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgcmVjdXJzaXZlIGl0IHNldHMgZXZlcnkgY2hpbGRyZW4gd2l0aCB0aGUgY2hhbmdlLlxuICAgICAgICAgICAgaWYgKHJlbmRlcmVkUnVuVGltZVRyZWVJdGVtPy5jaGlsZHJlbiAmJiByZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVuZGVyZWRSdW5UaW1lVHJlZUl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldElzQ2hlY2tlZEZvckFsbChyZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4sIGV2dC50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZVRyZWUoXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5nZXRUcmVlSXRlbShwYXRoKSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4gJiYgcmVuZGVyZWRSdW5UaW1lVHJlZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlPy5zZWxlY3RDb25maWc/LnJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldElzQ2hlY2tlZEZvckFsbChyZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4sIGV2dC50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuU3RhdGVDaGFuZ2VzRm9yQWxsKHJlbmRlcmVkUnVuVGltZVRyZWVJdGVtPy5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNvbXBvbmVudEluc3RhbmNlPy5yZW5kZXJOb2RlQ2hhbmdlcyhbXSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlQ29tcG9uZW50SW5zdGFuY2U/LnJlbmRlck5vZGVDaGFuZ2VzKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3luY1N0YXRlQ2hhbmdlc0F0UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFRyZWVJdGVtKHBhdGgpLm5vZGUuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VHJlZUl0ZW0ocnVuVGltZUJhY2t1cFRyZWVJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHJ1blRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub2RlUGF0aHNTZXEgPSB0aGlzLmdldFBhcmVudFBhdGhzKHBhdGgpO1xuICAgICAgICAgICAgaWYgKG5vZGVQYXRoc1NlcS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZVBhdGhzU2VxLmZvckVhY2goKG5vZGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZUl0ZW0gPSB0aGlzLmdldFRyZWVJdGVtKG5vZGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRTdGF0ZXMgPSB0aGlzLmdldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShub2RlUGF0aCkuY2hpbGRyZW4ubWFwKChfKSA9PiBfLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSdW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjaWRlU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZT8uaXNTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/LnJlY3Vyc2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY1N0YXRlQ2hhbmdlc0F0UGF0aChub2RlUGF0aCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb24oLi4udGhpcy50ZW1wU2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcHJldkl0ZW0gPSB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdO1xuICAgICAgICAgICAgaWYgKGV2dC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRyZWVJdGVtKHByZXZJdGVtLnBhdGgpLm5vZGUuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KHByZXZJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXRlbS5ub2RlLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHJ1blRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW0ubm9kZS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChydW5UaW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0UGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChldnQudGFyZ2V0LmNoZWNrZWQgJiYgcHJldkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkl0ZW1Ob2RlUGF0aHNTZXEgPSB0aGlzLmdldFBhcmVudFBhdGhzKHByZXZJdGVtLnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldkl0ZW1Ob2RlUGF0aHNTZXEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkl0ZW1Ob2RlUGF0aHNTZXEuZm9yRWFjaCgobm9kZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKG5vZGVQYXRoLCAnYWxsTm90U2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNTdGF0ZUNoYW5nZXNBdFBhdGgobm9kZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZVBhdGhzU2VxID0gdGhpcy5nZXRQYXJlbnRQYXRocyhwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZVBhdGhzU2VxPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVQYXRoc1NlcS5mb3JFYWNoKChub2RlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShub2RlUGF0aCwgZXZ0LnRhcmdldC5jaGVja2VkID8gJ2luZGV0ZXJtaW5hdGUnIDogJ2FsbE5vdFNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNTdGF0ZUNoYW5nZXNBdFBhdGgobm9kZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzQ2hpbGQgPSAoXzogbnVtYmVyLCBpdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCk6IGJvb2xlYW4gPT4gISFpdGVtPy5jaGlsZHJlbiAmJiBpdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID49IDA7XG5cbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvblNlbGVjdEZuKHBhdGg6IHN0cmluZyk6IChldnQ6IGFueSkgPT4gdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmdldFRyZWVJdGVtKHBhdGgpPy5ub2RlPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlU2VsZWN0ZWQgPSB0aGlzLm5vZGVTZWxlY3RlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHJldHVybiAoZXZ0OiBhbnkpID0+IG5vZGVTZWxlY3RlZChldnQsIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIChldnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCd0cmVlSXRlbU1vZGVsLm5vZGUuc2VsZWN0YWJsZSBpcyBmYWxzZSwgeW91IGNhbiBub3QgaW1wbGVtZW50IG9uU2VsZWN0Jyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0UnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKHBhdGg6IHN0cmluZyk6IFRyZWVJdGVtU2VsZWN0aW9uUmVjdXJzaXZlTW9kZWwge1xuICAgICAgICBjb25zdCBpbmRleEFycjogQXJyYXk8bnVtYmVyPiA9IHRoaXMucmVzb2x2ZVBhdGgocGF0aCk7XG4gICAgICAgIGxldCBub2RlQXJyID0gdGhpcy5ydW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGU7XG4gICAgICAgIGxldCBub2RlO1xuICAgICAgICBpbmRleEFycj8uZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgbm9kZUFyciA9IG5vZGVBcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlQXJyW3BhdGhJbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRUcmVlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgdGhpcy5faXNNdWx0aUxldmVsID0gdGhpcy5jaGVja0lmTXVsdGlMZXZlbCh0aGlzLm5vZGVzKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkTm9kZXMgPSB0aGlzLnByb2Nlc3NJbnB1dHMoc3RydWN0dXJlZENsb25lKHRoaXMubm9kZXMpKTtcbiAgICAgICAgICAgIHRoaXMudHJlZURhdGFSdW5UaW1lID0gdGhpcy5jcmVhdGVUcmVlRGF0YVJ1bnRpbWUodGhpcy5wcm9jZXNzZWROb2Rlcyk7XG4gICAgICAgICAgICB0aGlzLnRyZWVEYXRhUnVuVGltZSA9IHRoaXMuYXBwbHlSdW5UaW1lTGFzdEl0ZW1zKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgIHRoaXMucnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID0gdGhpcy5jcmVhdGVSdW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUodGhpcy5wcm9jZXNzZWROb2Rlcyk7XG4gICAgICAgICAgICB0aGlzLnRyZWVEYXRhUnVuVGltZUJhY2t1cCA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICAvLyB0b2RvIEl0IHNob3VsZCBiZSBjb25maWd1cmFibGUsIDgwMCwgMiBhbmQgNDAwIGFyZSBoYXJkIGNvZGVkIHJpZ2h0IG5vd1xuICAgICAgICAgICAgaWYgKHRoaXMudHJlZURhdGFSdW5UaW1lQmFja3VwLmxlbmd0aCA+IDgwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZVBhZ2luYXRpb24gPSBuZXcgRXVpVHJlZVBhZ2luYXRpb248VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KHRoaXMudHJlZURhdGFSdW5UaW1lQmFja3VwLCAxLCAyLCA0MDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRlZERhdGEgPSB0aGlzLnRyZWVQYWdpbmF0aW9uLmdldFZpZXdEYXRhKCkuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmNka0FycmF5RGF0YVNvdXJjZSA9IG5ldyBBcnJheURhdGFTb3VyY2U8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KHBhZ2luYXRlZERhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0aGlzLnRyYWNrQnlDb250cm9sLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gcGFnaW5hdGVkRGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrQXJyYXlEYXRhU291cmNlID0gbmV3IEFycmF5RGF0YVNvdXJjZTxUcmVlSXRlbVJ1blRpbWVNb2RlbD4odGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0aGlzLnRyYWNrQnlDb250cm9sLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy50cmVlRGF0YVJ1blRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlckluaXRpYWxFeHBhbmQodGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldEluaXRpYWxTZWxlY3Rpb24odGhpcy50cmVlRGF0YVJ1blRpbWUpLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgKGEsIGIpID0+IGE/LnBhdGggPT09IGI/LnBhdGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gWy4uLnRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRdPy5tYXAoKGl0ZW0pID0+IHRoaXMuZ2V0VHJlZUl0ZW0oaXRlbT8ucGF0aCkpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsU3Vicykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWxTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsU3VicyA9IHRoaXMuc2VsZWN0aW9uTW9kZWwuY2hhbmdlZC5waXBlKGRlYm91bmNlVGltZSgxKSkuc3Vic2NyaWJlKChzYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkNoYW5nZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkZWQ6IHNjLmFkZGVkLm1hcCgoXykgPT4gdGhpcy5nZXRUcmVlSXRlbShfLnBhdGgpKSxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZDogc2MucmVtb3ZlZC5tYXAoKF8pID0+IHRoaXMuZ2V0VHJlZUl0ZW0oXy5wYXRoKSksXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWy4uLnRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRdLm1hcCgoaXRlbSkgPT4gdGhpcy5nZXRUcmVlSXRlbShpdGVtLnBhdGgpKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHNlbGVjdGlvbkNoYW5nZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChzZWxlY3Rpb25DaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzSW5wdXRzKHRyZWVEYXRhOiBUcmVlRGF0YU1vZGVsKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIHRyZWVEYXRhID0gdGhpcy5vdmVycmlkZVRyZWVEYXRhTW9kZWxGb3JTZWxlY3Rpb24odHJlZURhdGEsIHRoaXMuaXNSZWN1cnNpdmVTZWxlY3Rpb24sICF0aGlzLmlzUmVjdXJzaXZlUGFyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdCkge1xuICAgICAgICAgICAgdHJlZURhdGEgPSB0aGlzLm92ZXJyaWRlVHJlZURhdGFNb2RlbEZvclNlbGVjdGlvbih0cmVlRGF0YSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZURhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvdmVycmlkZVRyZWVEYXRhTW9kZWxGb3JTZWxlY3Rpb24oXG4gICAgICAgIG5vZGVBcnI6IFRyZWVEYXRhTW9kZWwsXG4gICAgICAgIGlzUmVjdXJzaXZlOiBib29sZWFuLFxuICAgICAgICBub0F1dG9TZWxlY3RQYXJlbnQ6IGJvb2xlYW4sXG4gICAgICAgIHNpbmdsZVNlbGVjdD86IGJvb2xlYW4sXG4gICAgKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIHJldHVybiBub2RlQXJyPy5tYXAoKGl0ZW06IFRyZWVJdGVtTW9kZWwsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiB0eXBlb2YgaXRlbT8ubm9kZT8uc2VsZWN0YWJsZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogaXRlbT8ubm9kZT8uc2VsZWN0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNJbmRldGVybWluYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdENvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ubm9kZS5zZWxlY3RDb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaXRlbT8ubm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICEhaXNSZWN1cnNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbT8ubm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9BdXRvU2VsZWN0UGFyZW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaXRlbT8ubm9kZT8uc2VsZWN0Q29uZmlnPy5ub0F1dG9TZWxlY3RQYXJlbnQgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5vQXV0b1NlbGVjdFBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtPy5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVTZWxlY3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpdGVtPy5ub2RlPy5zZWxlY3RDb25maWc/LnNpbmdsZVNlbGVjdCA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2luZ2xlU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0/Lm5vZGU/LnNlbGVjdENvbmZpZz8uc2luZ2xlU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMub3ZlcnJpZGVUcmVlRGF0YU1vZGVsRm9yU2VsZWN0aW9uKGl0ZW0uY2hpbGRyZW4sIGlzUmVjdXJzaXZlLCBub0F1dG9TZWxlY3RQYXJlbnQsIHNpbmdsZVNlbGVjdCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbS5ub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHlwZW9mIGl0ZW0/Lm5vZGU/LnNlbGVjdGFibGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGl0ZW0/Lm5vZGU/LnNlbGVjdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLm5vZGU/LnNlbGVjdENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVTZWxlY3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpdGVtPy5ub2RlPy5zZWxlY3RDb25maWc/LnNpbmdsZVNlbGVjdCA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2luZ2xlU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0/Lm5vZGU/LnNlbGVjdENvbmZpZz8uc2luZ2xlU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blNjcm9sbExpc3RlbmVyKCk6IHZvaWQge1xuICAgICAgICAvKiBpZiAodGhpcy5zY3JvbGxEaXNwYXRjaGVyU3VicykgeyB0b2RvXG4gICAgICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0qL1xuICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzID0gdGhpcy5zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKCkuc3Vic2NyaWJlKChzY3JvbGxhYmxlOiBDZGtTY3JvbGxhYmxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2Nyb2xsYWJsZSAmJiB0aGlzLmNoZWNrSWZDdXJyZW50U2Nyb2xsYWJsZShzY3JvbGxhYmxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlPy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgKyBzY3JvbGxhYmxlPy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPj1cbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZT8uZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRUb3AgPSBzY3JvbGxhYmxlPy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPT09IDA7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0VsZW1lbnQ6JywgdGhpcy5jZGtTY3JvbGxhYmxlUmVmLmdldEVsZW1lbnRSZWYoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXRCb3R0b20gJiYgIXRoaXMudHJlZVBhZ2luYXRpb24uaXNBdE1heCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZURhdGFSdW5UaW1lID0gdGhpcy50cmVlUGFnaW5hdGlvbi5wYWdpbmF0ZU5leHQoKS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSB0aGlzLmFwcGx5UnVuVGltZUxhc3RJdGVtcyh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0FycmF5RGF0YVNvdXJjZSA9IG5ldyBBcnJheURhdGFTb3VyY2UodGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oKG5vZGUpID0+IG5vZGU/LmNoaWxkcmVuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdGhpcy50cmFja0J5Q29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5kYXRhTm9kZXMgPSB0aGlzLnRyZWVEYXRhUnVuVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxIZWlnaHQgPSBzY3JvbGxhYmxlLm1lYXN1cmVTY3JvbGxPZmZzZXQoJ2JvdHRvbScpICsgc2Nyb2xsYWJsZS5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCd0b3AnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gc2Nyb2xsYWJsZS5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvblRvU2Nyb2xsID0gdG90YWxIZWlnaHQgLSB2aWV3cG9ydEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oeyB0b3A6IHBvc2l0aW9uVG9TY3JvbGwgLyAyIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0F0VG9wICYmIHRoaXMudHJlZVBhZ2luYXRpb24uZ2V0Q3VycmVudFN0YXJ0UGFnZSgpID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVEYXRhUnVuVGltZSA9IHRoaXMudHJlZVBhZ2luYXRpb24ucGFnaW5hdGVQcmV2KCkuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZURhdGFSdW5UaW1lID0gdGhpcy5hcHBseVJ1blRpbWVMYXN0SXRlbXModGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZGtBcnJheURhdGFTb3VyY2UgPSBuZXcgQXJyYXlEYXRhU291cmNlKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRoaXMudHJhY2tCeUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy50cmVlRGF0YVJ1blRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gc2Nyb2xsYWJsZS5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCdib3R0b20nKSArIHNjcm9sbGFibGUubWVhc3VyZVNjcm9sbE9mZnNldCgndG9wJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHNjcm9sbGFibGUuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25Ub1Njcm9sbCA9IHRvdGFsSGVpZ2h0IC0gdmlld3BvcnRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlLnNjcm9sbFRvKHsgdG9wOiBwb3NpdGlvblRvU2Nyb2xsIC8gMiArIHZpZXdwb3J0SGVpZ2h0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGlvbkluZGV4T2ZJdGVtKHJ1blRpbWVUcmVlSXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5maW5kSW5kZXgoKGkpID0+IGk/LnBhdGggPT09IHJ1blRpbWVUcmVlSXRlbT8ucGF0aCk7XG4gICAgfVxuICAgIC8vIHRvZG8gcmUtdGhpbmsgYWJvdXQgdGhlIGFjY2VzcyBmcm9tIGN1c3RvbSBvbiBub2RlIHNlbGVjdCBoZWxwZXJcbiAgICBwcml2YXRlIHNpbGVudFNlbGVjdChwYXRoOnN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKTogdm9pZHtcbiAgICAgICAgY29uc3QgcnVudGltZUJhY2t1cFRyZWVJdGVtID0gdGhpcy5nZXRSdW5UaW1lQmFja3VwVHJlZUl0ZW0ocGF0aCk7XG4gICAgICAgIGNvbnN0IHRyZWVJdGVtID0gdGhpcy5nZXRUcmVlSXRlbShwYXRoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRyZWVJdGVtLm5vZGU7XG4gICAgICAgIGlmIChub2RlPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICBub2RlLmlzU2VsZWN0ZWQgPSBpc0NoZWNrZWQ7XG4gICAgICAgICAgICBub2RlLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdChydW50aW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBTZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChydW50aW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RUcmVlSXRlbShydW5UaW1lQmFja3VwVHJlZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdChydW5UaW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZWxlY3RUcmVlSXRlbShydW5UaW1lVHJlZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KHJ1blRpbWVUcmVlSXRlbSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUcmVlRGF0YVJ1bnRpbWUobm9kZXM6IFRyZWVEYXRhTW9kZWwpOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCB7XG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUobm9kZXMpPy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVSdW5UaW1lU3RhdGUoaXRlbSwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5UnVuVGltZUxhc3RJdGVtcyhpdGVtczogVHJlZURhdGFSdW5UaW1lTW9kZWwpOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCB7XG4gICAgICAgIHJldHVybiBpdGVtcz8ubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0/LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdDogaXRlbXMubGVuZ3RoID09PSBpbmRleCArIDEgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogaXRlbS5jaGlsZHJlbj8ubGVuZ3RoID4gMCA/IHRoaXMuYXBwbHlSdW5UaW1lTGFzdEl0ZW1zKGl0ZW0uY2hpbGRyZW4pIDogaXRlbT8uY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdDogaXRlbXMubGVuZ3RoID09PSBpbmRleCArIDEgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKG5vZGVzOiBUcmVlRGF0YU1vZGVsKTogQXJyYXk8VHJlZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKG5vZGVzKT8ubWFwKChpdGVtKSA9PiB0aGlzLmNhbGN1bGF0ZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSh7IC4uLml0ZW0gfSkpO1xuICAgIH1cblxuICAgIC8vIENyZWF0aW5nIHJ1biB0aW1lIHN0YXRlIHdoaWNoIGluY2x1ZGVzIGNoaWxkcmVuIHNlbGVjdGlvbiBzdGF0ZSBmb3Igc2VsZWN0aW9uIHRyZWUuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJdGVtU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUodHJlZUl0ZW06IFRyZWVJdGVtTW9kZWwpOiBUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5TZWxlY3Rpb25SZWN1cnNpdmU6IEFycmF5PFRyZWVJdGVtU2VsZWN0aW9uUmVjdXJzaXZlTW9kZWw+ID0gW107XG4gICAgICAgIGlmICh0cmVlSXRlbS5jaGlsZHJlbiAmJiB0cmVlSXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0cmVlSXRlbS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlblNlbGVjdGlvblJlY3Vyc2l2ZVtpbmRleF0gPSB0aGlzLmNhbGN1bGF0ZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShjaGlsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZFN0YXRlcyA9IGNoaWxkcmVuU2VsZWN0aW9uUmVjdXJzaXZlLm1hcCgoXykgPT4gXy5zZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSk7XG4gICAgICAgIGNvbnN0IGl0ZW1TdGF0ZTogU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUgPSAgdHJlZUl0ZW0ubm9kZS5zZWxlY3RhYmxlID8gdGhpcy5kZWNpZGVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShcbiAgICAgICAgICAgIGNoaWxkU3RhdGVzLFxuICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZS5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUsXG4gICAgICAgICAgICB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCxcbiAgICAgICAgKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlOiBpdGVtU3RhdGUsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5TZWxlY3Rpb25SZWN1cnNpdmUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWNpZGVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShcbiAgICAgICAgY2hpbGRTdGF0ZXM6IEFycmF5PFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlPiA9IFtdLFxuICAgICAgICBpc1NlbGVjdGVkOiBib29sZWFuLFxuICAgICAgICByZWN1cnNpdmU6IGJvb2xlYW4sXG4gICAgICAgIG5vQXV0b1NlbGVjdFBhcmVudDogYm9vbGVhbixcbiAgICApOiBTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSB7XG4gICAgICAgIGxldCBpdGVtU3RhdGU6IFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID0gJ2luZGV0ZXJtaW5hdGUnO1xuICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBjaGlsZFN0YXRlcy5maWx0ZXIoKGNoaWxkU3RhdGVzKT0+Y2hpbGRTdGF0ZXMpLmV2ZXJ5KChzdGF0ZSkgPT4gc3RhdGUgPT09ICdhbGxTZWxlY3RlZCcpKSB7XG4gICAgICAgICAgICBpdGVtU3RhdGUgPSAnYWxsU2VsZWN0ZWQnO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkICYmIGNoaWxkU3RhdGVzLmZpbHRlcigoY2hpbGRTdGF0ZXMpPT5jaGlsZFN0YXRlcykuZXZlcnkoKHN0YXRlKSA9PiBzdGF0ZSA9PT0gJ2FsbE5vdFNlbGVjdGVkJykpIHtcbiAgICAgICAgICAgIGl0ZW1TdGF0ZSA9ICdhbGxOb3RTZWxlY3RlZCc7XG4gICAgICAgIH0gZWxzZSBpZiAocmVjdXJzaXZlICYmIGNoaWxkU3RhdGVzLmZpbHRlcigoY2hpbGRTdGF0ZXMpPT5jaGlsZFN0YXRlcykuZXZlcnkoKHN0YXRlKSA9PiBzdGF0ZSA9PT0gJ2FsbFNlbGVjdGVkJykgJiYgIWlzU2VsZWN0ZWQgJiYgIW5vQXV0b1NlbGVjdFBhcmVudCkge1xuICAgICAgICAgICAgaXRlbVN0YXRlID0gJ2FsbFNlbGVjdGVkJztcbiAgICAgICAgfSBlbHNlIGlmIChyZWN1cnNpdmUgJiYgY2hpbGRTdGF0ZXMuZmlsdGVyKChjaGlsZFN0YXRlcyk9PmNoaWxkU3RhdGVzKS5ldmVyeSgoc3RhdGUpID0+IHN0YXRlID09PSAnYWxsTm90U2VsZWN0ZWQnKSAmJiBpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBpdGVtU3RhdGUgPSAnYWxsTm90U2VsZWN0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtU3RhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jU3RhdGVDaGFuZ2VzQXRQYXRoKG5vZGVQYXRoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRyZWVJdGVtID0gdGhpcy5nZXRUcmVlSXRlbShub2RlUGF0aCk7XG4gICAgICAgIGNvbnN0IHJ1blRpbWVCYWNrdXBUcmVlSXRlbSA9IHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKG5vZGVQYXRoKTtcbiAgICAgICAgY29uc3QgcnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZUl0ZW0gPSB0aGlzLmdldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShub2RlUGF0aCk7XG4gICAgICAgIGlmICh0cmVlSXRlbT8ubm9kZT8uc2VsZWN0YWJsZSAmJiB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/LnJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgaWYgKCF0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCkge1xuICAgICAgICAgICAgICAgIHRyZWVJdGVtLm5vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRyZWVJdGVtLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVJdGVtLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID09PSAnYWxsU2VsZWN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBpc0luZGV0ZXJtaW5hdGU6IHJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVJdGVtLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID09PSAnaW5kZXRlcm1pbmF0ZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udHJlZUl0ZW0ubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogdHJlZUl0ZW0ubm9kZS5pc1NlbGVjdGVkICYmIHJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVJdGVtLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID09PSAnYWxsU2VsZWN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBpc0luZGV0ZXJtaW5hdGU6XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlSXRlbS5zZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSA9PT0gJ2luZGV0ZXJtaW5hdGUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoIXRyZWVJdGVtLm5vZGUuaXNTZWxlY3RlZCAmJiBydW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlSXRlbS5zZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSA9PT0gJ2FsbFNlbGVjdGVkJyksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRyZWVJdGVtLCB0cmVlSXRlbS5ub2RlLnRyZWVDb250ZW50QmxvY2subGFiZWwsICdpc1NlbGVjdGVkOicgKyB0cmVlSXRlbS5ub2RlLmlzU2VsZWN0ZWQsICdpc0luZGV0ZXJtaW5hdGU6JyArIHRyZWVJdGVtLm5vZGUuaXNJbmRldGVybWluYXRlKTtcbiAgICAgICAgICAgIGlmICh0cmVlSXRlbS5ub2RlLmlzU2VsZWN0ZWQgPT09IHRydWUgJiYgIXRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChydW5UaW1lQmFja3VwVHJlZUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RUcmVlSXRlbShydW5UaW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0cmVlSXRlbS5ub2RlLmlzU2VsZWN0ZWQgPT09IGZhbHNlICYmIHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChydW5UaW1lQmFja3VwVHJlZUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHJ1blRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFRyZWVEYXRhKHBhdGg6IHN0cmluZywgaXRlbTogVHJlZUl0ZW1Nb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleEFycjogQXJyYXk8bnVtYmVyPiA9IHRoaXMucmVzb2x2ZVBhdGgocGF0aCk7XG4gICAgICAgIGxldCBpdGVtQXJyID0gdGhpcy5wcm9jZXNzZWROb2RlcztcbiAgICAgICAgaW5kZXhBcnI/LmZvckVhY2goKHBhdGhJbmRleDogbnVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgaW5kZXhBcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnIgPSBpdGVtQXJyW3BhdGhJbmRleF0/LmNoaWxkcmVuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtQXJyW3BhdGhJbmRleF0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFRyZWVEYXRhUnVuVGltZUJhY2t1cChwYXRoOiBzdHJpbmcsIGl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IGl0ZW1BcnIgPSB0aGlzLnRyZWVEYXRhUnVuVGltZUJhY2t1cDtcbiAgICAgICAgaW5kZXhBcnIuZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaXRlbUFyciA9IGl0ZW1BcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnJbcGF0aEluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VHJlZURhdGFSdW5UaW1lKHBhdGg6IHN0cmluZywgaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkSXRlbSA9IHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpO1xuICAgICAgICBpZihvbGRJdGVtKXtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pPy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgb2xkSXRlbVtrZXldID0gaXRlbVtrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZVRyZWUocGF0aDogc3RyaW5nLCBpdGVtOiBUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IGl0ZW1BcnIgPSB0aGlzLnJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZTtcbiAgICAgICAgaW5kZXhBcnIuZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaXRlbUFyciA9IGl0ZW1BcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnJbcGF0aEluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKHBhdGg6IHN0cmluZywgc2VsZWN0aW9uUmVjdXJzaXZlU3RhdGU6IFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IGl0ZW1BcnIgPSB0aGlzLnJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZTtcbiAgICAgICAgaW5kZXhBcnIuZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaXRlbUFyciA9IGl0ZW1BcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnJbcGF0aEluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbUFycltwYXRoSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldElzQ2hlY2tlZEZvckFsbChub2RlQXJyOiBBcnJheTxUcmVlSXRlbVJ1blRpbWVNb2RlbD4sIGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBub2RlQXJyLmZvckVhY2goKHJ1blRpbWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVudGltZUJhY2t1cFRyZWVJdGVtID0gdGhpcy5nZXRSdW5UaW1lQmFja3VwVHJlZUl0ZW0ocnVuVGltZUl0ZW0ucGF0aCk7XG4gICAgICAgICAgICBjb25zdCB0cmVlSXRlbSA9IHRoaXMuZ2V0VHJlZUl0ZW0ocnVuVGltZUl0ZW0ucGF0aCk7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdHJlZUl0ZW0ubm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5pc1NlbGVjdGVkID0gaXNDaGVja2VkO1xuICAgICAgICAgICAgICAgIG5vZGUuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRyZWVJdGVtKHJ1bnRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHJ1bnRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1blRpbWVJdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXNDaGVja2VkRm9yQWxsKG5vZGVBcnJbaW5kZXhdLmNoaWxkcmVuLCBpc0NoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blN0YXRlQ2hhbmdlc0ZvckFsbChub2RlQXJyOiBBcnJheTxUcmVlSXRlbVJ1blRpbWVNb2RlbD4pOiB2b2lkIHtcbiAgICAgICAgbm9kZUFycj8uZm9yRWFjaCgocnVuVGltZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuU3RhdGVDaGFuZ2VzRm9yQWxsKG5vZGVBcnJbaW5kZXhdLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNTZWxlY3Rpb25BdFBhdGgocnVuVGltZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNTZWxlY3Rpb25BdFBhdGgocnVuVGltZVRyZWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCk6IHZvaWQge1xuICAgICAgICAvLyBJdCBpcyBoZXJlIGZvciB0aGUgZmlsdGVyIGVkZ2UgY2FzZS5cbiAgICAgICAgdGhpcy5zeW5jU3RhdGVDaGFuZ2VzQXRQYXRoKHJ1blRpbWVUcmVlSXRlbS5wYXRoKTtcbiAgICAgICAgLy8gU2V0cyBpc1NlbGVjdGVkIGNoYW5nZSBvbiB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHRoaXMuZ2V0VHJlZUl0ZW0ocnVuVGltZVRyZWVJdGVtLnBhdGgpLm5vZGUuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RUcmVlSXRlbSh0aGlzLmdldFJ1blRpbWVCYWNrdXBUcmVlSXRlbShydW5UaW1lVHJlZUl0ZW0ucGF0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHJ1blRpbWVUcmVlSXRlbS5wYXRoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVQYXRoKHBhdGg6IHN0cmluZyk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gcGF0aD8uc3BsaXQoJy4nKS5tYXAoKGluZGV4OiBzdHJpbmcpID0+IHBhcnNlSW50KGluZGV4LCAxMCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50UGF0aHMocGF0aDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBhdGhBcnIgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGhhc1BhcmVudCA9IHBhdGhBcnIubGVuZ3RoID4gMTtcbiAgICAgICAgLy8gU2V0cyB0aGUgaGFzUGFyZW50IElmIHRoZXJlIGlzIGEgcGFyZW50LCBhbmQgcmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZvcm0gcGF0aEFyci5cbiAgICAgICAgaWYgKGhhc1BhcmVudCkge1xuICAgICAgICAgICAgcGF0aEFyci5wb3AoKTtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgcGFyZW50IHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoQXJyLmpvaW4oJy4nKTtcbiAgICAgICAgICAgIC8vIENyZWF0aW5nIG5vZGUgaW5kZXggc2VxdWVuY2UgZi5lIElmIHBhdGggaXMgJzEuMicgaXQgd2lsbCBiZSBbMSwyXVxuICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4U2VxID0gcGFyZW50UGF0aC5zcGxpdCgnLicpLm1hcCgoaW5kZXhTdHIpID0+IHBhcnNlSW50KGluZGV4U3RyLCAxMCkpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRpbmcgdGhlIG5vZGUgcGF0aHMgYXJyYXkgdG8gYmUgcmUtY2FsY3VsYXRlZCBmcm9tIGJvdHRvbSB0byB0b3BcbiAgICAgICAgICAgIGNvbnN0IG5vZGVQYXRoc1NlcSA9IFtdO1xuICAgICAgICAgICAgbm9kZUluZGV4U2VxLmZvckVhY2goKG5vZGVJbmRleCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBub2RlUGF0aHNTZXFbaW5kZXhdID0gbm9kZUluZGV4U2VxLnNsaWNlKDAsIGluZGV4ICsgMSkuam9pbignLicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZVBhdGhzU2VxLnJldmVyc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlUnVuVGltZVN0YXRlKHRyZWVJdGVtOiBUcmVlSXRlbU1vZGVsLCBpbmRleDogbnVtYmVyLCBwYXJlbnRQYXRoPzogc3RyaW5nKTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwge1xuICAgICAgICBjb25zdCBydW5UaW1lVHJlZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsID0ge1xuICAgICAgICAgICAgcGF0aDogcGFyZW50UGF0aCA/IHBhcmVudFBhdGggKyAnLicgKyBpbmRleCA6IGluZGV4LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRyZWVJdGVtLmNoaWxkcmVuICYmIHRyZWVJdGVtLmNoaWxkcmVuLmxlbmd0aCA+PSAwKSB7XG4gICAgICAgICAgICBydW5UaW1lVHJlZUl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIHRyZWVJdGVtLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCB0cmVlSXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcnVuVGltZVRyZWVJdGVtLmNoaWxkcmVuW3RyZWVJdGVtSW5kZXhdID0gdGhpcy5jYWxjdWxhdGVSdW5UaW1lU3RhdGUoY2hpbGQsIHRyZWVJdGVtSW5kZXgsIHJ1blRpbWVUcmVlSXRlbS5wYXRoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydW5UaW1lVHJlZUl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJUcmVlRGF0YShydW5UaW1lVHJlZURhdGE6IFRyZWVEYXRhUnVuVGltZU1vZGVsLCBrZXkgPSAnbGFiZWwnLCBmaWx0ZXJTdHI6IHN0cmluZywgc2hvd0NoaWxkcmVuOiBib29sZWFuLCBzaG93Pzpib29sZWFuKTogVHJlZURhdGFSdW5UaW1lTW9kZWwge1xuICAgICAgICByZXR1cm4gcnVuVGltZVRyZWVEYXRhLmZpbHRlcigocnVuVGltZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldERhdGEgPSB0aGlzLmdldFRyZWVJdGVtKHJ1blRpbWVJdGVtLnBhdGgpLm5vZGUudHJlZUNvbnRlbnRCbG9ja1trZXldO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRhcmdldERhdGEgJiYgdGhpcy5ub3JtYWxpemVkU3RyKHRhcmdldERhdGEpPy5pbmNsdWRlcyh0aGlzLm5vcm1hbGl6ZWRTdHIoZmlsdGVyU3RyKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmKHJ1blRpbWVJdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIHJ1blRpbWVJdGVtLmNoaWxkcmVuID0gdGhpcy5maWx0ZXJUcmVlRGF0YShydW5UaW1lSXRlbS5jaGlsZHJlbiwga2V5LCBmaWx0ZXJTdHIsIHNob3dDaGlsZHJlbiwgc2hvd0NoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihydW5UaW1lSXRlbSx7IG1hdGNoZWQ6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAvLyBydW5UaW1lSXRlbS5tYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcnVuVGltZUl0ZW0uY2hpbGRyZW4gPSB0aGlzLmZpbHRlclRyZWVEYXRhKHJ1blRpbWVJdGVtLmNoaWxkcmVuLCBrZXksIGZpbHRlclN0ciwgc2hvd0NoaWxkcmVuLCBzaG93KTtcbiAgICAgICAgICAgICAgICBydW5UaW1lSXRlbS5jaGlsZHJlbiA9IHJ1blRpbWVJdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDAgPyBydW5UaW1lSXRlbS5jaGlsZHJlbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwIHx8IHNob3c7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzaG93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZWRTdHIoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbml0aWFsU2VsZWN0aW9uKG5vZGVzOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCk6IEFycmF5PFRyZWVJdGVtUnVuVGltZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbjogQXJyYXk8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+ID0gW107XG4gICAgICAgIHRoaXMuc2NhblNlbGVjdGlvbihub2Rlcywgc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjYW5TZWxlY3Rpb24obm9kZXM6IFRyZWVEYXRhUnVuVGltZU1vZGVsLCBzZWxlY3Rpb246IEFycmF5PFRyZWVJdGVtUnVuVGltZU1vZGVsPik6IHZvaWQge1xuICAgICAgICBub2Rlcz8uZm9yRWFjaCgoaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFRyZWVJdGVtKGl0ZW0ucGF0aCkubm9kZT8uc2VsZWN0YWJsZSAmJiB0aGlzLmdldFRyZWVJdGVtKGl0ZW0ucGF0aCkubm9kZS5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5TZWxlY3Rpb24oaXRlbS5jaGlsZHJlbiwgc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJJbml0aWFsRXhwYW5kKG5vZGVzOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCk6IHZvaWQge1xuICAgICAgICBub2Rlcz8uZm9yRWFjaCgoaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySW5pdGlhbEV4cGFuZChpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5nZXRUcmVlSXRlbShpdGVtLnBhdGgpLm5vZGUuaXNFeHBhbmRlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmdldFRyZWVJdGVtKGl0ZW0ucGF0aCkubm9kZS5pc0V4cGFuZGVkICYmICF0aGlzLmNka1RyZWVDb250cm9sLmlzRXhwYW5kZWQoaXRlbSkpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEF0KGl0ZW0ucGF0aCk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuZ2V0VHJlZUl0ZW0oaXRlbS5wYXRoKS5ub2RlLmlzRXhwYW5kZWQgJiYgIHRoaXMuY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZChpdGVtKSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuY29sbGFwc2UoaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGFuZE1hdGNoZWQobm9kZXM6IFRyZWVEYXRhUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIG5vZGVzLmZvckVhY2goKGl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5tYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRoaXMuZ2V0UGFyZW50UGF0aHMoaXRlbS5wYXRoKVswXTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50VHJlZUl0ZW0gPSB0aGlzLmdldFRyZWVJdGVtKHBhcmVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRUcmVlSXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBhcmVudFRyZWVJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBhcmVudFRyZWVJdGVtLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIC8vICBub2RlLmlzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhlcmVcIiwgcGFyZW50VHJlZUl0ZW0ubm9kZS50cmVlQ29udGVudEJsb2NrLmxhYmVsLCBwYXJlbnRQYXRoLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRBdChwYXJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZE1hdGNoZWQoaXRlbS5jaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGg6IHN0cmluZyk6IFRyZWVJdGVtUnVuVGltZU1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJ1blRpbWVUcmVlSXRlbSh0aGlzLnRyZWVEYXRhUnVuVGltZSwgcGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kUnVuVGltZVRyZWVJdGVtKHRyZWVEYXRhUnVuVGltZTogVHJlZURhdGFSdW5UaW1lTW9kZWwsIHBhdGgpOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCB7XG4gICAgICAgIGZvciAoY29uc3QgcnVuVGltZUl0ZW0gb2YgdHJlZURhdGFSdW5UaW1lKSB7XG4gICAgICAgICAgICBpZiAocnVuVGltZUl0ZW0ucGF0aCA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydW5UaW1lSXRlbTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRSdW5UaW1lVHJlZUl0ZW0ocnVuVGltZUl0ZW0uY2hpbGRyZW4sIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHBhdGg6IHN0cmluZyk6IFRyZWVJdGVtUnVuVGltZU1vZGVsIHtcbiAgICAgICAgY29uc3QgaW5kZXhBcnI6IEFycmF5PG51bWJlcj4gPSB0aGlzLnJlc29sdmVQYXRoKHBhdGgpO1xuICAgICAgICBsZXQgbm9kZUFyciA9IHRoaXMudHJlZURhdGFSdW5UaW1lQmFja3VwO1xuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgaWYgKG5vZGVBcnIgJiYgQXJyYXkuaXNBcnJheShub2RlQXJyKSkge1xuICAgICAgICAgICAgaW5kZXhBcnI/LmZvckVhY2goKHBhdGhJbmRleDogbnVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGluZGV4QXJyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUFyciA9IG5vZGVBcnIgJiYgbm9kZUFycltwYXRoSW5kZXhdPy5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZUFycltwYXRoSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3NzQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2V1aS10cmVlJyxcbiAgICAgICAgICAgIHRoaXMuaXNNdWx0aXNlbGVjdCA/ICdldWktdHJlZS0tbXVsdGlzZWxlY3QnIDogJycsXG4gICAgICAgICAgICB0aGlzLl9pc011bHRpTGV2ZWwgPyAnZXVpLXRyZWUtLXdpdGgtY2hpbGRyZW4nIDogJycsXG4gICAgICAgICAgICB0aGlzLnNob3dMaW5lcyA/ICdldWktdHJlZS0tc2hvdy1saW5lcycgOiAnJyxcbiAgICAgICAgXVxuICAgICAgICAuam9pbignICcpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0lmTXVsdGlMZXZlbCh0cmVlOiBUcmVlRGF0YU1vZGVsKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc011bHRpTGV2ZWwgPSBmYWxzZTtcbiAgICAgICAgdHJlZS5mb3JFYWNoKChpdGVtOiBUcmVlSXRlbU1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaXNNdWx0aUxldmVsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpc011bHRpTGV2ZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0lmQ3VycmVudFNjcm9sbGFibGUoc2Nyb2xsZWQ6IENka1Njcm9sbGFibGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbGVkLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50ID09PSB0aGlzLmNka1Njcm9sbGFibGVSZWYuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxufVxuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSb3V0ZXJNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIEV1aUlucHV0Q2hlY2tib3hNb2R1bGUsXG4gICAgICAgIENka1RyZWVNb2R1bGUsXG4gICAgICAgIEV1aUJ1dHRvbk1vZHVsZSxcbiAgICAgICAgRXVpSWNvbk1vZHVsZSxcbiAgICAgICAgRXVpTGFiZWxNb2R1bGUsXG4gICAgICAgIEV1aUJhZGdlTW9kdWxlLFxuICAgICAgICBFdWlDaGlwTW9kdWxlLFxuICAgICAgICBFdWlEcm9wZG93bk1vZHVsZSxcbiAgICAgICAgU2Nyb2xsaW5nTW9kdWxlLFxuICAgIF0sXG4gICAgZGVjbGFyYXRpb25zOiBbRXVpVHJlZUNvbXBvbmVudF0sXG4gICAgZXhwb3J0czogW0V1aVRyZWVDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBFdWlUcmVlTW9kdWxlIHt9XG4iLCI8ZGl2IGNsYXNzPVwiZXVpLXVsLXJlcCBldWktdHJlZV9fd3JhcHBlclwiIGNka1Njcm9sbGFibGUgI2Nka1Njcm9sbGFibGVSZWY+XG4gICAgPGNkay10cmVlXG4gICAgICAgICN0cmVlQ29tcG9uZW50SW5zdGFuY2VcbiAgICAgICAgW2RhdGFTb3VyY2VdPVwiY2RrQXJyYXlEYXRhU291cmNlXCJcbiAgICAgICAgW3RyZWVDb250cm9sXT1cImNka1RyZWVDb250cm9sXCJcbiAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXG4gICAgICAgICpuZ0lmPVwicmVuZGVyVHJlZVwiXG4gICAgICAgIGNsYXNzPVwiZXVpLWNkay10cmVlXCI+XG4gICAgICAgIDwhLS0gVGhlcmUgYXJlIHR3byBzdGF0ZXMgb2YgZ2VuZXJpYyBjZGstbmVzdGVkLXRyZWUtbm9kZSBkZWNsYXJhdGlvbnMuXG4gICAgICAgIEZpcnN0IG9uZSBpcyB3aXRob3V0IGNoaWxkLiBObyBzdWIgcmVuZGVyaW5nLlxuICAgICAgICAtLT5cbiAgICAgICAgPGNkay1uZXN0ZWQtdHJlZS1ub2RlICpjZGtUcmVlTm9kZURlZj1cImxldCB0cmVlUnVuVGltZUl0ZW1Nb2RlbFwiIGNsYXNzPVwiZXVpLWNkay1uZXN0ZWQtdHJlZS1ub2RlXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHJlZVJ1blRpbWVJdGVtTW9kZWxcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZXVpLWxpLXJlcCBldWktdHJlZS1ub2RlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZXVpLXRyZWUtbm9kZS0tZmlyc3RdPVwidHJlZVJ1blRpbWVJdGVtTW9kZWw/LnBhdGggPT09ICcwJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmV1aS10cmVlLW5vZGUtLWxhc3RdPVwidHJlZVJ1blRpbWVJdGVtTW9kZWwubGFzdFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7e1xuICAgICAgICAgICAgICAgICAgICBnZXRUcmVlSXRlbSh0cmVlUnVuVGltZUl0ZW1Nb2RlbD8ucGF0aCk/Lm5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnRvb2x0aXBMYWJlbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJlZUl0ZW0odHJlZVJ1blRpbWVJdGVtTW9kZWw/LnBhdGgpPy5ub2RlPy50cmVlQ29udGVudEJsb2NrPy5sYWJlbFxuICAgICAgICAgICAgICAgIH19XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV1aS10cmVlLW5vZGUtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ob2RlQ2xpY2sodHJlZVJ1blRpbWVJdGVtTW9kZWwsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV1aS10cmVlLW5vZGUtd3JhcHBlcl9fY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJzIG5vZGUgaW4gZGVmYXVsdCBvciBwcm92aWRlZCB0ZW1wbGF0ZSdzIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZXMgb25TZWxlY3Qgd2l0aCBvblNlbGVjdEZuIGZvciBkZXZlbG9wZXJzIHRvIHNlbmQgdGhlIGV2ZW50cyBmcm9tIHRoZWlyIGN1c3RvbSBjaGVjayBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlcyBpZCB0byBiZSB1c2VkIG9uIGdlbmVyaWMgdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZVJlZiB8fCBub2RlVGVtcGxhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoKT8ubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0Rm4odHJlZVJ1blRpbWVJdGVtTW9kZWwucGF0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB1aWQgKyB0cmVlUnVuVGltZUl0ZW1Nb2RlbC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiB0cmVlUnVuVGltZUl0ZW1Nb2RlbC5wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvY2RrLW5lc3RlZC10cmVlLW5vZGU+XG4gICAgICAgIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBleHBhbmRhYmxlIG5vZGVzIC0tPlxuICAgICAgICA8Y2RrLW5lc3RlZC10cmVlLW5vZGVcbiAgICAgICAgICAgICpjZGtUcmVlTm9kZURlZj1cImxldCB0cmVlUnVuVGltZUl0ZW1Nb2RlbDsgd2hlbjogaGFzQ2hpbGRcIlxuICAgICAgICAgICAgY2xhc3M9XCJldWktY2RrLW5lc3RlZC10cmVlLW5vZGUgZXVpLWNkay1uZXN0ZWQtdHJlZS1ub2RlLS13aXRoLWNoaWxkXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJldWktbGktcmVwIGV1aS10cmVlLW5vZGUgZXVpLXRyZWUtbm9kZS0td2l0aC1jaGlsZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmV1aS10cmVlLW5vZGUtLWZpcnN0XT1cInRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoID09PSAnMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ldWktdHJlZS1ub2RlLS1sYXN0XT1cInRyZWVSdW5UaW1lSXRlbU1vZGVsLmxhc3RcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwidHJlZVJ1blRpbWVJdGVtTW9kZWxcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3tcbiAgICAgICAgICAgICAgICAgICAgZ2V0VHJlZUl0ZW0odHJlZVJ1blRpbWVJdGVtTW9kZWw/LnBhdGgpPy5ub2RlPy50cmVlQ29udGVudEJsb2NrPy50b29sdGlwTGFiZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoKT8ubm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWxcbiAgICAgICAgICAgICAgICB9fVwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJldWktdHJlZS1ub2RlLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLUhlcmUgd3JhcHMgdGhlIG5vZGUsIGFuZCBsaXN0ZW4gZm9yIG5vZGUgY2xpY2tzLi0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvbk5vZGVDbGljayh0cmVlUnVuVGltZUl0ZW1Nb2RlbCwgJGV2ZW50KVwiIGNsYXNzPVwiZXVpLXRyZWUtbm9kZS13cmFwcGVyX19jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXhwYW5kL2NvbGxhcHNlIGFjdGlvbiBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1aUJhc2ljQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVpUm91bmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1aVNpemVTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVG9nZ2xlICcgKyBnZXRUcmVlSXRlbSh0cmVlUnVuVGltZUl0ZW1Nb2RlbD8ucGF0aCk/Lm5vZGU/LnRyZWVDb250ZW50QmxvY2s/LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ob2RlVG9nZ2xlKHRyZWVSdW5UaW1lSXRlbU1vZGVsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrVHJlZU5vZGVUb2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV1aS10cmVlLW5vZGVfX2J1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxldWktaWNvbi1zdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlUnVuVGltZUl0ZW1Nb2RlbCkgJiYgIWNvbGxhcHNlZEljb25DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImV4cGFuZGVkU3ZnSWNvbkNsYXNzXCI+PC9ldWktaWNvbi1zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV1aS1pY29uLXN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNka1RyZWVDb250cm9sLmlzRXhwYW5kZWQodHJlZVJ1blRpbWVJdGVtTW9kZWwpICYmICFleHBhbmRlZEljb25DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImNvbGxhcHNlZFN2Z0ljb25DbGFzc1wiPjwvZXVpLWljb24tc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJzIG5vZGUgaW4gZGVmYXVsdCBvciBwcm92aWRlZCB0ZW1wbGF0ZSdzIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZXMgb25TZWxlY3Qgd2l0aCBvblNlbGVjdEZuIGZvciBkZXZlbG9wZXJzIHRvIHNlbmQgdGhlIGV2ZW50cyBmcm9tIHRoZWlyIGN1c3RvbSBjaGVjayBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlcyBpZCB0byBiZSB1c2VkIG9uIGdlbmVyaWMgdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZVJlZiB8fCBub2RlVGVtcGxhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbU1vZGVsLnBhdGgpPy5ub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdDogb25TZWxlY3RGbih0cmVlUnVuVGltZUl0ZW1Nb2RlbC5wYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHVpZCArIHRyZWVSdW5UaW1lSXRlbU1vZGVsLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHRyZWVSdW5UaW1lSXRlbU1vZGVsLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBnZXRUcmVlSXRlbSh0cmVlUnVuVGltZUl0ZW1Nb2RlbD8ucGF0aCk/LmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS11c2VzIGNka1RyZWVOb2RlT3V0bGV0IHRvIHJlbmRlciBjaGlsZHJlbiBub2RlcywgQ2RrVHJlZUNvbnRyb2wgaXMgdXNlZCB0byBjb250cm9sIGlzRXhwYW5kZWQgc3RhdGUuLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV1aS11bC1yZXAgZXVpLXRyZWUtbm9kZVwiIHJvbGU9XCJncm91cFwiICpuZ0lmPVwiY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlUnVuVGltZUl0ZW1Nb2RlbClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBjZGtUcmVlTm9kZU91dGxldD48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Nkay1uZXN0ZWQtdHJlZS1ub2RlPlxuICAgIDwvY2RrLXRyZWU+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNub2RlVGVtcGxhdGVEZWZhdWx0IGxldC1ub2RlIGxldC1vblNlbGVjdD1cIm9uU2VsZWN0XCIgbGV0LWlkPVwiaWRcIiBsZXQtcGF0aD1cInBhdGhcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXVpLXRyZWUtbm9kZS13cmFwcGVyX19jb250YWluZXItbGVmdFwiIFtjbGFzcy5ldWktdHJlZS1ub2RlLXdyYXBwZXJfX2NvbnRhaW5lci1sZWZ0LS1zZWxlY3RlZF09XCJub2RlPy5pc1NlbGVjdGVkXCI+XG4gICAgICAgICAgICA8IS0taW5wdXQgY2hlY2tib3ggYXJlYS0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgZXVpSW5wdXRDaGVja0JveFxuICAgICAgICAgICAgICAgICpuZ0lmPVwibm9kZSAmJiBub2RlLnNlbGVjdGFibGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgaWQ9XCJ7eyBpZCB9fVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFub2RlPy5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCIhIW5vZGU/LmlzSW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdCgkZXZlbnQpXCIgLz5cblxuICAgICAgICAgICAgPCEtLWljb24gYXJlYS0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGU/LnRyZWVDb250ZW50QmxvY2s/Lmljb25TdmdOYW1lXCI+XG4gICAgICAgICAgICAgICAgPGV1aS1pY29uLXN2Z1xuICAgICAgICAgICAgICAgICAgICBpY29uPVwie3sgbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8uaWNvblN2Z05hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I9XCJ7eyBub2RlPy50cmVlQ29udGVudEJsb2NrPy5pY29uVHlwZUNsYXNzIHx8ICduZXV0cmFsJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJldWktdS1tci14c1wiPlxuICAgICAgICAgICAgICAgIDwvZXVpLWljb24tc3ZnPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS1jaGlwcyBhcmVhLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8uY2hpcHNcIj5cbiAgICAgICAgICAgICAgICA8ZXVpLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaXAgb2Ygbm9kZS50cmVlQ29udGVudEJsb2NrLmNoaXBzXCJcbiAgICAgICAgICAgICAgICAgICAgZXVpU2l6ZVNcbiAgICAgICAgICAgICAgICAgICAgW2V1aVZhcmlhbnRdPVwiY2hpcC50eXBlQ2xhc3MgfHwgJ3NlY29uZGFyeSdcIlxuICAgICAgICAgICAgICAgICAgICBbZXVpT3V0bGluZV09XCJjaGlwLmlzT3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXVpLWNoaXAtLXJvdW5kZWQgZXVpLXUtbXIteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZXVpTGFiZWw+e3sgY2hpcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2V1aS1jaGlwPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS1iYWRnZSAodHlwZUxhYmVsICYgdHlwZUNsYXNzKSBhcmVhLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udHlwZUxhYmVsXCIgW25nU3dpdGNoXT1cIm5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnR5cGVDbGFzc1wiPlxuICAgICAgICAgICAgICAgIDxldWktYmFkZ2UgZXVpU2l6ZU0gW2V1aVZhcmlhbnRdPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udHlwZUNsYXNzIHx8ICdwcmltYXJ5J1wiIGNsYXNzPVwiZXVpLXUtZmxleC1uby1zaHJpbmsgZXVpLXUtbXIteHNcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udHlwZUxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9ldWktYmFkZ2U+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLWxhYmVsIGFyZWEtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImV1aS10cmVlLW5vZGUtd3JhcHBlcl9fY29udGFpbmVyLW1pZGRsZVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udXJsICYmICFub2RlPy50cmVlQ29udGVudEJsb2NrPy51cmxFeHRlcm5hbFwiXG4gICAgICAgICAgICAgICAgZXVpTGFiZWxcbiAgICAgICAgICAgICAgICBmb3I9XCJ7eyBpZCB9fVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJldWktdS10ZXh0LXRydW5jYXRlIGV1aS11LXAtMnhzXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZXVpLWxhYmVsLS1zZWxlY3RlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRSdW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUocGF0aCk/LnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID09PSAnaW5kZXRlcm1pbmF0ZScgfHwgbm9kZT8uaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBub2RlPy5pc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZXVpLXUtY3Vyc29yLXBvaW50ZXJdPVwibm9kZT8uc2VsZWN0YWJsZVwiPlxuICAgICAgICAgICAgICAgIHt7IGF1dG9UcmFuc2xhdGUgPyAobm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWwgfCB0cmFuc2xhdGUpIDogbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWwgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJub2RlPy50cmVlQ29udGVudEJsb2NrPy51cmxcIiBldWlMYWJlbCBmb3I9XCJ7eyBpZCB9fVwiIGNsYXNzPVwiZXVpLXUtdGV4dC10cnVuY2F0ZSBldWktdS1wLTJ4c1wiPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXVpLXUtdGV4dC1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmV1aS11LXRleHQtbGluay1zdGFuZGFsb25lXT1cIiFzaG93VW5kZXJsaW5lZExpbmtzXCJcbiAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udXJsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGF1dG9UcmFuc2xhdGUgPyAobm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWwgfCB0cmFuc2xhdGUpIDogbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udXJsRXh0ZXJuYWxcIiBldWlMYWJlbCBmb3I9XCJ7eyBpZCB9fVwiIGNsYXNzPVwiZXVpLXUtdGV4dC10cnVuY2F0ZSBldWktdS1wLTJ4c1wiPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXVpLXUtdGV4dC1saW5rLWV4dGVybmFsXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmV1aS11LXRleHQtbGluay1leHRlcm5hbC1zdGFuZGFsb25lXT1cIiFzaG93VW5kZXJsaW5lZExpbmtzXCJcbiAgICAgICAgICAgICAgICAgICAgaHJlZj1cInt7IG5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnVybEV4dGVybmFsIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwie3sgbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udXJsRXh0ZXJuYWxUYXJnZXQgfHwgJ2JsYW5rJyB9fVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBhdXRvVHJhbnNsYXRlID8gKG5vZGU/LnRyZWVDb250ZW50QmxvY2s/LmxhYmVsIHwgdHJhbnNsYXRlKSA6IG5vZGU/LnRyZWVDb250ZW50QmxvY2s/LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnJpZ2h0Q29udGVudFwiIGNsYXNzPVwiZXVpLXRyZWUtbm9kZS13cmFwcGVyX19jb250YWluZXItcmlnaHRcIj5cbiAgICAgICAgICAgIDwhLS1iYWRnZXMgYXJlYS0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmFkZ2Ugb2Ygbm9kZS50cmVlQ29udGVudEJsb2NrLnJpZ2h0Q29udGVudD8uYmFkZ2VzXCI+XG4gICAgICAgICAgICAgICAgPGV1aS1iYWRnZSBldWlPdXRsaW5lIFtldWlWYXJpYW50XT1cImJhZGdlLnR5cGVDbGFzcyB8fCAnc2Vjb25kYXJ5J1wiIGNsYXNzPVwiZXVpLXUtbWwteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZXVpTGFiZWw+e3sgYmFkZ2UubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9ldWktYmFkZ2U+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLWNoaXBzIGFyZWEtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoaXAgb2Ygbm9kZS50cmVlQ29udGVudEJsb2NrLnJpZ2h0Q29udGVudD8uY2hpcHNcIj5cbiAgICAgICAgICAgICAgICA8ZXVpLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgZXVpU2l6ZVNcbiAgICAgICAgICAgICAgICAgICAgW2V1aVZhcmlhbnRdPVwiY2hpcC50eXBlQ2xhc3MgfHwgJ3NlY29uZGFyeSdcIlxuICAgICAgICAgICAgICAgICAgICBbZXVpT3V0bGluZV09XCJjaGlwLmlzT3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXVpLWNoaXAtLXJvdW5kZWQgZXVpLXUtbWItbm9uZSBldWktdS1tbC14c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBldWlMYWJlbD57eyBjaGlwLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZXVpLWNoaXA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLUNvbnRleHQgbWVudS0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGUudHJlZUNvbnRlbnRCbG9jay5yaWdodENvbnRlbnQ/LmNvbnRleHRNZW51TWV0YURhdGEgJiYgcmlnaHRDb250ZXh0TWVudVRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgICAgICAgPGV1aS1kcm9wZG93biBjbGFzcz1cImV1aS11LW1sLXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gZXVpQnV0dG9uIGV1aVNpemVTIGV1aVJvdW5kZWQgZXVpSWNvbkJ1dHRvbiBldWlCYXNpY0J1dHRvbiBldWlTZWNvbmRhcnkgW2F0dHIuYXJpYS1sYWJlbF09XCInT3B0aW9ucyBtZW51J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGV1aS1pY29uLXN2ZyBpY29uPVwiZWxsaXBzaXMtdmVydGljYWw6c2hhcnBcIj48L2V1aS1pY29uLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxldWktZHJvcGRvd24tY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJpZ2h0Q29udGV4dE1lbnVUZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBub2RlPy50cmVlQ29udGVudEJsb2NrPy5yaWdodENvbnRlbnQ/LmNvbnRleHRNZW51TWV0YURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBub2RlPy50cmVlQ29udGVudEJsb2NrPy5yaWdodENvbnRlbnQ/LmNvbnRleHRNZW51TWV0YURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2V1aS1kcm9wZG93bi1jb250ZW50PlxuICAgICAgICAgICAgICAgIDwvZXVpLWRyb3Bkb3duPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS1tZXRhZGF0YSwgdXNlcyB0aGUgaGVscCBvZiBuZyB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSBkeW5hbWljIGV4cGFuZCB2YXJpYWJsZSB3aXRob3V0IGhhbmRsaW5nIHN0YXRlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIm5vZGUudHJlZUNvbnRlbnRCbG9jaz8ubWV0YWRhdGEgJiYgbm9kZUNvbnRlbnRNZXRhZGF0YVRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVDb250ZW50TWV0YWRhdGFDb250YWluZXJcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHsgZXhwYW5kZWQ6IGZhbHNlIH1cbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9kZUNvbnRlbnRNZXRhZGF0YUNvbnRhaW5lciBsZXQtbWV0YURhdGFDb250YWluZXI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgZXVpQnV0dG9uXG4gICAgICAgICAgICAgICAgZXVpQmFzaWNCdXR0b25cbiAgICAgICAgICAgICAgICBldWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgZXVpUm91bmRlZFxuICAgICAgICAgICAgICAgIGV1aVNpemVTXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cImV4cGFuZCBjb2xsYXBzZSB0cmVlIGl0ZW1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtZXRhRGF0YUNvbnRhaW5lci5leHBhbmRlZCA9ICFtZXRhRGF0YUNvbnRhaW5lci5leHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgIDxldWktaWNvbi1zdmcgW2ljb25dPVwibWV0YURhdGFDb250YWluZXIuZXhwYW5kZWQgPyAnY2hldnJvbi1kb3duOnNoYXJwJyA6ICdjaGV2cm9uLWZvcndhcmQ6c2hhcnAnXCI+PC9ldWktaWNvbi1zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtZXRhRGF0YUNvbnRhaW5lci5leHBhbmRlZFwiIGNsYXNzPVwiZXVpLXRyZWUtbm9kZV9fbWV0YWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8IS0tcGFzc2luZyBtZXRhZGF0YSBvZiB0aGUgbm9kZSBjb250ZW50IHRvIHByb3ZpZGVkIHRlbXBsYXRlLXJlZjpub2RlQ29udGVudE1ldGFkYXRhVGVtcGxhdGVSZWYtLT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZUNvbnRlbnRNZXRhZGF0YVRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
975
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpLXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZXVpLXRyZWUvZXVpLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZXVpLXRyZWUvZXVpLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixZQUFZLEVBQ1osTUFBTSxFQUNOLGlCQUFpQixFQU1qQixXQUFXLEVBRVgsZ0JBQWdCLEVBQ2hCLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFRSCxpQkFBaUIsRUFFakIsd0JBQXdCLEdBQzNCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBVyxNQUFNLG1CQUFtQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxF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QVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFNUIsZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07O0FBcTVCWCxNQUFNLE9BQU8sYUFBYTsrR0FBYixhQUFhO2dIQUFiLGFBQWEsaUJBNTdCYixnQkFBZ0IsYUEyNkJyQixZQUFZO1lBQ1osWUFBWTtZQUNaLFdBQVc7WUFDWCxlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLGFBQWE7WUFDYixlQUFlO1lBQ2YsYUFBYTtZQUNiLGNBQWM7WUFDZCxjQUFjO1lBQ2QsYUFBYTtZQUNiLGlCQUFpQjtZQUNqQixlQUFlLGFBdjdCVixnQkFBZ0I7Z0hBNDdCaEIsYUFBYSxZQWpCbEIsWUFBWTtZQUNaLFlBQVk7WUFDWixXQUFXO1lBQ1gsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixhQUFhO1lBQ2IsZUFBZTtZQUNmLGFBQWE7WUFDYixjQUFjO1lBQ2QsY0FBYztZQUNkLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsZUFBZTs7NEZBS1YsYUFBYTtrQkFuQnpCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFO3dCQUNMLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2Ysc0JBQXNCO3dCQUN0QixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixpQkFBaUI7d0JBQ2pCLGVBQWU7cUJBQ2xCO29CQUNELFlBQVksRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUNoQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBIb3N0QmluZGluZyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICAgIFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlLFxuICAgIFRyZWVEYXRhTW9kZWwsXG4gICAgVHJlZUl0ZW1Nb2RlbCxcbiAgICBUcmVlRGF0YVJ1blRpbWVNb2RlbCxcbiAgICBUcmVlSXRlbVJ1blRpbWVNb2RlbCxcbiAgICBUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsLFxuICAgIEV1aVRyZWVTZWxlY3Rpb25DaGFuZ2VzLFxuICAgIEV1aVRyZWVQYWdpbmF0aW9uLFxuICAgIEN1c3RvbU5vZGVTZWxlY3RGbixcbiAgICBDdXN0b21Ob2RlU2VsZWN0Rm5IZWxwZXIsXG59IGZyb20gJy4vZXVpLXRyZWUubW9kZWwnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFdWlJbnB1dENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGV1aS9jb21wb25lbnRzL2V1aS1pbnB1dC1jaGVja2JveCc7XG5pbXBvcnQgeyBFdWlCdXR0b25Nb2R1bGUgfSBmcm9tICdAZXVpL2NvbXBvbmVudHMvZXVpLWJ1dHRvbic7XG5pbXBvcnQgeyBFdWlJY29uTW9kdWxlIH0gZnJvbSAnQGV1aS9jb21wb25lbnRzL2V1aS1pY29uJztcbmltcG9ydCB7IEV1aUxhYmVsTW9kdWxlIH0gZnJvbSAnQGV1aS9jb21wb25lbnRzL2V1aS1sYWJlbCc7XG5pbXBvcnQgeyBFdWlCYWRnZU1vZHVsZSB9IGZyb20gJ0BldWkvY29tcG9uZW50cy9ldWktYmFkZ2UnO1xuaW1wb3J0IHsgRXVpQ2hpcE1vZHVsZSB9IGZyb20gJ0BldWkvY29tcG9uZW50cy9ldWktY2hpcCc7XG5pbXBvcnQgeyBFdWlEcm9wZG93bk1vZHVsZSB9IGZyb20gJ0BldWkvY29tcG9uZW50cy9ldWktZHJvcGRvd24nO1xuaW1wb3J0IHsgTmVzdGVkVHJlZUNvbnRyb2wsIENka1RyZWVNb2R1bGUsIENka1RyZWUgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBBcnJheURhdGFTb3VyY2UsIFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlLCBTY3JvbGxEaXNwYXRjaGVyLCBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdldWktdHJlZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2V1aS10cmVlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zdHlsZXMvX2luZGV4LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBFdWlUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gICAgcHVibGljIGdldCBjc3NDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENzc0NsYXNzZXMoKTtcbiAgICB9XG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZTJlJykgQElucHV0KCkgZTJlQXR0ciA9ICdldWktdHJlZSc7XG4gICAgQElucHV0KCkgbm9kZXM6IFRyZWVEYXRhTW9kZWw7XG4gICAgLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgQElucHV0KCkgbm9kZVRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIEBJbnB1dCgpIG5vZGVDb250ZW50TWV0YWRhdGFUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBASW5wdXQoKSByaWdodENvbnRleHRNZW51VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgY3VzdG9tTm9kZVNlbGVjdEZuOiBDdXN0b21Ob2RlU2VsZWN0Rm47XG4gICAgLyoqIEBkZXByZWNhdGVkIFRoaXMgd2lsbCBiZSByZW1vdmVkIGluIG5leHQgdmVyc2lvbiBvZiBldWkgaW4gZmF2b3Igb2YgZXhwYW5kZWRTdmdJY29uQ2xhc3MgKi9cbiAgICBASW5wdXQoKSBleHBhbmRlZEljb25DbGFzczogc3RyaW5nO1xuICAgIC8qKiBAZGVwcmVjYXRlZCBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiBuZXh0IHZlcnNpb24gb2YgZXVpIGluIGZhdm9yIG9mIGNvbGxhcHNlZFN2Z0ljb25DbGFzcyAqL1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlZEljb25DbGFzczogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGV4cGFuZGVkU3ZnSWNvbkNsYXNzID0gJ2NoZXZyb24tZm9yd2FyZDpzaGFycCc7XG4gICAgQElucHV0KCkgY29sbGFwc2VkU3ZnSWNvbkNsYXNzID0gJ2NoZXZyb24tZG93bjpzaGFycCc7XG5cbiAgICBAVmlld0NoaWxkKCdjZGtTY3JvbGxhYmxlUmVmJywgeyByZWFkOiBDZGtTY3JvbGxhYmxlIH0pIGNka1Njcm9sbGFibGVSZWY6IENka1Njcm9sbGFibGU7XG4gICAgQFZpZXdDaGlsZCgndHJlZUNvbXBvbmVudEluc3RhbmNlJykgcHVibGljIHRyZWVDb21wb25lbnRJbnN0YW5jZTogQ2RrVHJlZTxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaXNDbGlja1RvZ2dsaW5nTm9kZSA9IGZhbHNlO1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBpc011bHRpc2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGlzU2luZ2xlU2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGlzUmVjdXJzaXZlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGlzUmVjdXJzaXZlUGFyZW50U2VsZWN0aW9uID0gdHJ1ZTtcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1VuZGVybGluZWRMaW5rcyA9IGZhbHNlO1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93TGluZXMgPSB0cnVlO1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhdXRvVHJhbnNsYXRlID0gdHJ1ZTtcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaGlnaGxpZ2h0UGF0aCA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXVpVHJlZVNlbGVjdGlvbkNoYW5nZXM+KCk7XG4gICAgQE91dHB1dCgpIG5vZGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUl0ZW1Nb2RlbD4oKTtcbiAgICBAT3V0cHV0KCkgbm9kZVRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUl0ZW1Nb2RlbD4oKTtcbiAgICBjZGtBcnJheURhdGFTb3VyY2U6IEFycmF5RGF0YVNvdXJjZTxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG4gICAgY2RrVHJlZUNvbnRyb2w6IE5lc3RlZFRyZWVDb250cm9sPFRyZWVJdGVtUnVuVGltZU1vZGVsPjtcbiAgICByZW5kZXJUcmVlOiBib29sZWFuO1xuICAgIHB1YmxpYyB1aWQ6IHN0cmluZyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMDApLnRvU3RyaW5nKCk7XG4gICAgcHJvdGVjdGVkIF9pc011bHRpTGV2ZWw7XG4gICAgcHJpdmF0ZSBwcm9jZXNzZWROb2RlczogVHJlZURhdGFNb2RlbDtcbiAgICBwcml2YXRlIHRyZWVEYXRhUnVuVGltZTogVHJlZURhdGFSdW5UaW1lTW9kZWw7XG4gICAgcHJpdmF0ZSB0cmVlRGF0YVJ1blRpbWVCYWNrdXA6IFRyZWVEYXRhUnVuVGltZU1vZGVsO1xuICAgIHByaXZhdGUgcnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlOiBBcnJheTxUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsPjtcbiAgICBwcml2YXRlIHNlbGVjdGlvbk1vZGVsOiBTZWxlY3Rpb25Nb2RlbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG4gICAgcHJpdmF0ZSB0ZW1wU2VsZWN0aW9uTW9kZWw6IFNlbGVjdGlvbk1vZGVsPFRyZWVJdGVtUnVuVGltZU1vZGVsPjtcbiAgICBwcml2YXRlIHNlbGVjdGlvbk1vZGVsU3VicztcbiAgICBwcml2YXRlIHNjcm9sbERpc3BhdGNoZXJTdWJzO1xuICAgIHByaXZhdGUgX3NlbGVjdGlvbjtcbiAgICBwcml2YXRlIHRyZWVQYWdpbmF0aW9uOiBFdWlUcmVlUGFnaW5hdGlvbjxUcmVlSXRlbVJ1blRpbWVNb2RlbD47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBzY3JvbGxEaXNwYXRjaGVyOiBTY3JvbGxEaXNwYXRjaGVyKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdFRyZWUoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydub2RlcyddPy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ25vZGVzJ10/LnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pbml0VHJlZSgpO1xuICAgICAgICAgICAgaWYodGhpcy50cmVlQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb21wb25lbnRJbnN0YW5jZT8ucmVuZGVyTm9kZUNoYW5nZXMoW10pO1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNvbXBvbmVudEluc3RhbmNlPy5yZW5kZXJOb2RlQ2hhbmdlcyh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWxTdWJzKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsU3Vicy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWxlY3Rpb24oKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XG4gICAgfVxuXG4gICAgZ2V0UHJvY2Vzc2VkTm9kZXMoKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZE5vZGVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpOiBhbnkge1xuICAgICAgICByZXR1cm4gaXRlbS5wYXRoO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHRyYWNrQnlDb250cm9sKGl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgZ2V0VHJlZUl0ZW0ocGF0aDogc3RyaW5nKTogVHJlZUl0ZW1Nb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IG5vZGVBcnIgPSB0aGlzLnByb2Nlc3NlZE5vZGVzO1xuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgaWYgKG5vZGVBcnIgJiYgQXJyYXkuaXNBcnJheShub2RlQXJyKSkge1xuICAgICAgICAgICAgaW5kZXhBcnI/LmZvckVhY2goKHBhdGhJbmRleDogbnVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGluZGV4QXJyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUFyciA9IG5vZGVBcnIgJiYgbm9kZUFycltwYXRoSW5kZXhdPy5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZUFycltwYXRoSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGV4cGFuZEFsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5leHBhbmRBbGwoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBleHBhbmRBdChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRQYXJlbnRQYXRocyhwYXRoKS5yZXZlcnNlKCkuZm9yRWFjaCgocGFyZW50UGF0aCk9PntcbiAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhcmVudFBhdGgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY29sbGFwc2VBbGwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuY29sbGFwc2VBbGwoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJUZXJtKGZpbHRlcklucHV0OiBzdHJpbmcsIGZpbHRlcktleT86IHN0cmluZywgc2hvd0NoaWxkcmVuT2ZNYXRjaGVkSXRlbXM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChmaWx0ZXJJbnB1dCAhPT0gJycgJiYgZmlsdGVySW5wdXQgIT09IG51bGwgJiYgdHlwZW9mIGZpbHRlcklucHV0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSB0aGlzLmZpbHRlclRyZWVEYXRhKHN0cnVjdHVyZWRDbG9uZSh0aGlzLnRyZWVEYXRhUnVuVGltZUJhY2t1cCksIGZpbHRlcktleSB8fCAnbGFiZWwnLCBmaWx0ZXJJbnB1dCwgc2hvd0NoaWxkcmVuT2ZNYXRjaGVkSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSB0aGlzLmFwcGx5UnVuVGltZUxhc3RJdGVtcyh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICB0aGlzLmNka0FycmF5RGF0YVNvdXJjZSA9IG5ldyBBcnJheURhdGFTb3VyY2UodGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oKG5vZGUpID0+IG5vZGU/LmNoaWxkcmVuLCB7IHRyYWNrQnk6IHRoaXMudHJhY2tCeUNvbnRyb2wgfSk7XG4gICAgICAgICAgICB0aGlzLmNka1RyZWVDb250cm9sLmRhdGFOb2RlcyA9IHRoaXMudHJlZURhdGFSdW5UaW1lO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kTWF0Y2hlZCh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICAvLyB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy50cmVlRGF0YVJ1blRpbWVCYWNrdXApO1xuICAgICAgICAgICAgdGhpcy5jZGtBcnJheURhdGFTb3VyY2UgPSBuZXcgQXJyYXlEYXRhU291cmNlKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwgeyB0cmFja0J5OiB0aGlzLnRyYWNrQnlDb250cm9sIH0pO1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5kYXRhTm9kZXMgPSB0aGlzLnRyZWVEYXRhUnVuVGltZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0QWxsU2VsZWN0aW9uKGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnRlbXBTZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZCxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAoYSwgYikgPT4gYT8ucGF0aCA9PT0gYj8ucGF0aCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRJc0NoZWNrZWRGb3JBbGwodGhpcy50cmVlRGF0YVJ1blRpbWUsIGlzQ2hlY2tlZCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKC4uLnRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUcmVlSXRlbShnaXZlblRyZWVJdGVtOiBUcmVlSXRlbU1vZGVsLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJlZUl0ZW0gPSBzdHJ1Y3R1cmVkQ2xvbmUoZ2l2ZW5UcmVlSXRlbSk7XG4gICAgICAgIGlmICh0cmVlSXRlbSAmJiBwYXRoKSB7XG4gICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPFRyZWVJdGVtUnVuVGltZU1vZGVsPihcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIChhLCBiKSA9PiBhPy5wYXRoID09PSBiPy5wYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldFRyZWVEYXRhKHBhdGgsIHRoaXMucHJvY2Vzc0lucHV0cyhbdHJlZUl0ZW1dKVswXSk7XG4gICAgICAgIGNvbnN0IHBhdGhBcnIgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQocGF0aEFyci5wb3AoKSwgMTApO1xuICAgICAgICBjb25zdCB0cmVlSXRlbVJ1bnRpbWUgPSB0aGlzLmNhbGN1bGF0ZVJ1blRpbWVTdGF0ZSh0cmVlSXRlbSwgaW5kZXgsIHBhdGhBcnIuam9pbignLicpKTtcbiAgICAgICAgaWYgKHRyZWVJdGVtUnVudGltZT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRyZWVJdGVtUnVudGltZS5jaGlsZHJlbiA9IHRoaXMuYXBwbHlSdW5UaW1lTGFzdEl0ZW1zKHRyZWVJdGVtUnVudGltZS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUcmVlRGF0YVJ1blRpbWVCYWNrdXAocGF0aCwgdHJlZUl0ZW1SdW50aW1lKTtcbiAgICAgICAgdGhpcy5zZXRUcmVlRGF0YVJ1blRpbWUocGF0aCwgdHJlZUl0ZW1SdW50aW1lKTtcbiAgICAgICAgLy8gaXRlbVJlY3Vyc2l2ZVNlbGVjdGlvblN0YXRlXG4gICAgICAgIGNvbnN0IGl0ZW1SZWN1cnNpdmVTZWxlY3Rpb25TdGF0ZSA9IHRoaXMuY2FsY3VsYXRlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKHRyZWVJdGVtKTtcbiAgICAgICAgdGhpcy5zZXRSdW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGVUcmVlKHBhdGgsIGl0ZW1SZWN1cnNpdmVTZWxlY3Rpb25TdGF0ZSk7XG4gICAgICAgIHRoaXMuc3luY1N0YXRlQ2hhbmdlc0F0UGF0aChwYXRoKTtcbiAgICAgICAgaWYgKHRoaXMuY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlSXRlbVJ1bnRpbWUpICYmICF0cmVlSXRlbS5ub2RlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wudG9nZ2xlKHRyZWVJdGVtUnVudGltZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlSXRlbVJ1bnRpbWUpICYmIHRyZWVJdGVtLm5vZGUuaXNFeHBhbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5leHBhbmQodHJlZUl0ZW1SdW50aW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlckluaXRpYWxFeHBhbmQodGhpcy5nZXRSdW5UaW1lVHJlZUl0ZW0ocGF0aCk/LmNoaWxkcmVuKTtcbiAgICAgICAgdGhpcy5nZXRJbml0aWFsU2VsZWN0aW9uKHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpPy5jaGlsZHJlbik/LmZvckVhY2goKHJ1blRpbWVJdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRyZWVJdGVtKHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHJ1blRpbWVJdGVtLnBhdGgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKC4uLnRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKTtcbiAgICAgICAgLy8gUmVuZGVyaW5nXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnRyZWVDb21wb25lbnRJbnN0YW5jZS5yZW5kZXJOb2RlQ2hhbmdlcyhbXSk7XG4gICAgICAgIHRoaXMudHJlZUNvbXBvbmVudEluc3RhbmNlLnJlbmRlck5vZGVDaGFuZ2VzKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25Ob2RlQ2xpY2sodHJlZVJ1blRpbWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCwgZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc011bHRpc2VsZWN0IHx8IGUucG9pbnRlcklkICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlQ2xpY2suZW1pdCh0aGlzLmdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbT8ucGF0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDbGlja1RvZ2dsaW5nTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC50b2dnbGUodHJlZVJ1blRpbWVJdGVtKTtcbiAgICAgICAgICAgIHRoaXMub25Ob2RlVG9nZ2xlKHRyZWVSdW5UaW1lSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk5vZGVUb2dnbGUodHJlZVJ1blRpbWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbT8ucGF0aCkubm9kZS5pc0V4cGFuZGVkID0gdGhpcy5jZGtUcmVlQ29udHJvbC5pc0V4cGFuZGVkKHRyZWVSdW5UaW1lSXRlbSk7XG4gICAgICAgIHRoaXMubm9kZVRvZ2dsZS5lbWl0KHRoaXMuZ2V0VHJlZUl0ZW0odHJlZVJ1blRpbWVJdGVtPy5wYXRoKSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbm9kZVNlbGVjdGVkKGV2dDogYW55LCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0VHJlZUl0ZW0ocGF0aCk7XG4gICAgICAgIGNvbnN0IHJ1blRpbWVCYWNrdXBUcmVlSXRlbSA9IHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHBhdGgpO1xuICAgICAgICBjb25zdCByZW5kZXJlZFJ1blRpbWVUcmVlSXRlbSA9IHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpO1xuICAgICAgICBjb25zdCBub2RlID0gaXRlbT8ubm9kZTtcbiAgICAgICAgdGhpcy50ZW1wU2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKGEsIGIpID0+IGE/LnBhdGggPT09IGI/LnBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHBhdGgsaXRlbSxydW5UaW1lVHJlZUl0ZW0sIHJlbmRlcmVkUnVuVGltZVRyZWVJdGVtKTtcbiAgICAgICAgaWYodGhpcy5jdXN0b21Ob2RlU2VsZWN0Rm4pe1xuICAgICAgICAgICAgdGhpcy5jdXN0b21Ob2RlU2VsZWN0Rm4ocGF0aCwgZXZ0LnRhcmdldC5jaGVja2VkLCBpdGVtLCBuZXcgQ3VzdG9tTm9kZVNlbGVjdEZuSGVscGVyKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKC4uLnRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKTtcbiAgICAgICAgfSAgZWxzZSBpZiAoIW5vZGU/LnNlbGVjdENvbmZpZz8uc2luZ2xlU2VsZWN0KSB7XG4gICAgICAgICAgICBub2RlLmlzU2VsZWN0ZWQgPSBldnQudGFyZ2V0LmNoZWNrZWQ7XG4gICAgICAgICAgICBub2RlLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgcmVjdXJzaXZlIGl0IHNldHMgZXZlcnkgY2hpbGRyZW4gd2l0aCB0aGUgY2hhbmdlLlxuICAgICAgICAgICAgaWYgKHJlbmRlcmVkUnVuVGltZVRyZWVJdGVtPy5jaGlsZHJlbiAmJiByZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVuZGVyZWRSdW5UaW1lVHJlZUl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldElzQ2hlY2tlZEZvckFsbChyZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4sIGV2dC50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZVRyZWUoXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5nZXRUcmVlSXRlbShwYXRoKSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4gJiYgcmVuZGVyZWRSdW5UaW1lVHJlZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlPy5zZWxlY3RDb25maWc/LnJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldElzQ2hlY2tlZEZvckFsbChyZW5kZXJlZFJ1blRpbWVUcmVlSXRlbT8uY2hpbGRyZW4sIGV2dC50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuU3RhdGVDaGFuZ2VzRm9yQWxsKHJlbmRlcmVkUnVuVGltZVRyZWVJdGVtPy5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudHJlZUNvbXBvbmVudEluc3RhbmNlPy5yZW5kZXJOb2RlQ2hhbmdlcyhbXSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlQ29tcG9uZW50SW5zdGFuY2U/LnJlbmRlck5vZGVDaGFuZ2VzKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3luY1N0YXRlQ2hhbmdlc0F0UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFRyZWVJdGVtKHBhdGgpLm5vZGUuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VHJlZUl0ZW0ocnVuVGltZUJhY2t1cFRyZWVJdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHJ1blRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub2RlUGF0aHNTZXEgPSB0aGlzLmdldFBhcmVudFBhdGhzKHBhdGgpO1xuICAgICAgICAgICAgaWYgKG5vZGVQYXRoc1NlcS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZVBhdGhzU2VxLmZvckVhY2goKG5vZGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZUl0ZW0gPSB0aGlzLmdldFRyZWVJdGVtKG5vZGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRTdGF0ZXMgPSB0aGlzLmdldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShub2RlUGF0aCkuY2hpbGRyZW4ubWFwKChfKSA9PiBfLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSdW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjaWRlU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZT8uaXNTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/LnJlY3Vyc2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY1N0YXRlQ2hhbmdlc0F0UGF0aChub2RlUGF0aCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb24oLi4udGhpcy50ZW1wU2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcHJldkl0ZW0gPSB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdO1xuICAgICAgICAgICAgaWYgKGV2dC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRyZWVJdGVtKHByZXZJdGVtLnBhdGgpLm5vZGUuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KHByZXZJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXRlbS5ub2RlLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHJ1blRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW0ubm9kZS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChydW5UaW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0UGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChldnQudGFyZ2V0LmNoZWNrZWQgJiYgcHJldkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkl0ZW1Ob2RlUGF0aHNTZXEgPSB0aGlzLmdldFBhcmVudFBhdGhzKHByZXZJdGVtLnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldkl0ZW1Ob2RlUGF0aHNTZXEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkl0ZW1Ob2RlUGF0aHNTZXEuZm9yRWFjaCgobm9kZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKG5vZGVQYXRoLCAnYWxsTm90U2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNTdGF0ZUNoYW5nZXNBdFBhdGgobm9kZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZVBhdGhzU2VxID0gdGhpcy5nZXRQYXJlbnRQYXRocyhwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZVBhdGhzU2VxPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVQYXRoc1NlcS5mb3JFYWNoKChub2RlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShub2RlUGF0aCwgZXZ0LnRhcmdldC5jaGVja2VkID8gJ2luZGV0ZXJtaW5hdGUnIDogJ2FsbE5vdFNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNTdGF0ZUNoYW5nZXNBdFBhdGgobm9kZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzQ2hpbGQgPSAoXzogbnVtYmVyLCBpdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCk6IGJvb2xlYW4gPT4gISFpdGVtPy5jaGlsZHJlbiAmJiBpdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID49IDA7XG5cbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvblNlbGVjdEZuKHBhdGg6IHN0cmluZyk6IChldnQ6IGFueSkgPT4gdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmdldFRyZWVJdGVtKHBhdGgpPy5ub2RlPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlU2VsZWN0ZWQgPSB0aGlzLm5vZGVTZWxlY3RlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHJldHVybiAoZXZ0OiBhbnkpID0+IG5vZGVTZWxlY3RlZChldnQsIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIChldnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCd0cmVlSXRlbU1vZGVsLm5vZGUuc2VsZWN0YWJsZSBpcyBmYWxzZSwgeW91IGNhbiBub3QgaW1wbGVtZW50IG9uU2VsZWN0Jyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0UnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKHBhdGg6IHN0cmluZyk6IFRyZWVJdGVtU2VsZWN0aW9uUmVjdXJzaXZlTW9kZWwge1xuICAgICAgICBjb25zdCBpbmRleEFycjogQXJyYXk8bnVtYmVyPiA9IHRoaXMucmVzb2x2ZVBhdGgocGF0aCk7XG4gICAgICAgIGxldCBub2RlQXJyID0gdGhpcy5ydW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGU7XG4gICAgICAgIGxldCBub2RlO1xuICAgICAgICBpbmRleEFycj8uZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgbm9kZUFyciA9IG5vZGVBcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlQXJyW3BhdGhJbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRUcmVlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgdGhpcy5faXNNdWx0aUxldmVsID0gdGhpcy5jaGVja0lmTXVsdGlMZXZlbCh0aGlzLm5vZGVzKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkTm9kZXMgPSB0aGlzLnByb2Nlc3NJbnB1dHMoc3RydWN0dXJlZENsb25lKHRoaXMubm9kZXMpKTtcbiAgICAgICAgICAgIHRoaXMudHJlZURhdGFSdW5UaW1lID0gdGhpcy5jcmVhdGVUcmVlRGF0YVJ1bnRpbWUodGhpcy5wcm9jZXNzZWROb2Rlcyk7XG4gICAgICAgICAgICB0aGlzLnRyZWVEYXRhUnVuVGltZSA9IHRoaXMuYXBwbHlSdW5UaW1lTGFzdEl0ZW1zKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgIHRoaXMucnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID0gdGhpcy5jcmVhdGVSdW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUodGhpcy5wcm9jZXNzZWROb2Rlcyk7XG4gICAgICAgICAgICB0aGlzLnRyZWVEYXRhUnVuVGltZUJhY2t1cCA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICAvLyB0b2RvIEl0IHNob3VsZCBiZSBjb25maWd1cmFibGUsIDgwMCwgMiBhbmQgNDAwIGFyZSBoYXJkIGNvZGVkIHJpZ2h0IG5vd1xuICAgICAgICAgICAgaWYgKHRoaXMudHJlZURhdGFSdW5UaW1lQmFja3VwLmxlbmd0aCA+IDgwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZVBhZ2luYXRpb24gPSBuZXcgRXVpVHJlZVBhZ2luYXRpb248VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KHRoaXMudHJlZURhdGFSdW5UaW1lQmFja3VwLCAxLCAyLCA0MDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRlZERhdGEgPSB0aGlzLnRyZWVQYWdpbmF0aW9uLmdldFZpZXdEYXRhKCkuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmNka0FycmF5RGF0YVNvdXJjZSA9IG5ldyBBcnJheURhdGFTb3VyY2U8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KHBhZ2luYXRlZERhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0aGlzLnRyYWNrQnlDb250cm9sLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gcGFnaW5hdGVkRGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrQXJyYXlEYXRhU291cmNlID0gbmV3IEFycmF5RGF0YVNvdXJjZTxUcmVlSXRlbVJ1blRpbWVNb2RlbD4odGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0aGlzLnRyYWNrQnlDb250cm9sLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy50cmVlRGF0YVJ1blRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlckluaXRpYWxFeHBhbmQodGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldEluaXRpYWxTZWxlY3Rpb24odGhpcy50cmVlRGF0YVJ1blRpbWUpLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgKGEsIGIpID0+IGE/LnBhdGggPT09IGI/LnBhdGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gWy4uLnRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRdPy5tYXAoKGl0ZW0pID0+IHRoaXMuZ2V0VHJlZUl0ZW0oaXRlbT8ucGF0aCkpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGVsU3Vicykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWxTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsU3VicyA9IHRoaXMuc2VsZWN0aW9uTW9kZWwuY2hhbmdlZC5waXBlKGRlYm91bmNlVGltZSgxKSkuc3Vic2NyaWJlKChzYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkNoYW5nZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkZWQ6IHNjLmFkZGVkLm1hcCgoXykgPT4gdGhpcy5nZXRUcmVlSXRlbShfLnBhdGgpKSxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZDogc2MucmVtb3ZlZC5tYXAoKF8pID0+IHRoaXMuZ2V0VHJlZUl0ZW0oXy5wYXRoKSksXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogWy4uLnRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRdLm1hcCgoaXRlbSkgPT4gdGhpcy5nZXRUcmVlSXRlbShpdGVtLnBhdGgpKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHNlbGVjdGlvbkNoYW5nZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChzZWxlY3Rpb25DaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzSW5wdXRzKHRyZWVEYXRhOiBUcmVlRGF0YU1vZGVsKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIHRyZWVEYXRhID0gdGhpcy5vdmVycmlkZVRyZWVEYXRhTW9kZWxGb3JTZWxlY3Rpb24odHJlZURhdGEsIHRoaXMuaXNSZWN1cnNpdmVTZWxlY3Rpb24sICF0aGlzLmlzUmVjdXJzaXZlUGFyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdCkge1xuICAgICAgICAgICAgdHJlZURhdGEgPSB0aGlzLm92ZXJyaWRlVHJlZURhdGFNb2RlbEZvclNlbGVjdGlvbih0cmVlRGF0YSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZURhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvdmVycmlkZVRyZWVEYXRhTW9kZWxGb3JTZWxlY3Rpb24oXG4gICAgICAgIG5vZGVBcnI6IFRyZWVEYXRhTW9kZWwsXG4gICAgICAgIGlzUmVjdXJzaXZlOiBib29sZWFuLFxuICAgICAgICBub0F1dG9TZWxlY3RQYXJlbnQ6IGJvb2xlYW4sXG4gICAgICAgIHNpbmdsZVNlbGVjdD86IGJvb2xlYW4sXG4gICAgKTogVHJlZURhdGFNb2RlbCB7XG4gICAgICAgIHJldHVybiBub2RlQXJyPy5tYXAoKGl0ZW06IFRyZWVJdGVtTW9kZWwsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiB0eXBlb2YgaXRlbT8ubm9kZT8uc2VsZWN0YWJsZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogaXRlbT8ubm9kZT8uc2VsZWN0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNJbmRldGVybWluYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdENvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ubm9kZS5zZWxlY3RDb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaXRlbT8ubm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICEhaXNSZWN1cnNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbT8ubm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9BdXRvU2VsZWN0UGFyZW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaXRlbT8ubm9kZT8uc2VsZWN0Q29uZmlnPy5ub0F1dG9TZWxlY3RQYXJlbnQgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5vQXV0b1NlbGVjdFBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtPy5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVTZWxlY3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpdGVtPy5ub2RlPy5zZWxlY3RDb25maWc/LnNpbmdsZVNlbGVjdCA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2luZ2xlU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0/Lm5vZGU/LnNlbGVjdENvbmZpZz8uc2luZ2xlU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMub3ZlcnJpZGVUcmVlRGF0YU1vZGVsRm9yU2VsZWN0aW9uKGl0ZW0uY2hpbGRyZW4sIGlzUmVjdXJzaXZlLCBub0F1dG9TZWxlY3RQYXJlbnQsIHNpbmdsZVNlbGVjdCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbS5ub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHlwZW9mIGl0ZW0/Lm5vZGU/LnNlbGVjdGFibGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGl0ZW0/Lm5vZGU/LnNlbGVjdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLm5vZGU/LnNlbGVjdENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVTZWxlY3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpdGVtPy5ub2RlPy5zZWxlY3RDb25maWc/LnNpbmdsZVNlbGVjdCA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2luZ2xlU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0/Lm5vZGU/LnNlbGVjdENvbmZpZz8uc2luZ2xlU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blNjcm9sbExpc3RlbmVyKCk6IHZvaWQge1xuICAgICAgICAvKiBpZiAodGhpcy5zY3JvbGxEaXNwYXRjaGVyU3VicykgeyB0b2RvXG4gICAgICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0qL1xuICAgICAgICB0aGlzLnNjcm9sbERpc3BhdGNoZXJTdWJzID0gdGhpcy5zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKCkuc3Vic2NyaWJlKChzY3JvbGxhYmxlOiBDZGtTY3JvbGxhYmxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2Nyb2xsYWJsZSAmJiB0aGlzLmNoZWNrSWZDdXJyZW50U2Nyb2xsYWJsZShzY3JvbGxhYmxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlPy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgKyBzY3JvbGxhYmxlPy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPj1cbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZT8uZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRUb3AgPSBzY3JvbGxhYmxlPy5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPT09IDA7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0VsZW1lbnQ6JywgdGhpcy5jZGtTY3JvbGxhYmxlUmVmLmdldEVsZW1lbnRSZWYoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXRCb3R0b20gJiYgIXRoaXMudHJlZVBhZ2luYXRpb24uaXNBdE1heCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZURhdGFSdW5UaW1lID0gdGhpcy50cmVlUGFnaW5hdGlvbi5wYWdpbmF0ZU5leHQoKS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlRGF0YVJ1blRpbWUgPSB0aGlzLmFwcGx5UnVuVGltZUxhc3RJdGVtcyh0aGlzLnRyZWVEYXRhUnVuVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0FycmF5RGF0YVNvdXJjZSA9IG5ldyBBcnJheURhdGFTb3VyY2UodGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxUcmVlSXRlbVJ1blRpbWVNb2RlbD4oKG5vZGUpID0+IG5vZGU/LmNoaWxkcmVuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdGhpcy50cmFja0J5Q29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZGtUcmVlQ29udHJvbC5kYXRhTm9kZXMgPSB0aGlzLnRyZWVEYXRhUnVuVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxIZWlnaHQgPSBzY3JvbGxhYmxlLm1lYXN1cmVTY3JvbGxPZmZzZXQoJ2JvdHRvbScpICsgc2Nyb2xsYWJsZS5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCd0b3AnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gc2Nyb2xsYWJsZS5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvblRvU2Nyb2xsID0gdG90YWxIZWlnaHQgLSB2aWV3cG9ydEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG8oeyB0b3A6IHBvc2l0aW9uVG9TY3JvbGwgLyAyIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0F0VG9wICYmIHRoaXMudHJlZVBhZ2luYXRpb24uZ2V0Q3VycmVudFN0YXJ0UGFnZSgpID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVEYXRhUnVuVGltZSA9IHRoaXMudHJlZVBhZ2luYXRpb24ucGFnaW5hdGVQcmV2KCkuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZURhdGFSdW5UaW1lID0gdGhpcy5hcHBseVJ1blRpbWVMYXN0SXRlbXModGhpcy50cmVlRGF0YVJ1blRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZGtBcnJheURhdGFTb3VyY2UgPSBuZXcgQXJyYXlEYXRhU291cmNlKHRoaXMudHJlZURhdGFSdW5UaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wgPSBuZXcgTmVzdGVkVHJlZUNvbnRyb2w8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+KChub2RlKSA9PiBub2RlPy5jaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRoaXMudHJhY2tCeUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy50cmVlRGF0YVJ1blRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRyZWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gc2Nyb2xsYWJsZS5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCdib3R0b20nKSArIHNjcm9sbGFibGUubWVhc3VyZVNjcm9sbE9mZnNldCgndG9wJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHNjcm9sbGFibGUuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25Ub1Njcm9sbCA9IHRvdGFsSGVpZ2h0IC0gdmlld3BvcnRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlLnNjcm9sbFRvKHsgdG9wOiBwb3NpdGlvblRvU2Nyb2xsIC8gMiArIHZpZXdwb3J0SGVpZ2h0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGlvbkluZGV4T2ZJdGVtKHJ1blRpbWVUcmVlSXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5maW5kSW5kZXgoKGkpID0+IGk/LnBhdGggPT09IHJ1blRpbWVUcmVlSXRlbT8ucGF0aCk7XG4gICAgfVxuICAgIC8vIHRvZG8gcmUtdGhpbmsgYWJvdXQgdGhlIGFjY2VzcyBmcm9tIGN1c3RvbSBvbiBub2RlIHNlbGVjdCBoZWxwZXJcbiAgICBwcml2YXRlIHNpbGVudFNlbGVjdChwYXRoOnN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKTogdm9pZHtcbiAgICAgICAgY29uc3QgcnVudGltZUJhY2t1cFRyZWVJdGVtID0gdGhpcy5nZXRSdW5UaW1lQmFja3VwVHJlZUl0ZW0ocGF0aCk7XG4gICAgICAgIGNvbnN0IHRyZWVJdGVtID0gdGhpcy5nZXRUcmVlSXRlbShwYXRoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRyZWVJdGVtLm5vZGU7XG4gICAgICAgIGlmIChub2RlPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICBub2RlLmlzU2VsZWN0ZWQgPSBpc0NoZWNrZWQ7XG4gICAgICAgICAgICBub2RlLmlzSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdChydW50aW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBTZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChydW50aW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RUcmVlSXRlbShydW5UaW1lQmFja3VwVHJlZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLnNlbGVjdChydW5UaW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzZWxlY3RUcmVlSXRlbShydW5UaW1lVHJlZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVtcFNlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KHJ1blRpbWVUcmVlSXRlbSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUcmVlRGF0YVJ1bnRpbWUobm9kZXM6IFRyZWVEYXRhTW9kZWwpOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCB7XG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUobm9kZXMpPy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVSdW5UaW1lU3RhdGUoaXRlbSwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5UnVuVGltZUxhc3RJdGVtcyhpdGVtczogVHJlZURhdGFSdW5UaW1lTW9kZWwpOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCB7XG4gICAgICAgIHJldHVybiBpdGVtcz8ubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0/LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdDogaXRlbXMubGVuZ3RoID09PSBpbmRleCArIDEgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogaXRlbS5jaGlsZHJlbj8ubGVuZ3RoID4gMCA/IHRoaXMuYXBwbHlSdW5UaW1lTGFzdEl0ZW1zKGl0ZW0uY2hpbGRyZW4pIDogaXRlbT8uY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdDogaXRlbXMubGVuZ3RoID09PSBpbmRleCArIDEgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKG5vZGVzOiBUcmVlRGF0YU1vZGVsKTogQXJyYXk8VHJlZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVNb2RlbD4ge1xuICAgICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKG5vZGVzKT8ubWFwKChpdGVtKSA9PiB0aGlzLmNhbGN1bGF0ZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSh7IC4uLml0ZW0gfSkpO1xuICAgIH1cblxuICAgIC8vIENyZWF0aW5nIHJ1biB0aW1lIHN0YXRlIHdoaWNoIGluY2x1ZGVzIGNoaWxkcmVuIHNlbGVjdGlvbiBzdGF0ZSBmb3Igc2VsZWN0aW9uIHRyZWUuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJdGVtU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUodHJlZUl0ZW06IFRyZWVJdGVtTW9kZWwpOiBUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5TZWxlY3Rpb25SZWN1cnNpdmU6IEFycmF5PFRyZWVJdGVtU2VsZWN0aW9uUmVjdXJzaXZlTW9kZWw+ID0gW107XG4gICAgICAgIGlmICh0cmVlSXRlbS5jaGlsZHJlbiAmJiB0cmVlSXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0cmVlSXRlbS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlblNlbGVjdGlvblJlY3Vyc2l2ZVtpbmRleF0gPSB0aGlzLmNhbGN1bGF0ZUl0ZW1TZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShjaGlsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZFN0YXRlcyA9IGNoaWxkcmVuU2VsZWN0aW9uUmVjdXJzaXZlLm1hcCgoXykgPT4gXy5zZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSk7XG4gICAgICAgIGNvbnN0IGl0ZW1TdGF0ZTogU2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUgPSAgdHJlZUl0ZW0ubm9kZS5zZWxlY3RhYmxlID8gdGhpcy5kZWNpZGVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShcbiAgICAgICAgICAgIGNoaWxkU3RhdGVzLFxuICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZS5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZT8uc2VsZWN0Q29uZmlnPy5yZWN1cnNpdmUsXG4gICAgICAgICAgICB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCxcbiAgICAgICAgKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlOiBpdGVtU3RhdGUsXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5TZWxlY3Rpb25SZWN1cnNpdmUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWNpZGVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShcbiAgICAgICAgY2hpbGRTdGF0ZXM6IEFycmF5PFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlPiA9IFtdLFxuICAgICAgICBpc1NlbGVjdGVkOiBib29sZWFuLFxuICAgICAgICByZWN1cnNpdmU6IGJvb2xlYW4sXG4gICAgICAgIG5vQXV0b1NlbGVjdFBhcmVudDogYm9vbGVhbixcbiAgICApOiBTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSB7XG4gICAgICAgIGxldCBpdGVtU3RhdGU6IFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID0gJ2luZGV0ZXJtaW5hdGUnO1xuICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBjaGlsZFN0YXRlcy5maWx0ZXIoKGNoaWxkU3RhdGVzKT0+Y2hpbGRTdGF0ZXMpLmV2ZXJ5KChzdGF0ZSkgPT4gc3RhdGUgPT09ICdhbGxTZWxlY3RlZCcpKSB7XG4gICAgICAgICAgICBpdGVtU3RhdGUgPSAnYWxsU2VsZWN0ZWQnO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkICYmIGNoaWxkU3RhdGVzLmZpbHRlcigoY2hpbGRTdGF0ZXMpPT5jaGlsZFN0YXRlcykuZXZlcnkoKHN0YXRlKSA9PiBzdGF0ZSA9PT0gJ2FsbE5vdFNlbGVjdGVkJykpIHtcbiAgICAgICAgICAgIGl0ZW1TdGF0ZSA9ICdhbGxOb3RTZWxlY3RlZCc7XG4gICAgICAgIH0gZWxzZSBpZiAocmVjdXJzaXZlICYmIGNoaWxkU3RhdGVzLmZpbHRlcigoY2hpbGRTdGF0ZXMpPT5jaGlsZFN0YXRlcykuZXZlcnkoKHN0YXRlKSA9PiBzdGF0ZSA9PT0gJ2FsbFNlbGVjdGVkJykgJiYgIWlzU2VsZWN0ZWQgJiYgIW5vQXV0b1NlbGVjdFBhcmVudCkge1xuICAgICAgICAgICAgaXRlbVN0YXRlID0gJ2FsbFNlbGVjdGVkJztcbiAgICAgICAgfSBlbHNlIGlmIChyZWN1cnNpdmUgJiYgY2hpbGRTdGF0ZXMuZmlsdGVyKChjaGlsZFN0YXRlcyk9PmNoaWxkU3RhdGVzKS5ldmVyeSgoc3RhdGUpID0+IHN0YXRlID09PSAnYWxsTm90U2VsZWN0ZWQnKSAmJiBpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICBpdGVtU3RhdGUgPSAnYWxsTm90U2VsZWN0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtU3RhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jU3RhdGVDaGFuZ2VzQXRQYXRoKG5vZGVQYXRoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRyZWVJdGVtID0gdGhpcy5nZXRUcmVlSXRlbShub2RlUGF0aCk7XG4gICAgICAgIGNvbnN0IHJ1blRpbWVCYWNrdXBUcmVlSXRlbSA9IHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKG5vZGVQYXRoKTtcbiAgICAgICAgY29uc3QgcnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZUl0ZW0gPSB0aGlzLmdldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShub2RlUGF0aCk7XG4gICAgICAgIGlmICh0cmVlSXRlbT8ubm9kZT8uc2VsZWN0YWJsZSAmJiB0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/LnJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgaWYgKCF0cmVlSXRlbS5ub2RlPy5zZWxlY3RDb25maWc/Lm5vQXV0b1NlbGVjdFBhcmVudCkge1xuICAgICAgICAgICAgICAgIHRyZWVJdGVtLm5vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRyZWVJdGVtLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVJdGVtLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID09PSAnYWxsU2VsZWN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBpc0luZGV0ZXJtaW5hdGU6IHJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVJdGVtLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID09PSAnaW5kZXRlcm1pbmF0ZScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJlZUl0ZW0ubm9kZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udHJlZUl0ZW0ubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogdHJlZUl0ZW0ubm9kZS5pc1NlbGVjdGVkICYmIHJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVJdGVtLnNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlID09PSAnYWxsU2VsZWN0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBpc0luZGV0ZXJtaW5hdGU6XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlSXRlbS5zZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSA9PT0gJ2luZGV0ZXJtaW5hdGUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoIXRyZWVJdGVtLm5vZGUuaXNTZWxlY3RlZCAmJiBydW5UaW1lU2VsZWN0aW9uUmVjdXJzaXZlSXRlbS5zZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSA9PT0gJ2FsbFNlbGVjdGVkJyksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRyZWVJdGVtLCB0cmVlSXRlbS5ub2RlLnRyZWVDb250ZW50QmxvY2subGFiZWwsICdpc1NlbGVjdGVkOicgKyB0cmVlSXRlbS5ub2RlLmlzU2VsZWN0ZWQsICdpc0luZGV0ZXJtaW5hdGU6JyArIHRyZWVJdGVtLm5vZGUuaXNJbmRldGVybWluYXRlKTtcbiAgICAgICAgICAgIGlmICh0cmVlSXRlbS5ub2RlLmlzU2VsZWN0ZWQgPT09IHRydWUgJiYgIXRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChydW5UaW1lQmFja3VwVHJlZUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RUcmVlSXRlbShydW5UaW1lQmFja3VwVHJlZUl0ZW0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0cmVlSXRlbS5ub2RlLmlzU2VsZWN0ZWQgPT09IGZhbHNlICYmIHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChydW5UaW1lQmFja3VwVHJlZUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHJ1blRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFRyZWVEYXRhKHBhdGg6IHN0cmluZywgaXRlbTogVHJlZUl0ZW1Nb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleEFycjogQXJyYXk8bnVtYmVyPiA9IHRoaXMucmVzb2x2ZVBhdGgocGF0aCk7XG4gICAgICAgIGxldCBpdGVtQXJyID0gdGhpcy5wcm9jZXNzZWROb2RlcztcbiAgICAgICAgaW5kZXhBcnI/LmZvckVhY2goKHBhdGhJbmRleDogbnVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgaW5kZXhBcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnIgPSBpdGVtQXJyW3BhdGhJbmRleF0/LmNoaWxkcmVuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtQXJyW3BhdGhJbmRleF0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFRyZWVEYXRhUnVuVGltZUJhY2t1cChwYXRoOiBzdHJpbmcsIGl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IGl0ZW1BcnIgPSB0aGlzLnRyZWVEYXRhUnVuVGltZUJhY2t1cDtcbiAgICAgICAgaW5kZXhBcnIuZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaXRlbUFyciA9IGl0ZW1BcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnJbcGF0aEluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VHJlZURhdGFSdW5UaW1lKHBhdGg6IHN0cmluZywgaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkSXRlbSA9IHRoaXMuZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGgpO1xuICAgICAgICBpZihvbGRJdGVtKXtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pPy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgb2xkSXRlbVtrZXldID0gaXRlbVtrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZVRyZWUocGF0aDogc3RyaW5nLCBpdGVtOiBUcmVlSXRlbVNlbGVjdGlvblJlY3Vyc2l2ZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IGl0ZW1BcnIgPSB0aGlzLnJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZTtcbiAgICAgICAgaW5kZXhBcnIuZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaXRlbUFyciA9IGl0ZW1BcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnJbcGF0aEluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUnVuVGltZVNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKHBhdGg6IHN0cmluZywgc2VsZWN0aW9uUmVjdXJzaXZlU3RhdGU6IFNlbGVjdGlvblJlY3Vyc2l2ZVN0YXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyOiBBcnJheTxudW1iZXI+ID0gdGhpcy5yZXNvbHZlUGF0aChwYXRoKTtcbiAgICAgICAgbGV0IGl0ZW1BcnIgPSB0aGlzLnJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZTtcbiAgICAgICAgaW5kZXhBcnIuZm9yRWFjaCgocGF0aEluZGV4OiBudW1iZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBpbmRleEFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaXRlbUFyciA9IGl0ZW1BcnJbcGF0aEluZGV4XT8uY2hpbGRyZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1BcnJbcGF0aEluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbUFycltwYXRoSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldElzQ2hlY2tlZEZvckFsbChub2RlQXJyOiBBcnJheTxUcmVlSXRlbVJ1blRpbWVNb2RlbD4sIGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBub2RlQXJyLmZvckVhY2goKHJ1blRpbWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVudGltZUJhY2t1cFRyZWVJdGVtID0gdGhpcy5nZXRSdW5UaW1lQmFja3VwVHJlZUl0ZW0ocnVuVGltZUl0ZW0ucGF0aCk7XG4gICAgICAgICAgICBjb25zdCB0cmVlSXRlbSA9IHRoaXMuZ2V0VHJlZUl0ZW0ocnVuVGltZUl0ZW0ucGF0aCk7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdHJlZUl0ZW0ubm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5pc1NlbGVjdGVkID0gaXNDaGVja2VkO1xuICAgICAgICAgICAgICAgIG5vZGUuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRyZWVJdGVtKHJ1bnRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHJ1bnRpbWVCYWNrdXBUcmVlSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1blRpbWVJdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXNDaGVja2VkRm9yQWxsKG5vZGVBcnJbaW5kZXhdLmNoaWxkcmVuLCBpc0NoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blN0YXRlQ2hhbmdlc0ZvckFsbChub2RlQXJyOiBBcnJheTxUcmVlSXRlbVJ1blRpbWVNb2RlbD4pOiB2b2lkIHtcbiAgICAgICAgbm9kZUFycj8uZm9yRWFjaCgocnVuVGltZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuU3RhdGVDaGFuZ2VzRm9yQWxsKG5vZGVBcnJbaW5kZXhdLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNTZWxlY3Rpb25BdFBhdGgocnVuVGltZUl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNTZWxlY3Rpb25BdFBhdGgocnVuVGltZVRyZWVJdGVtOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCk6IHZvaWQge1xuICAgICAgICAvLyBJdCBpcyBoZXJlIGZvciB0aGUgZmlsdGVyIGVkZ2UgY2FzZS5cbiAgICAgICAgdGhpcy5zeW5jU3RhdGVDaGFuZ2VzQXRQYXRoKHJ1blRpbWVUcmVlSXRlbS5wYXRoKTtcbiAgICAgICAgLy8gU2V0cyBpc1NlbGVjdGVkIGNoYW5nZSBvbiB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHRoaXMuZ2V0VHJlZUl0ZW0ocnVuVGltZVRyZWVJdGVtLnBhdGgpLm5vZGUuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RUcmVlSXRlbSh0aGlzLmdldFJ1blRpbWVCYWNrdXBUcmVlSXRlbShydW5UaW1lVHJlZUl0ZW0ucGF0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFRyZWVJdGVtKHRoaXMuZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHJ1blRpbWVUcmVlSXRlbS5wYXRoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVQYXRoKHBhdGg6IHN0cmluZyk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gcGF0aD8uc3BsaXQoJy4nKS5tYXAoKGluZGV4OiBzdHJpbmcpID0+IHBhcnNlSW50KGluZGV4LCAxMCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50UGF0aHMocGF0aDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBhdGhBcnIgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IGhhc1BhcmVudCA9IHBhdGhBcnIubGVuZ3RoID4gMTtcbiAgICAgICAgLy8gU2V0cyB0aGUgaGFzUGFyZW50IElmIHRoZXJlIGlzIGEgcGFyZW50LCBhbmQgcmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZvcm0gcGF0aEFyci5cbiAgICAgICAgaWYgKGhhc1BhcmVudCkge1xuICAgICAgICAgICAgcGF0aEFyci5wb3AoKTtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgcGFyZW50IHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoQXJyLmpvaW4oJy4nKTtcbiAgICAgICAgICAgIC8vIENyZWF0aW5nIG5vZGUgaW5kZXggc2VxdWVuY2UgZi5lIElmIHBhdGggaXMgJzEuMicgaXQgd2lsbCBiZSBbMSwyXVxuICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4U2VxID0gcGFyZW50UGF0aC5zcGxpdCgnLicpLm1hcCgoaW5kZXhTdHIpID0+IHBhcnNlSW50KGluZGV4U3RyLCAxMCkpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRpbmcgdGhlIG5vZGUgcGF0aHMgYXJyYXkgdG8gYmUgcmUtY2FsY3VsYXRlZCBmcm9tIGJvdHRvbSB0byB0b3BcbiAgICAgICAgICAgIGNvbnN0IG5vZGVQYXRoc1NlcSA9IFtdO1xuICAgICAgICAgICAgbm9kZUluZGV4U2VxLmZvckVhY2goKG5vZGVJbmRleCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBub2RlUGF0aHNTZXFbaW5kZXhdID0gbm9kZUluZGV4U2VxLnNsaWNlKDAsIGluZGV4ICsgMSkuam9pbignLicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZVBhdGhzU2VxLnJldmVyc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlUnVuVGltZVN0YXRlKHRyZWVJdGVtOiBUcmVlSXRlbU1vZGVsLCBpbmRleDogbnVtYmVyLCBwYXJlbnRQYXRoPzogc3RyaW5nKTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwge1xuICAgICAgICBjb25zdCBydW5UaW1lVHJlZUl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsID0ge1xuICAgICAgICAgICAgcGF0aDogcGFyZW50UGF0aCA/IHBhcmVudFBhdGggKyAnLicgKyBpbmRleCA6IGluZGV4LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRyZWVJdGVtLmNoaWxkcmVuICYmIHRyZWVJdGVtLmNoaWxkcmVuLmxlbmd0aCA+PSAwKSB7XG4gICAgICAgICAgICBydW5UaW1lVHJlZUl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIHRyZWVJdGVtLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCB0cmVlSXRlbUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcnVuVGltZVRyZWVJdGVtLmNoaWxkcmVuW3RyZWVJdGVtSW5kZXhdID0gdGhpcy5jYWxjdWxhdGVSdW5UaW1lU3RhdGUoY2hpbGQsIHRyZWVJdGVtSW5kZXgsIHJ1blRpbWVUcmVlSXRlbS5wYXRoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydW5UaW1lVHJlZUl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJUcmVlRGF0YShydW5UaW1lVHJlZURhdGE6IFRyZWVEYXRhUnVuVGltZU1vZGVsLCBrZXkgPSAnbGFiZWwnLCBmaWx0ZXJTdHI6IHN0cmluZywgc2hvd0NoaWxkcmVuOiBib29sZWFuLCBzaG93Pzpib29sZWFuKTogVHJlZURhdGFSdW5UaW1lTW9kZWwge1xuICAgICAgICByZXR1cm4gcnVuVGltZVRyZWVEYXRhLmZpbHRlcigocnVuVGltZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldERhdGEgPSB0aGlzLmdldFRyZWVJdGVtKHJ1blRpbWVJdGVtLnBhdGgpLm5vZGUudHJlZUNvbnRlbnRCbG9ja1trZXldO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRhcmdldERhdGEgJiYgdGhpcy5ub3JtYWxpemVkU3RyKHRhcmdldERhdGEpPy5pbmNsdWRlcyh0aGlzLm5vcm1hbGl6ZWRTdHIoZmlsdGVyU3RyKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmKHJ1blRpbWVJdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIHJ1blRpbWVJdGVtLmNoaWxkcmVuID0gdGhpcy5maWx0ZXJUcmVlRGF0YShydW5UaW1lSXRlbS5jaGlsZHJlbiwga2V5LCBmaWx0ZXJTdHIsIHNob3dDaGlsZHJlbiwgc2hvd0NoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihydW5UaW1lSXRlbSx7IG1hdGNoZWQ6IHRydWUgfSlcbiAgICAgICAgICAgICAgICAvLyBydW5UaW1lSXRlbS5tYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcnVuVGltZUl0ZW0uY2hpbGRyZW4gPSB0aGlzLmZpbHRlclRyZWVEYXRhKHJ1blRpbWVJdGVtLmNoaWxkcmVuLCBrZXksIGZpbHRlclN0ciwgc2hvd0NoaWxkcmVuLCBzaG93KTtcbiAgICAgICAgICAgICAgICBydW5UaW1lSXRlbS5jaGlsZHJlbiA9IHJ1blRpbWVJdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDAgPyBydW5UaW1lSXRlbS5jaGlsZHJlbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwIHx8IHNob3c7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzaG93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZWRTdHIoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbml0aWFsU2VsZWN0aW9uKG5vZGVzOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCk6IEFycmF5PFRyZWVJdGVtUnVuVGltZU1vZGVsPiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbjogQXJyYXk8VHJlZUl0ZW1SdW5UaW1lTW9kZWw+ID0gW107XG4gICAgICAgIHRoaXMuc2NhblNlbGVjdGlvbihub2Rlcywgc2VsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjYW5TZWxlY3Rpb24obm9kZXM6IFRyZWVEYXRhUnVuVGltZU1vZGVsLCBzZWxlY3Rpb246IEFycmF5PFRyZWVJdGVtUnVuVGltZU1vZGVsPik6IHZvaWQge1xuICAgICAgICBub2Rlcz8uZm9yRWFjaCgoaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFRyZWVJdGVtKGl0ZW0ucGF0aCkubm9kZT8uc2VsZWN0YWJsZSAmJiB0aGlzLmdldFRyZWVJdGVtKGl0ZW0ucGF0aCkubm9kZS5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYW5TZWxlY3Rpb24oaXRlbS5jaGlsZHJlbiwgc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJJbml0aWFsRXhwYW5kKG5vZGVzOiBUcmVlRGF0YVJ1blRpbWVNb2RlbCk6IHZvaWQge1xuICAgICAgICBub2Rlcz8uZm9yRWFjaCgoaXRlbTogVHJlZUl0ZW1SdW5UaW1lTW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySW5pdGlhbEV4cGFuZChpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5nZXRUcmVlSXRlbShpdGVtLnBhdGgpLm5vZGUuaXNFeHBhbmRlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmdldFRyZWVJdGVtKGl0ZW0ucGF0aCkubm9kZS5pc0V4cGFuZGVkICYmICF0aGlzLmNka1RyZWVDb250cm9sLmlzRXhwYW5kZWQoaXRlbSkpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZEF0KGl0ZW0ucGF0aCk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuZ2V0VHJlZUl0ZW0oaXRlbS5wYXRoKS5ub2RlLmlzRXhwYW5kZWQgJiYgIHRoaXMuY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZChpdGVtKSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RrVHJlZUNvbnRyb2wuY29sbGFwc2UoaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4cGFuZE1hdGNoZWQobm9kZXM6IFRyZWVEYXRhUnVuVGltZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIG5vZGVzLmZvckVhY2goKGl0ZW06IFRyZWVJdGVtUnVuVGltZU1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5tYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRoaXMuZ2V0UGFyZW50UGF0aHMoaXRlbS5wYXRoKVswXTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50VHJlZUl0ZW0gPSB0aGlzLmdldFRyZWVJdGVtKHBhcmVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRUcmVlSXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBhcmVudFRyZWVJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBhcmVudFRyZWVJdGVtLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIC8vICBub2RlLmlzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhlcmVcIiwgcGFyZW50VHJlZUl0ZW0ubm9kZS50cmVlQ29udGVudEJsb2NrLmxhYmVsLCBwYXJlbnRQYXRoLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRBdChwYXJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZE1hdGNoZWQoaXRlbS5jaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UnVuVGltZVRyZWVJdGVtKHBhdGg6IHN0cmluZyk6IFRyZWVJdGVtUnVuVGltZU1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJ1blRpbWVUcmVlSXRlbSh0aGlzLnRyZWVEYXRhUnVuVGltZSwgcGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kUnVuVGltZVRyZWVJdGVtKHRyZWVEYXRhUnVuVGltZTogVHJlZURhdGFSdW5UaW1lTW9kZWwsIHBhdGgpOiBUcmVlSXRlbVJ1blRpbWVNb2RlbCB7XG4gICAgICAgIGZvciAoY29uc3QgcnVuVGltZUl0ZW0gb2YgdHJlZURhdGFSdW5UaW1lKSB7XG4gICAgICAgICAgICBpZiAocnVuVGltZUl0ZW0ucGF0aCA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydW5UaW1lSXRlbTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuVGltZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRSdW5UaW1lVHJlZUl0ZW0ocnVuVGltZUl0ZW0uY2hpbGRyZW4sIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UnVuVGltZUJhY2t1cFRyZWVJdGVtKHBhdGg6IHN0cmluZyk6IFRyZWVJdGVtUnVuVGltZU1vZGVsIHtcbiAgICAgICAgY29uc3QgaW5kZXhBcnI6IEFycmF5PG51bWJlcj4gPSB0aGlzLnJlc29sdmVQYXRoKHBhdGgpO1xuICAgICAgICBsZXQgbm9kZUFyciA9IHRoaXMudHJlZURhdGFSdW5UaW1lQmFja3VwO1xuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgaWYgKG5vZGVBcnIgJiYgQXJyYXkuaXNBcnJheShub2RlQXJyKSkge1xuICAgICAgICAgICAgaW5kZXhBcnI/LmZvckVhY2goKHBhdGhJbmRleDogbnVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGluZGV4QXJyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUFyciA9IG5vZGVBcnIgJiYgbm9kZUFycltwYXRoSW5kZXhdPy5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZUFycltwYXRoSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3NzQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2V1aS10cmVlJyxcbiAgICAgICAgICAgIHRoaXMuaXNNdWx0aXNlbGVjdCA/ICdldWktdHJlZS0tbXVsdGlzZWxlY3QnIDogJycsXG4gICAgICAgICAgICB0aGlzLl9pc011bHRpTGV2ZWwgPyAnZXVpLXRyZWUtLXdpdGgtY2hpbGRyZW4nIDogJycsXG4gICAgICAgICAgICB0aGlzLnNob3dMaW5lcyA/ICdldWktdHJlZS0tc2hvdy1saW5lcycgOiAnJyxcbiAgICAgICAgXVxuICAgICAgICAuam9pbignICcpXG4gICAgICAgIC50cmltKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0lmTXVsdGlMZXZlbCh0cmVlOiBUcmVlRGF0YU1vZGVsKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc011bHRpTGV2ZWwgPSBmYWxzZTtcbiAgICAgICAgdHJlZS5mb3JFYWNoKChpdGVtOiBUcmVlSXRlbU1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaXNNdWx0aUxldmVsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpc011bHRpTGV2ZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0lmQ3VycmVudFNjcm9sbGFibGUoc2Nyb2xsZWQ6IENka1Njcm9sbGFibGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbGVkLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50ID09PSB0aGlzLmNka1Njcm9sbGFibGVSZWYuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxufVxuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSb3V0ZXJNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIEV1aUlucHV0Q2hlY2tib3hNb2R1bGUsXG4gICAgICAgIENka1RyZWVNb2R1bGUsXG4gICAgICAgIEV1aUJ1dHRvbk1vZHVsZSxcbiAgICAgICAgRXVpSWNvbk1vZHVsZSxcbiAgICAgICAgRXVpTGFiZWxNb2R1bGUsXG4gICAgICAgIEV1aUJhZGdlTW9kdWxlLFxuICAgICAgICBFdWlDaGlwTW9kdWxlLFxuICAgICAgICBFdWlEcm9wZG93bk1vZHVsZSxcbiAgICAgICAgU2Nyb2xsaW5nTW9kdWxlLFxuICAgIF0sXG4gICAgZGVjbGFyYXRpb25zOiBbRXVpVHJlZUNvbXBvbmVudF0sXG4gICAgZXhwb3J0czogW0V1aVRyZWVDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBFdWlUcmVlTW9kdWxlIHt9XG4iLCI8ZGl2IGNsYXNzPVwiZXVpLXVsLXJlcCBldWktdHJlZV9fd3JhcHBlclwiIGNka1Njcm9sbGFibGUgI2Nka1Njcm9sbGFibGVSZWY+XG4gICAgPGNkay10cmVlXG4gICAgICAgICN0cmVlQ29tcG9uZW50SW5zdGFuY2VcbiAgICAgICAgW2RhdGFTb3VyY2VdPVwiY2RrQXJyYXlEYXRhU291cmNlXCJcbiAgICAgICAgW3RyZWVDb250cm9sXT1cImNka1RyZWVDb250cm9sXCJcbiAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXG4gICAgICAgICpuZ0lmPVwicmVuZGVyVHJlZVwiXG4gICAgICAgIGNsYXNzPVwiZXVpLWNkay10cmVlXCI+XG4gICAgICAgIDwhLS0gVGhlcmUgYXJlIHR3byBzdGF0ZXMgb2YgZ2VuZXJpYyBjZGstbmVzdGVkLXRyZWUtbm9kZSBkZWNsYXJhdGlvbnMuXG4gICAgICAgIEZpcnN0IG9uZSBpcyB3aXRob3V0IGNoaWxkLiBObyBzdWIgcmVuZGVyaW5nLlxuICAgICAgICAtLT5cbiAgICAgICAgPGNkay1uZXN0ZWQtdHJlZS1ub2RlICpjZGtUcmVlTm9kZURlZj1cImxldCB0cmVlUnVuVGltZUl0ZW1Nb2RlbFwiIGNsYXNzPVwiZXVpLWNkay1uZXN0ZWQtdHJlZS1ub2RlXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHJlZVJ1blRpbWVJdGVtTW9kZWxcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZXVpLWxpLXJlcCBldWktdHJlZS1ub2RlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZXVpLXRyZWUtbm9kZS0tZmlyc3RdPVwidHJlZVJ1blRpbWVJdGVtTW9kZWw/LnBhdGggPT09ICcwJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmV1aS10cmVlLW5vZGUtLWxhc3RdPVwidHJlZVJ1blRpbWVJdGVtTW9kZWwubGFzdFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7e1xuICAgICAgICAgICAgICAgICAgICBnZXRUcmVlSXRlbSh0cmVlUnVuVGltZUl0ZW1Nb2RlbD8ucGF0aCk/Lm5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnRvb2x0aXBMYWJlbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJlZUl0ZW0odHJlZVJ1blRpbWVJdGVtTW9kZWw/LnBhdGgpPy5ub2RlPy50cmVlQ29udGVudEJsb2NrPy5sYWJlbFxuICAgICAgICAgICAgICAgIH19XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV1aS10cmVlLW5vZGUtd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ob2RlQ2xpY2sodHJlZVJ1blRpbWVJdGVtTW9kZWwsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV1aS10cmVlLW5vZGUtd3JhcHBlcl9fY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJzIG5vZGUgaW4gZGVmYXVsdCBvciBwcm92aWRlZCB0ZW1wbGF0ZSdzIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZXMgb25TZWxlY3Qgd2l0aCBvblNlbGVjdEZuIGZvciBkZXZlbG9wZXJzIHRvIHNlbmQgdGhlIGV2ZW50cyBmcm9tIHRoZWlyIGN1c3RvbSBjaGVjayBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlcyBpZCB0byBiZSB1c2VkIG9uIGdlbmVyaWMgdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZVJlZiB8fCBub2RlVGVtcGxhdGVEZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoKT8ubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0Rm4odHJlZVJ1blRpbWVJdGVtTW9kZWwucGF0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB1aWQgKyB0cmVlUnVuVGltZUl0ZW1Nb2RlbC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiB0cmVlUnVuVGltZUl0ZW1Nb2RlbC5wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvY2RrLW5lc3RlZC10cmVlLW5vZGU+XG4gICAgICAgIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBleHBhbmRhYmxlIG5vZGVzIC0tPlxuICAgICAgICA8Y2RrLW5lc3RlZC10cmVlLW5vZGVcbiAgICAgICAgICAgICpjZGtUcmVlTm9kZURlZj1cImxldCB0cmVlUnVuVGltZUl0ZW1Nb2RlbDsgd2hlbjogaGFzQ2hpbGRcIlxuICAgICAgICAgICAgY2xhc3M9XCJldWktY2RrLW5lc3RlZC10cmVlLW5vZGUgZXVpLWNkay1uZXN0ZWQtdHJlZS1ub2RlLS13aXRoLWNoaWxkXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJldWktbGktcmVwIGV1aS10cmVlLW5vZGUgZXVpLXRyZWUtbm9kZS0td2l0aC1jaGlsZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmV1aS10cmVlLW5vZGUtLWZpcnN0XT1cInRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoID09PSAnMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ldWktdHJlZS1ub2RlLS1sYXN0XT1cInRyZWVSdW5UaW1lSXRlbU1vZGVsLmxhc3RcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwidHJlZVJ1blRpbWVJdGVtTW9kZWxcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3tcbiAgICAgICAgICAgICAgICAgICAgZ2V0VHJlZUl0ZW0odHJlZVJ1blRpbWVJdGVtTW9kZWw/LnBhdGgpPy5ub2RlPy50cmVlQ29udGVudEJsb2NrPy50b29sdGlwTGFiZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoKT8ubm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWxcbiAgICAgICAgICAgICAgICB9fVwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJldWktdHJlZS1ub2RlLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLUhlcmUgd3JhcHMgdGhlIG5vZGUsIGFuZCBsaXN0ZW4gZm9yIG5vZGUgY2xpY2tzLi0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvbk5vZGVDbGljayh0cmVlUnVuVGltZUl0ZW1Nb2RlbCwgJGV2ZW50KVwiIGNsYXNzPVwiZXVpLXRyZWUtbm9kZS13cmFwcGVyX19jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXhwYW5kL2NvbGxhcHNlIGFjdGlvbiBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldWlCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVpQmFzaWNCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldWlSb3VuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVpU2l6ZVNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidUb2dnbGUgJyArIGdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoKT8ubm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk5vZGVUb2dnbGUodHJlZVJ1blRpbWVJdGVtTW9kZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtUcmVlTm9kZVRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXVpLXRyZWUtbm9kZV9fYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV1aS1pY29uLXN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjZGtUcmVlQ29udHJvbC5pc0V4cGFuZGVkKHRyZWVSdW5UaW1lSXRlbU1vZGVsKSAmJiAhY29sbGFwc2VkSWNvbkNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiZXhwYW5kZWRTdmdJY29uQ2xhc3NcIj48L2V1aS1pY29uLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXVpLWljb24tc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2RrVHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0cmVlUnVuVGltZUl0ZW1Nb2RlbCkgJiYgIWV4cGFuZGVkSWNvbkNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiY29sbGFwc2VkU3ZnSWNvbkNsYXNzXCI+PC9ldWktaWNvbi1zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlcnMgbm9kZSBpbiBkZWZhdWx0IG9yIHByb3ZpZGVkIHRlbXBsYXRlJ3MgY29udGV4dC5cbiAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlcyBvblNlbGVjdCB3aXRoIG9uU2VsZWN0Rm4gZm9yIGRldmVsb3BlcnMgdG8gc2VuZCB0aGUgZXZlbnRzIGZyb20gdGhlaXIgY3VzdG9tIGNoZWNrIGV2ZW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVzIGlkIHRvIGJlIHVzZWQgb24gZ2VuZXJpYyB0ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlUmVmIHx8IG5vZGVUZW1wbGF0ZURlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogZ2V0VHJlZUl0ZW0odHJlZVJ1blRpbWVJdGVtTW9kZWwucGF0aCk/Lm5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0OiBvblNlbGVjdEZuKHRyZWVSdW5UaW1lSXRlbU1vZGVsLnBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdWlkICsgdHJlZVJ1blRpbWVJdGVtTW9kZWwucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogdHJlZVJ1blRpbWVJdGVtTW9kZWwucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGdldFRyZWVJdGVtKHRyZWVSdW5UaW1lSXRlbU1vZGVsPy5wYXRoKT8uY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLXVzZXMgY2RrVHJlZU5vZGVPdXRsZXQgdG8gcmVuZGVyIGNoaWxkcmVuIG5vZGVzLCBDZGtUcmVlQ29udHJvbCBpcyB1c2VkIHRvIGNvbnRyb2wgaXNFeHBhbmRlZCBzdGF0ZS4tLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXVpLXVsLXJlcCBldWktdHJlZS1ub2RlXCIgcm9sZT1cImdyb3VwXCIgKm5nSWY9XCJjZGtUcmVlQ29udHJvbC5pc0V4cGFuZGVkKHRyZWVSdW5UaW1lSXRlbU1vZGVsKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGNka1RyZWVOb2RlT3V0bGV0PjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvY2RrLW5lc3RlZC10cmVlLW5vZGU+XG4gICAgPC9jZGstdHJlZT5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI25vZGVUZW1wbGF0ZURlZmF1bHQgbGV0LW5vZGUgbGV0LW9uU2VsZWN0PVwib25TZWxlY3RcIiBsZXQtaWQ9XCJpZFwiIGxldC1wYXRoPVwicGF0aFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJldWktdHJlZS1ub2RlLXdyYXBwZXJfX2NvbnRhaW5lci1sZWZ0XCIgW2NsYXNzLmV1aS10cmVlLW5vZGUtd3JhcHBlcl9fY29udGFpbmVyLWxlZnQtLXNlbGVjdGVkXT1cIm5vZGU/LmlzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgIDwhLS1pbnB1dCBjaGVja2JveCBhcmVhLS0+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBldWlJbnB1dENoZWNrQm94XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJub2RlICYmIG5vZGUuc2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBpZD1cInt7IGlkIH19XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIW5vZGU/LmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIiEhbm9kZT8uaXNJbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0KCRldmVudClcIiAvPlxuXG4gICAgICAgICAgICA8IS0taWNvbiBhcmVhLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8uaWNvblN2Z05hbWVcIj5cbiAgICAgICAgICAgICAgICA8ZXVpLWljb24tc3ZnXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJ7eyBub2RlPy50cmVlQ29udGVudEJsb2NrPy5pY29uU3ZnTmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcj1cInt7IG5vZGU/LnRyZWVDb250ZW50QmxvY2s/Lmljb25UeXBlQ2xhc3MgfHwgJ25ldXRyYWwnIH19XCJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV1aS11LW1yLXhzXCI+XG4gICAgICAgICAgICAgICAgPC9ldWktaWNvbi1zdmc+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLWNoaXBzIGFyZWEtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlPy50cmVlQ29udGVudEJsb2NrPy5jaGlwc1wiPlxuICAgICAgICAgICAgICAgIDxldWktY2hpcFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hpcCBvZiBub2RlLnRyZWVDb250ZW50QmxvY2suY2hpcHNcIlxuICAgICAgICAgICAgICAgICAgICBldWlTaXplU1xuICAgICAgICAgICAgICAgICAgICBbZXVpVmFyaWFudF09XCJjaGlwLnR5cGVDbGFzcyB8fCAnc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtldWlPdXRsaW5lXT1cImNoaXAuaXNPdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJldWktY2hpcC0tcm91bmRlZCBldWktdS1tci14c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBldWlMYWJlbD57eyBjaGlwLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZXVpLWNoaXA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLWJhZGdlICh0eXBlTGFiZWwgJiB0eXBlQ2xhc3MpIGFyZWEtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlPy50cmVlQ29udGVudEJsb2NrPy50eXBlTGFiZWxcIiBbbmdTd2l0Y2hdPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udHlwZUNsYXNzXCI+XG4gICAgICAgICAgICAgICAgPGV1aS1iYWRnZSBldWlTaXplTSBbZXVpVmFyaWFudF09XCJub2RlPy50cmVlQ29udGVudEJsb2NrPy50eXBlQ2xhc3MgfHwgJ3ByaW1hcnknXCIgY2xhc3M9XCJldWktdS1mbGV4LW5vLXNocmluayBldWktdS1tci14c1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBub2RlPy50cmVlQ29udGVudEJsb2NrPy50eXBlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2V1aS1iYWRnZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tbGFiZWwgYXJlYS0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXVpLXRyZWUtbm9kZS13cmFwcGVyX19jb250YWluZXItbWlkZGxlXCI+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFub2RlPy50cmVlQ29udGVudEJsb2NrPy51cmwgJiYgIW5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnVybEV4dGVybmFsXCJcbiAgICAgICAgICAgICAgICBldWlMYWJlbFxuICAgICAgICAgICAgICAgIGZvcj1cInt7IGlkIH19XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImV1aS11LXRleHQtdHJ1bmNhdGUgZXVpLXUtcC0yeHNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ldWktbGFiZWwtLXNlbGVjdGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdldFJ1blRpbWVTZWxlY3Rpb25SZWN1cnNpdmVTdGF0ZShwYXRoKT8uc2VsZWN0aW9uUmVjdXJzaXZlU3RhdGUgPT09ICdpbmRldGVybWluYXRlJyB8fCBub2RlPy5pc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5vZGU/LmlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ldWktdS1jdXJzb3ItcG9pbnRlcl09XCJub2RlPy5zZWxlY3RhYmxlXCI+XG4gICAgICAgICAgICAgICAge3sgYXV0b1RyYW5zbGF0ZSA/IChub2RlPy50cmVlQ29udGVudEJsb2NrPy5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBub2RlPy50cmVlQ29udGVudEJsb2NrPy5sYWJlbCB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIm5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnVybFwiIGV1aUxhYmVsIGZvcj1cInt7IGlkIH19XCIgY2xhc3M9XCJldWktdS10ZXh0LXRydW5jYXRlIGV1aS11LXAtMnhzXCI+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJldWktdS10ZXh0LWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXVpLXUtdGV4dC1saW5rLXN0YW5kYWxvbmVdPVwiIXNob3dVbmRlcmxpbmVkTGlua3NcIlxuICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJub2RlPy50cmVlQ29udGVudEJsb2NrPy51cmxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgYXV0b1RyYW5zbGF0ZSA/IChub2RlPy50cmVlQ29udGVudEJsb2NrPy5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBub2RlPy50cmVlQ29udGVudEJsb2NrPy5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJub2RlPy50cmVlQ29udGVudEJsb2NrPy51cmxFeHRlcm5hbFwiIGV1aUxhYmVsIGZvcj1cInt7IGlkIH19XCIgY2xhc3M9XCJldWktdS10ZXh0LXRydW5jYXRlIGV1aS11LXAtMnhzXCI+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJldWktdS10ZXh0LWxpbmstZXh0ZXJuYWxcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXVpLXUtdGV4dC1saW5rLWV4dGVybmFsLXN0YW5kYWxvbmVdPVwiIXNob3dVbmRlcmxpbmVkTGlua3NcIlxuICAgICAgICAgICAgICAgICAgICBocmVmPVwie3sgbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8udXJsRXh0ZXJuYWwgfX1cIlxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJ7eyBub2RlPy50cmVlQ29udGVudEJsb2NrPy51cmxFeHRlcm5hbFRhcmdldCB8fCAnYmxhbmsnIH19XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGF1dG9UcmFuc2xhdGUgPyAobm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWwgfCB0cmFuc2xhdGUpIDogbm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwibm9kZT8udHJlZUNvbnRlbnRCbG9jaz8ucmlnaHRDb250ZW50XCIgY2xhc3M9XCJldWktdHJlZS1ub2RlLXdyYXBwZXJfX2NvbnRhaW5lci1yaWdodFwiPlxuICAgICAgICAgICAgPCEtLWJhZGdlcyBhcmVhLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiYWRnZSBvZiBub2RlLnRyZWVDb250ZW50QmxvY2sucmlnaHRDb250ZW50Py5iYWRnZXNcIj5cbiAgICAgICAgICAgICAgICA8ZXVpLWJhZGdlIGV1aU91dGxpbmUgW2V1aVZhcmlhbnRdPVwiYmFkZ2UudHlwZUNsYXNzIHx8ICdzZWNvbmRhcnknXCIgY2xhc3M9XCJldWktdS1tbC14c1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBldWlMYWJlbD57eyBiYWRnZS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2V1aS1iYWRnZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tY2hpcHMgYXJlYS0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpcCBvZiBub2RlLnRyZWVDb250ZW50QmxvY2sucmlnaHRDb250ZW50Py5jaGlwc1wiPlxuICAgICAgICAgICAgICAgIDxldWktY2hpcFxuICAgICAgICAgICAgICAgICAgICBldWlTaXplU1xuICAgICAgICAgICAgICAgICAgICBbZXVpVmFyaWFudF09XCJjaGlwLnR5cGVDbGFzcyB8fCAnc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtldWlPdXRsaW5lXT1cImNoaXAuaXNPdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJldWktY2hpcC0tcm91bmRlZCBldWktdS1tYi1ub25lIGV1aS11LW1sLXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGV1aUxhYmVsPnt7IGNoaXAubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9ldWktY2hpcD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tQ29udGV4dCBtZW51LS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9kZS50cmVlQ29udGVudEJsb2NrLnJpZ2h0Q29udGVudD8uY29udGV4dE1lbnVNZXRhRGF0YSAmJiByaWdodENvbnRleHRNZW51VGVtcGxhdGVSZWZcIj5cbiAgICAgICAgICAgICAgICA8ZXVpLWRyb3Bkb3duIGNsYXNzPVwiZXVpLXUtbWwteHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBldWlCdXR0b24gZXVpU2l6ZVMgZXVpUm91bmRlZCBldWlJY29uQnV0dG9uIGV1aUJhc2ljQnV0dG9uIGV1aVNlY29uZGFyeSBbYXR0ci5hcmlhLWxhYmVsXT1cIidPcHRpb25zIG1lbnUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZXVpLWljb24tc3ZnIGljb249XCJlbGxpcHNpcy12ZXJ0aWNhbDpzaGFycFwiPjwvZXVpLWljb24tc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGV1aS1kcm9wZG93bi1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicmlnaHRDb250ZXh0TWVudVRlbXBsYXRlUmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IG5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnJpZ2h0Q29udGVudD8uY29udGV4dE1lbnVNZXRhRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG5vZGU/LnRyZWVDb250ZW50QmxvY2s/LnJpZ2h0Q29udGVudD8uY29udGV4dE1lbnVNZXRhRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZXVpLWRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9ldWktZHJvcGRvd24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLW1ldGFkYXRhLCB1c2VzIHRoZSBoZWxwIG9mIG5nIHRlbXBsYXRlIHRvIGdlbmVyYXRlIGR5bmFtaWMgZXhwYW5kIHZhcmlhYmxlIHdpdGhvdXQgaGFuZGxpbmcgc3RhdGUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwibm9kZS50cmVlQ29udGVudEJsb2NrPy5tZXRhZGF0YSAmJiBub2RlQ29udGVudE1ldGFkYXRhVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZUNvbnRlbnRNZXRhZGF0YUNvbnRhaW5lclwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICRpbXBsaWNpdDogeyBleHBhbmRlZDogZmFsc2UgfVxuICAgICAgICAgICAgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNub2RlQ29udGVudE1ldGFkYXRhQ29udGFpbmVyIGxldC1tZXRhRGF0YUNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBldWlCdXR0b25cbiAgICAgICAgICAgICAgICBldWlCYXNpY0J1dHRvblxuICAgICAgICAgICAgICAgIGV1aUljb25CdXR0b25cbiAgICAgICAgICAgICAgICBldWlSb3VuZGVkXG4gICAgICAgICAgICAgICAgZXVpU2l6ZVNcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiZXhwYW5kIGNvbGxhcHNlIHRyZWUgaXRlbVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1ldGFEYXRhQ29udGFpbmVyLmV4cGFuZGVkID0gIW1ldGFEYXRhQ29udGFpbmVyLmV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgPGV1aS1pY29uLXN2ZyBbaWNvbl09XCJtZXRhRGF0YUNvbnRhaW5lci5leHBhbmRlZCA/ICdjaGV2cm9uLWRvd246c2hhcnAnIDogJ2NoZXZyb24tZm9yd2FyZDpzaGFycCdcIj48L2V1aS1pY29uLXN2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1ldGFEYXRhQ29udGFpbmVyLmV4cGFuZGVkXCIgY2xhc3M9XCJldWktdHJlZS1ub2RlX19tZXRhY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDwhLS1wYXNzaW5nIG1ldGFkYXRhIG9mIHRoZSBub2RlIGNvbnRlbnQgdG8gcHJvdmlkZWQgdGVtcGxhdGUtcmVmOm5vZGVDb250ZW50TWV0YWRhdGFUZW1wbGF0ZVJlZi0tPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlQ29udGVudE1ldGFkYXRhVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBub2RlPy50cmVlQ29udGVudEJsb2NrPy5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBub2RlPy50cmVlQ29udGVudEJsb2NrPy5tZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|