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

107 lines 24.3 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, ChangeDetectorRef, Component, EventEmitter, Input, Output, } from "@angular/core"; import { FormBuilder, Validators } from "@angular/forms"; import { Subject } from "rxjs"; import { PizzagnaService } from "../../../../../pizzagna/services/pizzagna.service"; import { PizzagnaLayer, } from "../../../../../types"; import { ConfiguratorHeadingService } from "../../../../services/configurator-heading.service"; import * as i0 from "@angular/core"; import * as i1 from "../../../../services/configurator-heading.service"; import * as i2 from "@angular/forms"; import * as i3 from "../../../../../pizzagna/services/pizzagna.service"; import * as i4 from "@angular/common"; import * as i5 from "@nova-ui/bits"; import * as i6 from "../../../widget-editor-accordion/widget-editor-accordion.component"; import * as i7 from "../../../widget-editor-accordion/widget-editor-accordion-header/widget-editor-accordion-header.component"; import * as i8 from "../../../../pipe/add-data.pipe"; import * as i9 from "../../../../pipe/widget-editor-accordion-form-state.pipe"; import * as i10 from "../../../../pipe/widget-editor-accordion-header-icon.pipe"; export class TimeseriesTileIndicatorDataConfigurationComponent { static { this.lateLoadKey = "TimeseriesTileIndicatorDataConfigurationComponent"; } set selectedSeries(value) { this._selectedSeries = value; if (value) { this.form.patchValue({ id: value.id }); } } get selectedSeries() { return this._selectedSeries; } constructor(changeDetector, configuratorHeading, formBuilder, pizzagnaService) { this.changeDetector = changeDetector; this.configuratorHeading = configuratorHeading; this.formBuilder = formBuilder; this.pizzagnaService = pizzagnaService; this.formReady = new EventEmitter(); this.formDestroy = new EventEmitter(); this.destroy$ = new Subject(); } ngOnInit() { this.form = this.formBuilder.group({ id: [this.selectedSeriesId || null, [Validators.required]], }); this.formReady.emit(this.form); } ngOnChanges(changes) { if (changes.allSeries) { this.selectedSeries = this.allSeries.find((s) => this.selectedSeriesId === s.id); } if (changes.selectedSeriesId) { if (!this.allSeries) { return; } this.selectedSeries = this.allSeries.find((s) => this.selectedSeriesId === s.id); } } onSelect(selectedSeries) { this.selectedSeriesId = selectedSeries.id; this.selectedSeries = selectedSeries; this.form.patchValue({ id: selectedSeries.id }); setTimeout(() => { this.pizzagnaService.setProperty(`${PizzagnaLayer.Data}.${this.componentId}.properties.selectedSeriesId`, selectedSeries.id); this.changeDetector.markForCheck(); }); } ngOnDestroy() { this.formDestroy.emit(this.form); this.destroy$.next(); this.destroy$.complete(); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeseriesTileIndicatorDataConfigurationComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ConfiguratorHeadingService }, { token: i2.FormBuilder }, { token: i3.PizzagnaService }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TimeseriesTileIndicatorDataConfigurationComponent, selector: "nui-timeseries-tile-indicator-data-configuration", inputs: { componentId: "componentId", selectedSeriesId: "selectedSeriesId", allSeries: "allSeries", availableSeries: "availableSeries" }, outputs: { formReady: "formReady", formDestroy: "formDestroy" }, usesOnChanges: true, ngImport: i0, template: "<ng-container [formGroup]=\"form\">\n <nui-widget-editor-accordion\n [state]=\"form.get('id') | nuiWidgetEditorAccordionFormState | async\"\n >\n <nui-widget-editor-accordion-header\n [headerIcon]=\"\n form.get('id') | nuiFormHeaderIconPipe : 'database' | async\n \"\n [subtitle]=\"selectedSeries?.description\"\n headerTitle=\"Indicator data\"\n />\n <div class=\"timeseries-tile-data-configuration__accordion-content\">\n <nui-form-field\n caption=\"Series data\"\n i18n-caption\n [control]=\"form.get('id')\"\n >\n <nui-select-v2\n placeholder=\"Series data\"\n i18n-placeholder\n [value]=\"selectedSeries\"\n [popupViewportMargin]=\"configuratorHeading.height$ | async\"\n (valueSelected)=\"onSelect($event)\"\n >\n <nui-select-v2-option\n *ngFor=\"\n let series of availableSeries\n | nuiAddData : selectedSeries\n \"\n [value]=\"series\"\n >\n {{ series.description }}\n </nui-select-v2-option>\n </nui-select-v2>\n <nui-validation-message for=\"required\" i18n>\n This field is required\n </nui-validation-message>\n </nui-form-field>\n </div>\n </nui-widget-editor-accordion>\n</ng-container>\n", styles: [".timeseries-tile-data-configuration__accordion-content{padding:15px 15px 15px 46px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.FormFieldComponent, selector: "nui-form-field", inputs: ["control", "caption", "info", "infoTemplate", "hint", "hintTemplate", "customBoxWidth", "showOptionalText"] }, { kind: "component", type: i5.SelectV2Component, selector: "nui-select-v2", inputs: ["displayValueTemplate"] }, { kind: "component", type: i5.SelectV2OptionComponent, selector: "nui-select-v2-option", inputs: ["value", "index", "displayValueContext", "outfiltered"] }, { kind: "component", type: i5.ValidationMessageComponent, selector: "nui-validation-message", inputs: ["show", "for"] }, { kind: "component", type: i6.WidgetEditorAccordionComponent, selector: "nui-widget-editor-accordion", inputs: ["showOpenStateIcon", "state"], outputs: ["openToggle"] }, { kind: "component", type: i7.WidgetEditorAccordionHeaderComponent, selector: "nui-widget-editor-accordion-header", inputs: ["headerIcon", "iconColor", "subtitle", "headerTitle"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AddDataPipe, name: "nuiAddData" }, { kind: "pipe", type: i9.WidgetEditorAccordionFormStatePipe, name: "nuiWidgetEditorAccordionFormState" }, { kind: "pipe", type: i10.FormHeaderIconPipePipe, name: "nuiFormHeaderIconPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeseriesTileIndicatorDataConfigurationComponent, decorators: [{ type: Component, args: [{ selector: "nui-timeseries-tile-indicator-data-configuration", changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container [formGroup]=\"form\">\n <nui-widget-editor-accordion\n [state]=\"form.get('id') | nuiWidgetEditorAccordionFormState | async\"\n >\n <nui-widget-editor-accordion-header\n [headerIcon]=\"\n form.get('id') | nuiFormHeaderIconPipe : 'database' | async\n \"\n [subtitle]=\"selectedSeries?.description\"\n headerTitle=\"Indicator data\"\n />\n <div class=\"timeseries-tile-data-configuration__accordion-content\">\n <nui-form-field\n caption=\"Series data\"\n i18n-caption\n [control]=\"form.get('id')\"\n >\n <nui-select-v2\n placeholder=\"Series data\"\n i18n-placeholder\n [value]=\"selectedSeries\"\n [popupViewportMargin]=\"configuratorHeading.height$ | async\"\n (valueSelected)=\"onSelect($event)\"\n >\n <nui-select-v2-option\n *ngFor=\"\n let series of availableSeries\n | nuiAddData : selectedSeries\n \"\n [value]=\"series\"\n >\n {{ series.description }}\n </nui-select-v2-option>\n </nui-select-v2>\n <nui-validation-message for=\"required\" i18n>\n This field is required\n </nui-validation-message>\n </nui-form-field>\n </div>\n </nui-widget-editor-accordion>\n</ng-container>\n", styles: [".timeseries-tile-data-configuration__accordion-content{padding:15px 15px 15px 46px}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.ConfiguratorHeadingService }, { type: i2.FormBuilder }, { type: i3.PizzagnaService }], propDecorators: { componentId: [{ type: Input }], selectedSeriesId: [{ type: Input }], allSeries: [{ type: Input }], availableSeries: [{ type: Input }], formReady: [{ type: Output }], formDestroy: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllcy10aWxlLWluZGljYXRvci1kYXRhLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWd1cmF0b3IvY29tcG9uZW50cy93aWRnZXRzL3RpbWVzZXJpZXMvdGltZXNlcmllcy10aWxlLWluZGljYXRvci1kYXRhLWNvbmZpZ3VyYXRpb24vdGltZXNlcmllcy10aWxlLWluZGljYXRvci1kYXRhLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWd1cmF0b3IvY29tcG9uZW50cy93aWRnZXRzL3RpbWVzZXJpZXMvdGltZXNlcmllcy10aWxlLWluZGljYXRvci1kYXRhLWNvbmZpZ3VyYXRpb24vdGltZXNlcmllcy10aWxlLWluZGljYXRvci1kYXRhLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxPQUFP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QUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7a0lBakZRLGlEQUFpRDtzSEFBakQsaURBQWlELHdUQ3JEOUQsaXBEQXlDQTs7NEZEWWEsaURBQWlEO2tCQVQ3RCxTQUFTOytCQUNJLGtEQUFrRCxtQkFNM0MsdUJBQXVCLENBQUMsTUFBTTt1TEFPdEMsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgSVRpbWVzZXJpZXNXaWRnZXREYXRhIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdGltZXNlcmllcy13aWRnZXQvdHlwZXNcIjtcbmltcG9ydCB7IFBpenphZ25hU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9waXp6YWduYS9zZXJ2aWNlcy9waXp6YWduYS5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIElIYXNDaGFuZ2VEZXRlY3RvcixcbiAgICBJSGFzRm9ybSxcbiAgICBQaXp6YWduYUxheWVyLFxufSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRvckhlYWRpbmdTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL2NvbmZpZ3VyYXRvci1oZWFkaW5nLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXRpbWVzZXJpZXMtdGlsZS1pbmRpY2F0b3ItZGF0YS1jb25maWd1cmF0aW9uXCIsXG4gICAgdGVtcGxhdGVVcmw6XG4gICAgICAgIFwiLi90aW1lc2VyaWVzLXRpbGUtaW5kaWNhdG9yLWRhdGEtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1xuICAgICAgICBcIi4vdGltZXNlcmllcy10aWxlLWluZGljYXRvci1kYXRhLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmxlc3NcIixcbiAgICBdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lc2VyaWVzVGlsZUluZGljYXRvckRhdGFDb25maWd1cmF0aW9uQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBJSGFzQ2hhbmdlRGV0ZWN0b3IsIElIYXNGb3JtLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gICAgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJUaW1lc2VyaWVzVGlsZUluZGljYXRvckRhdGFDb25maWd1cmF0aW9uQ29tcG9uZW50XCI7XG5cbiAgICBASW5wdXQoKSBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkU2VyaWVzSWQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBhbGxTZXJpZXM6IElUaW1lc2VyaWVzV2lkZ2V0RGF0YVtdO1xuICAgIEBJbnB1dCgpIGF2YWlsYWJsZVNlcmllczogSVRpbWVzZXJpZXNXaWRnZXREYXRhW107XG5cbiAgICBAT3V0cHV0KCkgZm9ybVJlYWR5OiBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPiA9XG4gICAgICAgIG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPigpO1xuICAgIEBPdXRwdXQoKSBmb3JtRGVzdHJveTogRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4gPVxuICAgICAgICBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcblxuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRTZXJpZXModmFsdWU6IElUaW1lc2VyaWVzV2lkZ2V0RGF0YSB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFNlcmllcyA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgaWQ6IHZhbHVlLmlkIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFNlcmllcygpOiBJVGltZXNlcmllc1dpZGdldERhdGEgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRTZXJpZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkU2VyaWVzPzogSVRpbWVzZXJpZXNXaWRnZXREYXRhO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBjb25maWd1cmF0b3JIZWFkaW5nOiBDb25maWd1cmF0b3JIZWFkaW5nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgcGl6emFnbmFTZXJ2aWNlOiBQaXp6YWduYVNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgaWQ6IFt0aGlzLnNlbGVjdGVkU2VyaWVzSWQgfHwgbnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3JtUmVhZHkuZW1pdCh0aGlzLmZvcm0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmFsbFNlcmllcykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlcmllcyA9IHRoaXMuYWxsU2VyaWVzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHMpID0+IHRoaXMuc2VsZWN0ZWRTZXJpZXNJZCA9PT0gcy5pZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLnNlbGVjdGVkU2VyaWVzSWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxTZXJpZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VyaWVzID0gdGhpcy5hbGxTZXJpZXMuZmluZChcbiAgICAgICAgICAgICAgICAocykgPT4gdGhpcy5zZWxlY3RlZFNlcmllc0lkID09PSBzLmlkXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2VsZWN0KHNlbGVjdGVkU2VyaWVzOiBJVGltZXNlcmllc1dpZGdldERhdGEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlcmllc0lkID0gc2VsZWN0ZWRTZXJpZXMuaWQ7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJpZXMgPSBzZWxlY3RlZFNlcmllcztcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBpZDogc2VsZWN0ZWRTZXJpZXMuaWQgfSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5waXp6YWduYVNlcnZpY2Uuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgYCR7UGl6emFnbmFMYXllci5EYXRhfS4ke3RoaXMuY29tcG9uZW50SWR9LnByb3BlcnRpZXMuc2VsZWN0ZWRTZXJpZXNJZGAsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJpZXMuaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybURlc3Ryb3kuZW1pdCh0aGlzLmZvcm0pO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bnVpLXdpZGdldC1lZGl0b3ItYWNjb3JkaW9uXG4gICAgICAgIFtzdGF0ZV09XCJmb3JtLmdldCgnaWQnKSB8IG51aVdpZGdldEVkaXRvckFjY29yZGlvbkZvcm1TdGF0ZSB8IGFzeW5jXCJcbiAgICA+XG4gICAgICAgIDxudWktd2lkZ2V0LWVkaXRvci1hY2NvcmRpb24taGVhZGVyXG4gICAgICAgICAgICBbaGVhZGVySWNvbl09XCJcbiAgICAgICAgICAgICAgICBmb3JtLmdldCgnaWQnKSB8IG51aUZvcm1IZWFkZXJJY29uUGlwZSA6ICdkYXRhYmFzZScgfCBhc3luY1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtzdWJ0aXRsZV09XCJzZWxlY3RlZFNlcmllcz8uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgaGVhZGVyVGl0bGU9XCJJbmRpY2F0b3IgZGF0YVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lc2VyaWVzLXRpbGUtZGF0YS1jb25maWd1cmF0aW9uX19hY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgPG51aS1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgY2FwdGlvbj1cIlNlcmllcyBkYXRhXCJcbiAgICAgICAgICAgICAgICBpMThuLWNhcHRpb25cbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJmb3JtLmdldCgnaWQnKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZXJpZXMgZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkU2VyaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgW3BvcHVwVmlld3BvcnRNYXJnaW5dPVwiY29uZmlndXJhdG9ySGVhZGluZy5oZWlnaHQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAodmFsdWVTZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxudWktc2VsZWN0LXYyLW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlcmllcyBvZiBhdmFpbGFibGVTZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBudWlBZGREYXRhIDogc2VsZWN0ZWRTZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VyaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VyaWVzLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbnVpLXNlbGVjdC12Mi1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9udWktc2VsZWN0LXYyPlxuICAgICAgICAgICAgICAgIDxudWktdmFsaWRhdGlvbi1tZXNzYWdlIGZvcj1cInJlcXVpcmVkXCIgaTE4bj5cbiAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgIDwvbnVpLXZhbGlkYXRpb24tbWVzc2FnZT5cbiAgICAgICAgICAgIDwvbnVpLWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbnVpLXdpZGdldC1lZGl0b3ItYWNjb3JkaW9uPlxuPC9uZy1jb250YWluZXI+XG4iXX0=