UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

158 lines 22.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, LiveAnnouncer } from "@angular/cdk/a11y"; import { Injectable } from "@angular/core"; import isNil from "lodash/isNil"; import { KEYBOARD_CODE } from "../../constants/keycode.constants"; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/a11y"; export class SelectedItemsKeyControlService { constructor(liveAnnouncer) { this.liveAnnouncer = liveAnnouncer; } initSelectedItemsKeyManager(elems, combobox) { this.combobox = combobox; this.inputElement = combobox.inputElement?.nativeElement; this.selectedItems = elems; this.selectedItemsKeyManager = new ActiveDescendantKeyManager(elems) .withHorizontalOrientation("ltr") .withWrap(); if (!isNil(this.activeSelectedItemIndex) && this.activeSelectedItemIndex >= 0 && Number.isInteger(this.activeSelectedItemIndex)) { setTimeout(() => this.selectedItemsKeyManager.setActiveItem(this.activeSelectedItemIndex)); } } onKeydown(event) { const caretPosition = event.target.selectionStart; const isKeyAllowed = this.isBackspace(event) || this.isLeftOrRightArrow(event); if (caretPosition !== 0 || (!this.activeItem && this.isRightArrow(event))) { return; } if (!isKeyAllowed) { this.deactivateSelectedItems(); return; } if (!this.combobox.manualDropdownControl && !this.activeItem) { this.combobox.hideDropdown(); } if (this.isLeftArrow(event) && this.activeItem !== this.selectedItems.first) { this.selectedItemsKeyManager.onKeydown(event); this.liveAnnouncer.announce(`${this.getActiveItemTitle} selected`); return; } if (this.isRightArrow(event) && this.activeItem) { this.handleRightArrow(event); return; } if (this.isBackspace(event)) { this.handleBackspace(); return; } } setLastItemActive() { this.selectedItemsKeyManager.setLastItemActive(); } isSelectedItemsActive() { return Boolean(this.activeItem); } deactivateSelectedItems() { this.selectedItemsKeyManager.setActiveItem(-1); this.activeSelectedItemIndex = undefined; } handleBackspace() { if (this.activeItem) { this.deselectItem(); return; } if (!this.activeItem) { this.setLastItemActive(); return; } } handleRightArrow(event) { const isLastSelectedItemActive = this.activeItem === this.selectedItems.last; if (isLastSelectedItemActive) { this.selectedItemsKeyManager.onKeydown(event); this.deactivateSelectedItems(); if (!this.combobox.manualDropdownControl) { this.combobox.showDropdown(); } return; } this.selectedItemsKeyManager.onKeydown(event); this.liveAnnouncer.announce(`${this.getActiveItemTitle} selected`); } calculateActiveSelectedItemIndex() { if (isNil(this.selectedItemsKeyManager.activeItemIndex)) { throw new Error("ActiveItemIndex is not defined"); } const previousItemIndex = this.selectedItemsKeyManager.activeItemIndex - 1; if (previousItemIndex >= 0) { this.activeSelectedItemIndex = previousItemIndex; return; } if (previousItemIndex === -1 && this.selectedItems.length > 1) { this.activeSelectedItemIndex = 0; return; } if (previousItemIndex === -1 && this.selectedItems.length) { this.activeSelectedItemIndex = undefined; return; } if (previousItemIndex >= 0 && this.selectedItems.length === 0) { this.activeSelectedItemIndex = undefined; return; } } isBackspace(event) { return event.code === KEYBOARD_CODE.BACKSPACE; } isLeftOrRightArrow(event) { return this.isLeftArrow(event) || this.isRightArrow(event); } isRightArrow(event) { return event.code === KEYBOARD_CODE.ARROW_RIGHT; } isLeftArrow(event) { return event.code === KEYBOARD_CODE.ARROW_LEFT; } get activeItem() { return this.selectedItemsKeyManager.activeItem; } deselectItem() { if (!isNil(this.selectedItemsKeyManager.activeItemIndex)) { this.calculateActiveSelectedItemIndex(); this.combobox.deselectItem(this.selectedItemsKeyManager.activeItemIndex); this.liveAnnouncer.announce(`${this.getActiveItemTitle} removed`); } } get getActiveItemTitle() { return this.activeItem?.cdRef.context.item.label || ""; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectedItemsKeyControlService, deps: [{ token: i1.LiveAnnouncer }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectedItemsKeyControlService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectedItemsKeyControlService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.LiveAnnouncer }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0ZWQtaXRlbXMta2V5LWNvbnRyb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VsZWN0LXYyL3NlbGVjdGVkLWl0ZW1zLWtleS1jb250cm9sLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sS0FBSyxNQUFNLGNBQWMsQ0FBQztBQUlqQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7OztBQUdsRSxNQUFNLE9BQU8sOEJBQThCO0lBT3ZDLFlBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQUcsQ0FBQztJQUU1QywyQkFBMkIsQ0FDOUIsS0FBNkMsRUFDN0MsUUFBNkI7UUFFN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQztRQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUUzQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSwwQkFBMEIsQ0FBQyxLQUFLLENBQUM7YUFDL0QseUJBQXlC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bUhBQTlCLDhCQUE4Qjs7NEZBQTlCLDhCQUE4QjtrQkFEMUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciwgTGl2ZUFubm91bmNlciB9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgUXVlcnlMaXN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBpc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5cbmltcG9ydCB7IENvbWJvYm94VjJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21ib2JveC12Mi9jb21ib2JveC12Mi5jb21wb25lbnRcIjtcbmltcG9ydCB7IE1hcmtBc1NlbGVjdGVkSXRlbURpcmVjdGl2ZSB9IGZyb20gXCIuL21hcmstYXMtc2VsZWN0ZWQtaXRlbS5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IEtFWUJPQVJEX0NPREUgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2tleWNvZGUuY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZWxlY3RlZEl0ZW1zS2V5Q29udHJvbFNlcnZpY2Uge1xuICAgIHByaXZhdGUgc2VsZWN0ZWRJdGVtczogUXVlcnlMaXN0PE1hcmtBc1NlbGVjdGVkSXRlbURpcmVjdGl2ZT47XG4gICAgcHJpdmF0ZSBzZWxlY3RlZEl0ZW1zS2V5TWFuYWdlcjogQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8YW55PjtcbiAgICBwcml2YXRlIGFjdGl2ZVNlbGVjdGVkSXRlbUluZGV4PzogbnVtYmVyO1xuICAgIHByaXZhdGUgY29tYm9ib3g6IENvbWJvYm94VjJDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBpbnB1dEVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbGl2ZUFubm91bmNlcjogTGl2ZUFubm91bmNlcikge31cblxuICAgIHB1YmxpYyBpbml0U2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIoXG4gICAgICAgIGVsZW1zOiBRdWVyeUxpc3Q8TWFya0FzU2VsZWN0ZWRJdGVtRGlyZWN0aXZlPixcbiAgICAgICAgY29tYm9ib3g6IENvbWJvYm94VjJDb21wb25lbnRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb21ib2JveCA9IGNvbWJvYm94O1xuICAgICAgICB0aGlzLmlucHV0RWxlbWVudCA9IGNvbWJvYm94LmlucHV0RWxlbWVudD8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gZWxlbXM7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zS2V5TWFuYWdlciA9IG5ldyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcihlbGVtcylcbiAgICAgICAgICAgIC53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKFwibHRyXCIpXG4gICAgICAgICAgICAud2l0aFdyYXAoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNOaWwodGhpcy5hY3RpdmVTZWxlY3RlZEl0ZW1JbmRleCkgJiZcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJdGVtSW5kZXggPj0gMCAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih0aGlzLmFjdGl2ZVNlbGVjdGVkSXRlbUluZGV4KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNLZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJdGVtSW5kZXhcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5zZWxlY3Rpb25TdGFydDtcbiAgICAgICAgY29uc3QgaXNLZXlBbGxvd2VkID1cbiAgICAgICAgICAgIHRoaXMuaXNCYWNrc3BhY2UoZXZlbnQpIHx8IHRoaXMuaXNMZWZ0T3JSaWdodEFycm93KGV2ZW50KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjYXJldFBvc2l0aW9uICE9PSAwIHx8XG4gICAgICAgICAgICAoIXRoaXMuYWN0aXZlSXRlbSAmJiB0aGlzLmlzUmlnaHRBcnJvdyhldmVudCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0tleUFsbG93ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZVNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb21ib2JveC5tYW51YWxEcm9wZG93bkNvbnRyb2wgJiYgIXRoaXMuYWN0aXZlSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5jb21ib2JveC5oaWRlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNMZWZ0QXJyb3coZXZlbnQpICYmXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUl0ZW0gIT09IHRoaXMuc2VsZWN0ZWRJdGVtcy5maXJzdFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShgJHt0aGlzLmdldEFjdGl2ZUl0ZW1UaXRsZX0gc2VsZWN0ZWRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzUmlnaHRBcnJvdyhldmVudCkgJiYgdGhpcy5hY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJpZ2h0QXJyb3coZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNCYWNrc3BhY2UoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tzcGFjZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldExhc3RJdGVtQWN0aXZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNLZXlNYW5hZ2VyLnNldExhc3RJdGVtQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU2VsZWN0ZWRJdGVtc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5hY3RpdmVJdGVtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVhY3RpdmF0ZVNlbGVjdGVkSXRlbXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSgtMSk7XG4gICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJdGVtSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVCYWNrc3BhY2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RJdGVtKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5zZXRMYXN0SXRlbUFjdGl2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVSaWdodEFycm93KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzTGFzdFNlbGVjdGVkSXRlbUFjdGl2ZSA9XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUl0ZW0gPT09IHRoaXMuc2VsZWN0ZWRJdGVtcy5sYXN0O1xuXG4gICAgICAgIGlmIChpc0xhc3RTZWxlY3RlZEl0ZW1BY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZVNlbGVjdGVkSXRlbXMoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbWJvYm94Lm1hbnVhbERyb3Bkb3duQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tYm9ib3guc2hvd0Ryb3Bkb3duKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKGAke3RoaXMuZ2V0QWN0aXZlSXRlbVRpdGxlfSBzZWxlY3RlZGApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY3VsYXRlQWN0aXZlU2VsZWN0ZWRJdGVtSW5kZXgoKTogdm9pZCB7XG4gICAgICAgIGlmIChpc05pbCh0aGlzLnNlbGVjdGVkSXRlbXNLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjdGl2ZUl0ZW1JbmRleCBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbUluZGV4ID1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4IC0gMTtcblxuICAgICAgICBpZiAocHJldmlvdXNJdGVtSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEl0ZW1JbmRleCA9IHByZXZpb3VzSXRlbUluZGV4O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZpb3VzSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEl0ZW1JbmRleCA9IDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldmlvdXNJdGVtSW5kZXggPT09IC0xICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJdGVtSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldmlvdXNJdGVtSW5kZXggPj0gMCAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSXRlbUluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0JhY2tzcGFjZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5CQUNLU1BBQ0U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xlZnRPclJpZ2h0QXJyb3coZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMZWZ0QXJyb3coZXZlbnQpIHx8IHRoaXMuaXNSaWdodEFycm93KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmlnaHRBcnJvdyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICByZXR1cm4gZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19SSUdIVDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTGVmdEFycm93KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX0xFRlQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgYWN0aXZlSXRlbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIuYWN0aXZlSXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc2VsZWN0SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc05pbCh0aGlzLnNlbGVjdGVkSXRlbXNLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQWN0aXZlU2VsZWN0ZWRJdGVtSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMuY29tYm9ib3guZGVzZWxlY3RJdGVtKFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKGAke3RoaXMuZ2V0QWN0aXZlSXRlbVRpdGxlfSByZW1vdmVkYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBnZXRBY3RpdmVJdGVtVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlSXRlbT8uY2RSZWYuY29udGV4dC5pdGVtLmxhYmVsIHx8IFwiXCI7XG4gICAgfVxufVxuIl19