UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

301 lines (299 loc) 40.7 kB
/* MIT License Copyright (c) 2019 Temainfo Software 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 { Injectable } from '@angular/core'; import { Subscription } from 'rxjs'; import { TlButton } from '../button/button'; import * as i0 from "@angular/core"; import * as i1 from "../modal/services/current-modal.service"; let listener; let buttonElements = []; export class ShortcutService { constructor(currentModalService) { this.currentModalService = currentModalService; this.elementsListener = []; this.subscription = new Subscription(); this.modalContextArray = []; this.listenHeadingModal(); } setConfig(config) { this.config = config; } setRenderer(renderer) { this.renderer = renderer; this.createListener(); } listenHeadingModal() { this.subscription.add(this.currentModalService.currentFrontModal$.subscribe((component) => { if (component?.activeModal) { this.activeModal = component.activeModal; } })); } isKeyOnList(key) { return this.elementsListener.filter(value => value.shortcut.toLocaleLowerCase() === key.toLocaleLowerCase()).length > 0; } createListener() { if (!listener) { this.subscription.add(document.addEventListener('keydown', ($event) => { if (!$event.key || !this.isKeyOnList($event.key)) { return; } $event.preventDefault(); if (!this.isKeysShortcutEqualsKeysEvent($event)) { return; } if (this.isElementDisabledClass()) { return; } if (this.getEqualKeys(this.elementsListener[this.elementIndex].shortcut).length > 1) { this.currentShortcut = this.elementsListener[this.elementIndex].shortcut; return this.handleClickComponentWithEqualsKeys(); } this.handleClickComponentWithoutEqualsKeys(); this.handleElementsOfView(); })); listener = this.subscription; } } isElementDisabledClass() { if (!this.config) { return false; } if (!this.config.disableClass) { return false; } for (let index = 0; index < this.getElementDisabled().classList.length; index++) { if (this.getElementDisabled().classList[index] === this.config.disableClass) { return true; } } return false; } getElementDisabled() { if (this.elementsListener[this.elementIndex].element instanceof TlButton) { return this.elementsListener[this.elementIndex].element.button.nativeElement; } else { return this.elementsListener[this.elementIndex].element.nativeElement; } } handleClickComponentWithEqualsKeys() { this.setModalContextArray(); this.isElementInstanceOfButton(this.elementsListener[this.elementIndex]) ? this.handleEqualButton() : this.handleEqualElement(); } handleClickComponentWithoutEqualsKeys() { this.setModalContextArray(); this.isElementInstanceOfButton(this.elementsListener[this.elementIndex]) ? this.activeElementButton(this.elementIndex) : this.elementsListener[this.elementIndex].element.nativeElement.click(); } handleEqualButton() { if (this.isButtonDisabled()) { return; } return this.activeHighestButtonElement(); } setModalContextArray() { this.modalContextArray = this.getExistModalContext(); } handleEqualElement() { this.orderElementsByZindex(); this.elementsListener[this.elementsListener.indexOf(this.highestZindexElement)].element.nativeElement.click(); this.handleElementsOfView(); } activeHighestButtonElement() { if (this.hasModalContextArray()) { const button = this.getModalContextEqualActiveModal()[0]; if (button) { button.element.button.nativeElement.click(); } } else { this.sortButtons()[0].element.button.nativeElement.click(); } setTimeout(() => { this.handleElementsOfView(); }, 520); } hasModalContextArray() { return this.modalContextArray.length > 0; } getModalContextEqualActiveModal() { return this.modalContextArray.filter((item) => (item.element.modalContext === this.activeModal) && (item.shortcut === this.elementsListener[this.elementIndex].shortcut)); } getExistModalContext() { return buttonElements.filter((item) => item.element.modalContext); } getButtonsOfCurrentShortCut() { return buttonElements.filter((value) => (this.currentShortcut === value.shortcut)); } sortButtons() { return this.getButtonsOfCurrentShortCut().sort((a, b) => { return parseInt(a.element.indexShortcut, 10) - parseInt(b.element.indexShortcut, 10); }); } activeElementButton(element) { let button; if (this.getModalContextEqualActiveModal()[0] && this.hasModalContextArray()) { button = this.getModalContextEqualActiveModal()[0]; } else { button = this.elementsListener[element]; } button.element.buttonElement.nativeElement.click(); setTimeout(() => { this.handleElementsOfView(); }, 520); } filterButtons() { buttonElements = []; this.elementsListener.forEach((value) => { if (this.isElementInstanceOfButton(value)) { if (buttonElements.indexOf(value) < 0) { buttonElements.push(value); } } }); } isKeysShortcutEqualsKeysEvent($event) { for (let element = 0; element < this.elementsListener.length; element++) { if (!$event.key) { return; } if (this.getShortcutEventMultipleKey($event).key === this.handleShortcutMultipleKey(element).key && this.getShortcutEventMultipleKey($event).ctrlKey === this.handleShortcutMultipleKey(element).ctrlKey && this.getShortcutEventMultipleKey($event).shiftKey === this.handleShortcutMultipleKey(element).shiftKey && this.getShortcutEventMultipleKey($event).altKey === this.handleShortcutMultipleKey(element).altKey) { this.elementIndex = element; return this.elementsListener[element]; } } } handleElementsOfView() { setTimeout(() => { const tempArrayElements = this.elementsListener.slice(0); for (let element = 0; element < tempArrayElements.length; element++) { this.isElementInstanceOfButton(tempArrayElements[element]) ? this.handleElementButton(tempArrayElements[element]) : this.handleOtherElements(tempArrayElements[element]); } }, 280); } handleElementButton(item) { if (!this.existElementOnView(item.element.buttonElement.nativeElement)) { this.deleteButtonElementFromArray(item); this.deleteElementFromArray(item); } } handleOtherElements(item) { if (!this.existElementOnView(item.element.nativeElement)) { this.deleteElementFromArray(item); } } isElementInstanceOfButton(value) { return value.element instanceof TlButton; } handleShortcutMultipleKey(element) { const assistKeys = { ctrl: false, shift: false, alt: false }; let key = this.elementsListener[element].shortcut.toLowerCase(); this.getShortcutWithoutSpaces(element).split('+').forEach((value, index, array) => { if (value === 'ctrl') { return assistKeys.ctrl = true; } if (value === 'shift') { return assistKeys.shift = true; } if (value === 'alt') { return assistKeys.alt = true; } key = value; }); return { ctrlKey: assistKeys.ctrl, shiftKey: assistKeys.shift, altKey: assistKeys.alt, key: key }; } getShortcutEventMultipleKey($event) { return { ctrlKey: $event.ctrlKey, shiftKey: $event.shiftKey, altKey: $event.altKey, key: $event.key.toLowerCase() }; } existElementOnView(value) { return document.body.contains(value); } getCharsOfShortcut(element) { return this.elementsListener[element].shortcut.toLowerCase().split(''); } getShortcutWithoutSpaces(element) { return this.removeSpacesShortcutString(element).toString().replace(/,/gi, ''); } removeSpacesShortcutString(element) { return this.getCharsOfShortcut(element).filter((value) => { return value !== ' '; }); } deleteElementFromArray(element) { this.elementsListener.splice(this.elementsListener.indexOf(element), 1); } deleteButtonElementFromArray(element) { buttonElements.splice(buttonElements.indexOf(element), 1); } isButtonDisabled() { return this.elementsListener[this.elementIndex].element.buttonElement.nativeElement.disabled; } getEqualKeys(shortcut) { return this.elementsListener.filter((value) => { return String(shortcut).toLocaleLowerCase() === String(value.shortcut).toLocaleLowerCase(); }); } orderElementsByZindex() { const tmpNormalElements = this.filterElementsNotEqualButton(); tmpNormalElements.sort((a, b) => { if (a.element.nativeElement) { return parseInt(a.element.nativeElement.style.zIndex, 10) - parseInt(b.element.nativeElement.style.zIndex, 10); } }); this.highestZindexElement = tmpNormalElements[tmpNormalElements.length - 1]; } filterElementsNotEqualButton() { return this.elementsListener.filter((value, index, array) => { return !this.isElementInstanceOfButton(value) && (value.shortcut === this.currentShortcut); }); } ngOnDestroy() { this.subscription.unsubscribe(); } } /** @nocollapse */ ShortcutService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ShortcutService, deps: [{ token: i1.CurrentModalService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ ShortcutService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ShortcutService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ShortcutService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.CurrentModalService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcnRjdXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3Nob3J0Y3V0L3Nob3J0Y3V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQVU1QyxJQUFJLFFBQVEsQ0FBQztBQUViLElBQUksY0FBYyxHQUEyQixFQUFFLENBQUM7QUFHaEQsTUFBTSxPQUFPLGVBQWU7SUFvQjFCLFlBQXNCLG1CQUF3QztRQUF4Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBbEJ2RCxxQkFBZ0IsR0FBMkIsRUFBRSxDQUFDO1FBVTdDLGlCQUFZLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFNaEQsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBRzdCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxTQUFTLENBQUUsTUFBc0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELFdBQVcsQ0FBRSxRQUFRO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUUsQ0FBRSxTQUFjLEVBQUcsRUFBRTtZQUNqRyxJQUFHLFNBQVMsRUFBRSxXQUFXLEVBQUU7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O0lBRUQscUJBQXFCO1FBQ25CLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDOUQsaUJBQWlCLENBQUMsSUFBSSxDQUFFLENBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRyxFQUFFO1lBQ2pDLElBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUc7Z0JBQzdCLE9BQU8sUUFBUSxDQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFFO29CQUN6RCxRQUFRLENBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUUsQ0FBQzthQUN4RDtRQUNILENBQUMsQ0FBRSxDQUFDO1FBQ0osSUFBSSxDQUFDLG9CQUFvQixHQUFHLGlCQUFpQixDQUFFLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsQ0FBQztJQUNoRixDQUFDO0lBRUQsNEJBQTRCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBRSxDQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFHLEVBQUU7WUFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBRSxLQUFLLENBQUUsSUFBSSxDQUFFLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBRSxDQUFDO1FBQ2pHLENBQUMsQ0FBRSxDQUFDO0lBQ04sQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7O2dJQTlUVSxlQUFlO29JQUFmLGVBQWU7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gTUlUIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUbEJ1dHRvbiB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24nO1xuaW1wb3J0IHsgU2hvcnRjdXRDb25maWcgfSBmcm9tICcuL3Nob3J0Y3V0LmNvbmZpZyc7XG5pbXBvcnQgeyBDdXJyZW50TW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbW9kYWwvc2VydmljZXMvY3VycmVudC1tb2RhbC5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50U2hvcnRjdXQge1xuICBpZDogc3RyaW5nO1xuICBzaG9ydGN1dDogc3RyaW5nO1xuICBlbGVtZW50OiBhbnk7XG59XG5cbmxldCBsaXN0ZW5lcjtcblxubGV0IGJ1dHRvbkVsZW1lbnRzOiBBcnJheTxFbGVtZW50U2hvcnRjdXQ+ID0gW107XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTaG9ydGN1dFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBlbGVtZW50c0xpc3RlbmVyOiBBcnJheTxFbGVtZW50U2hvcnRjdXQ+ID0gW107XG5cbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuXG4gIHByaXZhdGUgZWxlbWVudEluZGV4O1xuXG4gIHByaXZhdGUgY3VycmVudFNob3J0Y3V0O1xuXG4gIHByaXZhdGUgaGlnaGVzdFppbmRleEVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcml2YXRlIGFjdGl2ZU1vZGFsOiBhbnk7XG5cbiAgcHJpdmF0ZSBjb25maWc6IFNob3J0Y3V0Q29uZmlnO1xuXG4gIHByaXZhdGUgbW9kYWxDb250ZXh0QXJyYXkgPSBbXTtcblxuICBjb25zdHJ1Y3RvciggIHByaXZhdGUgY3VycmVudE1vZGFsU2VydmljZTogQ3VycmVudE1vZGFsU2VydmljZSkge1xuICAgIHRoaXMubGlzdGVuSGVhZGluZ01vZGFsKCk7XG4gIH1cblxuICBzZXRDb25maWcoIGNvbmZpZzogU2hvcnRjdXRDb25maWcgKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cblxuICBzZXRSZW5kZXJlciggcmVuZGVyZXIgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgIHRoaXMuY3JlYXRlTGlzdGVuZXIoKTtcbiAgfVxuXG4gIGxpc3RlbkhlYWRpbmdNb2RhbCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoIHRoaXMuY3VycmVudE1vZGFsU2VydmljZS5jdXJyZW50RnJvbnRNb2RhbCQuc3Vic2NyaWJlKCAoIGNvbXBvbmVudDogYW55ICkgPT4ge1xuICAgICAgaWYoY29tcG9uZW50Py5hY3RpdmVNb2RhbCkge1xuICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsID0gY29tcG9uZW50LmFjdGl2ZU1vZGFsO1xuICAgICAgfVxuICAgIH0gKSApO1xuICB9XG5cbiAgaXNLZXlPbkxpc3QoIGtleTogc3RyaW5nICkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzTGlzdGVuZXIuZmlsdGVyKHZhbHVlID0+IHZhbHVlLnNob3J0Y3V0LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IGtleS50b0xvY2FsZUxvd2VyQ2FzZSgpICkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGNyZWF0ZUxpc3RlbmVyKCkge1xuICAgIGlmICggIWxpc3RlbmVyICkge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAna2V5ZG93bicsICggJGV2ZW50OiBLZXlib2FyZEV2ZW50ICkgPT4ge1xuICAgICAgICBpZiAoICEkZXZlbnQua2V5IHx8ICF0aGlzLmlzS2V5T25MaXN0KCAkZXZlbnQua2V5ICkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICggIXRoaXMuaXNLZXlzU2hvcnRjdXRFcXVhbHNLZXlzRXZlbnQoICRldmVudCApICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIHRoaXMuaXNFbGVtZW50RGlzYWJsZWRDbGFzcygpICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIHRoaXMuZ2V0RXF1YWxLZXlzKCB0aGlzLmVsZW1lbnRzTGlzdGVuZXJbIHRoaXMuZWxlbWVudEluZGV4IF0uc2hvcnRjdXQgKS5sZW5ndGggPiAxICkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFNob3J0Y3V0ID0gdGhpcy5lbGVtZW50c0xpc3RlbmVyWyB0aGlzLmVsZW1lbnRJbmRleCBdLnNob3J0Y3V0O1xuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUNsaWNrQ29tcG9uZW50V2l0aEVxdWFsc0tleXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrQ29tcG9uZW50V2l0aG91dEVxdWFsc0tleXMoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFbGVtZW50c09mVmlldygpO1xuICAgICAgfSApICk7XG4gICAgICBsaXN0ZW5lciA9IHRoaXMuc3Vic2NyaXB0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGlzRWxlbWVudERpc2FibGVkQ2xhc3MoKSB7XG4gICAgaWYgKCAhdGhpcy5jb25maWcgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICggIXRoaXMuY29uZmlnLmRpc2FibGVDbGFzcyApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yICggbGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmdldEVsZW1lbnREaXNhYmxlZCgpLmNsYXNzTGlzdC5sZW5ndGg7IGluZGV4KysgKSB7XG4gICAgICBpZiAoIHRoaXMuZ2V0RWxlbWVudERpc2FibGVkKCkuY2xhc3NMaXN0WyBpbmRleCBdID09PSB0aGlzLmNvbmZpZy5kaXNhYmxlQ2xhc3MgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRFbGVtZW50RGlzYWJsZWQoKSB7XG4gICAgaWYgKCB0aGlzLmVsZW1lbnRzTGlzdGVuZXJbIHRoaXMuZWxlbWVudEluZGV4IF0uZWxlbWVudCBpbnN0YW5jZW9mIFRsQnV0dG9uICkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNMaXN0ZW5lclsgdGhpcy5lbGVtZW50SW5kZXggXS5lbGVtZW50LmJ1dHRvbi5uYXRpdmVFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50c0xpc3RlbmVyWyB0aGlzLmVsZW1lbnRJbmRleCBdLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDbGlja0NvbXBvbmVudFdpdGhFcXVhbHNLZXlzKCkge1xuICAgIHRoaXMuc2V0TW9kYWxDb250ZXh0QXJyYXkoKTtcbiAgICB0aGlzLmlzRWxlbWVudEluc3RhbmNlT2ZCdXR0b24oIHRoaXMuZWxlbWVudHNMaXN0ZW5lclsgdGhpcy5lbGVtZW50SW5kZXggXSApID9cbiAgICAgIHRoaXMuaGFuZGxlRXF1YWxCdXR0b24oKSA6XG4gICAgICB0aGlzLmhhbmRsZUVxdWFsRWxlbWVudCgpO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2tDb21wb25lbnRXaXRob3V0RXF1YWxzS2V5cygpIHtcbiAgICB0aGlzLnNldE1vZGFsQ29udGV4dEFycmF5KCk7XG4gICAgdGhpcy5pc0VsZW1lbnRJbnN0YW5jZU9mQnV0dG9uKCB0aGlzLmVsZW1lbnRzTGlzdGVuZXJbIHRoaXMuZWxlbWVudEluZGV4IF0gKSA/XG4gICAgICB0aGlzLmFjdGl2ZUVsZW1lbnRCdXR0b24oIHRoaXMuZWxlbWVudEluZGV4ICkgOlxuICAgICAgdGhpcy5lbGVtZW50c0xpc3RlbmVyWyB0aGlzLmVsZW1lbnRJbmRleCBdLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgaGFuZGxlRXF1YWxCdXR0b24oKSB7XG4gICAgaWYgKCB0aGlzLmlzQnV0dG9uRGlzYWJsZWQoKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlSGlnaGVzdEJ1dHRvbkVsZW1lbnQoKTtcbiAgfVxuXG4gIHNldE1vZGFsQ29udGV4dEFycmF5KCkge1xuICAgIHRoaXMubW9kYWxDb250ZXh0QXJyYXkgPSB0aGlzLmdldEV4aXN0TW9kYWxDb250ZXh0KCk7XG4gIH1cblxuICBoYW5kbGVFcXVhbEVsZW1lbnQoKSB7XG4gICAgdGhpcy5vcmRlckVsZW1lbnRzQnlaaW5kZXgoKTtcbiAgICB0aGlzLmVsZW1lbnRzTGlzdGVuZXJbIHRoaXMuZWxlbWVudHNMaXN0ZW5lci5pbmRleE9mKCB0aGlzLmhpZ2hlc3RaaW5kZXhFbGVtZW50ICkgXS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB0aGlzLmhhbmRsZUVsZW1lbnRzT2ZWaWV3KCk7XG4gIH1cblxuICBhY3RpdmVIaWdoZXN0QnV0dG9uRWxlbWVudCgpIHtcbiAgICBpZiAoIHRoaXMuaGFzTW9kYWxDb250ZXh0QXJyYXkoKSApIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0TW9kYWxDb250ZXh0RXF1YWxBY3RpdmVNb2RhbCgpWyAwIF07XG4gICAgICBpZiAoIGJ1dHRvbiApIHtcbiAgICAgICAgYnV0dG9uLmVsZW1lbnQuYnV0dG9uLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0QnV0dG9ucygpWyAwIF0uZWxlbWVudC5idXR0b24ubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZUVsZW1lbnRzT2ZWaWV3KCk7XG4gICAgfSwgNTIwICk7XG4gIH1cblxuICBoYXNNb2RhbENvbnRleHRBcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbENvbnRleHRBcnJheS5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0TW9kYWxDb250ZXh0RXF1YWxBY3RpdmVNb2RhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RhbENvbnRleHRBcnJheS5maWx0ZXIoICggaXRlbSApID0+XG4gICAgKGl0ZW0uZWxlbWVudC5tb2RhbENvbnRleHQgPT09IHRoaXMuYWN0aXZlTW9kYWwpICYmXG4gICAgKGl0ZW0uc2hvcnRjdXQgPT09IHRoaXMuZWxlbWVudHNMaXN0ZW5lclt0aGlzLmVsZW1lbnRJbmRleF0uc2hvcnRjdXQpKTtcbiAgfVxuXG4gIGdldEV4aXN0TW9kYWxDb250ZXh0KCkge1xuICAgIHJldHVybiBidXR0b25FbGVtZW50cy5maWx0ZXIoICggaXRlbSApID0+IGl0ZW0uZWxlbWVudC5tb2RhbENvbnRleHQgKTtcbiAgfVxuXG4gIGdldEJ1dHRvbnNPZkN1cnJlbnRTaG9ydEN1dCgpIHtcbiAgICByZXR1cm4gYnV0dG9uRWxlbWVudHMuZmlsdGVyKCAoIHZhbHVlICkgPT4gKHRoaXMuY3VycmVudFNob3J0Y3V0ID09PSB2YWx1ZS5zaG9ydGN1dCkpO1xuICB9XG5cbiAgc29ydEJ1dHRvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9uc09mQ3VycmVudFNob3J0Q3V0KCkuc29ydCggKCBhLCBiICkgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KCBhLmVsZW1lbnQuaW5kZXhTaG9ydGN1dCwgMTAgKSAtXG4gICAgICAgIHBhcnNlSW50KCBiLmVsZW1lbnQuaW5kZXhTaG9ydGN1dCwgMTAgKTtcbiAgICB9ICk7XG4gIH1cblxuICBhY3RpdmVFbGVtZW50QnV0dG9uKCBlbGVtZW50ICkge1xuICAgIGxldCBidXR0b247XG4gICAgaWYgKCB0aGlzLmdldE1vZGFsQ29udGV4dEVxdWFsQWN0aXZlTW9kYWwoKVsgMCBdICYmIHRoaXMuaGFzTW9kYWxDb250ZXh0QXJyYXkoKSkge1xuICAgICAgYnV0dG9uID0gdGhpcy5nZXRNb2RhbENvbnRleHRFcXVhbEFjdGl2ZU1vZGFsKClbIDAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnV0dG9uID0gdGhpcy5lbGVtZW50c0xpc3RlbmVyWyBlbGVtZW50IF07XG4gICAgfVxuICAgIGJ1dHRvbi5lbGVtZW50LmJ1dHRvbkVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRWxlbWVudHNPZlZpZXcoKTtcbiAgICB9LCA1MjAgKTtcbiAgfVxuXG4gIGZpbHRlckJ1dHRvbnMoKSB7XG4gICAgYnV0dG9uRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLmVsZW1lbnRzTGlzdGVuZXIuZm9yRWFjaCggKCB2YWx1ZSApID0+IHtcbiAgICAgIGlmICggdGhpcy5pc0VsZW1lbnRJbnN0YW5jZU9mQnV0dG9uKCB2YWx1ZSApICkge1xuICAgICAgICBpZiAoIGJ1dHRvbkVsZW1lbnRzLmluZGV4T2YoIHZhbHVlICkgPCAwICkge1xuICAgICAgICAgIGJ1dHRvbkVsZW1lbnRzLnB1c2goIHZhbHVlICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9ICk7XG4gIH1cblxuICBpc0tleXNTaG9ydGN1dEVxdWFsc0tleXNFdmVudCggJGV2ZW50OiBLZXlib2FyZEV2ZW50ICkge1xuICAgIGZvciAoIGxldCBlbGVtZW50ID0gMDsgZWxlbWVudCA8IHRoaXMuZWxlbWVudHNMaXN0ZW5lci5sZW5ndGg7IGVsZW1lbnQrKyApIHtcbiAgICAgIGlmICggISRldmVudC5rZXkgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICggdGhpcy5nZXRTaG9ydGN1dEV2ZW50TXVsdGlwbGVLZXkoICRldmVudCApLmtleSA9PT0gdGhpcy5oYW5kbGVTaG9ydGN1dE11bHRpcGxlS2V5KCBlbGVtZW50ICkua2V5ICYmXG4gICAgICAgIHRoaXMuZ2V0U2hvcnRjdXRFdmVudE11bHRpcGxlS2V5KCAkZXZlbnQgKS5jdHJsS2V5ID09PSB0aGlzLmhhbmRsZVNob3J0Y3V0TXVsdGlwbGVLZXkoIGVsZW1lbnQgKS5jdHJsS2V5ICYmXG4gICAgICAgIHRoaXMuZ2V0U2hvcnRjdXRFdmVudE11bHRpcGxlS2V5KCAkZXZlbnQgKS5zaGlmdEtleSA9PT0gdGhpcy5oYW5kbGVTaG9ydGN1dE11bHRpcGxlS2V5KCBlbGVtZW50ICkuc2hpZnRLZXkgJiZcbiAgICAgICAgdGhpcy5nZXRTaG9ydGN1dEV2ZW50TXVsdGlwbGVLZXkoICRldmVudCApLmFsdEtleSA9PT0gdGhpcy5oYW5kbGVTaG9ydGN1dE11bHRpcGxlS2V5KCBlbGVtZW50ICkuYWx0S2V5ICkge1xuICAgICAgICB0aGlzLmVsZW1lbnRJbmRleCA9IGVsZW1lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzTGlzdGVuZXJbIGVsZW1lbnQgXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVFbGVtZW50c09mVmlldygpIHtcbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICBjb25zdCB0ZW1wQXJyYXlFbGVtZW50cyA9IHRoaXMuZWxlbWVudHNMaXN0ZW5lci5zbGljZSggMCApO1xuICAgICAgZm9yICggbGV0IGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgdGVtcEFycmF5RWxlbWVudHMubGVuZ3RoOyBlbGVtZW50KysgKSB7XG4gICAgICAgIHRoaXMuaXNFbGVtZW50SW5zdGFuY2VPZkJ1dHRvbiggdGVtcEFycmF5RWxlbWVudHNbIGVsZW1lbnQgXSApID9cbiAgICAgICAgICB0aGlzLmhhbmRsZUVsZW1lbnRCdXR0b24oIHRlbXBBcnJheUVsZW1lbnRzWyBlbGVtZW50IF0gKSA6XG4gICAgICAgICAgdGhpcy5oYW5kbGVPdGhlckVsZW1lbnRzKCB0ZW1wQXJyYXlFbGVtZW50c1sgZWxlbWVudCBdICk7XG4gICAgICB9XG4gICAgfSwgMjgwICk7XG4gIH1cblxuICBoYW5kbGVFbGVtZW50QnV0dG9uKCBpdGVtICkge1xuICAgIGlmICggIXRoaXMuZXhpc3RFbGVtZW50T25WaWV3KCBpdGVtLmVsZW1lbnQuYnV0dG9uRWxlbWVudC5uYXRpdmVFbGVtZW50ICkgKSB7XG4gICAgICB0aGlzLmRlbGV0ZUJ1dHRvbkVsZW1lbnRGcm9tQXJyYXkoIGl0ZW0gKTtcbiAgICAgIHRoaXMuZGVsZXRlRWxlbWVudEZyb21BcnJheSggaXRlbSApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU90aGVyRWxlbWVudHMoIGl0ZW0gKSB7XG4gICAgaWYgKCAhdGhpcy5leGlzdEVsZW1lbnRPblZpZXcoIGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50ICkgKSB7XG4gICAgICB0aGlzLmRlbGV0ZUVsZW1lbnRGcm9tQXJyYXkoIGl0ZW0gKTtcbiAgICB9XG4gIH1cblxuICBpc0VsZW1lbnRJbnN0YW5jZU9mQnV0dG9uKCB2YWx1ZSApIHtcbiAgICByZXR1cm4gdmFsdWUuZWxlbWVudCBpbnN0YW5jZW9mIFRsQnV0dG9uO1xuICB9XG5cbiAgaGFuZGxlU2hvcnRjdXRNdWx0aXBsZUtleSggZWxlbWVudCApIHtcbiAgICBjb25zdCBhc3Npc3RLZXlzID0geyBjdHJsOiBmYWxzZSwgc2hpZnQ6IGZhbHNlLCBhbHQ6IGZhbHNlIH07XG4gICAgbGV0IGtleSA9IHRoaXMuZWxlbWVudHNMaXN0ZW5lclsgZWxlbWVudCBdLnNob3J0Y3V0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICB0aGlzLmdldFNob3J0Y3V0V2l0aG91dFNwYWNlcyggZWxlbWVudCApLnNwbGl0KCAnKycgKS5mb3JFYWNoKCAoIHZhbHVlLCBpbmRleCwgYXJyYXkgKSA9PiB7XG4gICAgICBpZiAoIHZhbHVlID09PSAnY3RybCcgKSB7XG4gICAgICAgIHJldHVybiBhc3Npc3RLZXlzLmN0cmwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCB2YWx1ZSA9PT0gJ3NoaWZ0JyApIHtcbiAgICAgICAgcmV0dXJuIGFzc2lzdEtleXMuc2hpZnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCB2YWx1ZSA9PT0gJ2FsdCcgKSB7XG4gICAgICAgIHJldHVybiBhc3Npc3RLZXlzLmFsdCA9IHRydWU7XG4gICAgICB9XG4gICAgICBrZXkgPSB2YWx1ZTtcbiAgICB9ICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3RybEtleTogYXNzaXN0S2V5cy5jdHJsLFxuICAgICAgc2hpZnRLZXk6IGFzc2lzdEtleXMuc2hpZnQsXG4gICAgICBhbHRLZXk6IGFzc2lzdEtleXMuYWx0LFxuICAgICAga2V5OiBrZXlcbiAgICB9O1xuICB9XG5cbiAgZ2V0U2hvcnRjdXRFdmVudE11bHRpcGxlS2V5KCAkZXZlbnQ6IEtleWJvYXJkRXZlbnQgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN0cmxLZXk6ICRldmVudC5jdHJsS2V5LFxuICAgICAgc2hpZnRLZXk6ICRldmVudC5zaGlmdEtleSxcbiAgICAgIGFsdEtleTogJGV2ZW50LmFsdEtleSxcbiAgICAgIGtleTogJGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpXG4gICAgfTtcbiAgfVxuXG4gIGV4aXN0RWxlbWVudE9uVmlldyggdmFsdWUgKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY29udGFpbnMoIHZhbHVlICk7XG4gIH1cblxuICBnZXRDaGFyc09mU2hvcnRjdXQoIGVsZW1lbnQgKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNMaXN0ZW5lclsgZWxlbWVudCBdLnNob3J0Y3V0LnRvTG93ZXJDYXNlKCkuc3BsaXQoICcnICk7XG4gIH1cblxuICBnZXRTaG9ydGN1dFdpdGhvdXRTcGFjZXMoIGVsZW1lbnQgKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlU3BhY2VzU2hvcnRjdXRTdHJpbmcoIGVsZW1lbnQgKS50b1N0cmluZygpLnJlcGxhY2UoIC8sL2dpLCAnJyApO1xuICB9XG5cbiAgcmVtb3ZlU3BhY2VzU2hvcnRjdXRTdHJpbmcoIGVsZW1lbnQgKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hhcnNPZlNob3J0Y3V0KCBlbGVtZW50ICkuZmlsdGVyKCAoIHZhbHVlICkgPT4ge1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSAnICc7XG4gICAgfSApO1xuICB9XG5cbiAgZGVsZXRlRWxlbWVudEZyb21BcnJheSggZWxlbWVudCApIHtcbiAgICB0aGlzLmVsZW1lbnRzTGlzdGVuZXIuc3BsaWNlKCB0aGlzLmVsZW1lbnRzTGlzdGVuZXIuaW5kZXhPZiggZWxlbWVudCApLCAxICk7XG4gIH1cblxuICBkZWxldGVCdXR0b25FbGVtZW50RnJvbUFycmF5KCBlbGVtZW50ICkge1xuICAgIGJ1dHRvbkVsZW1lbnRzLnNwbGljZSggYnV0dG9uRWxlbWVudHMuaW5kZXhPZiggZWxlbWVudCApLCAxICk7XG4gIH1cblxuICBpc0J1dHRvbkRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzTGlzdGVuZXJbIHRoaXMuZWxlbWVudEluZGV4IF0uZWxlbWVudC5idXR0b25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQ7XG4gIH1cblxuICBnZXRFcXVhbEtleXMoIHNob3J0Y3V0ICkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzTGlzdGVuZXIuZmlsdGVyKCAoIHZhbHVlICkgPT4ge1xuICAgICAgcmV0dXJuIFN0cmluZyhzaG9ydGN1dCkudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gU3RyaW5nKHZhbHVlLnNob3J0Y3V0KS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH0gKTtcbiAgfVxuXG4gIG9yZGVyRWxlbWVudHNCeVppbmRleCgpIHtcbiAgICBjb25zdCB0bXBOb3JtYWxFbGVtZW50cyA9IHRoaXMuZmlsdGVyRWxlbWVudHNOb3RFcXVhbEJ1dHRvbigpO1xuICAgIHRtcE5vcm1hbEVsZW1lbnRzLnNvcnQoICggYSwgYiApID0+IHtcbiAgICAgIGlmICggYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCggYS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuekluZGV4LCAxMCApIC1cbiAgICAgICAgICBwYXJzZUludCggYi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuekluZGV4LCAxMCApO1xuICAgICAgfVxuICAgIH0gKTtcbiAgICB0aGlzLmhpZ2hlc3RaaW5kZXhFbGVtZW50ID0gdG1wTm9ybWFsRWxlbWVudHNbIHRtcE5vcm1hbEVsZW1lbnRzLmxlbmd0aCAtIDEgXTtcbiAgfVxuXG4gIGZpbHRlckVsZW1lbnRzTm90RXF1YWxCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNMaXN0ZW5lci5maWx0ZXIoICggdmFsdWUsIGluZGV4LCBhcnJheSApID0+IHtcbiAgICAgIHJldHVybiAhdGhpcy5pc0VsZW1lbnRJbnN0YW5jZU9mQnV0dG9uKCB2YWx1ZSApICYmICggdmFsdWUuc2hvcnRjdXQgPT09IHRoaXMuY3VycmVudFNob3J0Y3V0ICk7XG4gICAgfSApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG59XG4iXX0=