UNPKG

@nova-ui/dashboards

Version:

Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and

111 lines 17.1 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { ChangeDetectionStrategy, Component, Inject, Input, Optional, } from "@angular/core"; import { Subject } from "rxjs"; import { debounceTime, takeUntil } from "rxjs/operators"; import { EventBus } from "@nova-ui/bits"; import { REFRESH, WIDGET_SEARCH } from "../../services/types"; import { DATA_SOURCE, PIZZAGNA_EVENT_BUS } from "../../types"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@nova-ui/bits"; export class WidgetSearchComponent { static { this.lateLoadKey = "WidgetSearchComponent"; } static { this.defaultSearchDebounce = 500; } constructor(dataSource, eventBus) { this.dataSource = dataSource; this.eventBus = eventBus; this.enabled = false; this.searchTerm$ = new Subject(); this.destroy$ = new Subject(); } ngOnInit() { if (this.dataSource.features?.getSupportedFeatures()?.search?.enabled) { this.enabled = true; } this.registerFilters(); this.handleSearchTermSubscription(this.configuration?.searchOnKeyUp); } ngOnChanges(changes) { if (changes.configuration) { const searchCfg = changes.configuration.currentValue; this.handleSearchTermSubscription(searchCfg.searchOnKeyUp); } } onSearchInputChanged(searchTerm) { if (this.configuration?.searchOnKeyUp?.enabled) { this.searchValue = searchTerm; this.searchTerm$.next(searchTerm); } } onSearch(searchTerm) { this.searchValue = searchTerm; this.searchTerm$.next(searchTerm); } ngOnDestroy() { this.eventBus.getStream(WIDGET_SEARCH).next({ payload: "", }); this.destroy$.next(); this.destroy$.complete(); } registerFilters() { this.dataSource?.registerComponent({ search: { componentInstance: { getFilters: () => ({ value: this.searchValue, }), }, }, }); } handleSearchTermSubscription(searchOnKeyUpCfg) { this.searchTermSubscription?.unsubscribe(); this.searchTermSubscription = this.searchTerm$ .pipe(takeUntil(this.destroy$), debounceTime(searchOnKeyUpCfg?.debounceTime || WidgetSearchComponent.defaultSearchDebounce)) .subscribe((searchTerm) => { this.eventBus.getStream(REFRESH).next({}); this.eventBus.getStream(WIDGET_SEARCH).next({ payload: searchTerm, }); }); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetSearchComponent, deps: [{ token: DATA_SOURCE, optional: true }, { token: PIZZAGNA_EVENT_BUS }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: WidgetSearchComponent, selector: "nui-widget-search", inputs: { configuration: "configuration", searchValue: "searchValue" }, host: { properties: { "class.default": "enabled", "class.invisible": "!enabled" } }, usesOnChanges: true, ngImport: i0, template: "<nui-search\n class=\"unlimited-width\"\n *ngIf=\"enabled\"\n [value]=\"searchValue\"\n (inputChange)=\"onSearchInputChanged($event)\"\n (cancel)=\"onSearch($event)\"\n (search)=\"onSearch($event)\"\n></nui-search>\n", styles: [":host.default{padding:5px 10px}:host.invisible{height:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SearchComponent, selector: "nui-search", inputs: ["captureFocus", "name", "isInErrorState", "placeholder", "value"], outputs: ["cancel", "focusChange", "inputChange", "search"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetSearchComponent, decorators: [{ type: Component, args: [{ selector: "nui-widget-search", changeDetection: ChangeDetectionStrategy.OnPush, host: { "[class.default]": "enabled", "[class.invisible]": "!enabled" }, template: "<nui-search\n class=\"unlimited-width\"\n *ngIf=\"enabled\"\n [value]=\"searchValue\"\n (inputChange)=\"onSearchInputChanged($event)\"\n (cancel)=\"onSearch($event)\"\n (search)=\"onSearch($event)\"\n></nui-search>\n", styles: [":host.default{padding:5px 10px}:host.invisible{height:0}\n"] }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_SOURCE] }] }, { type: i2.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }], propDecorators: { configuration: [{ type: Input }], searchValue: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvd2lkZ2V0LXNlYXJjaC93aWRnZXQtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy93aWRnZXQtc2VhcmNoL3dpZGdldC1zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxHQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFHOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBUzlELE1BQU0sT0FBTyxxQkFBcUI7YUFDdkIsZ0JBQVcsR0FBRyx1QkFBdUIsQUFBMUIsQ0FBMkI7YUFDdEMsMEJBQXFCLEdBQUcsR0FBRyxBQUFOLENBQU87SUFVbkMsWUFDNkMsVUFBdUIsRUFDN0IsUUFBMEI7UUFEcEIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQVIxRCxZQUFPLEdBQVksS0FBSyxDQUFDO1FBRXpCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUMzQixhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQU01QyxDQUFDO0lBRUcsUUFBUTtRQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1lBQ25FLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQ3JELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDOUQ7SUFDTCxDQUFDO0lBRU0sb0JBQW9CLENBQUMsVUFBa0I7UUFDMUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckM7SUFDTCxDQUFDO0lBRU0sUUFBUSxDQUFDLFVBQWtCO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxFQUFFO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxlQUFlO1FBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUM7WUFDL0IsTUFBTSxFQUFFO2dCQUNKLGlCQUFpQixFQUFFO29CQUNmLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO3dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVztxQkFDMUIsQ0FBQztpQkFDTDthQUNKO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDRCQUE0QixDQUNoQyxnQkFBNEM7UUFFNUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsV0FBVzthQUN6QyxJQUFJLENBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsWUFBWSxDQUNSLGdCQUFnQixFQUFFLFlBQVk7WUFDMUIscUJBQXFCLENBQUMscUJBQXFCLENBQ2xELENBQ0o7YUFDQSxTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN4QyxPQUFPLEVBQUUsVUFBVTthQUN0QixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7a0lBbEZRLHFCQUFxQixrQkFhTixXQUFXLDZCQUN2QixrQkFBa0I7c0hBZHJCLHFCQUFxQiwyT0MvQ2xDLDRPQVFBOzs0RkR1Q2EscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNJLG1CQUFtQixtQkFHWix1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRTs7MEJBZWxFLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsV0FBVzs7MEJBQzlCLE1BQU07MkJBQUMsa0JBQWtCO3lDQVZkLGFBQWE7c0JBQTVCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBFdmVudEJ1cywgSURhdGFTb3VyY2UsIElFdmVudCB9IGZyb20gXCJAbm92YS11aS9iaXRzXCI7XG5cbmltcG9ydCB7IElTZWFyY2hPbktleVVwLCBJV2lkZ2V0U2VhcmNoQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUZSRVNILCBXSURHRVRfU0VBUkNIIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3R5cGVzXCI7XG5pbXBvcnQgeyBEQVRBX1NPVVJDRSwgUElaWkFHTkFfRVZFTlRfQlVTIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS13aWRnZXQtc2VhcmNoXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi93aWRnZXQtc2VhcmNoLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3dpZGdldC1zZWFyY2guY29tcG9uZW50Lmxlc3NcIl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDogeyBcIltjbGFzcy5kZWZhdWx0XVwiOiBcImVuYWJsZWRcIiwgXCJbY2xhc3MuaW52aXNpYmxlXVwiOiBcIiFlbmFibGVkXCIgfSxcbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0U2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJXaWRnZXRTZWFyY2hDb21wb25lbnRcIjtcbiAgICBzdGF0aWMgZGVmYXVsdFNlYXJjaERlYm91bmNlID0gNTAwO1xuXG4gICAgQElucHV0KCkgcHVibGljIGNvbmZpZ3VyYXRpb246IElXaWRnZXRTZWFyY2hDb25maWd1cmF0aW9uO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hWYWx1ZTogc3RyaW5nO1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgc2VhcmNoVGVybSQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIHNlYXJjaFRlcm1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERBVEFfU09VUkNFKSBwcml2YXRlIGRhdGFTb3VyY2U6IElEYXRhU291cmNlLFxuICAgICAgICBASW5qZWN0KFBJWlpBR05BX0VWRU5UX0JVUykgcHVibGljIGV2ZW50QnVzOiBFdmVudEJ1czxJRXZlbnQ+XG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlLmZlYXR1cmVzPy5nZXRTdXBwb3J0ZWRGZWF0dXJlcygpPy5zZWFyY2g/LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlckZpbHRlcnMoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2hUZXJtU3Vic2NyaXB0aW9uKHRoaXMuY29uZmlndXJhdGlvbj8uc2VhcmNoT25LZXlVcCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoQ2ZnID0gY2hhbmdlcy5jb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VhcmNoVGVybVN1YnNjcmlwdGlvbihzZWFyY2hDZmcuc2VhcmNoT25LZXlVcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWFyY2hJbnB1dENoYW5nZWQoc2VhcmNoVGVybTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24/LnNlYXJjaE9uS2V5VXA/LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBzZWFyY2hUZXJtO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXJtJC5uZXh0KHNlYXJjaFRlcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2VhcmNoKHNlYXJjaFRlcm06IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gc2VhcmNoVGVybTtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtJC5uZXh0KHNlYXJjaFRlcm0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5nZXRTdHJlYW0oV0lER0VUX1NFQVJDSCkubmV4dCh7XG4gICAgICAgICAgICBwYXlsb2FkOiBcIlwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyRmlsdGVycygpIHtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlPy5yZWdpc3RlckNvbXBvbmVudCh7XG4gICAgICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZToge1xuICAgICAgICAgICAgICAgICAgICBnZXRGaWx0ZXJzOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2VhcmNoVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVNlYXJjaFRlcm1TdWJzY3JpcHRpb24oXG4gICAgICAgIHNlYXJjaE9uS2V5VXBDZmc6IElTZWFyY2hPbktleVVwIHwgdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGVybVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hUZXJtJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZShcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoT25LZXlVcENmZz8uZGVib3VuY2VUaW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRTZWFyY2hDb21wb25lbnQuZGVmYXVsdFNlYXJjaERlYm91bmNlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoc2VhcmNoVGVybSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZ2V0U3RyZWFtKFJFRlJFU0gpLm5leHQoe30pO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZ2V0U3RyZWFtKFdJREdFVF9TRUFSQ0gpLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBzZWFyY2hUZXJtLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPG51aS1zZWFyY2hcbiAgICBjbGFzcz1cInVubGltaXRlZC13aWR0aFwiXG4gICAgKm5nSWY9XCJlbmFibGVkXCJcbiAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgIChpbnB1dENoYW5nZSk9XCJvblNlYXJjaElucHV0Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAoY2FuY2VsKT1cIm9uU2VhcmNoKCRldmVudClcIlxuICAgIChzZWFyY2gpPVwib25TZWFyY2goJGV2ZW50KVwiXG4+PC9udWktc2VhcmNoPlxuIl19