UNPKG

ng-zorro-antd

Version:

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

644 lines 50 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * 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 { forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, EventEmitter, Host, Input, Optional, Output, SkipSelf, TemplateRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { ReplaySubject, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { isNotNil, toBoolean, warnDeprecation, InputBoolean, NzNoAnimationDirective, NzTreeBase, NzTreeBaseService, NzTreeHigherOrderServiceToken } from 'ng-zorro-antd/core'; import { NzTreeService } from './nz-tree.service'; /** * @param {?} higherOrderService * @param {?} treeService * @return {?} */ export function NzTreeServiceFactory(higherOrderService, treeService) { return higherOrderService ? higherOrderService : treeService; } var NzTreeComponent = /** @class */ (function (_super) { tslib_1.__extends(NzTreeComponent, _super); function NzTreeComponent(nzTreeService, cdr, noAnimation) { var _this = _super.call(this, nzTreeService) || this; _this.cdr = cdr; _this.noAnimation = noAnimation; _this.nzShowIcon = false; _this.nzShowExpand = true; _this.nzShowLine = false; _this.nzCheckable = false; _this.nzAsyncData = false; _this.nzDraggable = false; _this.nzHideUnMatched = false; _this.nzSelectMode = false; _this.nzCheckStrictly = false; _this.nzBlockNode = false; _this.nzExpandAll = false; _this._nzDefaultExpandAll = false; _this.nzExpandedKeysChange = new EventEmitter(); _this.nzSelectedKeysChange = new EventEmitter(); _this.nzCheckedKeysChange = new EventEmitter(); _this.nzSearchValueChange = new EventEmitter(); /** * @deprecated use `nzSearchValueChange` instead. */ _this.nzOnSearchNode = 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._nzMultiple = false; _this.nzDefaultSubject = new ReplaySubject(6); _this.destroy$ = new Subject(); _this.prefixCls = 'ant-tree'; _this.classMap = {}; _this.onChange = (/** * @return {?} */ function () { return null; }); _this.onTouched = (/** * @return {?} */ function () { return null; }); return _this; } Object.defineProperty(NzTreeComponent.prototype, "nzDefaultExpandAll", { get: /** * @return {?} */ function () { return this._nzDefaultExpandAll; }, /** * @deprecated 9.0.0 use `nzExpandAll` instead. */ set: /** * @deprecated 9.0.0 use `nzExpandAll` instead. * @param {?} value * @return {?} */ function (value) { warnDeprecation("'nzDefaultExpandAll' would be removed in 9.0.0. Please use 'nzExpandAll' instead."); this._nzDefaultExpandAll = value; }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzMultiple", { get: /** * @return {?} */ function () { return this._nzMultiple; }, set: /** * @param {?} value * @return {?} */ function (value) { this._nzMultiple = toBoolean(value); this.nzTreeService.isMultiple = toBoolean(value); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzData", { set: /** * @param {?} value * @return {?} */ function (value) { this.initNzData(value); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzDefaultExpandedKeys", { /** * @deprecated 9.0.0 - use `nzExpandedKeys` instead. */ set: /** * @deprecated 9.0.0 - use `nzExpandedKeys` instead. * @param {?} value * @return {?} */ function (value) { warnDeprecation("'nzDefaultExpandedKeys' would be removed in 9.0.0. Please use 'nzExpandedKeys' instead."); this.nzDefaultSubject.next({ type: 'nzExpandedKeys', keys: value }); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzDefaultSelectedKeys", { /** * @deprecated 9.0.0 - use `nzSelectedKeys` instead. */ set: /** * @deprecated 9.0.0 - use `nzSelectedKeys` instead. * @param {?} value * @return {?} */ function (value) { warnDeprecation("'nzDefaultSelectedKeys' would be removed in 9.0.0. Please use 'nzSelectedKeys' instead."); this.nzDefaultSubject.next({ type: 'nzSelectedKeys', keys: value }); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzDefaultCheckedKeys", { /** * @deprecated 9.0.0 - use `nzCheckedKeys` instead. */ set: /** * @deprecated 9.0.0 - use `nzCheckedKeys` instead. * @param {?} value * @return {?} */ function (value) { warnDeprecation("'nzDefaultCheckedKeys' would be removed in 9.0.0. Please use 'nzCheckedKeys' instead."); this.nzDefaultSubject.next({ type: 'nzCheckedKeys', keys: value }); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzExpandedKeys", { set: /** * @param {?} value * @return {?} */ function (value) { this.nzDefaultSubject.next({ type: 'nzExpandedKeys', keys: value }); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzSelectedKeys", { set: /** * @param {?} value * @return {?} */ function (value) { this.nzDefaultSubject.next({ type: 'nzSelectedKeys', keys: value }); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzCheckedKeys", { set: /** * @param {?} value * @return {?} */ function (value) { this.nzDefaultSubject.next({ type: 'nzCheckedKeys', keys: value }); }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzSearchValue", { get: /** * @return {?} */ function () { return this._searchValue; }, set: /** * @param {?} value * @return {?} */ function (value) { this._searchValue = value; this.nzTreeService.searchExpand(value); if (isNotNil(value)) { this.nzSearchValueChange.emit(this.nzTreeService.formatEvent('search', null, null)); this.nzOnSearchNode.emit(this.nzTreeService.formatEvent('search', null, null)); warnDeprecation("'nzOnSearchNode' would be deprecated in 9.0.0. Please use 'nzSearchValueChange' instead."); } }, enumerable: true, configurable: true }); Object.defineProperty(NzTreeComponent.prototype, "nzNodes", { /** * To render nodes if root is changed. */ get: /** * To render nodes if root is changed. * @return {?} */ function () { return this.nzTreeService.rootNodes; }, enumerable: true, configurable: true }); /** * @return {?} */ NzTreeComponent.prototype.setClassMap = /** * @return {?} */ function () { var _a; this.classMap = (_a = {}, _a[this.prefixCls] = true, _a[this.prefixCls + '-show-line'] = this.nzShowLine, _a[this.prefixCls + "-icon-hide"] = !this.nzShowIcon, _a[this.prefixCls + "-block-node"] = this.nzBlockNode, _a['draggable-tree'] = this.nzDraggable, _a['ant-select-tree'] = this.nzSelectMode, _a); }; /** * @param {?} value * @return {?} */ NzTreeComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this.initNzData(value); }; /** * @param {?} fn * @return {?} */ NzTreeComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ NzTreeComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; // tslint:disable-next-line:no-any // tslint:disable-next-line:no-any /** * @param {?} value * @return {?} */ NzTreeComponent.prototype.initNzData = // tslint:disable-next-line:no-any /** * @param {?} value * @return {?} */ function (value) { if (Array.isArray(value)) { this.nzTreeService.isCheckStrictly = this.nzCheckStrictly; this.nzTreeService.isMultiple = this.nzMultiple; this.nzTreeService.initTree(this.coerceTreeNodes(value)); } }; /** * @return {?} */ NzTreeComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.setClassMap(); this.nzDefaultSubject.pipe(takeUntil(this.destroy$)).subscribe((/** * @param {?} data * @return {?} */ function (data) { if (!data || !data.keys) { return; } switch (data.type) { case 'nzExpandedKeys': _this.nzTreeService.calcExpandedKeys(data.keys, _this.nzNodes); _this.nzExpandedKeysChange.emit(data.keys); break; case 'nzSelectedKeys': _this.nzTreeService.calcSelectedKeys(data.keys, _this.nzNodes, _this.nzMultiple); _this.nzSelectedKeysChange.emit(data.keys); break; case 'nzCheckedKeys': _this.nzTreeService.calcCheckedKeys(data.keys, _this.nzNodes, _this.nzCheckStrictly); _this.nzCheckedKeysChange.emit(data.keys); break; } _this.cdr.markForCheck(); })); this.nzTreeService .eventTriggerChanged() .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} data * @return {?} */ function (data) { switch (data.eventName) { case 'expand': _this.nzExpandChange.emit(data); break; case 'click': _this.nzClick.emit(data); break; case 'check': _this.nzCheckBoxChange.emit(data); break; case 'dblclick': _this.nzDblClick.emit(data); break; case 'contextmenu': _this.nzContextMenu.emit(data); break; // drag drop case 'dragstart': _this.nzOnDragStart.emit(data); break; case 'dragenter': _this.nzOnDragEnter.emit(data); break; case 'dragover': _this.nzOnDragOver.emit(data); break; case 'dragleave': _this.nzOnDragLeave.emit(data); break; case 'drop': _this.nzOnDrop.emit(data); break; case 'dragend': _this.nzOnDragEnd.emit(data); break; } })); }; /** * @param {?} changes * @return {?} */ NzTreeComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes.nzCheckStrictly) { this.nzTreeService.isCheckStrictly = toBoolean(changes.nzCheckStrictly.currentValue); } if (changes.nzMultiple) { this.nzTreeService.isMultiple = toBoolean(changes.nzMultiple.currentValue); } }; /** * @return {?} */ NzTreeComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroy$.next(); this.destroy$.complete(); }; NzTreeComponent.decorators = [ { type: Component, args: [{ selector: 'nz-tree', exportAs: 'nzTree', template: "<ul\n role=\"tree\"\n unselectable=\"on\"\n [ngClass]=\"classMap\">\n <ng-container *ngFor=\"let node of nzNodes\">\n <nz-tree-node\n [nzTreeNode]=\"node\"\n [nzSelectMode]=\"nzSelectMode\"\n [nzShowLine]=\"nzShowLine\"\n [nzExpandedIcon]=\"nzExpandedIcon\"\n [nzDraggable]=\"nzDraggable\"\n [nzCheckable]=\"nzCheckable\"\n [nzShowExpand]=\"nzShowExpand\"\n [nzAsyncData]=\"nzAsyncData\"\n [nzSearchValue]=\"nzSearchValue\"\n [nzHideUnMatched]=\"nzHideUnMatched\"\n [nzBeforeDrop]=\"nzBeforeDrop\"\n [nzExpandAll]=\"nzExpandAll\"\n [nzDefaultExpandAll]=\"nzDefaultExpandAll\"\n [nzShowIcon]=\"nzShowIcon\"\n [nzTreeTemplate]=\"nzTreeTemplate\"\n [nzNoAnimation]=\"noAnimation?.nzNoAnimation\">\n </nz-tree-node>\n </ng-container>\n</ul>", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ NzTreeService, { provide: NzTreeBaseService, useFactory: NzTreeServiceFactory, deps: [[new SkipSelf(), new Optional(), NzTreeHigherOrderServiceToken], NzTreeService] }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return NzTreeComponent; })), multi: true } ] }] } ]; /** @nocollapse */ NzTreeComponent.ctorParameters = function () { return [ { type: NzTreeBaseService }, { type: ChangeDetectorRef }, { type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] } ]; }; NzTreeComponent.propDecorators = { nzShowIcon: [{ type: Input }], nzShowExpand: [{ type: Input }], nzShowLine: [{ type: Input }], nzExpandedIcon: [{ type: Input }], nzCheckable: [{ type: Input }], nzAsyncData: [{ type: Input }], nzDraggable: [{ type: Input }], nzHideUnMatched: [{ type: Input }], nzSelectMode: [{ type: Input }], nzCheckStrictly: [{ type: Input }], nzBlockNode: [{ type: Input }], nzTreeTemplate: [{ type: Input }, { type: ContentChild, args: ['nzTreeTemplate', { static: true },] }], nzExpandAll: [{ type: Input }], nzDefaultExpandAll: [{ type: Input }], nzBeforeDrop: [{ type: Input }], nzMultiple: [{ type: Input }], nzData: [{ type: Input }], nzDefaultExpandedKeys: [{ type: Input }], nzDefaultSelectedKeys: [{ type: Input }], nzDefaultCheckedKeys: [{ type: Input }], nzExpandedKeys: [{ type: Input }], nzSelectedKeys: [{ type: Input }], nzCheckedKeys: [{ type: Input }], nzSearchValue: [{ type: Input }], nzExpandedKeysChange: [{ type: Output }], nzSelectedKeysChange: [{ type: Output }], nzCheckedKeysChange: [{ type: Output }], nzSearchValueChange: [{ type: Output }], nzOnSearchNode: [{ 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 }] }; tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzShowIcon", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzShowExpand", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzShowLine", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzCheckable", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzAsyncData", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzDraggable", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzHideUnMatched", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzSelectMode", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzCheckStrictly", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzBlockNode", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzTreeComponent.prototype, "nzExpandAll", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Boolean), tslib_1.__metadata("design:paramtypes", [Boolean]) ], NzTreeComponent.prototype, "nzDefaultExpandAll", null); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Boolean), tslib_1.__metadata("design:paramtypes", [Boolean]) ], NzTreeComponent.prototype, "nzMultiple", null); return NzTreeComponent; }(NzTreeBase)); export { NzTreeComponent }; if (false) { /** @type {?} */ NzTreeComponent.prototype.nzShowIcon; /** @type {?} */ NzTreeComponent.prototype.nzShowExpand; /** @type {?} */ NzTreeComponent.prototype.nzShowLine; /** @type {?} */ NzTreeComponent.prototype.nzExpandedIcon; /** @type {?} */ NzTreeComponent.prototype.nzCheckable; /** @type {?} */ NzTreeComponent.prototype.nzAsyncData; /** @type {?} */ NzTreeComponent.prototype.nzDraggable; /** @type {?} */ NzTreeComponent.prototype.nzHideUnMatched; /** @type {?} */ NzTreeComponent.prototype.nzSelectMode; /** @type {?} */ NzTreeComponent.prototype.nzCheckStrictly; /** @type {?} */ NzTreeComponent.prototype.nzBlockNode; /** @type {?} */ NzTreeComponent.prototype.nzTreeTemplate; /** @type {?} */ NzTreeComponent.prototype.nzExpandAll; /** * @type {?} * @private */ NzTreeComponent.prototype._nzDefaultExpandAll; /** @type {?} */ NzTreeComponent.prototype.nzBeforeDrop; /** @type {?} */ NzTreeComponent.prototype.nzExpandedKeysChange; /** @type {?} */ NzTreeComponent.prototype.nzSelectedKeysChange; /** @type {?} */ NzTreeComponent.prototype.nzCheckedKeysChange; /** @type {?} */ NzTreeComponent.prototype.nzSearchValueChange; /** * @deprecated use `nzSearchValueChange` instead. * @type {?} */ NzTreeComponent.prototype.nzOnSearchNode; /** @type {?} */ NzTreeComponent.prototype.nzClick; /** @type {?} */ NzTreeComponent.prototype.nzDblClick; /** @type {?} */ NzTreeComponent.prototype.nzContextMenu; /** @type {?} */ NzTreeComponent.prototype.nzCheckBoxChange; /** @type {?} */ NzTreeComponent.prototype.nzExpandChange; /** @type {?} */ NzTreeComponent.prototype.nzOnDragStart; /** @type {?} */ NzTreeComponent.prototype.nzOnDragEnter; /** @type {?} */ NzTreeComponent.prototype.nzOnDragOver; /** @type {?} */ NzTreeComponent.prototype.nzOnDragLeave; /** @type {?} */ NzTreeComponent.prototype.nzOnDrop; /** @type {?} */ NzTreeComponent.prototype.nzOnDragEnd; /** @type {?} */ NzTreeComponent.prototype._searchValue; /** @type {?} */ NzTreeComponent.prototype._nzMultiple; /** @type {?} */ NzTreeComponent.prototype.nzDefaultSubject; /** @type {?} */ NzTreeComponent.prototype.destroy$; /** @type {?} */ NzTreeComponent.prototype.prefixCls; /** @type {?} */ NzTreeComponent.prototype.classMap; /** @type {?} */ NzTreeComponent.prototype.onChange; /** @type {?} */ NzTreeComponent.prototype.onTouched; /** * @type {?} * @private */ NzTreeComponent.prototype.cdr; /** @type {?} */ NzTreeComponent.prototype.noAnimation; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkL3RyZWUvIiwic291cmNlcyI6WyJuei10cmVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osSUFBSSxFQUNKLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFFBQVEsRUFDUixXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBYyxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUdaLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLDZCQUE2QixFQUU5QixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7O0FBRWxELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsa0JBQXFDLEVBQ3JDLFdBQTBCO0lBRTFCLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDL0QsQ0FBQztBQUVEO0lBbUJxQywyQ0FBVTtJQXVMN0MseUJBQ0UsYUFBZ0MsRUFDeEIsR0FBc0IsRUFDSCxXQUFvQztRQUhqRSxZQUtFLGtCQUFNLGFBQWEsQ0FBQyxTQUNyQjtRQUpTLFNBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ0gsaUJBQVcsR0FBWCxXQUFXLENBQXlCO1FBekx4QyxnQkFB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MENBQWlEOztJQUNqRCx1Q0FBOEM7O0lBQzlDLDBDQUFpRDs7SUFDakQsc0NBQTZDOztJQUU3Qyx5Q0FBa0g7O0lBRWxILHNDQUE2Qzs7Ozs7SUFnQjdDLDhDQUFvQzs7SUFFcEMsdUNBQWlGOztJQW1GakYsK0NBQStGOztJQUMvRiwrQ0FBK0Y7O0lBQy9GLDhDQUE4Rjs7SUFFOUYsOENBQStFOzs7OztJQUsvRSx5Q0FBMEU7O0lBRTFFLGtDQUFtRTs7SUFDbkUscUNBQXNFOztJQUN0RSx3Q0FBeUU7O0lBQ3pFLDJDQUE0RTs7SUFDNUUseUNBQTBFOztJQUUxRSx3Q0FBeUU7O0lBQ3pFLHdDQUF5RTs7SUFDekUsdUNBQXdFOztJQUN4RSx3Q0FBeUU7O0lBQ3pFLG1DQUFvRTs7SUFDcEUsc0NBQXVFOztJQUV2RSx1Q0FBcUI7O0lBQ3JCLHNDQUE2Qjs7SUFDN0IsMkNBQTBFOztJQUMxRSxtQ0FBeUI7O0lBQ3pCLG9DQUF1Qjs7SUFDdkIsbUNBQWM7O0lBRWQsbUNBQXFEOztJQUNyRCxvQ0FBbUM7Ozs7O0lBb0NqQyw4QkFBOEI7O0lBQzlCLHNDQUErRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBmb3J3YXJkUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFNraXBTZWxmLFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgaXNOb3ROaWwsXG4gIHRvQm9vbGVhbixcbiAgd2FybkRlcHJlY2F0aW9uLFxuICBJbnB1dEJvb2xlYW4sXG4gIE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50LFxuICBOekZvcm1hdEVtaXRFdmVudCxcbiAgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSxcbiAgTnpUcmVlQmFzZSxcbiAgTnpUcmVlQmFzZVNlcnZpY2UsXG4gIE56VHJlZUhpZ2hlck9yZGVyU2VydmljZVRva2VuLFxuICBOelRyZWVOb2RlXG59IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZSc7XG5cbmltcG9ydCB7IE56VHJlZVNlcnZpY2UgfSBmcm9tICcuL256LXRyZWUuc2VydmljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBOelRyZWVTZXJ2aWNlRmFjdG9yeShcbiAgaGlnaGVyT3JkZXJTZXJ2aWNlOiBOelRyZWVCYXNlU2VydmljZSxcbiAgdHJlZVNlcnZpY2U6IE56VHJlZVNlcnZpY2Vcbik6IE56VHJlZUJhc2VTZXJ2aWNlIHtcbiAgcmV0dXJuIGhpZ2hlck9yZGVyU2VydmljZSA/IGhpZ2hlck9yZGVyU2VydmljZSA6IHRyZWVTZXJ2aWNlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei10cmVlJyxcbiAgZXhwb3J0QXM6ICduelRyZWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbnotdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICBOelRyZWVTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE56VHJlZUJhc2VTZXJ2aWNlLFxuICAgICAgdXNlRmFjdG9yeTogTnpUcmVlU2VydmljZUZhY3RvcnksXG4gICAgICBkZXBzOiBbW25ldyBTa2lwU2VsZigpLCBuZXcgT3B0aW9uYWwoKSwgTnpUcmVlSGlnaGVyT3JkZXJTZXJ2aWNlVG9rZW5dLCBOelRyZWVTZXJ2aWNlXVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOelRyZWVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTnpUcmVlQ29tcG9uZW50IGV4dGVuZHMgTnpUcmVlQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd0ljb24gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd0V4cGFuZCA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNob3dMaW5lID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56RXhwYW5kZWRJY29uOiBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogTnpUcmVlTm9kZSB9PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56Q2hlY2thYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekFzeW5jRGF0YSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpEcmFnZ2FibGUgPSBmYWxzZTtcblxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpIaWRlVW5NYXRjaGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNlbGVjdE1vZGUgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56Q2hlY2tTdHJpY3RseSA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpCbG9ja05vZGUgPSBmYWxzZTtcblxuICBASW5wdXQoKSBAQ29udGVudENoaWxkKCduelRyZWVUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIG56VHJlZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogTnpUcmVlTm9kZSB9PjtcblxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpFeHBhbmRBbGwgPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgOS4wLjAgdXNlIGBuekV4cGFuZEFsbGAgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIEBJbnB1dEJvb2xlYW4oKVxuICBzZXQgbnpEZWZhdWx0RXhwYW5kQWxsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgd2FybkRlcHJlY2F0aW9uKGAnbnpEZWZhdWx0RXhwYW5kQWxsJyB3b3VsZCBiZSByZW1vdmVkIGluIDkuMC4wLiBQbGVhc2UgdXNlICduekV4cGFuZEFsbCcgaW5zdGVhZC5gKTtcbiAgICB0aGlzLl9uekRlZmF1bHRFeHBhbmRBbGwgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBuekRlZmF1bHRFeHBhbmRBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX256RGVmYXVsdEV4cGFuZEFsbDtcbiAgfVxuXG4gIHByaXZhdGUgX256RGVmYXVsdEV4cGFuZEFsbCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG56QmVmb3JlRHJvcDogKGNvbmZpcm06IE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50KSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIEBJbnB1dCgpXG4gIEBJbnB1dEJvb2xlYW4oKVxuICBzZXQgbnpNdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX256TXVsdGlwbGUgPSB0b0Jvb2xlYW4odmFsdWUpO1xuICAgIHRoaXMubnpUcmVlU2VydmljZS5pc011bHRpcGxlID0gdG9Cb29sZWFuKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBuek11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9uek11bHRpcGxlO1xuICB9XG5cbiAgQElucHV0KClcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBzZXQgbnpEYXRhKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuaW5pdE56RGF0YSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgOS4wLjAgLSB1c2UgYG56RXhwYW5kZWRLZXlzYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG56RGVmYXVsdEV4cGFuZGVkS2V5cyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB3YXJuRGVwcmVjYXRpb24oYCduekRlZmF1bHRFeHBhbmRlZEtleXMnIHdvdWxkIGJlIHJlbW92ZWQgaW4gOS4wLjAuIFBsZWFzZSB1c2UgJ256RXhwYW5kZWRLZXlzJyBpbnN0ZWFkLmApO1xuICAgIHRoaXMubnpEZWZhdWx0U3ViamVjdC5uZXh0KHsgdHlwZTogJ256RXhwYW5kZWRLZXlzJywga2V5czogdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgOS4wLjAgLSB1c2UgYG56U2VsZWN0ZWRLZXlzYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG56RGVmYXVsdFNlbGVjdGVkS2V5cyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB3YXJuRGVwcmVjYXRpb24oYCduekRlZmF1bHRTZWxlY3RlZEtleXMnIHdvdWxkIGJlIHJlbW92ZWQgaW4gOS4wLjAuIFBsZWFzZSB1c2UgJ256U2VsZWN0ZWRLZXlzJyBpbnN0ZWFkLmApO1xuICAgIHRoaXMubnpEZWZhdWx0U3ViamVjdC5uZXh0KHsgdHlwZTogJ256U2VsZWN0ZWRLZXlzJywga2V5czogdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgOS4wLjAgLSB1c2UgYG56Q2hlY2tlZEtleXNgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbnpEZWZhdWx0Q2hlY2tlZEtleXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgd2FybkRlcHJlY2F0aW9uKGAnbnpEZWZhdWx0Q2hlY2tlZEtleXMnIHdvdWxkIGJlIHJlbW92ZWQgaW4gOS4wLjAuIFBsZWFzZSB1c2UgJ256Q2hlY2tlZEtleXMnIGluc3RlYWQuYCk7XG4gICAgdGhpcy5uekRlZmF1bHRTdWJqZWN0Lm5leHQoeyB0eXBlOiAnbnpDaGVja2VkS2V5cycsIGtleXM6IHZhbHVlIH0pO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IG56RXhwYW5kZWRLZXlzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubnpEZWZhdWx0U3ViamVjdC5uZXh0KHsgdHlwZTogJ256RXhwYW5kZWRLZXlzJywga2V5czogdmFsdWUgfSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgbnpTZWxlY3RlZEtleXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uekRlZmF1bHRTdWJqZWN0Lm5leHQoeyB0eXBlOiAnbnpTZWxlY3RlZEtleXMnLCBrZXlzOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBuekNoZWNrZWRLZXlzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubnpEZWZhdWx0U3ViamVjdC5uZXh0KHsgdHlwZTogJ256Q2hlY2tlZEtleXMnLCBrZXlzOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBuelNlYXJjaFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubnpUcmVlU2VydmljZS5zZWFyY2hFeHBhbmQodmFsdWUpO1xuICAgIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMubnpTZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KHRoaXMubnpUcmVlU2VydmljZS5mb3JtYXRFdmVudCgnc2VhcmNoJywgbnVsbCwgbnVsbCkpO1xuICAgICAgdGhpcy5uek9uU2VhcmNoTm9kZS5lbWl0KHRoaXMubnpUcmVlU2VydmljZS5mb3JtYXRFdmVudCgnc2VhcmNoJywgbnVsbCwgbnVsbCkpO1xuICAgICAgd2FybkRlcHJlY2F0aW9uKGAnbnpPblNlYXJjaE5vZGUnIHdvdWxkIGJlIGRlcHJlY2F0ZWQgaW4gOS4wLjAuIFBsZWFzZSB1c2UgJ256U2VhcmNoVmFsdWVDaGFuZ2UnIGluc3RlYWQuYCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG56U2VhcmNoVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVG8gcmVuZGVyIG5vZGVzIGlmIHJvb3QgaXMgY2hhbmdlZC5cbiAgICovXG4gIGdldCBuek5vZGVzKCk6IE56VHJlZU5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubnpUcmVlU2VydmljZS5yb290Tm9kZXM7XG4gIH1cblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpFeHBhbmRlZEtleXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpTZWxlY3RlZEtleXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDaGVja2VkS2V5c0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZ1tdPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56U2VhcmNoVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYG56U2VhcmNoVmFsdWVDaGFuZ2VgIGluc3RlYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPblNlYXJjaE5vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBuekNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56RGJsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDb250ZXh0TWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekNoZWNrQm94Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56RXhwYW5kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ0VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnT3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ0xlYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25Ecm9wID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcblxuICBfc2VhcmNoVmFsdWU6IHN0cmluZztcbiAgX256TXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbnpEZWZhdWx0U3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PHsgdHlwZTogc3RyaW5nOyBrZXlzOiBzdHJpbmdbXSB9Pig2KTtcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcmVmaXhDbHMgPSAnYW50LXRyZWUnO1xuICBjbGFzc01hcCA9IHt9O1xuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IE56VHJlZU5vZGVbXSkgPT4gdm9pZCA9ICgpID0+IG51bGw7XG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IG51bGw7XG5cbiAgc2V0Q2xhc3NNYXAoKTogdm9pZCB7XG4gICAgdGhpcy5jbGFzc01hcCA9IHtcbiAgICAgIFt0aGlzLnByZWZpeENsc106IHRydWUsXG4gICAgICBbdGhpcy5wcmVmaXhDbHMgKyAnLXNob3ctbGluZSddOiB0aGlzLm56U2hvd0xpbmUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWljb24taGlkZWBdOiAhdGhpcy5uelNob3dJY29uLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1ibG9jay1ub2RlYF06IHRoaXMubnpCbG9ja05vZGUsXG4gICAgICBbJ2RyYWdnYWJsZS10cmVlJ106IHRoaXMubnpEcmFnZ2FibGUsXG4gICAgICBbJ2FudC1zZWxlY3QtdHJlZSddOiB0aGlzLm56U2VsZWN0TW9kZVxuICAgIH07XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBOelRyZWVOb2RlW10pOiB2b2lkIHtcbiAgICB0aGlzLmluaXROekRhdGEodmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IE56VHJlZU5vZGVbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgaW5pdE56RGF0YSh2YWx1ZTogYW55W10pOiB2b2lkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMubnpUcmVlU2VydmljZS5pc0NoZWNrU3RyaWN0bHkgPSB0aGlzLm56Q2hlY2tTdHJpY3RseTtcbiAgICAgIHRoaXMubnpUcmVlU2VydmljZS5pc011bHRpcGxlID0gdGhpcy5uek11bHRpcGxlO1xuICAgICAgdGhpcy5uelRyZWVTZXJ2aWNlLmluaXRUcmVlKHRoaXMuY29lcmNlVHJlZU5vZGVzKHZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbnpUcmVlU2VydmljZTogTnpUcmVlQmFzZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBIb3N0KCkgQE9wdGlvbmFsKCkgcHVibGljIG5vQW5pbWF0aW9uPzogTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZVxuICApIHtcbiAgICBzdXBlcihuelRyZWVTZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgICB0aGlzLm56RGVmYXVsdFN1YmplY3QucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGF0YTogeyB0eXBlOiBzdHJpbmc7IGtleXM6IHN0cmluZ1tdIH0pID0+IHtcbiAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5rZXlzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ256RXhwYW5kZWRLZXlzJzpcbiAgICAgICAgICB0aGlzLm56VHJlZVNlcnZpY2UuY2FsY0V4cGFuZGVkS2V5cyhkYXRhLmtleXMsIHRoaXMubnpOb2Rlcyk7XG4gICAgICAgICAgdGhpcy5uekV4cGFuZGVkS2V5c0NoYW5nZS5lbWl0KGRhdGEua2V5cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ256U2VsZWN0ZWRLZXlzJzpcbiAgICAgICAgICB0aGlzLm56VHJlZVNlcnZpY2UuY2FsY1NlbGVjdGVkS2V5cyhkYXRhLmtleXMsIHRoaXMubnpOb2RlcywgdGhpcy5uek11bHRpcGxlKTtcbiAgICAgICAgICB0aGlzLm56U2VsZWN0ZWRLZXlzQ2hhbmdlLmVtaXQoZGF0YS5rZXlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbnpDaGVja2VkS2V5cyc6XG4gICAgICAgICAgdGhpcy5uelRyZWVTZXJ2aWNlLmNhbGNDaGVja2VkS2V5cyhkYXRhLmtleXMsIHRoaXMubnpOb2RlcywgdGhpcy5uekNoZWNrU3RyaWN0bHkpO1xuICAgICAgICAgIHRoaXMubnpDaGVja2VkS2V5c0NoYW5nZS5lbWl0KGRhdGEua2V5cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgICB0aGlzLm56VHJlZVNlcnZpY2VcbiAgICAgIC5ldmVudFRyaWdnZXJDaGFuZ2VkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YS5ldmVudE5hbWUpIHtcbiAgICAgICAgICBjYXNlICdleHBhbmQnOlxuICAgICAgICAgICAgdGhpcy5uekV4cGFuZENoYW5nZS5lbWl0KGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnY2xpY2snOlxuICAgICAgICAgICAgdGhpcy5uekNsaWNrLmVtaXQoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdjaGVjayc6XG4gICAgICAgICAgICB0aGlzLm56Q2hlY2tCb3hDaGFuZ2UuZW1pdChkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICAgICAgICAgIHRoaXMubnpEYmxDbGljay5lbWl0KGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgICAgICAgICAgdGhpcy5uekNvbnRleHRNZW51LmVtaXQoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBkcmFnIGRyb3BcbiAgICAgICAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgICAgICAgICAgdGhpcy5uek9uRHJhZ1N0YXJ0LmVtaXQoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAgICAgICAgdGhpcy5uek9uRHJhZ0VudGVyLmVtaXQoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgICAgICAgICB0aGlzLm56T25EcmFnT3Zlci5lbWl0KGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgICAgICAgIHRoaXMubnpPbkRyYWdMZWF2ZS5lbWl0KGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJvcCc6XG4gICAgICAgICAgICB0aGlzLm56T25Ecm9wLmVtaXQoZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgICAgICAgIHRoaXMubnpPbkRyYWdFbmQuZW1pdChkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH0pOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5uekNoZWNrU3RyaWN0bHkpIHtcbiAgICAgIHRoaXMubnpUcmVlU2VydmljZS5pc0NoZWNrU3RyaWN0bHkgPSB0b0Jvb2xlYW4oY2hhbmdlcy5uekNoZWNrU3RyaWN0bHkuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMubnpNdWx0aXBsZSkge1xuICAgICAgdGhpcy5uelRyZWVTZXJ2aWNlLmlzTXVsdGlwbGUgPSB0b0Jvb2xlYW4oY2hhbmdlcy5uek11bHRpcGxlLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=