UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

136 lines 16.2 kB
import { Injectable, InjectionToken, Injector } from '@angular/core'; import { Router } from '@angular/router'; import { shareReplay, map, distinctUntilChanged } from 'rxjs/operators'; import { fromTrigger, hookGeneric, getInjectedHooks, sortByPriority, stateToFactory, ExtensionPointForPlugins } from '../common/extension-hooks'; import { groupBy } from 'lodash-es'; import { PluginsResolveService } from '../plugins/plugins-resolve.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "../plugins/plugins-resolve.service"; /** * A hook to add ActionBarItems using the multi provider extension concept. * Consider using the `hookActionBar` function instead. * * ```typescript * providers: [ * { * provide: HOOK_ACTION_BAR, * useValue: [{ template: SomeComponent, priority: 10, placement: 'left' } as ActionBarItem], * multi: true * } * ] * ``` * @deprecated Consider using the `hookActionBar` function instead. */ export const HOOK_ACTION_BAR = new InjectionToken('HOOK_ACTION_BAR'); /** * A hook to add ActionBarItems using the multi provider extension concept. * * You can either provide a single `ActionBarItem` as parameter: * ```typescript * hookActionBar(...) * ``` * * Or an array to directly register multiple: * ```typescript * hookActionBar([...]) * ``` * * Or you provide an Service that implements `ExtensionFactory<ActionBarItem>` * ```typescript * export class MyActionBarFactory implements ExtensionFactory<ActionBarItem> {...} * ... * hookActionBar(MyActionBarFactory) * ``` * A typed alternative to `HOOK_ACTION_BAR`. * @param items The `ActionBarItem`'s or `ExtensionFactory` to be provided. * @returns An `Provider` to be provided in your module. */ export function hookActionBar(items, options) { return hookGeneric(items, HOOK_ACTION_BAR, options); } /** * A service which defines action-bar items via the multi provider concept. * * ```typescript * // preferred way, multi provider concept: * providers: [ * { * provide: HOOK_ACTION_BAR, * useValue: [{ template: SomeComponent, priority: 10, placement: 'left' } as ActionBarItem], * multi: true * } * ] * * // use services: * this.actionBarService.add({ template: SomeComponent, priority: 10, placement: 'left' }); * ``` */ export class ActionBarService extends ExtensionPointForPlugins { /** * @ignore */ constructor(rootInjector, router, plugins) { super(rootInjector, plugins); this.router = router; this.items$ = this.setupItemsObservable(); } /** * Returns the current state. * @readonly * @returns The current set of actions. */ get state() { return this.state$.value; } /** * Adds a new item to the action bar in the header and emits a state change. * @param item The item to add. */ add(item) { this.state.add(item); this.emitNewState(); } /** * Removes an action bar item from the header and emits a state change. * @param item The item to remove. */ remove(item) { this.state.delete(item); this.emitNewState(); } setupItemsObservable() { return fromTrigger(this.router, this.refresh$, [ getInjectedHooks(HOOK_ACTION_BAR, this.injectors), () => this.factories, stateToFactory(this.state$) ]).pipe(map((items) => { const grouped = groupBy(items, 'groupId'); // groupBy stores undefined as a string key -> all undefined a ungrouped const ungroupedItems = grouped.undefined || []; const groupedItems = Object.keys(grouped) .filter(key => key !== 'undefined') .map(key => this.pickItemFromGroup(grouped[key])); return [...ungroupedItems, ...groupedItems]; }), map(items => sortByPriority(items)), shareReplay(1), distinctUntilChanged()); } pickItemFromGroup(groupedItems) { const groupIsPrioritized = groupedItems.some(item => item.hasOwnProperty('inGroupPriority')); if (!groupIsPrioritized) { return groupedItems[0]; } const itemWithHighestPriority = groupedItems.reduce((prev, current) => { return prev.inGroupPriority > current.inGroupPriority ? prev : current; }); return itemWithHighestPriority; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionBarService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionBarService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionBarService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i2.PluginsResolveService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWJhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9hY3Rpb24tYmFyL2FjdGlvbi1iYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUVMLFdBQVcsRUFFWCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxjQUFjLEVBQ2Qsd0JBQXdCLEVBRXpCLE1BQU0sMkJBQTJCLENBQUM7QUFFbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7OztBQXNCM0U7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxjQUFjLENBQXFCLGlCQUFpQixDQUFDLENBQUM7QUFFekY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixLQUFxQyxFQUNyQyxPQUFxQztJQUVyQyxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sT0FBTyxnQkFBaUIsU0FBUSx3QkFBdUM7SUFDM0U7O09BRUc7SUFDSCxZQUNFLFlBQXNCLEVBQ2QsTUFBYyxFQUN0QixPQUE4QjtRQUU5QixLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSHJCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFJdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxJQUFtQjtRQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFtQjtRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLG9CQUFvQjtRQUM1QixPQUFPLFdBQVcsQ0FBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzVELGdCQUFnQixDQUFnQixlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNoRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNwQixjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUM1QixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLEtBQXNCLEVBQUUsRUFBRTtZQUM3QixNQUFNLE9BQU8sR0FBb0MsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRSx3RUFBd0U7WUFDeEUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7aUJBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUM7aUJBQ2xDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNuQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ2Qsb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxZQUE2QjtRQUN2RCxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSx1QkFBdUIsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3BFLE9BQU8sSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sdUJBQXVCLENBQUM7SUFDakMsQ0FBQzsrR0F0RVUsZ0JBQWdCO21IQUFoQixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmVSZXBsYXksIG1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBFeHRlbnNpb25GYWN0b3J5LFxuICBmcm9tVHJpZ2dlcixcbiAgR2VuZXJpY0hvb2tUeXBlLFxuICBob29rR2VuZXJpYyxcbiAgZ2V0SW5qZWN0ZWRIb29rcyxcbiAgc29ydEJ5UHJpb3JpdHksXG4gIHN0YXRlVG9GYWN0b3J5LFxuICBFeHRlbnNpb25Qb2ludEZvclBsdWdpbnMsXG4gIEdlbmVyaWNIb29rT3B0aW9uc1xufSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IEFjdGlvbkJhckl0ZW0gfSBmcm9tICcuL2FjdGlvbi1iYXIubW9kZWwnO1xuaW1wb3J0IHsgZ3JvdXBCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBQbHVnaW5zUmVzb2x2ZVNlcnZpY2UgfSBmcm9tICcuLi9wbHVnaW5zL3BsdWdpbnMtcmVzb2x2ZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBBbiBleHRlbnNpb24gSE9PSyBjYW4gdXNlIGVpdGhlciBhIHB1cmUgdmFsdWU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgeyBwcm92aWRlOiBIT09LX1gsIHVzZVZhbHVlOiB7IC4uLmhvb2tWYWx1ZSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqXG4gKiBPciBhbiBhcnJheSB0byBkaXJlY3RseSByZWdpc3RlciBtdWx0aXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICB7IHByb3ZpZGU6IEhPT0tfWCwgdXNlVmFsdWU6IFt7IC4uLmhvb2tWYWx1ZXMgfV0sIG11bHRpOiB0cnVlIH1cbiAqIGBgYFxuICpcbiAqIE9yIGFuIEV4dGVuc2lvbkZhY3Rvcnkgd2hpY2ggYWxsb3dzIHRvIGRlZmluZSBhIGdldCgpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uXG4gKiBnZXRzIGNhbGxlZCBvbiBlYWNoIG5hdmlnYXRpb24gd2l0aCB0aGUgY3VycmVudCByb3V0ZSBhbmQgY2FuIHJldHVybiB2YWx1ZXNcbiAqIGFzeW5jIChvYnNlcnZhYmxlIG9yIHByb21pc2UpLlxuICogYGBgdHlwZXNjcmlwdFxuICogIHsgcHJvdmlkZTogSE9PS19YLCB1c2VGYWN0b3J5OiB7IGdldDogKHJvdXRlKSA9PiBkb1NvbWV0aGluZ0FzeW5jKHJvdXRlKSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgQWN0aW9uQmFyRXh0ZW5zaW9uID0gQWN0aW9uQmFySXRlbSB8IEFjdGlvbkJhckl0ZW1bXSB8IEV4dGVuc2lvbkZhY3Rvcnk8QWN0aW9uQmFySXRlbT47XG5cbi8qKlxuICogQSBob29rIHRvIGFkZCBBY3Rpb25CYXJJdGVtcyB1c2luZyB0aGUgbXVsdGkgcHJvdmlkZXIgZXh0ZW5zaW9uIGNvbmNlcHQuXG4gKiBDb25zaWRlciB1c2luZyB0aGUgYGhvb2tBY3Rpb25CYXJgIGZ1bmN0aW9uIGluc3RlYWQuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogcHJvdmlkZXJzOiBbXG4gKiAgIHtcbiAqICAgICBwcm92aWRlOiBIT09LX0FDVElPTl9CQVIsXG4gKiAgICAgdXNlVmFsdWU6IFt7IHRlbXBsYXRlOiBTb21lQ29tcG9uZW50LCBwcmlvcml0eTogMTAsIHBsYWNlbWVudDogJ2xlZnQnIH0gYXMgQWN0aW9uQmFySXRlbV0sXG4gKiAgICAgbXVsdGk6IHRydWVcbiAqICAgfVxuICogXVxuICogYGBgXG4gKiBAZGVwcmVjYXRlZCBDb25zaWRlciB1c2luZyB0aGUgYGhvb2tBY3Rpb25CYXJgIGZ1bmN0aW9uIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBIT09LX0FDVElPTl9CQVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48QWN0aW9uQmFyRXh0ZW5zaW9uPignSE9PS19BQ1RJT05fQkFSJyk7XG5cbi8qKlxuICogQSBob29rIHRvIGFkZCBBY3Rpb25CYXJJdGVtcyB1c2luZyB0aGUgbXVsdGkgcHJvdmlkZXIgZXh0ZW5zaW9uIGNvbmNlcHQuXG4gKlxuICogWW91IGNhbiBlaXRoZXIgcHJvdmlkZSBhIHNpbmdsZSBgQWN0aW9uQmFySXRlbWAgYXMgcGFyYW1ldGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogIGhvb2tBY3Rpb25CYXIoLi4uKVxuICogYGBgXG4gKlxuICogT3IgYW4gYXJyYXkgdG8gZGlyZWN0bHkgcmVnaXN0ZXIgbXVsdGlwbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgaG9va0FjdGlvbkJhcihbLi4uXSlcbiAqIGBgYFxuICpcbiAqIE9yIHlvdSBwcm92aWRlIGFuIFNlcnZpY2UgdGhhdCBpbXBsZW1lbnRzIGBFeHRlbnNpb25GYWN0b3J5PEFjdGlvbkJhckl0ZW0+YFxuICogYGBgdHlwZXNjcmlwdFxuICogIGV4cG9ydCBjbGFzcyBNeUFjdGlvbkJhckZhY3RvcnkgaW1wbGVtZW50cyBFeHRlbnNpb25GYWN0b3J5PEFjdGlvbkJhckl0ZW0+IHsuLi59XG4gKiAgLi4uXG4gKiAgaG9va0FjdGlvbkJhcihNeUFjdGlvbkJhckZhY3RvcnkpXG4gKiBgYGBcbiAqIEEgdHlwZWQgYWx0ZXJuYXRpdmUgdG8gYEhPT0tfQUNUSU9OX0JBUmAuXG4gKiBAcGFyYW0gaXRlbXMgVGhlIGBBY3Rpb25CYXJJdGVtYCdzIG9yIGBFeHRlbnNpb25GYWN0b3J5YCB0byBiZSBwcm92aWRlZC5cbiAqIEByZXR1cm5zIEFuIGBQcm92aWRlcmAgdG8gYmUgcHJvdmlkZWQgaW4geW91ciBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rQWN0aW9uQmFyKFxuICBpdGVtczogR2VuZXJpY0hvb2tUeXBlPEFjdGlvbkJhckl0ZW0+LFxuICBvcHRpb25zPzogUGFydGlhbDxHZW5lcmljSG9va09wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIGhvb2tHZW5lcmljKGl0ZW1zLCBIT09LX0FDVElPTl9CQVIsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEEgc2VydmljZSB3aGljaCBkZWZpbmVzIGFjdGlvbi1iYXIgaXRlbXMgdmlhIHRoZSBtdWx0aSBwcm92aWRlciBjb25jZXB0LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHByZWZlcnJlZCB3YXksIG11bHRpIHByb3ZpZGVyIGNvbmNlcHQ6XG4gKiBwcm92aWRlcnM6IFtcbiAqICAge1xuICogICAgIHByb3ZpZGU6IEhPT0tfQUNUSU9OX0JBUixcbiAqICAgICB1c2VWYWx1ZTogW3sgdGVtcGxhdGU6IFNvbWVDb21wb25lbnQsIHByaW9yaXR5OiAxMCwgcGxhY2VtZW50OiAnbGVmdCcgfSBhcyBBY3Rpb25CYXJJdGVtXSxcbiAqICAgICBtdWx0aTogdHJ1ZVxuICogICB9XG4gKiBdXG4gKlxuICogLy8gdXNlIHNlcnZpY2VzOlxuICogdGhpcy5hY3Rpb25CYXJTZXJ2aWNlLmFkZCh7IHRlbXBsYXRlOiBTb21lQ29tcG9uZW50LCBwcmlvcml0eTogMTAsIHBsYWNlbWVudDogJ2xlZnQnIH0pO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFjdGlvbkJhclNlcnZpY2UgZXh0ZW5kcyBFeHRlbnNpb25Qb2ludEZvclBsdWdpbnM8QWN0aW9uQmFySXRlbT4ge1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdEluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHBsdWdpbnM6IFBsdWdpbnNSZXNvbHZlU2VydmljZVxuICApIHtcbiAgICBzdXBlcihyb290SW5qZWN0b3IsIHBsdWdpbnMpO1xuICAgIHRoaXMuaXRlbXMkID0gdGhpcy5zZXR1cEl0ZW1zT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAqIEByZWFkb25seVxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXQgb2YgYWN0aW9ucy5cbiAgICovXG4gIGdldCBzdGF0ZSgpOiBTZXQ8QWN0aW9uQmFySXRlbT4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlJC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGl0ZW0gdG8gdGhlIGFjdGlvbiBiYXIgaW4gdGhlIGhlYWRlciBhbmQgZW1pdHMgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGFkZC5cbiAgICovXG4gIGFkZChpdGVtOiBBY3Rpb25CYXJJdGVtKSB7XG4gICAgdGhpcy5zdGF0ZS5hZGQoaXRlbSk7XG4gICAgdGhpcy5lbWl0TmV3U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGFjdGlvbiBiYXIgaXRlbSBmcm9tIHRoZSBoZWFkZXIgYW5kIGVtaXRzIGEgc3RhdGUgY2hhbmdlLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byByZW1vdmUuXG4gICAqL1xuICByZW1vdmUoaXRlbTogQWN0aW9uQmFySXRlbSkge1xuICAgIHRoaXMuc3RhdGUuZGVsZXRlKGl0ZW0pO1xuICAgIHRoaXMuZW1pdE5ld1N0YXRlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBJdGVtc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxBY3Rpb25CYXJJdGVtW10+IHtcbiAgICByZXR1cm4gZnJvbVRyaWdnZXI8QWN0aW9uQmFySXRlbT4odGhpcy5yb3V0ZXIsIHRoaXMucmVmcmVzaCQsIFtcbiAgICAgIGdldEluamVjdGVkSG9va3M8QWN0aW9uQmFySXRlbT4oSE9PS19BQ1RJT05fQkFSLCB0aGlzLmluamVjdG9ycyksXG4gICAgICAoKSA9PiB0aGlzLmZhY3RvcmllcyxcbiAgICAgIHN0YXRlVG9GYWN0b3J5KHRoaXMuc3RhdGUkKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKGl0ZW1zOiBBY3Rpb25CYXJJdGVtW10pID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBlZDogUmVjb3JkPHN0cmluZywgQWN0aW9uQmFySXRlbVtdPiA9IGdyb3VwQnkoaXRlbXMsICdncm91cElkJyk7XG4gICAgICAgIC8vIGdyb3VwQnkgc3RvcmVzIHVuZGVmaW5lZCBhcyBhIHN0cmluZyBrZXkgLT4gYWxsIHVuZGVmaW5lZCBhIHVuZ3JvdXBlZFxuICAgICAgICBjb25zdCB1bmdyb3VwZWRJdGVtcyA9IGdyb3VwZWQudW5kZWZpbmVkIHx8IFtdO1xuICAgICAgICBjb25zdCBncm91cGVkSXRlbXMgPSBPYmplY3Qua2V5cyhncm91cGVkKVxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgLm1hcChrZXkgPT4gdGhpcy5waWNrSXRlbUZyb21Hcm91cChncm91cGVkW2tleV0pKTtcbiAgICAgICAgcmV0dXJuIFsuLi51bmdyb3VwZWRJdGVtcywgLi4uZ3JvdXBlZEl0ZW1zXTtcbiAgICAgIH0pLFxuICAgICAgbWFwKGl0ZW1zID0+IHNvcnRCeVByaW9yaXR5KGl0ZW1zKSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBpY2tJdGVtRnJvbUdyb3VwKGdyb3VwZWRJdGVtczogQWN0aW9uQmFySXRlbVtdKTogQWN0aW9uQmFySXRlbSB7XG4gICAgY29uc3QgZ3JvdXBJc1ByaW9yaXRpemVkID0gZ3JvdXBlZEl0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLmhhc093blByb3BlcnR5KCdpbkdyb3VwUHJpb3JpdHknKSk7XG4gICAgaWYgKCFncm91cElzUHJpb3JpdGl6ZWQpIHtcbiAgICAgIHJldHVybiBncm91cGVkSXRlbXNbMF07XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1XaXRoSGlnaGVzdFByaW9yaXR5ID0gZ3JvdXBlZEl0ZW1zLnJlZHVjZSgocHJldiwgY3VycmVudCkgPT4ge1xuICAgICAgcmV0dXJuIHByZXYuaW5Hcm91cFByaW9yaXR5ID4gY3VycmVudC5pbkdyb3VwUHJpb3JpdHkgPyBwcmV2IDogY3VycmVudDtcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlbVdpdGhIaWdoZXN0UHJpb3JpdHk7XG4gIH1cbn1cbiJdfQ==