@nova-ui/bits
Version:
SolarWinds Nova Framework
158 lines • 22.5 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 { 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