UNPKG

@ux-aspects/ux-aspects

Version:

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

149 lines 19.8 kB
import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, inject, Input, Output, Renderer2 } from '@angular/core'; import { BehaviorSubject, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { isKeyboardTrigger } from '../../../common/index'; import { FocusIndicatorService } from '../../../directives/accessibility/index'; import { MenuComponent } from '../menu/menu.component'; import { MenuItemType } from './menu-item-type.enum'; import * as i0 from "@angular/core"; export class MenuItemComponent { constructor() { this._menu = inject(MenuComponent); this._elementRef = inject(ElementRef); this._focusIndicatorService = inject(FocusIndicatorService); this._renderer = inject(Renderer2); /** Define the role of the element */ this.role = 'menuitem'; /** Emits when the menu item is clicked or the enter key is pressed. */ this.activate = new EventEmitter(); /** Indicate the type of the menu item */ this.type = MenuItemType.Default; /** Store the current hover state */ this.isHovered$ = new BehaviorSubject(false); /** Store the current focus state */ this.isFocused$ = new BehaviorSubject(false); /** Store the current expanded state */ this.isExpanded$ = new BehaviorSubject(false); /** Emit when an item is clicked */ this.onClick$ = new Subject(); /** Automatically unsubscribe from observables on destroy */ this._onDestroy$ = new Subject(); this._disabled = false; this._closeOnSelect = true; } /** Define if this item is disabled or not */ set disabled(disabled) { this._disabled = coerceBooleanProperty(disabled); } get disabled() { return this._disabled; } /** Determine if the menu should close on item click/enter.*/ set closeOnSelect(value) { this._closeOnSelect = coerceBooleanProperty(value); } get closeOnSelect() { return this._closeOnSelect; } /** Access the open state */ get isOpen() { return this._menu.isMenuOpen; } ngOnInit() { // register this item in the MenuComponent this._menu._addItem(this); // we only want to show the focus indicator whenever the keyboard is used this._focusIndicator = this._focusIndicatorService.monitor(this._elementRef.nativeElement); // subscribe to active item changes this._menu._activeItem$.pipe(takeUntil(this._onDestroy$)) .subscribe(item => this.setTabIndex(item === this)); } ngOnDestroy() { this._menu._removeItem(this); this.isHovered$.complete(); this.isExpanded$.complete(); this.isFocused$.complete(); this.onClick$.complete(); this._focusIndicator.destroy(); this._onDestroy$.next(); this._onDestroy$.complete(); } focus(origin) { this._focusIndicator.focus(origin); } /** This function is built into the CDK manager to allow jumping to items based on text content */ getLabel() { return this._elementRef.nativeElement.textContent.trim(); } _onMouseEnter() { this.isHovered$.next(true); } _onMouseLeave() { this.isHovered$.next(false); } _onFocus() { this.isFocused$.next(true); } _onBlur() { this.isFocused$.next(false); } _onClick(event) { if (!this.disabled) { if (this.closeOnSelect) { this.onClick$.next(isKeyboardTrigger(event) ? 'keyboard' : 'mouse'); } this.activate.emit(event); } } /** Forward any keyboard events to the MenuComponent for accessibility */ _onKeydown(event) { this._menu._onKeydown(event); } /** Update the tab index on this item */ setTabIndex(isTabbable) { this._renderer.setAttribute(this._elementRef.nativeElement, 'tabindex', isTabbable ? '0' : '-1'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: MenuItemComponent, selector: "[uxMenuItem]", inputs: { disabled: "disabled", closeOnSelect: "closeOnSelect", role: "role" }, outputs: { activate: "activate" }, host: { listeners: { "mouseenter": "_onMouseEnter()", "mouseleave": "_onMouseLeave()", "focus": "_onFocus()", "blur": "_onBlur()", "click": "_onClick($event)", "keydown.enter": "_onClick($event)", "keydown": "_onKeydown($event)" }, properties: { "attr.disabled": "disabled ? \"disabled\" : null", "attr.role": "role", "class.disabled": "disabled", "class.ux-menu-item": "true", "class.open": "isOpen" } }, ngImport: i0, template: "<ng-content></ng-content>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuItemComponent, decorators: [{ type: Component, args: [{ selector: '[uxMenuItem]', changeDetection: ChangeDetectionStrategy.OnPush, host: { '[attr.disabled]': 'disabled ? "disabled" : null', '[attr.role]': 'role', '[class.disabled]': 'disabled', '[class.ux-menu-item]': 'true', '[class.open]': 'isOpen' }, template: "<ng-content></ng-content>\n" }] }], propDecorators: { disabled: [{ type: Input }], closeOnSelect: [{ type: Input }], role: [{ type: Input }], activate: [{ type: Output }], _onMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], _onMouseLeave: [{ type: HostListener, args: ['mouseleave'] }], _onFocus: [{ type: HostListener, args: ['focus'] }], _onBlur: [{ type: HostListener, args: ['blur'] }], _onClick: [{ type: HostListener, args: ['click', ['$event']] }, { type: HostListener, args: ['keydown.enter', ['$event']] }], _onKeydown: [{ type: HostListener, args: ['keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21lbnUvbWVudS1pdGVtL21lbnUtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tZW51L21lbnUtaXRlbS9tZW51LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFrQixxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBY3JELE1BQU0sT0FBTyxpQkFBaUI7SUFaOUI7UUFhcUIsVUFBSyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5QixnQkFBVyxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFFMUQsMkJBQXNCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFdkQsY0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQW9CL0MscUNBQXFDO1FB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UCx1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDO3dCQUNGLGlCQUFpQixFQUFFLDhCQUE4Qjt3QkFDakQsYUFBYSxFQUFFLE1BQU07d0JBQ3JCLGtCQUFrQixFQUFFLFVBQVU7d0JBQzlCLHNCQUFzQixFQUFFLE1BQU07d0JBQzlCLGNBQWMsRUFBRSxRQUFRO3FCQUMzQjs4QkFZWSxRQUFRO3NCQUFwQixLQUFLO2dCQVNPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBU0csSUFBSTtzQkFBWixLQUFLO2dCQUdJLFFBQVE7c0JBQWpCLE1BQU07Z0JBaUVQLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxZQUFZO2dCQU0xQixhQUFhO3NCQURaLFlBQVk7dUJBQUMsWUFBWTtnQkFNMUIsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLE9BQU87Z0JBTXJCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxNQUFNO2dCQU9wQixRQUFRO3NCQUZQLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDaEMsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWXpDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c2FibGVPcHRpb24sIEZvY3VzT3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc0tleWJvYXJkVHJpZ2dlciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9pbmRleCc7XG5pbXBvcnQgeyBGb2N1c0luZGljYXRvciwgRm9jdXNJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5L2luZGV4JztcbmltcG9ydCB7IE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9tZW51L21lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE1lbnVJdGVtVHlwZSB9IGZyb20gJy4vbWVudS1pdGVtLXR5cGUuZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnW3V4TWVudUl0ZW1dJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgICdbYXR0ci5kaXNhYmxlZF0nOiAnZGlzYWJsZWQgPyBcImRpc2FibGVkXCIgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLnJvbGVdJzogJ3JvbGUnLFxuICAgICAgICAnW2NsYXNzLmRpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgICAgICdbY2xhc3MudXgtbWVudS1pdGVtXSc6ICd0cnVlJyxcbiAgICAgICAgJ1tjbGFzcy5vcGVuXSc6ICdpc09wZW4nXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBNZW51SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBGb2N1c2FibGVPcHRpb24ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lbnUgPSBpbmplY3QoTWVudUNvbXBvbmVudCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZvY3VzSW5kaWNhdG9yU2VydmljZSA9IGluamVjdChGb2N1c0luZGljYXRvclNlcnZpY2UpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICAgIC8qKiBEZWZpbmUgaWYgdGhpcyBpdGVtIGlzIGRpc2FibGVkIG9yIG5vdCAqL1xuICAgIEBJbnB1dCgpIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqIERldGVybWluZSBpZiB0aGUgbWVudSBzaG91bGQgY2xvc2Ugb24gaXRlbSBjbGljay9lbnRlci4qL1xuICAgIEBJbnB1dCgpIHNldCBjbG9zZU9uU2VsZWN0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlT25TZWxlY3QgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBjbG9zZU9uU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VPblNlbGVjdDtcbiAgICB9XG5cbiAgICAvKiogRGVmaW5lIHRoZSByb2xlIG9mIHRoZSBlbGVtZW50ICovXG4gICAgQElucHV0KCkgcm9sZTogJ21lbnVpdGVtJyB8ICdtZW51aXRlbXJhZGlvJyB8ICdtZW51aXRlbWNoZWNrYm94JyA9ICdtZW51aXRlbSc7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgbWVudSBpdGVtIGlzIGNsaWNrZWQgb3IgdGhlIGVudGVyIGtleSBpcyBwcmVzc2VkLiAqL1xuICAgIEBPdXRwdXQoKSBhY3RpdmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQ+KCk7XG5cbiAgICAvKiogQWNjZXNzIHRoZSBvcGVuIHN0YXRlICovXG4gICAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnUuaXNNZW51T3BlbjtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIG1lbnUgaXRlbSAqL1xuICAgIHJlYWRvbmx5IHR5cGU6IE1lbnVJdGVtVHlwZSA9IE1lbnVJdGVtVHlwZS5EZWZhdWx0O1xuXG4gICAgLyoqIFN0b3JlIHRoZSBjdXJyZW50IGhvdmVyIHN0YXRlICovXG4gICAgcmVhZG9ubHkgaXNIb3ZlcmVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFN0b3JlIHRoZSBjdXJyZW50IGZvY3VzIHN0YXRlICovXG4gICAgcmVhZG9ubHkgaXNGb2N1c2VkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFN0b3JlIHRoZSBjdXJyZW50IGV4cGFuZGVkIHN0YXRlICovXG4gICAgcmVhZG9ubHkgaXNFeHBhbmRlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBFbWl0IHdoZW4gYW4gaXRlbSBpcyBjbGlja2VkICovXG4gICAgcmVhZG9ubHkgb25DbGljayQgPSBuZXcgU3ViamVjdDxGb2N1c09yaWdpbj4oKTtcblxuICAgIC8qKiBTdG9yZSB0aGUgZm9jdXMgaW5kaWNhdG9yIGluc3RhbmNlICovXG4gICAgcHJpdmF0ZSBfZm9jdXNJbmRpY2F0b3I6IEZvY3VzSW5kaWNhdG9yO1xuXG4gICAgLyoqIEF1dG9tYXRpY2FsbHkgdW5zdWJzY3JpYmUgZnJvbSBvYnNlcnZhYmxlcyBvbiBkZXN0cm95ICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfY2xvc2VPblNlbGVjdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gcmVnaXN0ZXIgdGhpcyBpdGVtIGluIHRoZSBNZW51Q29tcG9uZW50XG4gICAgICAgIHRoaXMuX21lbnUuX2FkZEl0ZW0odGhpcyk7XG5cbiAgICAgICAgLy8gd2Ugb25seSB3YW50IHRvIHNob3cgdGhlIGZvY3VzIGluZGljYXRvciB3aGVuZXZlciB0aGUga2V5Ym9hcmQgaXMgdXNlZFxuICAgICAgICB0aGlzLl9mb2N1c0luZGljYXRvciA9IHRoaXMuX2ZvY3VzSW5kaWNhdG9yU2VydmljZS5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIGFjdGl2ZSBpdGVtIGNoYW5nZXNcbiAgICAgICAgdGhpcy5fbWVudS5fYWN0aXZlSXRlbSQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGl0ZW0gPT4gdGhpcy5zZXRUYWJJbmRleChpdGVtID09PSB0aGlzKSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21lbnUuX3JlbW92ZUl0ZW0odGhpcyk7XG4gICAgICAgIHRoaXMuaXNIb3ZlcmVkJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmlzRXhwYW5kZWQkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLm9uQ2xpY2skLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2ZvY3VzSW5kaWNhdG9yLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBmb2N1cyhvcmlnaW46IEZvY3VzT3JpZ2luKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzSW5kaWNhdG9yLmZvY3VzKG9yaWdpbik7XG4gICAgfVxuXG4gICAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgYnVpbHQgaW50byB0aGUgQ0RLIG1hbmFnZXIgdG8gYWxsb3cganVtcGluZyB0byBpdGVtcyBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQgKi9cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcbiAgICBfb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzSG92ZXJlZCQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgICBfb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzSG92ZXJlZCQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICAgIF9vbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBfb25CbHVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxuICAgIF9vbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xpY2skLm5leHQoaXNLZXlib2FyZFRyaWdnZXIoZXZlbnQpID8gJ2tleWJvYXJkJyA6ICdtb3VzZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBGb3J3YXJkIGFueSBrZXlib2FyZCBldmVudHMgdG8gdGhlIE1lbnVDb21wb25lbnQgZm9yIGFjY2Vzc2liaWxpdHkgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBfb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21lbnUuX29uS2V5ZG93bihldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIFVwZGF0ZSB0aGUgdGFiIGluZGV4IG9uIHRoaXMgaXRlbSAqL1xuICAgIHByaXZhdGUgc2V0VGFiSW5kZXgoaXNUYWJiYWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndGFiaW5kZXgnLCBpc1RhYmJhYmxlID8gJzAnIDogJy0xJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBib29sZWFuIHwgc3RyaW5nO1xuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9jbG9zZU9uU2VsZWN0OiBCb29sZWFuSW5wdXQ7XG59XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=