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

151 lines 23.6 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, Optional } from "@angular/core"; import keyBy from "lodash/keyBy"; import uniq from "lodash/uniq"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { EventBus } from "@nova-ui/bits"; import { PizzagnaService } from "../pizzagna/services/pizzagna.service"; import { DASHBOARD_EVENT_BUS, PizzagnaLayer, PIZZAGNA_EVENT_BUS, } from "../types"; import { EventRegistryService } from "./event-registry.service"; import { WidgetConfigurationService } from "./widget-configuration.service"; import * as i0 from "@angular/core"; import * as i1 from "./widget-configuration.service"; import * as i2 from "./event-registry.service"; import * as i3 from "../pizzagna/services/pizzagna.service"; import * as i4 from "@nova-ui/bits"; /** * This provider transmits events between the dashboard event bus and the widget event bus. * It needs to be configured with the events that need transmission each way. */ export class WidgetToDashboardEventProxyService { constructor(pizzagnaBus, dashboardBus, widgetConfigurationService, eventRegistry, pizzagnaService) { this.pizzagnaBus = pizzagnaBus; this.dashboardBus = dashboardBus; this.widgetConfigurationService = widgetConfigurationService; this.eventRegistry = eventRegistry; this.pizzagnaService = pizzagnaService; this.upstreamSubscriptions = {}; this.downstreamSubscriptions = {}; this.destroy$ = new Subject(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } setComponent(component) { this.component = component; } updateConfiguration(properties) { this.providerKey = properties.providerKey; this.upstreams = properties.upstreams; this.downstreams = properties.downstreams; if (this.upstreams) { // upstream = widget -> dashboard this.registerUpstreamSubscriptions(...this.upstreams); } if (this.downstreams) { // downstream = dashboard -> widget this.registerDownstreamSubscriptions(...this.downstreams); } } addUpstream(stream) { this.addStream(stream, "upstreams"); } addDownstream(stream) { this.addStream(stream, "downstreams"); } addStream(stream, streamKey) { const streams = uniq((this[streamKey] || []).concat(stream.id)); this[streamKey] = streams; if (!this.component) { return; } this.pizzagnaService.setProperty({ componentId: this.component.componentId, pizzagnaKey: PizzagnaLayer.Data, providerKey: this.providerKey, propertyPath: [streamKey], }, streams); } registerUpstreamSubscriptions(...upstreams) { if (!this.dashboardBus) { return; } this.registerSubscriptions(upstreams, this.upstreamSubscriptions, this.pizzagnaBus, (stream, event) => { // add widgetId to all events passed to the dashboard const widgetId = this.widgetConfigurationService.getWidget().id; this.dashboardBus .getStream(stream) .next(Object.assign({}, event, { widgetId })); }); } registerDownstreamSubscriptions(...downstreams) { if (!this.dashboardBus) { return; } this.registerSubscriptions(downstreams, this.downstreamSubscriptions, this.dashboardBus, (stream, event) => { // pass only events that have matching widgetId or a widgetId that is not defined const widgetId = this.widgetConfigurationService.getWidget().id; if (typeof event.widgetId === "undefined" || widgetId === event.widgetId) { this.pizzagnaBus.getStream(stream).next(event); } }); } registerSubscriptions(streams = [], subscriptions, sourceBus, handleEvent) { const streamsIndex = streams ? keyBy(streams, (x) => x) : null; // remove subscriptions that are not valid anymore for (const streamId of Object.keys(subscriptions)) { if (!streamsIndex || !streamsIndex[streamId]) { subscriptions[streamId].unsubscribe(); delete subscriptions[streamId]; } } // add subscriptions that were not registered before for (const streamId of Object.keys(streamsIndex ?? {}).filter((s) => !subscriptions[s])) { const eventDefinition = this.eventRegistry.getEvent(streamId); subscriptions[streamId] = sourceBus.getStream(eventDefinition) .pipe(takeUntil(this.destroy$)) .subscribe((event) => { handleEvent(eventDefinition, event); }); } } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetToDashboardEventProxyService, deps: [{ token: PIZZAGNA_EVENT_BUS }, { token: DASHBOARD_EVENT_BUS, optional: true }, { token: i1.WidgetConfigurationService, optional: true }, { token: i2.EventRegistryService }, { token: i3.PizzagnaService }], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetToDashboardEventProxyService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetToDashboardEventProxyService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i4.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }, { type: i4.EventBus, decorators: [{ type: Optional }, { type: Inject, args: [DASHBOARD_EVENT_BUS] }] }, { type: i1.WidgetConfigurationService, decorators: [{ type: Optional }] }, { type: i2.EventRegistryService }, { type: i3.PizzagnaService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRvLWRhc2hib2FyZC1ldmVudC1wcm94eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy93aWRnZXQtdG8tZGFzaGJvYXJkLWV2ZW50LXByb3h5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQ0gsbUJBQW1CLEVBR25CLGFBQWEsRUFDYixrQkFBa0IsR0FDckIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7OztBQW9CNUU7OztHQUdHO0FBRUgs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LFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDMUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsQztTQUNKO1FBRUQsb0RBQW9EO1FBQ3BELEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN6RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQzNCLEVBQUU7WUFDQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RCxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQ25CLFNBQVMsQ0FBQyxTQUFTLENBQ2YsZUFBZSxDQUV0QjtpQkFDSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQ3pCLFdBQVcsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7U0FDVjtJQUNMLENBQUM7a0lBMUpRLGtDQUFrQyxrQkFhL0Isa0JBQWtCLGFBRWxCLG1CQUFtQjtzSUFmdEIsa0NBQWtDOzs0RkFBbEMsa0NBQWtDO2tCQUQ5QyxVQUFVOzswQkFjRixNQUFNOzJCQUFDLGtCQUFrQjs7MEJBQ3pCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsbUJBQW1COzswQkFFMUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGtleUJ5IGZyb20gXCJsb2Rhc2gva2V5QnlcIjtcbmltcG9ydCB1bmlxIGZyb20gXCJsb2Rhc2gvdW5pcVwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgRXZlbnRCdXMsIElFdmVudCwgSUV2ZW50RGVmaW5pdGlvbiB9IGZyb20gXCJAbm92YS11aS9iaXRzXCI7XG5cbmltcG9ydCB7IFBpenphZ25hU2VydmljZSB9IGZyb20gXCIuLi9waXp6YWduYS9zZXJ2aWNlcy9waXp6YWduYS5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIERBU0hCT0FSRF9FVkVOVF9CVVMsXG4gICAgSUNvbmZpZ3VyYWJsZSxcbiAgICBJUHJvcGVydGllcyxcbiAgICBQaXp6YWduYUxheWVyLFxuICAgIFBJWlpBR05BX0VWRU5UX0JVUyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBFdmVudFJlZ2lzdHJ5U2VydmljZSB9IGZyb20gXCIuL2V2ZW50LXJlZ2lzdHJ5LnNlcnZpY2VcIjtcbmltcG9ydCB7IFdpZGdldENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vd2lkZ2V0LWNvbmZpZ3VyYXRpb24uc2VydmljZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXaWRnZXRFdmVudCBleHRlbmRzIElFdmVudCB7XG4gICAgd2lkZ2V0SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvZiBXaWRnZXRUb0Rhc2hib2FyZEV2ZW50UHJveHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2lkZ2V0VG9EYXNoYm9hcmRFdmVudFByb3h5Q29uZmlndXJhdGlvbiBleHRlbmRzIElQcm9wZXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV2ZW50cyB0aGF0IGFyZSB0cmFuc21pdHRlZCBmcm9tIHdpZGdldCB0byBkYXNoYm9hcmRcbiAgICAgKi9cbiAgICB1cHN0cmVhbXM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV2ZW50cyB0aGF0IGFyZSB0cmFuc21pdHRlZCBmcm9tIGRhc2hib2FyZCB0byB3aWRnZXRcbiAgICAgKi9cbiAgICBkb3duc3RyZWFtcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoaXMgcHJvdmlkZXIgdHJhbnNtaXRzIGV2ZW50cyBiZXR3ZWVuIHRoZSBkYXNoYm9hcmQgZXZlbnQgYnVzIGFuZCB0aGUgd2lkZ2V0IGV2ZW50IGJ1cy5cbiAqIEl0IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgZXZlbnRzIHRoYXQgbmVlZCB0cmFuc21pc3Npb24gZWFjaCB3YXkuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXaWRnZXRUb0Rhc2hib2FyZEV2ZW50UHJveHlTZXJ2aWNlXG4gICAgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlLCBPbkRlc3Ryb3lcbntcbiAgICBwcml2YXRlIHVwc3RyZWFtU3Vic2NyaXB0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHByaXZhdGUgZG93bnN0cmVhbVN1YnNjcmlwdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIGNvbXBvbmVudDogeyBjb21wb25lbnRJZDogc3RyaW5nIH07XG5cbiAgICBwcml2YXRlIHVwc3RyZWFtcz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgZG93bnN0cmVhbXM/OiBzdHJpbmdbXTtcbiAgICBwdWJsaWMgcHJvdmlkZXJLZXk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBJWlpBR05BX0VWRU5UX0JVUykgcHJpdmF0ZSBwaXp6YWduYUJ1czogRXZlbnRCdXM8SUV2ZW50PixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChEQVNIQk9BUkRfRVZFTlRfQlVTKVxuICAgICAgICBwcml2YXRlIGRhc2hib2FyZEJ1czogRXZlbnRCdXM8SUV2ZW50PixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgcHJpdmF0ZSB3aWRnZXRDb25maWd1cmF0aW9uU2VydmljZTogV2lkZ2V0Q29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZXZlbnRSZWdpc3RyeTogRXZlbnRSZWdpc3RyeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGl6emFnbmFTZXJ2aWNlOiBQaXp6YWduYVNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbXBvbmVudChjb21wb25lbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ29uZmlndXJhdGlvbihcbiAgICAgICAgcHJvcGVydGllczogSVdpZGdldFRvRGFzaGJvYXJkRXZlbnRQcm94eUNvbmZpZ3VyYXRpb25cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm92aWRlcktleSA9IHByb3BlcnRpZXMucHJvdmlkZXJLZXk7XG4gICAgICAgIHRoaXMudXBzdHJlYW1zID0gcHJvcGVydGllcy51cHN0cmVhbXM7XG4gICAgICAgIHRoaXMuZG93bnN0cmVhbXMgPSBwcm9wZXJ0aWVzLmRvd25zdHJlYW1zO1xuXG4gICAgICAgIGlmICh0aGlzLnVwc3RyZWFtcykge1xuICAgICAgICAgICAgLy8gdXBzdHJlYW0gPSB3aWRnZXQgLT4gZGFzaGJvYXJkXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyVXBzdHJlYW1TdWJzY3JpcHRpb25zKC4uLnRoaXMudXBzdHJlYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kb3duc3RyZWFtcykge1xuICAgICAgICAgICAgLy8gZG93bnN0cmVhbSA9IGRhc2hib2FyZCAtPiB3aWRnZXRcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJEb3duc3RyZWFtU3Vic2NyaXB0aW9ucyguLi50aGlzLmRvd25zdHJlYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRVcHN0cmVhbShzdHJlYW06IElFdmVudERlZmluaXRpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRTdHJlYW0oc3RyZWFtLCBcInVwc3RyZWFtc1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRG93bnN0cmVhbShzdHJlYW06IElFdmVudERlZmluaXRpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRTdHJlYW0oc3RyZWFtLCBcImRvd25zdHJlYW1zXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkU3RyZWFtKFxuICAgICAgICBzdHJlYW06IElFdmVudERlZmluaXRpb24sXG4gICAgICAgIHN0cmVhbUtleTogXCJ1cHN0cmVhbXNcIiB8IFwiZG93bnN0cmVhbXNcIlxuICAgICkge1xuICAgICAgICBjb25zdCBzdHJlYW1zID0gdW5pcSgodGhpc1tzdHJlYW1LZXldIHx8IFtdKS5jb25jYXQoc3RyZWFtLmlkKSk7XG4gICAgICAgIHRoaXNbc3RyZWFtS2V5XSA9IHN0cmVhbXM7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waXp6YWduYVNlcnZpY2Uuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgIHBpenphZ25hS2V5OiBQaXp6YWduYUxheWVyLkRhdGEsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJLZXk6IHRoaXMucHJvdmlkZXJLZXksXG4gICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoOiBbc3RyZWFtS2V5XSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJlYW1zXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclVwc3RyZWFtU3Vic2NyaXB0aW9ucyguLi51cHN0cmVhbXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXNoYm9hcmRCdXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb25zKFxuICAgICAgICAgICAgdXBzdHJlYW1zLFxuICAgICAgICAgICAgdGhpcy51cHN0cmVhbVN1YnNjcmlwdGlvbnMsXG4gICAgICAgICAgICB0aGlzLnBpenphZ25hQnVzLFxuICAgICAgICAgICAgKHN0cmVhbTogSUV2ZW50RGVmaW5pdGlvbiwgZXZlbnQ6IElFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB3aWRnZXRJZCB0byBhbGwgZXZlbnRzIHBhc3NlZCB0byB0aGUgZGFzaGJvYXJkXG4gICAgICAgICAgICAgICAgY29uc3Qgd2lkZ2V0SWQgPSB0aGlzLndpZGdldENvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFdpZGdldCgpLmlkO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRCdXNcbiAgICAgICAgICAgICAgICAgICAgLmdldFN0cmVhbShzdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgIC5uZXh0KDxhbnk+T2JqZWN0LmFzc2lnbih7fSwgZXZlbnQsIHsgd2lkZ2V0SWQgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJEb3duc3RyZWFtU3Vic2NyaXB0aW9ucyguLi5kb3duc3RyZWFtczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhc2hib2FyZEJ1cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbnMoXG4gICAgICAgICAgICBkb3duc3RyZWFtcyxcbiAgICAgICAgICAgIHRoaXMuZG93bnN0cmVhbVN1YnNjcmlwdGlvbnMsXG4gICAgICAgICAgICB0aGlzLmRhc2hib2FyZEJ1cyxcbiAgICAgICAgICAgIChzdHJlYW06IElFdmVudERlZmluaXRpb24sIGV2ZW50OiBJV2lkZ2V0RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBwYXNzIG9ubHkgZXZlbnRzIHRoYXQgaGF2ZSBtYXRjaGluZyB3aWRnZXRJZCBvciBhIHdpZGdldElkIHRoYXQgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHRoaXMud2lkZ2V0Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0V2lkZ2V0KCkuaWQ7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQud2lkZ2V0SWQgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0SWQgPT09IGV2ZW50LndpZGdldElkXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl6emFnbmFCdXMuZ2V0U3RyZWFtKHN0cmVhbSkubmV4dChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJTdWJzY3JpcHRpb25zKFxuICAgICAgICBzdHJlYW1zOiBzdHJpbmdbXSA9IFtdLFxuICAgICAgICBzdWJzY3JpcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICBzb3VyY2VCdXM6IEV2ZW50QnVzPElFdmVudD4sXG4gICAgICAgIGhhbmRsZUV2ZW50OiAoc3RyZWFtOiBJRXZlbnREZWZpbml0aW9uLCBldmVudDogSUV2ZW50KSA9PiB2b2lkXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbXNJbmRleDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBzdHJlYW1zXG4gICAgICAgICAgICA/IGtleUJ5KHN0cmVhbXMsICh4KSA9PiB4KVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIC8vIHJlbW92ZSBzdWJzY3JpcHRpb25zIHRoYXQgYXJlIG5vdCB2YWxpZCBhbnltb3JlXG4gICAgICAgIGZvciAoY29uc3Qgc3RyZWFtSWQgb2YgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgICAgIGlmICghc3RyZWFtc0luZGV4IHx8ICFzdHJlYW1zSW5kZXhbc3RyZWFtSWRdKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uc1tzdHJlYW1JZF0udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgc3Vic2NyaXB0aW9uc1tzdHJlYW1JZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgc3Vic2NyaXB0aW9ucyB0aGF0IHdlcmUgbm90IHJlZ2lzdGVyZWQgYmVmb3JlXG4gICAgICAgIGZvciAoY29uc3Qgc3RyZWFtSWQgb2YgT2JqZWN0LmtleXMoc3RyZWFtc0luZGV4ID8/IHt9KS5maWx0ZXIoXG4gICAgICAgICAgICAocykgPT4gIXN1YnNjcmlwdGlvbnNbc11cbiAgICAgICAgKSkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREZWZpbml0aW9uID0gdGhpcy5ldmVudFJlZ2lzdHJ5LmdldEV2ZW50KHN0cmVhbUlkKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnNbc3RyZWFtSWRdID0gKFxuICAgICAgICAgICAgICAgIHNvdXJjZUJ1cy5nZXRTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICkgYXMgb2JqZWN0IGFzIFN1YmplY3Q8SUV2ZW50PlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogSUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50RGVmaW5pdGlvbiwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19