UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

493 lines (492 loc) 56.6 kB
import { __decorate, __metadata } from "tslib"; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Directionality } from '@angular/cdk/bidi'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, EventEmitter, forwardRef, Host, Input, Optional, Output, SkipSelf, TemplateRef, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { treeCollapseMotion } from 'ng-zorro-antd/core/animation'; import { NzConfigService, WithConfig } from 'ng-zorro-antd/core/config'; import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation'; import { flattenTreeData, NzTreeBase, NzTreeBaseService, NzTreeHigherOrderServiceToken } from 'ng-zorro-antd/core/tree'; import { InputBoolean } from 'ng-zorro-antd/core/util'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { NzTreeService } from './tree.service'; export function NzTreeServiceFactory(higherOrderService, treeService) { return higherOrderService ? higherOrderService : treeService; } const NZ_CONFIG_MODULE_NAME = 'tree'; export class NzTreeComponent extends NzTreeBase { // Handle emit event end constructor(nzTreeService, nzConfigService, cdr, directionality, noAnimation) { super(nzTreeService); this.nzConfigService = nzConfigService; this.cdr = cdr; this.directionality = directionality; this.noAnimation = noAnimation; this._nzModuleName = NZ_CONFIG_MODULE_NAME; this.nzShowIcon = false; this.nzHideUnMatched = false; this.nzBlockNode = false; this.nzExpandAll = false; this.nzSelectMode = false; this.nzCheckStrictly = false; this.nzShowExpand = true; this.nzShowLine = false; this.nzCheckable = false; this.nzAsyncData = false; this.nzDraggable = false; this.nzMultiple = false; this.nzVirtualItemSize = 28; this.nzVirtualMaxBufferPx = 500; this.nzVirtualMinBufferPx = 28; this.nzVirtualHeight = null; this.nzData = []; this.nzExpandedKeys = []; this.nzSelectedKeys = []; this.nzCheckedKeys = []; this.nzSearchValue = ''; this.nzFlattenNodes = []; this.beforeInit = true; this.dir = 'ltr'; this.nzExpandedKeysChange = new EventEmitter(); this.nzSelectedKeysChange = new EventEmitter(); this.nzCheckedKeysChange = new EventEmitter(); this.nzSearchValueChange = new EventEmitter(); this.nzClick = new EventEmitter(); this.nzDblClick = new EventEmitter(); this.nzContextMenu = new EventEmitter(); this.nzCheckBoxChange = new EventEmitter(); this.nzExpandChange = new EventEmitter(); this.nzOnDragStart = new EventEmitter(); this.nzOnDragEnter = new EventEmitter(); this.nzOnDragOver = new EventEmitter(); this.nzOnDragLeave = new EventEmitter(); this.nzOnDrop = new EventEmitter(); this.nzOnDragEnd = new EventEmitter(); this.HIDDEN_STYLE = { width: 0, height: 0, display: 'flex', overflow: 'hidden', opacity: 0, border: 0, padding: 0, margin: 0 }; this.destroy$ = new Subject(); this.onChange = () => null; this.onTouched = () => null; } writeValue(value) { this.handleNzData(value); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } /** * Render all properties of nzTree * @param changes: all changes from @Input */ renderTreeProperties(changes) { let useDefaultExpandedKeys = false; let expandAll = false; const { nzData, nzExpandedKeys, nzSelectedKeys, nzCheckedKeys, nzCheckStrictly, nzExpandAll, nzMultiple, nzSearchValue } = changes; if (nzExpandAll) { useDefaultExpandedKeys = true; expandAll = this.nzExpandAll; } if (nzMultiple) { this.nzTreeService.isMultiple = this.nzMultiple; } if (nzCheckStrictly) { this.nzTreeService.isCheckStrictly = this.nzCheckStrictly; } if (nzData) { this.handleNzData(this.nzData); } if (nzCheckedKeys) { this.handleCheckedKeys(this.nzCheckedKeys); } if (nzCheckStrictly) { this.handleCheckedKeys(null); } if (nzExpandedKeys || nzExpandAll) { useDefaultExpandedKeys = true; this.handleExpandedKeys(expandAll || this.nzExpandedKeys); } if (nzSelectedKeys) { this.handleSelectedKeys(this.nzSelectedKeys, this.nzMultiple); } if (nzSearchValue) { if (!(nzSearchValue.firstChange && !this.nzSearchValue)) { useDefaultExpandedKeys = false; this.handleSearchValue(nzSearchValue.currentValue, this.nzSearchFunc); this.nzSearchValueChange.emit(this.nzTreeService.formatEvent('search', null, null)); } } // flatten data const currentExpandedKeys = this.getExpandedNodeList().map(v => v.key); const newExpandedKeys = useDefaultExpandedKeys ? expandAll || this.nzExpandedKeys : currentExpandedKeys; this.handleFlattenNodes(this.nzTreeService.rootNodes, newExpandedKeys); } trackByFlattenNode(_, node) { return node.key; } // Deal with properties /** * nzData * @param value */ handleNzData(value) { if (Array.isArray(value)) { const data = this.coerceTreeNodes(value); this.nzTreeService.initTree(data); } } handleFlattenNodes(data, expandKeys = []) { this.nzTreeService.flattenTreeData(data, expandKeys); } handleCheckedKeys(keys) { this.nzTreeService.conductCheck(keys, this.nzCheckStrictly); } handleExpandedKeys(keys = []) { this.nzTreeService.conductExpandedKeys(keys); } handleSelectedKeys(keys, isMulti) { this.nzTreeService.conductSelectedKeys(keys, isMulti); } handleSearchValue(value, searchFunc) { const dataList = flattenTreeData(this.nzTreeService.rootNodes, true).map(v => v.data); const checkIfMatched = (node) => { if (searchFunc) { return searchFunc(node.origin); } return !value || !node.title.toLowerCase().includes(value.toLowerCase()) ? false : true; }; dataList.forEach(v => { v.isMatched = checkIfMatched(v); v.canHide = !v.isMatched; if (!v.isMatched) { v.setExpanded(false); this.nzTreeService.setExpandedNodeList(v); } else { // expand this.nzTreeService.expandNodeAllParentBySearch(v); } this.nzTreeService.setMatchedNodeList(v); }); } /** * Handle emit event * @param event * handle each event */ eventTriggerChanged(event) { const node = event.node; switch (event.eventName) { case 'expand': this.renderTree(); this.nzExpandChange.emit(event); break; case 'click': this.nzClick.emit(event); break; case 'dblclick': this.nzDblClick.emit(event); break; case 'contextmenu': this.nzContextMenu.emit(event); break; case 'check': // Render checked state with nodes' property `isChecked` this.nzTreeService.setCheckedNodeList(node); if (!this.nzCheckStrictly) { this.nzTreeService.conduct(node); } // Cause check method will rerender list, so we need recover it and next the new event to user const eventNext = this.nzTreeService.formatEvent('check', node, event.event); this.nzCheckBoxChange.emit(eventNext); break; case 'dragstart': // if node is expanded if (node.isExpanded) { node.setExpanded(!node.isExpanded); this.renderTree(); } this.nzOnDragStart.emit(event); break; case 'dragenter': const selectedNode = this.nzTreeService.getSelectedNode(); if (selectedNode && selectedNode.key !== node.key && !node.isExpanded && !node.isLeaf) { node.setExpanded(true); this.renderTree(); } this.nzOnDragEnter.emit(event); break; case 'dragover': this.nzOnDragOver.emit(event); break; case 'dragleave': this.nzOnDragLeave.emit(event); break; case 'dragend': this.nzOnDragEnd.emit(event); break; case 'drop': this.renderTree(); this.nzOnDrop.emit(event); break; } } /** * Click expand icon */ renderTree() { this.handleFlattenNodes(this.nzTreeService.rootNodes, this.getExpandedNodeList().map(v => v.key)); this.cdr.markForCheck(); } ngOnInit() { var _a; this.nzTreeService.flattenNodes$.pipe(takeUntil(this.destroy$)).subscribe(data => { this.nzFlattenNodes = data; this.cdr.markForCheck(); }); this.dir = this.directionality.value; (_a = this.directionality.change) === null || _a === void 0 ? void 0 : _a.pipe(takeUntil(this.destroy$)).subscribe((direction) => { this.dir = direction; this.cdr.detectChanges(); }); } ngOnChanges(changes) { this.renderTreeProperties(changes); } ngAfterViewInit() { this.beforeInit = false; } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } } NzTreeComponent.decorators = [ { type: Component, args: [{ selector: 'nz-tree', exportAs: 'nzTree', animations: [treeCollapseMotion], template: ` <div role="tree"> <input [ngStyle]="HIDDEN_STYLE" /> </div> <div class="ant-tree-list" [class.ant-select-tree-list]="nzSelectMode"> <div> <cdk-virtual-scroll-viewport *ngIf="nzVirtualHeight" [class.ant-select-tree-list-holder-inner]="nzSelectMode" [class.ant-tree-list-holder-inner]="!nzSelectMode" [itemSize]="nzVirtualItemSize" [minBufferPx]="nzVirtualMinBufferPx" [maxBufferPx]="nzVirtualMaxBufferPx" [style.height]="nzVirtualHeight" > <ng-container *cdkVirtualFor="let node of nzFlattenNodes; trackBy: trackByFlattenNode"> <ng-template [ngTemplateOutlet]="nodeTemplate" [ngTemplateOutletContext]="{ $implicit: node }"></ng-template> </ng-container> </cdk-virtual-scroll-viewport> <div *ngIf="!nzVirtualHeight" [class.ant-select-tree-list-holder-inner]="nzSelectMode" [class.ant-tree-list-holder-inner]="!nzSelectMode" [@.disabled]="beforeInit || noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" [@treeCollapseMotion]="nzFlattenNodes.length" > <ng-container *ngFor="let node of nzFlattenNodes; trackBy: trackByFlattenNode"> <ng-template [ngTemplateOutlet]="nodeTemplate" [ngTemplateOutletContext]="{ $implicit: node }"></ng-template> </ng-container> </div> </div> </div> <ng-template #nodeTemplate let-treeNode> <nz-tree-node builtin [icon]="treeNode.icon" [title]="treeNode.title" [isLoading]="treeNode.isLoading" [isSelected]="treeNode.isSelected" [isDisabled]="treeNode.isDisabled" [isMatched]="treeNode.isMatched" [isExpanded]="treeNode.isExpanded" [isLeaf]="treeNode.isLeaf" [isStart]="treeNode.isStart" [isEnd]="treeNode.isEnd" [isChecked]="treeNode.isChecked" [isHalfChecked]="treeNode.isHalfChecked" [isDisableCheckbox]="treeNode.isDisableCheckbox" [isSelectable]="treeNode.isSelectable" [canHide]="treeNode.canHide" [nzTreeNode]="treeNode" [nzSelectMode]="nzSelectMode" [nzShowLine]="nzShowLine" [nzExpandedIcon]="nzExpandedIcon" [nzDraggable]="nzDraggable" [nzCheckable]="nzCheckable" [nzShowExpand]="nzShowExpand" [nzAsyncData]="nzAsyncData" [nzSearchValue]="nzSearchValue" [nzHideUnMatched]="nzHideUnMatched" [nzBeforeDrop]="nzBeforeDrop" [nzShowIcon]="nzShowIcon" [nzTreeTemplate]="nzTreeTemplate || nzTreeTemplateChild" (nzExpandChange)="eventTriggerChanged($event)" (nzClick)="eventTriggerChanged($event)" (nzDblClick)="eventTriggerChanged($event)" (nzContextMenu)="eventTriggerChanged($event)" (nzCheckBoxChange)="eventTriggerChanged($event)" (nzOnDragStart)="eventTriggerChanged($event)" (nzOnDragEnter)="eventTriggerChanged($event)" (nzOnDragOver)="eventTriggerChanged($event)" (nzOnDragLeave)="eventTriggerChanged($event)" (nzOnDragEnd)="eventTriggerChanged($event)" (nzOnDrop)="eventTriggerChanged($event)" ></nz-tree-node> </ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ NzTreeService, { provide: NzTreeBaseService, useFactory: NzTreeServiceFactory, deps: [[new SkipSelf(), new Optional(), NzTreeHigherOrderServiceToken], NzTreeService] }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzTreeComponent), multi: true } ], host: { '[class.ant-select-tree]': `nzSelectMode`, '[class.ant-select-tree-show-line]': `nzSelectMode && nzShowLine`, '[class.ant-select-tree-icon-hide]': `nzSelectMode && !nzShowIcon`, '[class.ant-select-tree-block-node]': `nzSelectMode && nzBlockNode`, '[class.ant-tree]': `!nzSelectMode`, '[class.ant-tree-rtl]': `dir === 'rtl'`, '[class.ant-tree-show-line]': `!nzSelectMode && nzShowLine`, '[class.ant-tree-icon-hide]': `!nzSelectMode && !nzShowIcon`, '[class.ant-tree-block-node]': `!nzSelectMode && nzBlockNode`, '[class.draggable-tree]': `nzDraggable` } },] } ]; NzTreeComponent.ctorParameters = () => [ { type: NzTreeBaseService }, { type: NzConfigService }, { type: ChangeDetectorRef }, { type: Directionality, decorators: [{ type: Optional }] }, { type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] } ]; NzTreeComponent.propDecorators = { nzShowIcon: [{ type: Input }], nzHideUnMatched: [{ type: Input }], nzBlockNode: [{ type: Input }], nzExpandAll: [{ type: Input }], nzSelectMode: [{ type: Input }], nzCheckStrictly: [{ type: Input }], nzShowExpand: [{ type: Input }], nzShowLine: [{ type: Input }], nzCheckable: [{ type: Input }], nzAsyncData: [{ type: Input }], nzDraggable: [{ type: Input }], nzMultiple: [{ type: Input }], nzExpandedIcon: [{ type: Input }], nzVirtualItemSize: [{ type: Input }], nzVirtualMaxBufferPx: [{ type: Input }], nzVirtualMinBufferPx: [{ type: Input }], nzVirtualHeight: [{ type: Input }], nzTreeTemplate: [{ type: Input }], nzBeforeDrop: [{ type: Input }], nzData: [{ type: Input }], nzExpandedKeys: [{ type: Input }], nzSelectedKeys: [{ type: Input }], nzCheckedKeys: [{ type: Input }], nzSearchValue: [{ type: Input }], nzSearchFunc: [{ type: Input }], nzTreeTemplateChild: [{ type: ContentChild, args: ['nzTreeTemplate', { static: true },] }], cdkVirtualScrollViewport: [{ type: ViewChild, args: [CdkVirtualScrollViewport, { read: CdkVirtualScrollViewport },] }], nzExpandedKeysChange: [{ type: Output }], nzSelectedKeysChange: [{ type: Output }], nzCheckedKeysChange: [{ type: Output }], nzSearchValueChange: [{ type: Output }], nzClick: [{ type: Output }], nzDblClick: [{ type: Output }], nzContextMenu: [{ type: Output }], nzCheckBoxChange: [{ type: Output }], nzExpandChange: [{ type: Output }], nzOnDragStart: [{ type: Output }], nzOnDragEnter: [{ type: Output }], nzOnDragOver: [{ type: Output }], nzOnDragLeave: [{ type: Output }], nzOnDrop: [{ type: Output }], nzOnDragEnd: [{ type: Output }] }; __decorate([ InputBoolean(), WithConfig(), __metadata("design:type", Boolean) ], NzTreeComponent.prototype, "nzShowIcon", void 0); __decorate([ InputBoolean(), WithConfig(), __metadata("design:type", Boolean) ], NzTreeComponent.prototype, "nzHideUnMatched", void 0); __decorate([ InputBoolean(), WithConfig(), __metadata("design:type", Boolean) ], NzTreeComponent.prototype, "nzBlockNode", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeComponent.prototype, "nzExpandAll", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeComponent.prototype, "nzSelectMode", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeComponent.prototype, "nzCheckStrictly", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeComponent.prototype, "nzShowExpand", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeComponent.prototype, "nzShowLine", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeComponent.prototype, "nzCheckable", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeComponent.prototype, "nzAsyncData", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzTreeComponent.prototype, "nzDraggable", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTreeComponent.prototype, "nzMultiple", void 0); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3RyZWUvdHJlZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBYSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQWUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pFLE9BQU8sRUFDTCxlQUFlLEVBR2YsVUFBVSxFQUNWLGlCQUFpQixFQUNqQiw2QkFBNkIsRUFJOUIsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9DLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxrQkFBcUMsRUFBRSxXQUEwQjtJQUNwRyxPQUFPLGtC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MkJBQ0wsS0FBSztxQkFDTCxLQUFLOzZCQUNMLEtBQUs7NkJBQ0wsS0FBSzs0QkFDTCxLQUFLOzRCQUNMLEtBQUs7MkJBQ0wsS0FBSztrQ0FDTCxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3VDQUMvQyxTQUFTLFNBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7bUNBS3RFLE1BQU07bUNBQ04sTUFBTTtrQ0FDTixNQUFNO2tDQUNOLE1BQU07c0JBQ04sTUFBTTt5QkFDTixNQUFNOzRCQUNOLE1BQU07K0JBQ04sTUFBTTs2QkFDTixNQUFNOzRCQUNOLE1BQU07NEJBQ04sTUFBTTsyQkFDTixNQUFNOzRCQUNOLE1BQU07dUJBQ04sTUFBTTswQkFDTixNQUFNOztBQTdDZ0M7SUFBN0IsWUFBWSxFQUFFO0lBQUUsVUFBVSxFQUFFOzttREFBNkI7QUFDNUI7SUFBN0IsWUFBWSxFQUFFO0lBQUUsVUFBVSxFQUFFOzt3REFBa0M7QUFDakM7SUFBN0IsWUFBWSxFQUFFO0lBQUUsVUFBVSxFQUFFOztvREFBOEI7QUFDM0M7SUFBZixZQUFZLEVBQUU7O29EQUFxQjtBQUNwQjtJQUFmLFlBQVksRUFBRTs7cURBQXNCO0FBQ3JCO0lBQWYsWUFBWSxFQUFFOzt3REFBeUI7QUFDeEI7SUFBZixZQUFZLEVBQUU7O3FEQUE4QjtBQUM3QjtJQUFmLFlBQVksRUFBRTs7bURBQW9CO0FBQ25CO0lBQWYsWUFBWSxFQUFFOztvREFBcUI7QUFDcEI7SUFBZixZQUFZLEVBQUU7O29EQUFxQjtBQUNwQjtJQUFmLFlBQVksRUFBRTs7b0RBQThCO0FBQzdCO0lBQWYsWUFBWSxFQUFFOzttREFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuaW1wb3J0IHsgRGlyZWN0aW9uLCBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBTa2lwU2VsZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHRyZWVDb2xsYXBzZU1vdGlvbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9hbmltYXRpb24nO1xuaW1wb3J0IHsgTnpDb25maWdLZXksIE56Q29uZmlnU2VydmljZSwgV2l0aENvbmZpZyB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuaW1wb3J0IHtcbiAgZmxhdHRlblRyZWVEYXRhLFxuICBOekZvcm1hdEJlZm9yZURyb3BFdmVudCxcbiAgTnpGb3JtYXRFbWl0RXZlbnQsXG4gIE56VHJlZUJhc2UsXG4gIE56VHJlZUJhc2VTZXJ2aWNlLFxuICBOelRyZWVIaWdoZXJPcmRlclNlcnZpY2VUb2tlbixcbiAgTnpUcmVlTm9kZSxcbiAgTnpUcmVlTm9kZUtleSxcbiAgTnpUcmVlTm9kZU9wdGlvbnNcbn0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3RyZWUnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTnpUcmVlU2VydmljZSB9IGZyb20gJy4vdHJlZS5zZXJ2aWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIE56VHJlZVNlcnZpY2VGYWN0b3J5KGhpZ2hlck9yZGVyU2VydmljZTogTnpUcmVlQmFzZVNlcnZpY2UsIHRyZWVTZXJ2aWNlOiBOelRyZWVTZXJ2aWNlKTogTnpUcmVlQmFzZVNlcnZpY2Uge1xuICByZXR1cm4gaGlnaGVyT3JkZXJTZXJ2aWNlID8gaGlnaGVyT3JkZXJTZXJ2aWNlIDogdHJlZVNlcnZpY2U7XG59XG5cbmNvbnN0IE5aX0NPTkZJR19NT0RVTEVfTkFNRTogTnpDb25maWdLZXkgPSAndHJlZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LXRyZWUnLFxuICBleHBvcnRBczogJ256VHJlZScsXG4gIGFuaW1hdGlvbnM6IFt0cmVlQ29sbGFwc2VNb3Rpb25dLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgcm9sZT1cInRyZWVcIj5cbiAgICAgIDxpbnB1dCBbbmdTdHlsZV09XCJISURERU5fU1RZTEVcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhbnQtdHJlZS1saXN0XCIgW2NsYXNzLmFudC1zZWxlY3QtdHJlZS1saXN0XT1cIm56U2VsZWN0TW9kZVwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICpuZ0lmPVwibnpWaXJ0dWFsSGVpZ2h0XCJcbiAgICAgICAgICBbY2xhc3MuYW50LXNlbGVjdC10cmVlLWxpc3QtaG9sZGVyLWlubmVyXT1cIm56U2VsZWN0TW9kZVwiXG4gICAgICAgICAgW2NsYXNzLmFudC10cmVlLWxpc3QtaG9sZGVyLWlubmVyXT1cIiFuelNlbGVjdE1vZGVcIlxuICAgICAgICAgIFtpdGVtU2l6ZV09XCJuelZpcnR1YWxJdGVtU2l6ZVwiXG4gICAgICAgICAgW21pbkJ1ZmZlclB4XT1cIm56VmlydHVhbE1pbkJ1ZmZlclB4XCJcbiAgICAgICAgICBbbWF4QnVmZmVyUHhdPVwibnpWaXJ0dWFsTWF4QnVmZmVyUHhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwibnpWaXJ0dWFsSGVpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbm9kZSBvZiBuekZsYXR0ZW5Ob2RlczsgdHJhY2tCeTogdHJhY2tCeUZsYXR0ZW5Ob2RlXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBub2RlIH1cIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCIhbnpWaXJ0dWFsSGVpZ2h0XCJcbiAgICAgICAgICBbY2xhc3MuYW50LXNlbGVjdC10cmVlLWxpc3QtaG9sZGVyLWlubmVyXT1cIm56U2VsZWN0TW9kZVwiXG4gICAgICAgICAgW2NsYXNzLmFudC10cmVlLWxpc3QtaG9sZGVyLWlubmVyXT1cIiFuelNlbGVjdE1vZGVcIlxuICAgICAgICAgIFtALmRpc2FibGVkXT1cImJlZm9yZUluaXQgfHwgbm9BbmltYXRpb24/Lm56Tm9BbmltYXRpb25cIlxuICAgICAgICAgIFtuek5vQW5pbWF0aW9uXT1cIm5vQW5pbWF0aW9uPy5uek5vQW5pbWF0aW9uXCJcbiAgICAgICAgICBbQHRyZWVDb2xsYXBzZU1vdGlvbl09XCJuekZsYXR0ZW5Ob2Rlcy5sZW5ndGhcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbm9kZSBvZiBuekZsYXR0ZW5Ob2RlczsgdHJhY2tCeTogdHJhY2tCeUZsYXR0ZW5Ob2RlXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBub2RlIH1cIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9kZVRlbXBsYXRlIGxldC10cmVlTm9kZT5cbiAgICAgIDxuei10cmVlLW5vZGVcbiAgICAgICAgYnVpbHRpblxuICAgICAgICBbaWNvbl09XCJ0cmVlTm9kZS5pY29uXCJcbiAgICAgICAgW3RpdGxlXT1cInRyZWVOb2RlLnRpdGxlXCJcbiAgICAgICAgW2lzTG9hZGluZ109XCJ0cmVlTm9kZS5pc0xvYWRpbmdcIlxuICAgICAgICBbaXNTZWxlY3RlZF09XCJ0cmVlTm9kZS5pc1NlbGVjdGVkXCJcbiAgICAgICAgW2lzRGlzYWJsZWRdPVwidHJlZU5vZGUuaXNEaXNhYmxlZFwiXG4gICAgICAgIFtpc01hdGNoZWRdPVwidHJlZU5vZGUuaXNNYXRjaGVkXCJcbiAgICAgICAgW2lzRXhwYW5kZWRdPVwidHJlZU5vZGUuaXNFeHBhbmRlZFwiXG4gICAgICAgIFtpc0xlYWZdPVwidHJlZU5vZGUuaXNMZWFmXCJcbiAgICAgICAgW2lzU3RhcnRdPVwidHJlZU5vZGUuaXNTdGFydFwiXG4gICAgICAgIFtpc0VuZF09XCJ0cmVlTm9kZS5pc0VuZFwiXG4gICAgICAgIFtpc0NoZWNrZWRdPVwidHJlZU5vZGUuaXNDaGVja2VkXCJcbiAgICAgICAgW2lzSGFsZkNoZWNrZWRdPVwidHJlZU5vZGUuaXNIYWxmQ2hlY2tlZFwiXG4gICAgICAgIFtpc0Rpc2FibGVDaGVja2JveF09XCJ0cmVlTm9kZS5pc0Rpc2FibGVDaGVja2JveFwiXG4gICAgICAgIFtpc1NlbGVjdGFibGVdPVwidHJlZU5vZGUuaXNTZWxlY3RhYmxlXCJcbiAgICAgICAgW2NhbkhpZGVdPVwidHJlZU5vZGUuY2FuSGlkZVwiXG4gICAgICAgIFtuelRyZWVOb2RlXT1cInRyZWVOb2RlXCJcbiAgICAgICAgW256U2VsZWN0TW9kZV09XCJuelNlbGVjdE1vZGVcIlxuICAgICAgICBbbnpTaG93TGluZV09XCJuelNob3dMaW5lXCJcbiAgICAgICAgW256RXhwYW5kZWRJY29uXT1cIm56RXhwYW5kZWRJY29uXCJcbiAgICAgICAgW256RHJhZ2dhYmxlXT1cIm56RHJhZ2dhYmxlXCJcbiAgICAgICAgW256Q2hlY2thYmxlXT1cIm56Q2hlY2thYmxlXCJcbiAgICAgICAgW256U2hvd0V4cGFuZF09XCJuelNob3dFeHBhbmRcIlxuICAgICAgICBbbnpBc3luY0RhdGFdPVwibnpBc3luY0RhdGFcIlxuICAgICAgICBbbnpTZWFyY2hWYWx1ZV09XCJuelNlYXJjaFZhbHVlXCJcbiAgICAgICAgW256SGlkZVVuTWF0Y2hlZF09XCJuekhpZGVVbk1hdGNoZWRcIlxuICAgICAgICBbbnpCZWZvcmVEcm9wXT1cIm56QmVmb3JlRHJvcFwiXG4gICAgICAgIFtuelNob3dJY29uXT1cIm56U2hvd0ljb25cIlxuICAgICAgICBbbnpUcmVlVGVtcGxhdGVdPVwibnpUcmVlVGVtcGxhdGUgfHwgbnpUcmVlVGVtcGxhdGVDaGlsZFwiXG4gICAgICAgIChuekV4cGFuZENoYW5nZSk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpDbGljayk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpEYmxDbGljayk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpDb250ZXh0TWVudSk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpDaGVja0JveENoYW5nZSk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpPbkRyYWdTdGFydCk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpPbkRyYWdFbnRlcik9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpPbkRyYWdPdmVyKT1cImV2ZW50VHJpZ2dlckNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChuek9uRHJhZ0xlYXZlKT1cImV2ZW50VHJpZ2dlckNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChuek9uRHJhZ0VuZCk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAobnpPbkRyb3ApPVwiZXZlbnRUcmlnZ2VyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgID48L256LXRyZWUtbm9kZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTnpUcmVlU2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOelRyZWVCYXNlU2VydmljZSxcbiAgICAgIHVzZUZhY3Rvcnk6IE56VHJlZVNlcnZpY2VGYWN0b3J5LFxuICAgICAgZGVwczogW1tuZXcgU2tpcFNlbGYoKSwgbmV3IE9wdGlvbmFsKCksIE56VHJlZUhpZ2hlck9yZGVyU2VydmljZVRva2VuXSwgTnpUcmVlU2VydmljZV1cbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnpUcmVlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWVdJzogYG56U2VsZWN0TW9kZWAsXG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWUtc2hvdy1saW5lXSc6IGBuelNlbGVjdE1vZGUgJiYgbnpTaG93TGluZWAsXG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWUtaWNvbi1oaWRlXSc6IGBuelNlbGVjdE1vZGUgJiYgIW56U2hvd0ljb25gLFxuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLWJsb2NrLW5vZGVdJzogYG56U2VsZWN0TW9kZSAmJiBuekJsb2NrTm9kZWAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZV0nOiBgIW56U2VsZWN0TW9kZWAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS1ydGxdJzogYGRpciA9PT0gJ3J0bCdgLFxuICAgICdbY2xhc3MuYW50LXRyZWUtc2hvdy1saW5lXSc6IGAhbnpTZWxlY3RNb2RlICYmIG56U2hvd0xpbmVgLFxuICAgICdbY2xhc3MuYW50LXRyZWUtaWNvbi1oaWRlXSc6IGAhbnpTZWxlY3RNb2RlICYmICFuelNob3dJY29uYCxcbiAgICAnW2NsYXNzLmFudC10cmVlLWJsb2NrLW5vZGVdJzogYCFuelNlbGVjdE1vZGUgJiYgbnpCbG9ja05vZGVgLFxuICAgICdbY2xhc3MuZHJhZ2dhYmxlLXRyZWVdJzogYG56RHJhZ2dhYmxlYFxuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56VHJlZUNvbXBvbmVudCBleHRlbmRzIE56VHJlZUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJlYWRvbmx5IF9uek1vZHVsZU5hbWU6IE56Q29uZmlnS2V5ID0gTlpfQ09ORklHX01PRFVMRV9OQU1FO1xuXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uelNob3dJY29uOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekhpZGVVbk1hdGNoZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256QmxvY2tOb2RlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekV4cGFuZEFsbDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTZWxlY3RNb2RlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekNoZWNrU3RyaWN0bHk6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256U2hvd0V4cGFuZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTaG93TGluZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpDaGVja2FibGU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256QXN5bmNEYXRhOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekRyYWdnYWJsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpNdWx0aXBsZTogQm9vbGVhbklucHV0O1xuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBAV2l0aENvbmZpZygpIG56U2hvd0ljb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIEBXaXRoQ29uZmlnKCkgbnpIaWRlVW5NYXRjaGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBAV2l0aENvbmZpZygpIG56QmxvY2tOb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekV4cGFuZEFsbCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTZWxlY3RNb2RlID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekNoZWNrU3RyaWN0bHkgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd0V4cGFuZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNob3dMaW5lID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekNoZWNrYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpBc3luY0RhdGEgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RHJhZ2dhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuek11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56RXhwYW5kZWRJY29uPzogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IE56VHJlZU5vZGU7IG9yaWdpbjogTnpUcmVlTm9kZU9wdGlvbnMgfT47XG4gIEBJbnB1dCgpIG56VmlydHVhbEl0ZW1TaXplID0gMjg7XG4gIEBJbnB1dCgpIG56VmlydHVhbE1heEJ1ZmZlclB4ID0gNTAwO1xuICBASW5wdXQoKSBuelZpcnR1YWxNaW5CdWZmZXJQeCA9IDI4O1xuICBASW5wdXQoKSBuelZpcnR1YWxIZWlnaHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuelRyZWVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBOelRyZWVOb2RlOyBvcmlnaW46IE56VHJlZU5vZGVPcHRpb25zIH0+O1xuICBASW5wdXQoKSBuekJlZm9yZURyb3A/OiAoY29uZmlybTogTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQpID0+IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIEBJbnB1dCgpIG56RGF0YTogTnpUcmVlTm9kZU9wdGlvbnNbXSB8IE56VHJlZU5vZGVbXSA9IFtdO1xuICBASW5wdXQoKSBuekV4cGFuZGVkS2V5czogTnpUcmVlTm9kZUtleVtdID0gW107XG4gIEBJbnB1dCgpIG56U2VsZWN0ZWRLZXlzOiBOelRyZWVOb2RlS2V5W10gPSBbXTtcbiAgQElucHV0KCkgbnpDaGVja2VkS2V5czogTnpUcmVlTm9kZUtleVtdID0gW107XG4gIEBJbnB1dCgpIG56U2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBuelNlYXJjaEZ1bmM/OiAobm9kZTogTnpUcmVlTm9kZU9wdGlvbnMpID0+IGJvb2xlYW47XG4gIEBDb250ZW50Q2hpbGQoJ256VHJlZVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgbnpUcmVlVGVtcGxhdGVDaGlsZCE6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBOelRyZWVOb2RlOyBvcmlnaW46IE56VHJlZU5vZGVPcHRpb25zIH0+O1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgeyByZWFkOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSkgY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0ITogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICBuekZsYXR0ZW5Ob2RlczogTnpUcmVlTm9kZVtdID0gW107XG4gIGJlZm9yZUluaXQgPSB0cnVlO1xuICBkaXI6IERpcmVjdGlvbiA9ICdsdHInO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBuekV4cGFuZGVkS2V5c0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZ1tdPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuelNlbGVjdGVkS2V5c0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZ1tdPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekNoZWNrZWRLZXlzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56U2VhcmNoVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekRibENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q29udGV4dE1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDaGVja0JveENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekV4cGFuZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyYWdPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuXG4gIEhJRERFTl9TVFlMRSA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICBvcGFjaXR5OiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIG1hcmdpbjogMFxuICB9O1xuXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBvbkNoYW5nZTogKHZhbHVlOiBOelRyZWVOb2RlW10pID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIHdyaXRlVmFsdWUodmFsdWU6IE56VHJlZU5vZGVbXSk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlTnpEYXRhKHZhbHVlKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBOelRyZWVOb2RlW10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGFsbCBwcm9wZXJ0aWVzIG9mIG56VHJlZVxuICAgKiBAcGFyYW0gY2hhbmdlczogYWxsIGNoYW5nZXMgZnJvbSBASW5wdXRcbiAgICovXG4gIHJlbmRlclRyZWVQcm9wZXJ0aWVzKGNoYW5nZXM6IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICBsZXQgdXNlRGVmYXVsdEV4cGFuZGVkS2V5cyA9IGZhbHNlO1xuICAgIGxldCBleHBhbmRBbGwgPSBmYWxzZTtcbiAgICBjb25zdCB7IG56RGF0YSwgbnpFeHBhbmRlZEtleXMsIG56U2VsZWN0ZWRLZXlzLCBuekNoZWNrZWRLZXlzLCBuekNoZWNrU3RyaWN0bHksIG56RXhwYW5kQWxsLCBuek11bHRpcGxlLCBuelNlYXJjaFZhbHVlIH0gPSBjaGFuZ2VzO1xuXG4gICAgaWYgKG56RXhwYW5kQWxsKSB7XG4gICAgICB1c2VEZWZhdWx0RXhwYW5kZWRLZXlzID0gdHJ1ZTtcbiAgICAgIGV4cGFuZEFsbCA9IHRoaXMubnpFeHBhbmRBbGw7XG4gICAgfVxuXG4gICAgaWYgKG56TXVsdGlwbGUpIHtcbiAgICAgIHRoaXMubnpUcmVlU2VydmljZS5pc011bHRpcGxlID0gdGhpcy5uek11bHRpcGxlO1xuICAgIH1cblxuICAgIGlmIChuekNoZWNrU3RyaWN0bHkpIHtcbiAgICAgIHRoaXMubnpUcmVlU2VydmljZS5pc0NoZWNrU3RyaWN0bHkgPSB0aGlzLm56Q2hlY2tTdHJpY3RseTtcbiAgICB9XG5cbiAgICBpZiAobnpEYXRhKSB7XG4gICAgICB0aGlzLmhhbmRsZU56RGF0YSh0aGlzLm56RGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKG56Q2hlY2tlZEtleXMpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2hlY2tlZEtleXModGhpcy5uekNoZWNrZWRLZXlzKTtcbiAgICB9XG5cbiAgICBpZiAobnpDaGVja1N0cmljdGx5KSB7XG4gICAgICB0aGlzLmhhbmRsZUNoZWNrZWRLZXlzKG51bGwpO1xuICAgIH1cblxuICAgIGlmIChuekV4cGFuZGVkS2V5cyB8fCBuekV4cGFuZEFsbCkge1xuICAgICAgdXNlRGVmYXVsdEV4cGFuZGVkS2V5cyA9IHRydWU7XG4gICAgICB0aGlzLmhhbmRsZUV4cGFuZGVkS2V5cyhleHBhbmRBbGwgfHwgdGhpcy5uekV4cGFuZGVkS2V5cyk7XG4gICAgfVxuXG4gICAgaWYgKG56U2VsZWN0ZWRLZXlzKSB7XG4gICAgICB0aGlzLmhhbmRsZVNlbGVjdGVkS2V5cyh0aGlzLm56U2VsZWN0ZWRLZXlzLCB0aGlzLm56TXVsdGlwbGUpO1xuICAgIH1cblxuICAgIGlmIChuelNlYXJjaFZhbHVlKSB7XG4gICAgICBpZiAoIShuelNlYXJjaFZhbHVlLmZpcnN0Q2hhbmdlICYmICF0aGlzLm56U2VhcmNoVmFsdWUpKSB7XG4gICAgICAgIHVzZURlZmF1bHRFeHBhbmRlZEtleXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2hWYWx1ZShuelNlYXJjaFZhbHVlLmN1cnJlbnRWYWx1ZSwgdGhpcy5uelNlYXJjaEZ1bmMpO1xuICAgICAgICB0aGlzLm56U2VhcmNoVmFsdWVDaGFuZ2UuZW1pdCh0aGlzLm56VHJlZVNlcnZpY2UuZm9ybWF0RXZlbnQoJ3NlYXJjaCcsIG51bGwsIG51bGwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmbGF0dGVuIGRhdGFcbiAgICBjb25zdCBjdXJyZW50RXhwYW5kZWRLZXlzID0gdGhpcy5nZXRFeHBhbmRlZE5vZGVMaXN0KCkubWFwKHYgPT4gdi5rZXkpO1xuICAgIGNvbnN0IG5ld0V4cGFuZGVkS2V5cyA9IHVzZURlZmF1bHRFeHBhbmRlZEtleXMgPyBleHBhbmRBbGwgfHwgdGhpcy5uekV4cGFuZGVkS2V5cyA6IGN1cnJlbnRFeHBhbmRlZEtleXM7XG4gI