@nova-ui/bits
Version:
SolarWinds Nova Framework
138 lines • 20 kB
JavaScript
// © 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, LiveAnnouncer } from "@angular/cdk/a11y";
import { Injectable } from "@angular/core";
import isNil from "lodash/isNil";
import { ANNOUNCER_CLOSE_MESSAGE, ANNOUNCER_OPEN_MESSAGE_SUFFIX, } from "./constants";
import { KEYBOARD_CODE } from "../../constants/keycode.constants";
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/a11y";
export class OptionKeyControlService {
constructor(liveAnnouncer) {
this.liveAnnouncer = liveAnnouncer;
}
initKeyboardManager() {
this.keyboardEventsManager = new ActiveDescendantKeyManager(this.optionItems).withVerticalOrientation();
}
handleKeydown(event) {
this.popup.showing
? this.handleOpenKeyDown(event)
: this.handleClosedKeyDown(event);
}
setActiveItem(option) {
this.keyboardEventsManager?.setActiveItem(option);
}
resetActiveItem() {
this.keyboardEventsManager.setActiveItem(-1);
}
setFirstItemActive() {
this.keyboardEventsManager?.setFirstItemActive();
}
getActiveItemIndex() {
return this.keyboardEventsManager.activeItemIndex;
}
setSkipPredicate(predicate) {
this.keyboardEventsManager.skipPredicate(predicate);
}
scrollToActiveItem(options) {
if (this.keyboardEventsManager.activeItem) {
// setTimeout is necessary because scrolling to the selected item should occur only when overlay rendered
setTimeout(() => {
this.keyboardEventsManager.activeItem?.scrollIntoView(options);
});
}
}
hasActiveItem() {
if (isNil(this.keyboardEventsManager.activeItemIndex)) {
throw new Error("ActiveItemIndex is not defined");
}
return Boolean(this.keyboardEventsManager.activeItem &&
this.keyboardEventsManager.activeItemIndex >= 0);
}
handleOpenKeyDown(event) {
switch (event.code) {
case KEYBOARD_CODE.ARROW_DOWN:
case KEYBOARD_CODE.ARROW_UP:
this.keyboardEventsManager.onKeydown(event);
this.announceNavigatedOption();
break;
case KEYBOARD_CODE.PAGE_UP:
event.preventDefault();
this.keyboardEventsManager.onKeydown(event);
this.keyboardEventsManager.setFirstItemActive();
break;
case KEYBOARD_CODE.PAGE_DOWN:
event.preventDefault();
this.keyboardEventsManager.onKeydown(event);
this.keyboardEventsManager.setLastItemActive();
break;
}
this.scrollToActiveItem({ block: "nearest" });
// prevent closing on enter
if (!this.hasActiveItem() && event.code === KEYBOARD_CODE.ENTER) {
event.preventDefault();
}
if (this.hasActiveItem() && event.code === KEYBOARD_CODE.ENTER) {
if (!this.keyboardEventsManager.activeItem) {
throw new Error("ActiveItem is not defined");
}
// perform action in menu item(select, switch, check etc).
this.keyboardEventsManager.activeItem.element.nativeElement.click();
}
if (event.code === KEYBOARD_CODE.TAB ||
event.code === KEYBOARD_CODE.ESCAPE) {
this.popup.toggle();
this.announceDropdown(this.popup.showing);
}
}
handleClosedKeyDown(event) {
// prevent opening on enter and prevent scrolling page on key down/key up when focused
if (this.shouldBePrevented(event)) {
event.preventDefault();
}
if (event.code === KEYBOARD_CODE.ARROW_DOWN) {
this.popup.toggle();
this.scrollToActiveItem({ block: "center" });
}
}
shouldBePrevented(event) {
return (event.code === KEYBOARD_CODE.ARROW_DOWN ||
event.code === KEYBOARD_CODE.ARROW_UP ||
event.code === KEYBOARD_CODE.ENTER);
}
announceNavigatedOption() {
const activeItem = this.keyboardEventsManager.activeItem;
if (activeItem) {
this.liveAnnouncer.announce(activeItem.value);
}
}
announceDropdown(open) {
const message = open
? `${this.optionItems.length} ${ANNOUNCER_OPEN_MESSAGE_SUFFIX}`
: ANNOUNCER_CLOSE_MESSAGE;
this.liveAnnouncer.announce(message);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionKeyControlService, deps: [{ token: i1.LiveAnnouncer }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionKeyControlService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionKeyControlService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.LiveAnnouncer }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLWtleS1jb250cm9sLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlbGVjdC12Mi9vcHRpb24ta2V5LWNvbnRyb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBRWpDLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsNkJBQTZCLEdBQ2hDLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBSWxFLE1BQU0sT0FBTyx1QkFBdUI7SUFNaEMsWUFBbUIsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFBRyxDQUFDO0lBRTVDLG1CQUFtQjtRQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSwwQkFBMEIsQ0FDdkQsSUFBSSxDQUFDLFdBQVcsQ0FDbkIsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBb0I7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxp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QyxRQUFRLENBQUUsVUFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFhO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUk7WUFDaEIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksNkJBQTZCLEVBQUU7WUFDL0QsQ0FBQyxDQUFDLHVCQUF1QixDQUFDO1FBRTlCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7K0dBeklRLHVCQUF1QjttSEFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyLCBMaXZlQW5ub3VuY2VyIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBRdWVyeUxpc3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcblxuaW1wb3J0IHtcbiAgICBBTk5PVU5DRVJfQ0xPU0VfTUVTU0FHRSxcbiAgICBBTk5PVU5DRVJfT1BFTl9NRVNTQUdFX1NVRkZJWCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBLRVlCT0FSRF9DT0RFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9rZXljb2RlLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgSU9wdGlvbiwgSU92ZXJsYXlDb21wb25lbnQgfSBmcm9tIFwiLi4vb3ZlcmxheS90eXBlc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT3B0aW9uS2V5Q29udHJvbFNlcnZpY2U8VCBleHRlbmRzIElPcHRpb24+IHtcbiAgICBwdWJsaWMgcG9wdXA6IElPdmVybGF5Q29tcG9uZW50O1xuICAgIHB1YmxpYyBvcHRpb25JdGVtczogUXVlcnlMaXN0PFQ+O1xuXG4gICAgcHJpdmF0ZSBrZXlib2FyZEV2ZW50c01hbmFnZXI6IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPFQ+O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGxpdmVBbm5vdW5jZXI6IExpdmVBbm5vdW5jZXIpIHt9XG5cbiAgICBwdWJsaWMgaW5pdEtleWJvYXJkTWFuYWdlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIgPSBuZXcgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXIoXG4gICAgICAgICAgICB0aGlzLm9wdGlvbkl0ZW1zXG4gICAgICAgICkud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvcHVwLnNob3dpbmdcbiAgICAgICAgICAgID8gdGhpcy5oYW5kbGVPcGVuS2V5RG93bihldmVudClcbiAgICAgICAgICAgIDogdGhpcy5oYW5kbGVDbG9zZWRLZXlEb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWN0aXZlSXRlbShvcHRpb246IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXI/LnNldEFjdGl2ZUl0ZW0ob3B0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRBY3RpdmVJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5zZXRBY3RpdmVJdGVtKC0xKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rmlyc3RJdGVtQWN0aXZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlcj8uc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFjdGl2ZUl0ZW1JbmRleCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2tpcFByZWRpY2F0ZShwcmVkaWNhdGU6IChvcHRpb246IFQpID0+IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuc2tpcFByZWRpY2F0ZShwcmVkaWNhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzY3JvbGxUb0FjdGl2ZUl0ZW0ob3B0aW9uczogU2Nyb2xsSW50b1ZpZXdPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgaXRlbSBzaG91bGQgb2NjdXIgb25seSB3aGVuIG92ZXJsYXkgcmVuZGVyZWRcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW0/LnNjcm9sbEludG9WaWV3KG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0FjdGl2ZUl0ZW0oKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpc05pbCh0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtSW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY3RpdmVJdGVtSW5kZXggaXMgbm90IGRlZmluZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtICYmXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuYWN0aXZlSXRlbUluZGV4ID49IDBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZU9wZW5LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICAgICAgY2FzZSBLRVlCT0FSRF9DT0RFLkFSUk9XX0RPV046XG4gICAgICAgICAgICBjYXNlIEtFWUJPQVJEX0NPREUuQVJST1dfVVA6XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlTmF2aWdhdGVkT3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtFWUJPQVJEX0NPREUuUEFHRV9VUDpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtFWUJPQVJEX0NPREUuUEFHRV9ET1dOOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY3JvbGxUb0FjdGl2ZUl0ZW0oeyBibG9jazogXCJuZWFyZXN0XCIgfSk7XG5cbiAgICAgICAgLy8gcHJldmVudCBjbG9zaW5nIG9uIGVudGVyXG4gICAgICAgIGlmICghdGhpcy5oYXNBY3RpdmVJdGVtKCkgJiYgZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5FTlRFUikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0FjdGl2ZUl0ZW0oKSAmJiBldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkVOVEVSKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY3RpdmVJdGVtIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwZXJmb3JtIGFjdGlvbiBpbiBtZW51IGl0ZW0oc2VsZWN0LCBzd2l0Y2gsIGNoZWNrIGV0YykuXG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5UQUIgfHxcbiAgICAgICAgICAgIGV2ZW50LmNvZGUgPT09IEtFWUJPQVJEX0NPREUuRVNDQVBFXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cC50b2dnbGUoKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEcm9wZG93bih0aGlzLnBvcHVwLnNob3dpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbG9zZWRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIHByZXZlbnQgb3BlbmluZyBvbiBlbnRlciBhbmQgcHJldmVudCBzY3JvbGxpbmcgcGFnZSBvbiBrZXkgZG93bi9rZXkgdXAgd2hlbiBmb2N1c2VkXG4gICAgICAgIGlmICh0aGlzLnNob3VsZEJlUHJldmVudGVkKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX0RPV04pIHtcbiAgICAgICAgICAgIHRoaXMucG9wdXAudG9nZ2xlKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvQWN0aXZlSXRlbSh7IGJsb2NrOiBcImNlbnRlclwiIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRCZVByZXZlbnRlZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19ET1dOIHx8XG4gICAgICAgICAgICBldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX1VQIHx8XG4gICAgICAgICAgICBldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkVOVEVSXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbm5vdW5jZU5hdmlnYXRlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW07XG5cbiAgICAgICAgaWYgKGFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZSgoYWN0aXZlSXRlbSBhcyBhbnkpLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYW5ub3VuY2VEcm9wZG93bihvcGVuOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvcGVuXG4gICAgICAgICAgICA/IGAke3RoaXMub3B0aW9uSXRlbXMubGVuZ3RofSAke0FOTk9VTkNFUl9PUEVOX01FU1NBR0VfU1VGRklYfWBcbiAgICAgICAgICAgIDogQU5OT1VOQ0VSX0NMT1NFX01FU1NBR0U7XG5cbiAgICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UpO1xuICAgIH1cbn1cbiJdfQ==