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

143 lines 21.4 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 { Inject, Injectable } from "@angular/core"; import isArray from "lodash/isArray"; import { BehaviorSubject, Subject } from "rxjs"; import { distinctUntilChanged, filter, takeUntil, tap } from "rxjs/operators"; import { EventBus } from "@nova-ui/bits"; import { PizzagnaService } from "../../pizzagna/services/pizzagna.service"; import { PizzagnaLayer, PIZZAGNA_EVENT_BUS, } from "../../types"; import * as i0 from "@angular/core"; import * as i1 from "../../pizzagna/services/pizzagna.service"; import * as i2 from "@nova-ui/bits"; export class KpiScaleSyncBroker { constructor(eventBus, pizzagnaService) { this.eventBus = eventBus; this.pizzagnaService = pizzagnaService; this.brokers = []; this.builder = new KpiScaleSyncBrokerBuilder(this.brokers); this.destroySubscriptions$ = new Subject(); this.getMin = (n) => Math.min(...n); this.getMax = (n) => Math.max(...n); this.valuesObject = this.builder.valuesObject; } updateConfiguration(properties) { this.properties = properties; if (this.componentId) { this.createPropertiesAndSubscribeToBrokers(); } } configure() { return this.builder; } getBrokers() { return this.brokers; } subscribeToBrokers() { this.destroy(); this.brokers.forEach((broker) => { broker.in$ .pipe(filter((_) => !!broker.in$.observers.length), distinctUntilChanged(), tap((data) => this.configureValueModel(data)), tap((data) => this.processAndEmitSyncedValue(data, broker)), takeUntil(this.destroySubscriptions$)) .subscribe(); }); } setComponent(component, componentId) { this.componentId = componentId; this.updateConfiguration(this.properties); } destroy() { this.destroySubscriptions$.next(); this.destroySubscriptions$.complete(); } processAndEmitSyncedValue(data, broker) { let fn = this.getMin; if (broker?.type) { fn = broker.type === "min" ? this.getMin : this.getMax; } const valuesToCompare = this.valuesObject[broker.id] .filter((item) => item.targetID && item.targetValue) .map((item) => item.targetValue); broker.out$.next({ ...data, targetValue: fn([...valuesToCompare]), }); } configureValueModel(data) { const targetObj = this.valuesObject[data.id].filter((obj) => obj.targetID === data.targetID); targetObj.length ? (targetObj[0].targetValue = data.targetValue) : this.valuesObject[data.id].push({ targetID: data.targetID, targetValue: data.targetValue, }); } createPropertiesAndSubscribeToBrokers() { this.tileNodes = this.pizzagnaService.getComponent(this.componentId).properties?.nodes; const { scaleSyncConfig } = this.properties; if (this.tileNodes?.length) { this.tileNodes.forEach((node, i) => { const property = { componentId: node, pizzagnaKey: PizzagnaLayer.Data, propertyPath: [`syncValuesBroker`], }; this.pizzagnaService.setProperty(property, this.getBrokers()); }); if (scaleSyncConfig && isArray(scaleSyncConfig)) { scaleSyncConfig.forEach((s) => this.configure().addBroker({ id: s.id, type: s?.type })); this.subscribeToBrokers(); } } } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiScaleSyncBroker, deps: [{ token: PIZZAGNA_EVENT_BUS }, { token: i1.PizzagnaService }], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiScaleSyncBroker }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiScaleSyncBroker, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i2.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }, { type: i1.PizzagnaService }] }); class KpiScaleSyncBrokerBuilder { constructor(brokers) { this.brokers = brokers; this.valuesObject = {}; } addBroker(broker) { const newBrokerSetting = { id: broker.id, targetID: "", targetValue: 1, }; this.valuesObject[broker.id] = new Array(); this.brokers.push({ ...broker, ...this.getDefaultBrokerObject(newBrokerSetting, newBrokerSetting), }); return this; } getDefaultBrokerObject(input, output) { return { in$: new BehaviorSubject(input), out$: new BehaviorSubject(output), }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLXNjYWxlLXN5bmMtYnJva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3Byb3ZpZGVycy9rcGktc2NhbGUtc3luYy1icm9rZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlFLE9BQU8sRUFBRSxRQUFRLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFHSCxhQUFhLEVBQ2Isa0JBQWtCLEdBQ3JCLE1BQU0sYUFBYSxDQUFDOzs7O0FBR3JCLE1BQU0sT0FBTyxrQkFBa0I7SUFVM0IsWUFDd0MsUUFBMEIsRUFDdEQsZUFBZ0M7UUFESixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUN0RCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFQcEMsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUN4QixZQUFP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LEtBQW1CLEVBQUUsTUFBb0I7UUFDcEUsT0FBTztZQUNILEdBQUcsRUFBRSxJQUFJLGVBQWUsQ0FBZSxLQUFLLENBQUM7WUFDN0MsSUFBSSxFQUFFLElBQUksZUFBZSxDQUFlLE1BQU0sQ0FBQztTQUNsRCxDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgaXNBcnJheSBmcm9tIFwibG9kYXNoL2lzQXJyYXlcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBFdmVudEJ1cywgSUV2ZW50IH0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcblxuaW1wb3J0IHsgSUJyb2tlciwgSUJyb2tlclVzZXJDb25maWcsIElCcm9rZXJWYWx1ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBJUGl6emFnbmFQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9waXp6YWduYS9mdW5jdGlvbnMvZ2V0LXBpenphZ25hLXByb3BlcnR5LXBhdGhcIjtcbmltcG9ydCB7IFBpenphZ25hU2VydmljZSB9IGZyb20gXCIuLi8uLi9waXp6YWduYS9zZXJ2aWNlcy9waXp6YWduYS5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIElDb25maWd1cmFibGUsXG4gICAgSVByb3BlcnRpZXMsXG4gICAgUGl6emFnbmFMYXllcixcbiAgICBQSVpaQUdOQV9FVkVOVF9CVVMsXG59IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgS3BpU2NhbGVTeW5jQnJva2VyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7XG4gICAgcHJvdGVjdGVkIHByb3BlcnRpZXM6IElQcm9wZXJ0aWVzO1xuICAgIHByb3RlY3RlZCBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSB2YWx1ZXNPYmplY3Q6IFJlY29yZDxzdHJpbmcsIEFycmF5PFBhcnRpYWw8SUJyb2tlclZhbHVlPj4+O1xuICAgIHByaXZhdGUgYnJva2VyczogSUJyb2tlcltdID0gW107XG4gICAgcHJpdmF0ZSBidWlsZGVyID0gbmV3IEtwaVNjYWxlU3luY0Jyb2tlckJ1aWxkZXIodGhpcy5icm9rZXJzKTtcbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSB0aWxlTm9kZXM6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoUElaWkFHTkFfRVZFTlRfQlVTKSBwcml2YXRlIGV2ZW50QnVzOiBFdmVudEJ1czxJRXZlbnQ+LFxuICAgICAgICBwcml2YXRlIHBpenphZ25hU2VydmljZTogUGl6emFnbmFTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWVzT2JqZWN0ID0gdGhpcy5idWlsZGVyLnZhbHVlc09iamVjdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ29uZmlndXJhdGlvbihwcm9wZXJ0aWVzOiBJUHJvcGVydGllcyk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXNBbmRTdWJzY3JpYmVUb0Jyb2tlcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmUoKTogS3BpU2NhbGVTeW5jQnJva2VyQnVpbGRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJyb2tlcnMoKTogcmVhZG9ubHkgSUJyb2tlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJva2VycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3Vic2NyaWJlVG9Ccm9rZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcblxuICAgICAgICB0aGlzLmJyb2tlcnMuZm9yRWFjaCgoYnJva2VyKSA9PiB7XG4gICAgICAgICAgICBicm9rZXIuaW4kXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoXykgPT4gISFicm9rZXIuaW4kLm9ic2VydmVycy5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgICAgICB0YXAoKGRhdGEpID0+IHRoaXMuY29uZmlndXJlVmFsdWVNb2RlbChkYXRhKSksXG4gICAgICAgICAgICAgICAgICAgIHRhcCgoZGF0YSkgPT4gdGhpcy5wcm9jZXNzQW5kRW1pdFN5bmNlZFZhbHVlKGRhdGEsIGJyb2tlcikpLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucyQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbXBvbmVudChjb21wb25lbnQ6IGFueSwgY29tcG9uZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbXBvbmVudElkID0gY29tcG9uZW50SWQ7XG4gICAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbih0aGlzLnByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zJC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzQW5kRW1pdFN5bmNlZFZhbHVlKGRhdGE6IElCcm9rZXJWYWx1ZSwgYnJva2VyOiBJQnJva2VyKSB7XG4gICAgICAgIGxldCBmbjogRnVuY3Rpb24gPSB0aGlzLmdldE1pbjtcblxuICAgICAgICBpZiAoYnJva2VyPy50eXBlKSB7XG4gICAgICAgICAgICBmbiA9IGJyb2tlci50eXBlID09PSBcIm1pblwiID8gdGhpcy5nZXRNaW4gOiB0aGlzLmdldE1heDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlc1RvQ29tcGFyZTogKG51bWJlciB8IHVuZGVmaW5lZClbXSA9IHRoaXMudmFsdWVzT2JqZWN0W1xuICAgICAgICAgICAgYnJva2VyLmlkXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udGFyZ2V0SUQgJiYgaXRlbS50YXJnZXRWYWx1ZSlcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udGFyZ2V0VmFsdWUpO1xuXG4gICAgICAgIGJyb2tlci5vdXQkLm5leHQoe1xuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIHRhcmdldFZhbHVlOiBmbihbLi4udmFsdWVzVG9Db21wYXJlXSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlndXJlVmFsdWVNb2RlbChkYXRhOiBJQnJva2VyVmFsdWUpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0T2JqID0gdGhpcy52YWx1ZXNPYmplY3RbZGF0YS5pZF0uZmlsdGVyKFxuICAgICAgICAgICAgKG9iaikgPT4gb2JqLnRhcmdldElEID09PSBkYXRhLnRhcmdldElEXG4gICAgICAgICk7XG5cbiAgICAgICAgdGFyZ2V0T2JqLmxlbmd0aFxuICAgICAgICAgICAgPyAodGFyZ2V0T2JqWzBdLnRhcmdldFZhbHVlID0gZGF0YS50YXJnZXRWYWx1ZSlcbiAgICAgICAgICAgIDogdGhpcy52YWx1ZXNPYmplY3RbZGF0YS5pZF0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0YXJnZXRJRDogZGF0YS50YXJnZXRJRCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlOiBkYXRhLnRhcmdldFZhbHVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVByb3BlcnRpZXNBbmRTdWJzY3JpYmVUb0Jyb2tlcnMoKSB7XG4gICAgICAgIHRoaXMudGlsZU5vZGVzID0gdGhpcy5waXp6YWduYVNlcnZpY2UuZ2V0Q29tcG9uZW50KFxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJZFxuICAgICAgICApLnByb3BlcnRpZXM/Lm5vZGVzO1xuICAgICAgICBjb25zdCB7IHNjYWxlU3luY0NvbmZpZyB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbGVOb2Rlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVOb2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHk6IElQaXp6YWduYVByb3BlcnR5ID0ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZDogbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgcGl6emFnbmFLZXk6IFBpenphZ25hTGF5ZXIuRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoOiBbYHN5bmNWYWx1ZXNCcm9rZXJgXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMucGl6emFnbmFTZXJ2aWNlLnNldFByb3BlcnR5KHByb3BlcnR5LCB0aGlzLmdldEJyb2tlcnMoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHNjYWxlU3luY0NvbmZpZyAmJiBpc0FycmF5KHNjYWxlU3luY0NvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBzY2FsZVN5bmNDb25maWcuZm9yRWFjaCgoczogSUJyb2tlclVzZXJDb25maWcpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlKCkuYWRkQnJva2VyKHsgaWQ6IHMuaWQsIHR5cGU6IHM/LnR5cGUgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9Ccm9rZXJzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1pbiA9IChuOiBudW1iZXJbXSkgPT4gTWF0aC5taW4oLi4ubik7XG4gICAgcHJpdmF0ZSBnZXRNYXggPSAobjogbnVtYmVyW10pID0+IE1hdGgubWF4KC4uLm4pO1xufVxuXG5jbGFzcyBLcGlTY2FsZVN5bmNCcm9rZXJCdWlsZGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBBcnJheTxQYXJ0aWFsPElCcm9rZXJWYWx1ZT4+PiA9XG4gICAgICAgIHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBicm9rZXJzOiBJQnJva2VyW10pIHt9XG5cbiAgICBwdWJsaWMgYWRkQnJva2VyKGJyb2tlcjogSUJyb2tlclVzZXJDb25maWcpOiBLcGlTY2FsZVN5bmNCcm9rZXJCdWlsZGVyIHtcbiAgICAgICAgY29uc3QgbmV3QnJva2VyU2V0dGluZzogSUJyb2tlclZhbHVlID0ge1xuICAgICAgICAgICAgaWQ6IGJyb2tlci5pZCxcbiAgICAgICAgICAgIHRhcmdldElEOiBcIlwiLFxuICAgICAgICAgICAgdGFyZ2V0VmFsdWU6IDEsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmFsdWVzT2JqZWN0W2Jyb2tlci5pZF0gPSBuZXcgQXJyYXk8UGFydGlhbDxJQnJva2VyVmFsdWU+PigpO1xuICAgICAgICB0aGlzLmJyb2tlcnMucHVzaCh7XG4gICAgICAgICAgICAuLi5icm9rZXIsXG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRCcm9rZXJPYmplY3QobmV3QnJva2VyU2V0dGluZywgbmV3QnJva2VyU2V0dGluZyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRCcm9rZXJPYmplY3QoaW5wdXQ6IElCcm9rZXJWYWx1ZSwgb3V0cHV0OiBJQnJva2VyVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluJDogbmV3IEJlaGF2aW9yU3ViamVjdDxJQnJva2VyVmFsdWU+KGlucHV0KSxcbiAgICAgICAgICAgIG91dCQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8SUJyb2tlclZhbHVlPihvdXRwdXQpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==