UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

113 lines 17.5 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 { ActiveDescendantKeyManager } from "@angular/cdk/a11y"; import { Injectable } from "@angular/core"; import { KEYBOARD_CODE } from "../../constants/keycode.constants"; import * as i0 from "@angular/core"; const scrollOption = { block: "nearest" }; export class TimePickerKeyboardService { initService(popup, overlay, trigger) { this.overlay = overlay; this.popup = popup; this.menuItems = popup.menuItems.toArray(); this.keyboardEventsManager = new ActiveDescendantKeyManager(this.menuItems); this.menuTrigger = trigger; } onKeyDown(event) { this.overlay.showing ? this.handleOpenedMenu(event) : this.handleClosedMenu(event); } handleOpenedMenu(event) { const { code } = event; if (code === KEYBOARD_CODE.ESCAPE) { this.hideMenu(); } if (code === KEYBOARD_CODE.ARROW_DOWN || code === KEYBOARD_CODE.ARROW_UP) { this.navigateByArrow(event); } if (code === KEYBOARD_CODE.ENTER) { event.preventDefault(); this.keyboardEventsManager.activeItem?.doAction(event); } if (code === KEYBOARD_CODE.SPACE && document.activeElement === this.menuTrigger) { event.preventDefault(); this.overlay.toggle(); } } handleClosedMenu(event) { const { code } = event; const isIconTrigger = document.activeElement === this.menuTrigger && this.isOpenMenuCode(code); const isInputTrigger = document.activeElement !== this.menuTrigger && code === KEYBOARD_CODE.ARROW_DOWN; if (isInputTrigger || isIconTrigger) { event.preventDefault(); this.overlay.show(); this.keyboardEventsManager.setActiveItem(this.getSelectedIndex()); this.keyboardEventsManager.activeItem?.menuItem?.nativeElement?.scrollIntoView({ block: "center" }); } } hideMenu() { this.overlay.hide(); } navigateByArrow(event) { const { code } = event; const index = this.keyboardEventsManager.activeItemIndex; event.preventDefault(); if (code === KEYBOARD_CODE.ARROW_UP && index === 0) { this.navigateOnLast(); return; } if (code === KEYBOARD_CODE.ARROW_DOWN && index === this.menuItems.length) { this.navigateOnFirst(); return; } this.keyboardEventsManager.onKeydown(event); this.keyboardEventsManager.activeItem?.menuItem?.nativeElement?.scrollIntoView(scrollOption); } navigateOnLast() { this.keyboardEventsManager.setActiveItem(this.menuItems.length - 1); this.keyboardEventsManager.activeItem?.menuItem.nativeElement.scrollIntoView(scrollOption); } navigateOnFirst() { this.keyboardEventsManager.setActiveItem(0); this.keyboardEventsManager.activeItem?.menuItem.nativeElement.scrollIntoView(scrollOption); } getSelectedIndex() { return this.menuItems.findIndex((component) => { const parent = component.menuItem.nativeElement.parentElement; return parent.classList.contains("nui-menu-item--selected"); }); } isOpenMenuCode(code) { return code === KEYBOARD_CODE.ENTER || code === KEYBOARD_CODE.SPACE; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimePickerKeyboardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimePickerKeyboardService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimePickerKeyboardService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIta2V5Ym9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIta2V5Ym9hcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBSWxFLE1BQU0sWUFBWSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBMkIsQ0FBQztBQUduRSxNQUFNLE9BQU8seUJBQXlCO0lBTzNCLFdBQVcsQ0FDZCxLQUF5QixFQUN6QixPQUF5QixFQUN6QixPQUFvQjtRQUVwQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQjtZQUN0QixJQUFJLDBCQUEwQixDQUMxQixJQUFJLENBQUMsU0FBUyxDQUNqQixDQUFDO1FBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7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QUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUMxRSxZQUFZLENBQ2YsQ0FBQztJQUNOLENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FDeEUsWUFBWSxDQUNmLENBQUM7SUFDTixDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQ3hFLFlBQVksQ0FDZixDQUFDO0lBQ04sQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDMUMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBRTlELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBbUI7UUFDdEMsT0FBTyxJQUFJLEtBQUssYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQztJQUN4RSxDQUFDOytHQWxJUSx5QkFBeUI7bUhBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciB9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IEtFWUJPQVJEX0NPREUgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2tleWNvZGUuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNZW51SXRlbUJhc2VDb21wb25lbnQsIE1lbnVQb3B1cENvbXBvbmVudCB9IGZyb20gXCIuLi9tZW51XCI7XG5pbXBvcnQgeyBPdmVybGF5Q29tcG9uZW50IH0gZnJvbSBcIi4uL292ZXJsYXkvb3ZlcmxheS1jb21wb25lbnQvb3ZlcmxheS5jb21wb25lbnRcIjtcblxuY29uc3Qgc2Nyb2xsT3B0aW9uID0geyBibG9jazogXCJuZWFyZXN0XCIgfSBhcyBTY3JvbGxJbnRvVmlld09wdGlvbnM7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lUGlja2VyS2V5Ym9hcmRTZXJ2aWNlIHtcbiAgICBwdWJsaWMgb3ZlcmxheTogT3ZlcmxheUNvbXBvbmVudDtcbiAgICBwcml2YXRlIHBvcHVwOiBNZW51UG9wdXBDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBtZW51SXRlbXM6IE1lbnVJdGVtQmFzZUNvbXBvbmVudFtdO1xuICAgIHByaXZhdGUga2V5Ym9hcmRFdmVudHNNYW5hZ2VyOiBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxNZW51SXRlbUJhc2VDb21wb25lbnQ+O1xuICAgIHByaXZhdGUgbWVudVRyaWdnZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgcHVibGljIGluaXRTZXJ2aWNlKFxuICAgICAgICBwb3B1cDogTWVudVBvcHVwQ29tcG9uZW50LFxuICAgICAgICBvdmVybGF5OiBPdmVybGF5Q29tcG9uZW50LFxuICAgICAgICB0cmlnZ2VyOiBIVE1MRWxlbWVudFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnBvcHVwID0gcG9wdXA7XG4gICAgICAgIHRoaXMubWVudUl0ZW1zID0gcG9wdXAubWVudUl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIgPVxuICAgICAgICAgICAgbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPE1lbnVJdGVtQmFzZUNvbXBvbmVudD4oXG4gICAgICAgICAgICAgICAgdGhpcy5tZW51SXRlbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIHRoaXMubWVudVRyaWdnZXIgPSB0cmlnZ2VyO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vdmVybGF5LnNob3dpbmdcbiAgICAgICAgICAgID8gdGhpcy5oYW5kbGVPcGVuZWRNZW51KGV2ZW50KVxuICAgICAgICAgICAgOiB0aGlzLmhhbmRsZUNsb3NlZE1lbnUoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlT3BlbmVkTWVudShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGV2ZW50O1xuXG4gICAgICAgIGlmIChjb2RlID09PSBLRVlCT0FSRF9DT0RFLkVTQ0FQRSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlTWVudSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19ET1dOIHx8XG4gICAgICAgICAgICBjb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX1VQXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUJ5QXJyb3coZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IEtFWUJPQVJEX0NPREUuRU5URVIpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtPy5kb0FjdGlvbihldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2RlID09PSBLRVlCT0FSRF9DT0RFLlNQQUNFICYmXG4gICAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLm1lbnVUcmlnZ2VyXG4gICAgICAgICkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheS50b2dnbGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xvc2VkTWVudShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBpc0ljb25UcmlnZ2VyID1cbiAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMubWVudVRyaWdnZXIgJiZcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuTWVudUNvZGUoY29kZSBhcyBLRVlCT0FSRF9DT0RFKTtcbiAgICAgICAgY29uc3QgaXNJbnB1dFRyaWdnZXIgPVxuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhpcy5tZW51VHJpZ2dlciAmJlxuICAgICAgICAgICAgY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19ET1dOO1xuXG4gICAgICAgIGlmIChpc0lucHV0VHJpZ2dlciB8fCBpc0ljb25UcmlnZ2VyKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5LnNob3coKTtcbiAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5nZXRTZWxlY3RlZEluZGV4KCkpO1xuICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuYWN0aXZlSXRlbT8ubWVudUl0ZW0/Lm5hdGl2ZUVsZW1lbnQ/LnNjcm9sbEludG9WaWV3KFxuICAgICAgICAgICAgICAgIHsgYmxvY2s6IFwiY2VudGVyXCIgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZU1lbnUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3ZlcmxheS5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYXZpZ2F0ZUJ5QXJyb3coZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtSW5kZXg7XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19VUCAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU9uTGFzdCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX0RPV04gJiZcbiAgICAgICAgICAgIGluZGV4ID09PSB0aGlzLm1lbnVJdGVtcy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlT25GaXJzdCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5vbktleWRvd24oZXZlbnQpO1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtPy5tZW51SXRlbT8ubmF0aXZlRWxlbWVudD8uc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgICBzY3JvbGxPcHRpb25cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5hdmlnYXRlT25MYXN0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMubWVudUl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtPy5tZW51SXRlbS5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KFxuICAgICAgICAgICAgc2Nyb2xsT3B0aW9uXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYXZpZ2F0ZU9uRmlyc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oMCk7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW0/Lm1lbnVJdGVtLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgICBzY3JvbGxPcHRpb25cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGVkSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVudUl0ZW1zLmZpbmRJbmRleCgoY29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBjb21wb25lbnQubWVudUl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LmNsYXNzTGlzdC5jb250YWlucyhcIm51aS1tZW51LWl0ZW0tLXNlbGVjdGVkXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzT3Blbk1lbnVDb2RlKGNvZGU6IEtFWUJPQVJEX0NPREUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvZGUgPT09IEtFWUJPQVJEX0NPREUuRU5URVIgfHwgY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5TUEFDRTtcbiAgICB9XG59XG4iXX0=