UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

150 lines 24.4 kB
import { LocationStrategy } from '@angular/common'; import { ChangeDetectorRef, Directive, HostBinding, HostListener, inject, Input } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; import { tick } from '../../../common/index'; import { NAVIGATION_MODULE_OPTIONS } from '../navigation-options'; import { NavigationService } from '../navigation.service'; import * as i0 from "@angular/core"; export class NavigationLinkDirective { constructor() { this._router = inject(Router); this._locationStrategy = inject(LocationStrategy); this._navigationService = inject(NavigationService); this._changeDetector = inject(ChangeDetectorRef); this._route = inject(ActivatedRoute); this._options = inject(NAVIGATION_MODULE_OPTIONS, { optional: true }); /** Emit with the current expaned state */ this._expanded$ = new Subject(); /** Unsubscribe from all observables when this directive is destroyed */ this._onDestroy = new Subject(); } /** The expaned state of this item */ set expanded(value) { this._expanded$.next(value); } ngOnInit() { // any time expanded state anywhere change we should run change detection in case we should collapse this._navigationService.expanded$.pipe(takeUntil(this._onDestroy)) .subscribe(() => this._changeDetector.markForCheck()); this._expanded$.pipe(tick(), takeUntil(this._onDestroy)).subscribe(expanded => { if (this.navigationItem.children && this.navigationItem.children.length > 0) { this.ariaExpanded = expanded; this._navigationService.setExpanded(this.navigationItem, expanded); } }); this._router.events .pipe(filter(event => event instanceof NavigationEnd), takeUntil(this._onDestroy)) .subscribe(this.updateNavigationState.bind(this)); this.updateNavigationState(); this.updateAttributes(); } ngOnChanges() { this.updateAttributes(); } ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } activated(event) { if (this.navigationItem.disabled) { return false; } if (this.navigationItem.routerLink) { const commands = Array.isArray(this.navigationItem.routerLink) ? this.navigationItem.routerLink : [this.navigationItem.routerLink]; this._router.navigate(commands, this.navigationItem.routerExtras); } // Toggle expanded state (relevant only if it has children) this.navigationItem.expanded = !this.navigationItem.expanded; // Invoke the custom click handler if specified if (this.navigationItem.click) { this.navigationItem.click(event, this.navigationItem); } return false; } updateNavigationState() { this.isActive = this.isActiveItem(this.navigationItem); if (this.navigationItem.children) { const activeChild = this.navigationItem.children.find(child => this.isActiveItem(child)); if (activeChild) { this.navigationItem.expanded = true; } } this._changeDetector.markForCheck(); } updateAttributes() { this.href = this.getHref(); this.role = (this.navigationItem.children && this.navigationItem.children.length > 0) ? 'button' : 'treeitem'; this.indentChildren = this.navigationItem.children && this.navigationItem.children.some(item => item.children && item.children.length > 0); } getHref() { if (this.navigationItem.disabled) { return null; } if (this.navigationItem.routerLink) { const commands = Array.isArray(this.navigationItem.routerLink) ? this.navigationItem.routerLink : [this.navigationItem.routerLink]; const urlTree = this._router.createUrlTree(commands, this.navigationItem.routerExtras); return this._locationStrategy.prepareExternalUrl(this._router.serializeUrl(urlTree)); } return null; } isActiveItem(item) { const { exact, ignoreQueryParams } = this.getRouterOptions(item); if (item.routerLink) { let routerExtras = item.routerExtras; // if we are to ignore the query params we must remove them if (ignoreQueryParams) { // get the current actual query params const { queryParams } = this._route.snapshot; // override the provided query params with the actual query params so they will alway match routerExtras = { ...routerExtras, queryParams }; } const commands = Array.isArray(item.routerLink) ? item.routerLink : [item.routerLink]; const urlTree = this._router.createUrlTree(commands, routerExtras); return this._router.isActive(urlTree, exact); } return false; } /** Get the router options with defaults for missing properties */ getRouterOptions(item) { // get the default options based on the ones provided in `forRoot` const defaultOptions = { exact: true, ignoreQueryParams: false, ...(this._options ? this._options.routerOptions : {}) }; // if there are item specific router options they should take precendence return { ...defaultOptions, ...item.routerOptions }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NavigationLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: NavigationLinkDirective, selector: "[uxNavigationLink]", inputs: { navigationItem: "navigationItem", expanded: "expanded", canExpand: "canExpand", indent: "indent" }, host: { listeners: { "click": "activated($event)", "keydown.enter": "activated($event)" }, properties: { "class.indent": "this.indent", "attr.href": "this.href", "attr.role": "this.role", "attr.aria-expanded": "this.ariaExpanded" } }, exportAs: ["uxNavigationLink"], usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NavigationLinkDirective, decorators: [{ type: Directive, args: [{ selector: '[uxNavigationLink]', exportAs: 'uxNavigationLink' }] }], propDecorators: { navigationItem: [{ type: Input }], expanded: [{ type: Input }], canExpand: [{ type: Input }], indent: [{ type: Input }, { type: HostBinding, args: ['class.indent'] }], href: [{ type: HostBinding, args: ['attr.href'] }], role: [{ type: HostBinding, args: ['attr.role'] }], ariaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded'] }], activated: [{ type: HostListener, args: ['click', ['$event']] }, { type: HostListener, args: ['keydown.enter', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1saW5rLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vbmF2aWdhdGlvbi1saW5rL25hdmlnYXRpb24tbGluay5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBTTFELE1BQU0sT0FBTyx1QkFBdUI7SUFKcEM7UUFLcUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6QixzQkFBaUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUU3Qyx1QkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUvQyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTVDLFdBQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFaEMsYUFBUSxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIs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VyxZQUFZO3NCQUE5QyxXQUFXO3VCQUFDLG9CQUFvQjtnQkFnRGpDLFNBQVM7c0JBRlIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUNoQyxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgaW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHRpY2sgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaW5kZXgnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkl0ZW0sIE5hdmlnYXRpb25JdGVtUm91dGVyT3B0aW9ucyB9IGZyb20gJy4uL25hdmlnYXRpb24taXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTkFWSUdBVElPTl9NT0RVTEVfT1BUSU9OUyB9IGZyb20gJy4uL25hdmlnYXRpb24tb3B0aW9ucyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25hdmlnYXRpb24uc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3V4TmF2aWdhdGlvbkxpbmtdJyxcbiAgICBleHBvcnRBczogJ3V4TmF2aWdhdGlvbkxpbmsnXG59KVxuZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25MaW5rRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2NhdGlvblN0cmF0ZWd5ID0gaW5qZWN0KExvY2F0aW9uU3RyYXRlZ3kpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmF2aWdhdGlvblNlcnZpY2UgPSBpbmplY3QoTmF2aWdhdGlvblNlcnZpY2UpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9ucyA9IGluamVjdChOQVZJR0FUSU9OX01PRFVMRV9PUFRJT05TLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgLyoqIFRoZSBOYXZpZ2F0aW9uSXRlbSB0aGlzIGVsZW1lbnQgcmVwcmVzZW50cyAqL1xuICAgIEBJbnB1dCgpIG5hdmlnYXRpb25JdGVtOiBOYXZpZ2F0aW9uSXRlbTtcblxuICAgIC8qKiBUaGUgZXhwYW5lZCBzdGF0ZSBvZiB0aGlzIGl0ZW0gKi9cbiAgICBASW5wdXQoKSBzZXQgZXhwYW5kZWQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5fZXhwYW5kZWQkLm5leHQodmFsdWUpOyB9XG5cbiAgICAvKiogRGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBjYW4gYmUgZXhwYW5kZWQgKi9cbiAgICBASW5wdXQoKSBjYW5FeHBhbmQ6IGJvb2xlYW47XG5cbiAgICAvKiogRGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBzaG91bGQgYmUgaW5kZW50ZWQgKi9cbiAgICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzLmluZGVudCcpIGluZGVudDogYm9vbGVhbjtcblxuICAgIC8qKiBEZXRlcm1pbmUgdGhlIGhyZWYgb2YgdGhpcyBlbGVtZW50ICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmhyZWYnKSBocmVmOiBzdHJpbmc7XG5cbiAgICAvKiogRGV0ZXJtaW5lIHRoZSByb2xlIG9mIHRoaXMgZWxlbWVudCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJykgcm9sZTogc3RyaW5nO1xuXG4gICAgLyoqIFVwZGF0ZSB0aGUgYXJpYS1leHBhbmRlZCBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50ICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKSBhcmlhRXhwYW5kZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogU3RvcmUgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgaXRlbSAqL1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuXG4gICAgLyoqIFN0b3JlIHRoZSBpbmRlbmRhdGlvbiBzdGF0ZSBvZiB0aGUgY2hpbGRyZW4gKi9cbiAgICBpbmRlbnRDaGlsZHJlbjogYm9vbGVhbjtcblxuICAgIC8qKiBFbWl0IHdpdGggdGhlIGN1cnJlbnQgZXhwYW5lZCBzdGF0ZSAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V4cGFuZGVkJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICAvKiogVW5zdWJzY3JpYmUgZnJvbSBhbGwgb2JzZXJ2YWJsZXMgd2hlbiB0aGlzIGRpcmVjdGl2ZSBpcyBkZXN0cm95ZWQgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgICAgICAvLyBhbnkgdGltZSBleHBhbmRlZCBzdGF0ZSBhbnl3aGVyZSBjaGFuZ2Ugd2Ugc2hvdWxkIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGluIGNhc2Ugd2Ugc2hvdWxkIGNvbGxhcHNlXG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TZXJ2aWNlLmV4cGFuZGVkJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSk7XG5cbiAgICAgICAgdGhpcy5fZXhwYW5kZWQkLnBpcGUodGljaygpLCB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKGV4cGFuZGVkID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25JdGVtLmNoaWxkcmVuICYmIHRoaXMubmF2aWdhdGlvbkl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYUV4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGlvblNlcnZpY2Uuc2V0RXhwYW5kZWQodGhpcy5uYXZpZ2F0aW9uSXRlbSwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9yb3V0ZXIuZXZlbnRzXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSwgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMudXBkYXRlTmF2aWdhdGlvblN0YXRlLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvblN0YXRlKCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVBdHRyaWJ1dGVzKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0cmlidXRlcygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pXG4gICAgYWN0aXZhdGVkKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25JdGVtLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uSXRlbS5yb3V0ZXJMaW5rKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tYW5kcyA9IEFycmF5LmlzQXJyYXkodGhpcy5uYXZpZ2F0aW9uSXRlbS5yb3V0ZXJMaW5rKSA/IHRoaXMubmF2aWdhdGlvbkl0ZW0ucm91dGVyTGluayA6IFt0aGlzLm5hdmlnYXRpb25JdGVtLnJvdXRlckxpbmtdO1xuICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzLCB0aGlzLm5hdmlnYXRpb25JdGVtLnJvdXRlckV4dHJhcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUb2dnbGUgZXhwYW5kZWQgc3RhdGUgKHJlbGV2YW50IG9ubHkgaWYgaXQgaGFzIGNoaWxkcmVuKVxuICAgICAgICB0aGlzLm5hdmlnYXRpb25JdGVtLmV4cGFuZGVkID0gIXRoaXMubmF2aWdhdGlvbkl0ZW0uZXhwYW5kZWQ7XG5cbiAgICAgICAgLy8gSW52b2tlIHRoZSBjdXN0b20gY2xpY2sgaGFuZGxlciBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkl0ZW0uY2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkl0ZW0uY2xpY2soZXZlbnQsIHRoaXMubmF2aWdhdGlvbkl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTmF2aWdhdGlvblN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5pc0FjdGl2ZUl0ZW0odGhpcy5uYXZpZ2F0aW9uSXRlbSk7XG5cbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNoaWxkID0gdGhpcy5uYXZpZ2F0aW9uSXRlbS5jaGlsZHJlbi5maW5kKGNoaWxkID0+IHRoaXMuaXNBY3RpdmVJdGVtKGNoaWxkKSk7XG4gICAgICAgICAgICBpZiAoYWN0aXZlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25JdGVtLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQXR0cmlidXRlcygpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLmhyZWYgPSB0aGlzLmdldEhyZWYoKTtcbiAgICAgICAgdGhpcy5yb2xlID0gKHRoaXMubmF2aWdhdGlvbkl0ZW0uY2hpbGRyZW4gJiYgdGhpcy5uYXZpZ2F0aW9uSXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSA/ICdidXR0b24nIDogJ3RyZWVpdGVtJztcblxuICAgICAgICB0aGlzLmluZGVudENoaWxkcmVuID0gdGhpcy5uYXZpZ2F0aW9uSXRlbS5jaGlsZHJlbiAmJiB0aGlzLm5hdmlnYXRpb25JdGVtLmNoaWxkcmVuLnNvbWUoaXRlbSA9PiBpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRIcmVmKCk6IHN0cmluZyB7XG5cbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbkl0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBBcnJheS5pc0FycmF5KHRoaXMubmF2aWdhdGlvbkl0ZW0ucm91dGVyTGluaykgPyB0aGlzLm5hdmlnYXRpb25JdGVtLnJvdXRlckxpbmsgOiBbdGhpcy5uYXZpZ2F0aW9uSXRlbS5yb3V0ZXJMaW5rXTtcbiAgICAgICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywgdGhpcy5uYXZpZ2F0aW9uSXRlbS5yb3V0ZXJFeHRyYXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsKHRoaXMuX3JvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FjdGl2ZUl0ZW0oaXRlbTogTmF2aWdhdGlvbkl0ZW0pOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCB7IGV4YWN0LCBpZ25vcmVRdWVyeVBhcmFtcyB9ID0gdGhpcy5nZXRSb3V0ZXJPcHRpb25zKGl0ZW0pO1xuXG4gICAgICAgIGlmIChpdGVtLnJvdXRlckxpbmspIHtcblxuICAgICAgICAgICAgbGV0IHJvdXRlckV4dHJhcyA9IGl0ZW0ucm91dGVyRXh0cmFzO1xuXG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgdG8gaWdub3JlIHRoZSBxdWVyeSBwYXJhbXMgd2UgbXVzdCByZW1vdmUgdGhlbVxuICAgICAgICAgICAgaWYgKGlnbm9yZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGFjdHVhbCBxdWVyeSBwYXJhbXNcbiAgICAgICAgICAgICAgICBjb25zdCB7IHF1ZXJ5UGFyYW1zIH0gPSB0aGlzLl9yb3V0ZS5zbmFwc2hvdDtcblxuICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbXMgd2l0aCB0aGUgYWN0dWFsIHF1ZXJ5IHBhcmFtcyBzbyB0aGV5IHdpbGwgYWx3YXkgbWF0Y2hcbiAgICAgICAgICAgICAgICByb3V0ZXJFeHRyYXMgPSB7IC4uLnJvdXRlckV4dHJhcywgcXVlcnlQYXJhbXMgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBBcnJheS5pc0FycmF5KGl0ZW0ucm91dGVyTGluaykgPyBpdGVtLnJvdXRlckxpbmsgOiBbaXRlbS5yb3V0ZXJMaW5rXTtcbiAgICAgICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywgcm91dGVyRXh0cmFzKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5pc0FjdGl2ZSh1cmxUcmVlLCBleGFjdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEdldCB0aGUgcm91dGVyIG9wdGlvbnMgd2l0aCBkZWZhdWx0cyBmb3IgbWlzc2luZyBwcm9wZXJ0aWVzICovXG4gICAgcHJpdmF0ZSBnZXRSb3V0ZXJPcHRpb25zKGl0ZW06IE5hdmlnYXRpb25JdGVtKTogTmF2aWdhdGlvbkl0ZW1Sb3V0ZXJPcHRpb25zIHtcblxuICAgICAgICAvLyBnZXQgdGhlIGRlZmF1bHQgb3B0aW9ucyBiYXNlZCBvbiB0aGUgb25lcyBwcm92aWRlZCBpbiBgZm9yUm9vdGBcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7IGV4YWN0OiB0cnVlLCBpZ25vcmVRdWVyeVBhcmFtczogZmFsc2UsIC4uLih0aGlzLl9vcHRpb25zID8gdGhpcy5fb3B0aW9ucy5yb3V0ZXJPcHRpb25zIDoge30pIH07XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGl0ZW0gc3BlY2lmaWMgcm91dGVyIG9wdGlvbnMgdGhleSBzaG91bGQgdGFrZSBwcmVjZW5kZW5jZVxuICAgICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0aW9ucywgLi4uaXRlbS5yb3V0ZXJPcHRpb25zIH07XG4gICAgfVxufSJdfQ==