UNPKG

@exalif/ngx-breadcrumbs

Version:

Angular 4+ breadcrumbs on top of native Angular router

276 lines (266 loc) 23.2 kB
import { Injectable, Injector, Component, NgModule } from '@angular/core'; import { Observable, of, from, BehaviorSubject, concat } from 'rxjs'; import * as template from 'lodash.template'; import * as templateSettings from 'lodash.templatesettings'; import { ActivatedRoute, NavigationEnd, Router, RouterModule } from '@angular/router'; import { filter, flatMap, distinct, toArray, first } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class BreadcrumbsConfig { } BreadcrumbsConfig.decorators = [ { type: Injectable }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ const /** @type {?} */ _ = { template: template, templateSettings: templateSettings }; _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; /** * @abstract */ class BreadcrumbsUtils { /** * @param {?} rawTemplate * @param {?} binding * @return {?} */ static stringFormat(rawTemplate, binding) { const /** @type {?} */ compiled = _.template(rawTemplate); return compiled(binding); } /** * @template T * @param {?} value * @return {?} */ static wrapIntoObservable(value) { if (value instanceof Observable) { return value; } if (this.isPromise(value)) { return from(Promise.resolve(value)); } return of(/** @type {?} */ (value)); } /** * @param {?} value * @return {?} */ static isPromise(value) { return value && (typeof value.then === 'function'); } } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class BreadcrumbsResolver { /** * @param {?} route * @param {?} state * @return {?} */ resolve(route, state) { const /** @type {?} */ data = route.routeConfig.data; const /** @type {?} */ path = this.getFullPath(route); let /** @type {?} */ text = typeof (data["breadcrumbs"]) === 'string' ? data["breadcrumbs"] : data["breadcrumbs"].text || data["text"] || path; text = BreadcrumbsUtils.stringFormat(text, route.data); const /** @type {?} */ crumbs = [{ text, path }]; return of(crumbs); } /** * @param {?} route * @return {?} */ getFullPath(route) { return this.fetchFullPath(route.pathFromRoot); } /** * @param {?} routes * @return {?} */ fetchFullPath(routes) { return routes.reduce((path, route) => path += this.fetchRelativePath(route.url), ''); } /** * @param {?} urlSegments * @return {?} */ fetchRelativePath(urlSegments) { return urlSegments.reduce((path, urlSegment) => path += '/' + urlSegment.path, ''); } } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class BreadcrumbsService { /** * @param {?} _router * @param {?} route * @param {?} _config * @param {?} _injector */ constructor(_router, route, _config, _injector) { this._router = _router; this.route = route; this._config = _config; this._injector = _injector; this._breadcrumbs = new BehaviorSubject([]); this._defaultResolver = new BreadcrumbsResolver(); this._router.events.pipe(filter((x) => x instanceof NavigationEnd)) .subscribe((event) => { const /** @type {?} */ routeRoot = _router.routerState.snapshot.root; this._resolveCrumbs(routeRoot).pipe(flatMap((crumbs) => crumbs), distinct((crumb) => crumb.text), toArray(), flatMap((crumbs) => { if (this._config.postProcess) { const /** @type {?} */ postProcessedCrumb = this._config.postProcess(crumbs); return BreadcrumbsUtils.wrapIntoObservable(postProcessedCrumb).pipe(first()); } else { return of(crumbs); } })) .subscribe((crumbs) => { this._breadcrumbs.next(crumbs); }); }); } /** * @return {?} */ get crumbs$() { return this._breadcrumbs; } /** * @return {?} */ getCrumbs() { return this.crumbs$; } /** * @param {?} route * @return {?} */ _resolveCrumbs(route) { let /** @type {?} */ crumbs$; const /** @type {?} */ data = route.routeConfig && route.routeConfig.data; if (data && data["breadcrumbs"]) { let /** @type {?} */ resolver; if (data["breadcrumbs"].prototype instanceof BreadcrumbsResolver) { resolver = this._injector.get(data["breadcrumbs"]); } else { resolver = this._defaultResolver; } const /** @type {?} */ result = resolver.resolve(route, this._router.routerState.snapshot); crumbs$ = BreadcrumbsUtils.wrapIntoObservable(result).pipe(first()); } else { crumbs$ = of([]); } if (route.firstChild) { crumbs$ = concat(crumbs$, this._resolveCrumbs(route.firstChild)); } return crumbs$; } } BreadcrumbsService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ BreadcrumbsService.ctorParameters = () => [ { type: Router }, { type: ActivatedRoute }, { type: BreadcrumbsConfig }, { type: Injector } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class BreadcrumbsComponent { /** * @param {?} breadcrumbsService */ constructor(breadcrumbsService) { this.breadcrumbsService = breadcrumbsService; this.crumbs$ = this.breadcrumbsService.getCrumbs(); } } BreadcrumbsComponent.decorators = [ { type: Component, args: [{ selector: 'lib-breadcrumbs', template: ` <ol *ngIf="crumbs$ | async as crumbs" class="breadcrumbs__container"> <li *ngFor="let crumb of crumbs; let last = last" [ngClass]="{ 'breadcrumbs__item--active': last }" class="breadcrumbs__item" > <a *ngIf="!last" [routerLink]="crumb.path">{{ crumb.text }}</a> <span *ngIf="last">{{ crumb.text }}</span> </li> </ol> ` },] }, ]; /** @nocollapse */ BreadcrumbsComponent.ctorParameters = () => [ { type: BreadcrumbsService } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class BreadcrumbsModule { /** * @return {?} */ static forRoot() { return { ngModule: BreadcrumbsModule, providers: [ BreadcrumbsConfig, BreadcrumbsService ] }; } /** * @return {?} */ static forChild() { return { ngModule: BreadcrumbsModule }; } } BreadcrumbsModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule, RouterModule ], declarations: [BreadcrumbsComponent], exports: [BreadcrumbsComponent] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { BreadcrumbsModule, BreadcrumbsComponent, BreadcrumbsService, BreadcrumbsConfig, BreadcrumbsResolver }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbGlmLW5neC1icmVhZGNydW1icy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL3NlcnZpY2VzL2JyZWFkY3J1bWJzLmNvbmZpZy50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL3V0aWxzL2JyZWFkY3J1bWJzLnV0aWxzLnRzIiwibmc6Ly9AZXhhbGlmL25neC1icmVhZGNydW1icy9saWIvc2VydmljZXMvYnJlYWRjcnVtYnMucmVzb2x2ZXIudHMiLCJuZzovL0BleGFsaWYvbmd4LWJyZWFkY3J1bWJzL2xpYi9zZXJ2aWNlcy9icmVhZGNydW1icy5zZXJ2aWNlLnRzIiwibmc6Ly9AZXhhbGlmL25neC1icmVhZGNydW1icy9saWIvY29tcG9uZW50L2JyZWFkY3J1bWJzLmNvbXBvbmVudC50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL2JyZWFkY3J1bWJzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcblxuZXhwb3J0IHR5cGUgUG9zdFByb2Nlc3NGdW5jdGlvbiA9XG4gIChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4gUHJvbWlzZTxCcmVhZGNydW1iW10+IHwgT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHwgQnJlYWRjcnVtYltdO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb25maWcge1xuICBwb3N0UHJvY2VzczogUG9zdFByb2Nlc3NGdW5jdGlvbjtcbn1cbiIsImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJlc29sdmUsIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgKiBhcyB0ZW1wbGF0ZSBmcm9tICdsb2Rhc2gudGVtcGxhdGUnO1xuaW1wb3J0ICogYXMgdGVtcGxhdGVTZXR0aW5ncyBmcm9tICdsb2Rhc2gudGVtcGxhdGVzZXR0aW5ncyc7XG5cbmNvbnN0IF8gPSB7XG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgdGVtcGxhdGVTZXR0aW5nczogdGVtcGxhdGVTZXR0aW5nc1xufTtcbl8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXFxzXFxTXSs/KX19L2c7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCcmVhZGNydW1ic1V0aWxzIHtcbiAgcHVibGljIHN0YXRpYyBzdHJpbmdGb3JtYXQocmF3VGVtcGxhdGU6IHN0cmluZywgYmluZGluZzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21waWxlZCA9IF8udGVtcGxhdGUocmF3VGVtcGxhdGUpO1xuXG4gICAgcmV0dXJuIGNvbXBpbGVkKGJpbmRpbmcpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB3cmFwSW50b09ic2VydmFibGU8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1Byb21pc2UodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2YodmFsdWUgYXMgVCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1Byb21pc2UodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSZXNvbHZlLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzVXRpbHMgfSBmcm9tICcuLi91dGlscy9icmVhZGNydW1icy51dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1ic1Jlc29sdmVyIGltcGxlbWVudHMgUmVzb2x2ZTxCcmVhZGNydW1iW10+IHtcbiAgcHVibGljIHJlc29sdmUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KVxuICAgIDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHwgUHJvbWlzZTxCcmVhZGNydW1iW10+IHwgQnJlYWRjcnVtYltdIHtcblxuICAgIGNvbnN0IGRhdGEgPSByb3V0ZS5yb3V0ZUNvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKHJvdXRlKTtcblxuICAgIGxldCB0ZXh0ID0gdHlwZW9mIChkYXRhLmJyZWFkY3J1bWJzKSA9PT0gJ3N0cmluZycgPyBkYXRhLmJyZWFkY3J1bWJzIDogZGF0YS5icmVhZGNydW1icy50ZXh0IHx8IGRhdGEudGV4dCB8fCBwYXRoO1xuICAgIHRleHQgPSBCcmVhZGNydW1ic1V0aWxzLnN0cmluZ0Zvcm1hdCh0ZXh0LCByb3V0ZS5kYXRhKTtcblxuICAgIGNvbnN0IGNydW1iczogQnJlYWRjcnVtYltdID0gW3tcbiAgICAgIHRleHQsXG4gICAgICBwYXRoXG4gICAgfV07XG5cbiAgICByZXR1cm4gb2YoY3J1bWJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGdWxsUGF0aChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hGdWxsUGF0aChyb3V0ZS5wYXRoRnJvbVJvb3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEZ1bGxQYXRoKHJvdXRlczogQWN0aXZhdGVkUm91dGVTbmFwc2hvdFtdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcm91dGVzLnJlZHVjZSgocGF0aCwgcm91dGUpID0+IHBhdGggKz0gdGhpcy5mZXRjaFJlbGF0aXZlUGF0aChyb3V0ZS51cmwpLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoUmVsYXRpdmVQYXRoKHVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10pOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmxTZWdtZW50cy5yZWR1Y2UoKHBhdGgsIHVybFNlZ21lbnQpID0+IHBhdGggKz0gJy8nICsgdXJsU2VnbWVudC5wYXRoLCAnJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29uY2F0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGZpbHRlciwgZmxhdE1hcCwgZGlzdGluY3QsIHRvQXJyYXksIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCcmVhZGNydW1ic0NvbmZpZyB9IGZyb20gJy4vYnJlYWRjcnVtYnMuY29uZmlnJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzUmVzb2x2ZXIgfSBmcm9tICcuL2JyZWFkY3J1bWJzLnJlc29sdmVyJztcbmltcG9ydCB7IEJyZWFkY3J1bWIgfSBmcm9tICcuLi9tb2RlbHMvYnJlYWRjcnVtYic7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1V0aWxzIH0gZnJvbSAnLi4vdXRpbHMvYnJlYWRjcnVtYnMudXRpbHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9icmVhZGNydW1icyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QnJlYWRjcnVtYltdPihbXSk7XG4gIHByaXZhdGUgX2RlZmF1bHRSZXNvbHZlciA9IG5ldyBCcmVhZGNydW1ic1Jlc29sdmVyKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHVibGljIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9jb25maWc6IEJyZWFkY3J1bWJzQ29uZmlnLFxuICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvclxuICApIHtcblxuICAgIHRoaXMuX3JvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoKHgpID0+IHggaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdXRlUm9vdCA9IF9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3Qucm9vdDtcblxuICAgICAgICB0aGlzLl9yZXNvbHZlQ3J1bWJzKHJvdXRlUm9vdCkucGlwZShcbiAgICAgICAgICBmbGF0TWFwKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4gY3J1bWJzKSxcbiAgICAgICAgICBkaXN0aW5jdCgoY3J1bWI6IEJyZWFkY3J1bWIpID0+IGNydW1iLnRleHQpLFxuICAgICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgICBmbGF0TWFwKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3N0UHJvY2Vzcykge1xuICAgICAgICAgICAgICBjb25zdCBwb3N0UHJvY2Vzc2VkQ3J1bWIgPSB0aGlzLl9jb25maWcucG9zdFByb2Nlc3MoY3J1bWJzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIEJyZWFkY3J1bWJzVXRpbHMud3JhcEludG9PYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ocG9zdFByb2Nlc3NlZENydW1iKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBvZihjcnVtYnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYnJlYWRjcnVtYnMubmV4dChjcnVtYnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgY3J1bWJzJCgpOiBPYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9icmVhZGNydW1icztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDcnVtYnMoKTogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHtcbiAgICByZXR1cm4gdGhpcy5jcnVtYnMkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUNydW1icyhyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdClcbiAgICA6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XG5cbiAgICBsZXQgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+O1xuXG4gICAgY29uc3QgZGF0YSA9IHJvdXRlLnJvdXRlQ29uZmlnICYmIHJvdXRlLnJvdXRlQ29uZmlnLmRhdGE7XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmJyZWFkY3J1bWJzKSB7XG4gICAgICBsZXQgcmVzb2x2ZXI6IEJyZWFkY3J1bWJzUmVzb2x2ZXI7XG5cbiAgICAgIGlmIChkYXRhLmJyZWFkY3J1bWJzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJyZWFkY3J1bWJzUmVzb2x2ZXIpIHtcbiAgICAgICAgcmVzb2x2ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoZGF0YS5icmVhZGNydW1icyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlciA9IHRoaXMuX2RlZmF1bHRSZXNvbHZlcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShyb3V0ZSwgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcbiAgICAgIGNydW1icyQgPSBCcmVhZGNydW1ic1V0aWxzLndyYXBJbnRvT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+KHJlc3VsdCkucGlwZShcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjcnVtYnMkID0gb2YoW10pO1xuICAgIH1cblxuICAgIGlmIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICBjcnVtYnMkID0gY29uY2F0KGNydW1icyQsIHRoaXMuX3Jlc29sdmVDcnVtYnMocm91dGUuZmlyc3RDaGlsZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjcnVtYnMkO1xuICB9XG59XG4iLCJcbmltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWJzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyZWFkY3J1bWJzJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8b2wgKm5nSWY9XCJjcnVtYnMkIHwgYXN5bmMgYXMgY3J1bWJzXCIgY2xhc3M9XCJicmVhZGNydW1ic19fY29udGFpbmVyXCI+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGNydW1iIG9mIGNydW1iczsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnYnJlYWRjcnVtYnNfX2l0ZW0tLWFjdGl2ZSc6IGxhc3QgfVwiXG4gICAgICAgIGNsYXNzPVwiYnJlYWRjcnVtYnNfX2l0ZW1cIlxuICAgICAgPlxuICAgICAgICA8YSAqbmdJZj1cIiFsYXN0XCIgW3JvdXRlckxpbmtdPVwiY3J1bWIucGF0aFwiPnt7IGNydW1iLnRleHQgfX08L2E+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibGFzdFwiPnt7IGNydW1iLnRleHQgfX08L3NwYW4+XG4gICAgICA8L2xpPlxuICAgIDwvb2w+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb21wb25lbnQge1xuICBwdWJsaWMgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+ID0gdGhpcy5icmVhZGNydW1ic1NlcnZpY2UuZ2V0Q3J1bWJzKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGJyZWFkY3J1bWJzU2VydmljZTogQnJlYWRjcnVtYnNTZXJ2aWNlKSB7IH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb25maWcgfSBmcm9tICcuL3NlcnZpY2VzL2JyZWFkY3J1bWJzLmNvbmZpZyc7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC9icmVhZGNydW1icy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtCcmVhZGNydW1ic0NvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtCcmVhZGNydW1ic0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNNb2R1bGUge1xuICBwdWJsaWMgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCcmVhZGNydW1ic01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBCcmVhZGNydW1ic0NvbmZpZyxcbiAgICAgICAgQnJlYWRjcnVtYnNTZXJ2aWNlXG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZm9yQ2hpbGQoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCcmVhZGNydW1ic01vZHVsZVxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7O1lBU0MsVUFBVTs7Ozs7OztBQ1BYLEFBS0EsdUJBQU0sQ0FBQyxHQUFHO0lBQ1IsUUFBUSxFQUFFLFFBQVE7SUFDbEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUM7QUFDRixDQUFDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDOzs7O0FBRW5EOzs7Ozs7SUFDUyxPQUFPLFlBQVksQ0FBQyxXQUFtQixFQUFFLE9BQVk7UUFDMUQsdUJBQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxD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