UNPKG

ngx-ui-hero

Version:

Simple, fast and reliable utilities for Angular.

166 lines 24.7 kB
import { InputService } from './input.service'; export class InputHandler { constructor(htmlInputElement, options) { this.inputService = new InputService(htmlInputElement, options); this.htmlInputElement = htmlInputElement; } handleClick(event, chromeAndroid) { let selectionRangeLength = Math.abs(this.inputService.inputSelection.selectionEnd - this.inputService.inputSelection.selectionStart); //if there is no selection and the value is not null, the cursor position will be fixed. if the browser is chrome on android, the cursor will go to the end of the number. if (selectionRangeLength == 0 && !isNaN(this.inputService.value)) { this.inputService.fixCursorPosition(chromeAndroid); } } handleCut(event) { if (this.isReadOnly()) { return; } setTimeout(() => { this.inputService.updateFieldValue(); this.setValue(this.inputService.value); this.onModelChange(this.inputService.value); }, 0); } handleInput(event) { if (this.isReadOnly()) { return; } let keyCode = this.getNewKeyCode(this.inputService.storedRawValue, this.inputService.rawValue); let rawValueLength = this.inputService.rawValue.length; let rawValueSelectionEnd = this.inputService.inputSelection.selectionEnd; let rawValueWithoutSuffixEndPosition = this.inputService.getRawValueWithoutSuffixEndPosition(); let storedRawValueLength = this.inputService.storedRawValue.length; this.inputService.rawValue = this.inputService.storedRawValue; if ((rawValueSelectionEnd != rawValueWithoutSuffixEndPosition || Math.abs(rawValueLength - storedRawValueLength) != 1) && storedRawValueLength != 0) { this.setCursorPosition(event); return; } if (rawValueLength < storedRawValueLength) { if (this.inputService.value != 0) { this.inputService.removeNumber(8); } else { this.setValue(null); } } if (rawValueLength > storedRawValueLength) { switch (keyCode) { case 43: this.inputService.changeToPositive(); break; case 45: this.inputService.changeToNegative(); break; default: if (!this.inputService.canInputMoreNumbers || (isNaN(this.inputService.value) && String.fromCharCode(keyCode).match(/\d/) == null)) { return; } this.inputService.addNumber(keyCode); } } this.setCursorPosition(event); this.onModelChange(this.inputService.value); } handleKeydown(event) { if (this.isReadOnly()) { return; } let keyCode = event.which || event.charCode || event.keyCode; if (keyCode == 8 || keyCode == 46 || keyCode == 63272) { event.preventDefault(); let selectionRangeLength = Math.abs(this.inputService.inputSelection.selectionEnd - this.inputService.inputSelection.selectionStart); if (selectionRangeLength == this.inputService.rawValue.length || this.inputService.value == 0) { this.setValue(null); this.onModelChange(this.inputService.value); } if (selectionRangeLength == 0 && !isNaN(this.inputService.value)) { this.inputService.removeNumber(keyCode); this.onModelChange(this.inputService.value); } if ((keyCode === 8 || keyCode === 46) && selectionRangeLength != 0 && !isNaN(this.inputService.value)) { this.inputService.removeNumber(keyCode); this.onModelChange(this.inputService.value); } } } handleKeypress(event) { if (this.isReadOnly()) { return; } let keyCode = event.which || event.charCode || event.keyCode; if (keyCode == undefined || [9, 13].indexOf(keyCode) != -1 || this.isArrowEndHomeKeyInFirefox(event)) { return; } switch (keyCode) { case 43: this.inputService.changeToPositive(); break; case 45: this.inputService.changeToNegative(); break; default: if (this.inputService.canInputMoreNumbers && (!isNaN(this.inputService.value) || String.fromCharCode(keyCode).match(/\d/) != null)) { this.inputService.addNumber(keyCode); } } event.preventDefault(); this.onModelChange(this.inputService.value); } handleKeyup(event) { this.inputService.fixCursorPosition(); } handlePaste(event) { if (this.isReadOnly()) { return; } setTimeout(() => { this.inputService.updateFieldValue(); this.setValue(this.inputService.value); this.onModelChange(this.inputService.value); }, 1); } updateOptions(options) { this.inputService.updateOptions(options); } getOnModelChange() { return this.onModelChange; } setOnModelChange(callbackFunction) { this.onModelChange = callbackFunction; } getOnModelTouched() { return this.onModelTouched; } setOnModelTouched(callbackFunction) { this.onModelTouched = callbackFunction; } setValue(value) { this.inputService.value = value; } getNewKeyCode(oldString, newString) { if (oldString.length > newString.length) { return null; } for (let x = 0; x < newString.length; x++) { if (oldString.length == x || oldString[x] != newString[x]) { return newString.charCodeAt(x); } } } isArrowEndHomeKeyInFirefox(event) { if ([35, 36, 37, 38, 39, 40].indexOf(event.keyCode) != -1 && (event.charCode == undefined || event.charCode == 0)) { return true; } return false; } isReadOnly() { return this.htmlInputElement && this.htmlInputElement.readOnly; } setCursorPosition(event) { let rawValueWithoutSuffixEndPosition = this.inputService.getRawValueWithoutSuffixEndPosition(); setTimeout(function () { event.target.setSelectionRange(rawValueWithoutSuffixEndPosition, rawValueWithoutSuffixEndPosition); }, 0); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC11aS1oZXJvL3NyYy9saWIvaW5wdXQtZm9ybXMvZGlyZWN0aXZlcy9jdXJyZW5jeS9pbnB1dC5oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxNQUFNLE9BQU8sWUFBWTtJQU9yQixZQUFZLGdCQUFrQyxFQUFFLE9BQVk7UUFDeEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDN0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFVLEVBQUUsYUFBc0I7UUFDMUMsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVySSwwS0FBMEs7UUFDMUssSUFBSSxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM5RCxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3REO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ25CLE9BQU87U0FDVjtRQUVELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMs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QUMsRUFBRTtnQkFDdkQsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xDO1NBQ0o7SUFDTCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsS0FBVTtRQUN6QyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUMvRyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLFVBQVU7UUFDZCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ25FLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxLQUFVO1FBQ2hDLElBQUksZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO1FBRS9GLFVBQVUsQ0FBQztZQUNQLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsZ0NBQWdDLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUN2RyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnB1dFNlcnZpY2UgfSBmcm9tICcuL2lucHV0LnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5wdXRIYW5kbGVyIHtcblxuICAgIHByaXZhdGUgaW5wdXRTZXJ2aWNlOiBJbnB1dFNlcnZpY2U7XG4gICAgcHJpdmF0ZSBvbk1vZGVsQ2hhbmdlOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIG9uTW9kZWxUb3VjaGVkOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIGh0bWxJbnB1dEVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihodG1sSW5wdXRFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50LCBvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UgPSBuZXcgSW5wdXRTZXJ2aWNlKGh0bWxJbnB1dEVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmh0bWxJbnB1dEVsZW1lbnQgPSBodG1sSW5wdXRFbGVtZW50O1xuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrKGV2ZW50OiBhbnksIGNocm9tZUFuZHJvaWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgbGV0IHNlbGVjdGlvblJhbmdlTGVuZ3RoID0gTWF0aC5hYnModGhpcy5pbnB1dFNlcnZpY2UuaW5wdXRTZWxlY3Rpb24uc2VsZWN0aW9uRW5kIC0gdGhpcy5pbnB1dFNlcnZpY2UuaW5wdXRTZWxlY3Rpb24uc2VsZWN0aW9uU3RhcnQpO1xuXG4gICAgICAgIC8vaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uIGFuZCB0aGUgdmFsdWUgaXMgbm90IG51bGwsIHRoZSBjdXJzb3IgcG9zaXRpb24gd2lsbCBiZSBmaXhlZC4gaWYgdGhlIGJyb3dzZXIgaXMgY2hyb21lIG9uIGFuZHJvaWQsIHRoZSBjdXJzb3Igd2lsbCBnbyB0byB0aGUgZW5kIG9mIHRoZSBudW1iZXIuXG4gICAgICAgIGlmIChzZWxlY3Rpb25SYW5nZUxlbmd0aCA9PSAwICYmICFpc05hTih0aGlzLmlucHV0U2VydmljZS52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLmZpeEN1cnNvclBvc2l0aW9uKGNocm9tZUFuZHJvaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQ3V0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkT25seSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuaW5wdXRTZXJ2aWNlLnZhbHVlKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW5wdXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1JlYWRPbmx5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBrZXlDb2RlID0gdGhpcy5nZXROZXdLZXlDb2RlKHRoaXMuaW5wdXRTZXJ2aWNlLnN0b3JlZFJhd1ZhbHVlLCB0aGlzLmlucHV0U2VydmljZS5yYXdWYWx1ZSk7XG4gICAgICAgIGxldCByYXdWYWx1ZUxlbmd0aCA9IHRoaXMuaW5wdXRTZXJ2aWNlLnJhd1ZhbHVlLmxlbmd0aDtcbiAgICAgICAgbGV0IHJhd1ZhbHVlU2VsZWN0aW9uRW5kID0gdGhpcy5pbnB1dFNlcnZpY2UuaW5wdXRTZWxlY3Rpb24uc2VsZWN0aW9uRW5kO1xuICAgICAgICBsZXQgcmF3VmFsdWVXaXRob3V0U3VmZml4RW5kUG9zaXRpb24gPSB0aGlzLmlucHV0U2VydmljZS5nZXRSYXdWYWx1ZVdpdGhvdXRTdWZmaXhFbmRQb3NpdGlvbigpO1xuICAgICAgICBsZXQgc3RvcmVkUmF3VmFsdWVMZW5ndGggPSB0aGlzLmlucHV0U2VydmljZS5zdG9yZWRSYXdWYWx1ZS5sZW5ndGg7XG4gICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnJhd1ZhbHVlID0gdGhpcy5pbnB1dFNlcnZpY2Uuc3RvcmVkUmF3VmFsdWU7XG5cbiAgICAgICAgaWYgKChyYXdWYWx1ZVNlbGVjdGlvbkVuZCAhPSByYXdWYWx1ZVdpdGhvdXRTdWZmaXhFbmRQb3NpdGlvbiB8fCBNYXRoLmFicyhyYXdWYWx1ZUxlbmd0aCAtIHN0b3JlZFJhd1ZhbHVlTGVuZ3RoKSAhPSAxKSAmJiBzdG9yZWRSYXdWYWx1ZUxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldEN1cnNvclBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdWYWx1ZUxlbmd0aCA8IHN0b3JlZFJhd1ZhbHVlTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUgIT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnJlbW92ZU51bWJlcig4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdWYWx1ZUxlbmd0aCA+IHN0b3JlZFJhd1ZhbHVlTGVuZ3RoKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDQzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VydmljZS5jaGFuZ2VUb1Bvc2l0aXZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLmNoYW5nZVRvTmVnYXRpdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0U2VydmljZS5jYW5JbnB1dE1vcmVOdW1iZXJzIHx8IChpc05hTih0aGlzLmlucHV0U2VydmljZS52YWx1ZSkgJiYgU3RyaW5nLmZyb21DaGFyQ29kZShrZXlDb2RlKS5tYXRjaCgvXFxkLykgPT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLmFkZE51bWJlcihrZXlDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Q3Vyc29yUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpO1xuICAgIH1cblxuICAgIGhhbmRsZUtleWRvd24oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1JlYWRPbmx5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBrZXlDb2RlID0gZXZlbnQud2hpY2ggfHwgZXZlbnQuY2hhckNvZGUgfHwgZXZlbnQua2V5Q29kZTtcblxuICAgICAgICBpZiAoa2V5Q29kZSA9PSA4IHx8IGtleUNvZGUgPT0gNDYgfHwga2V5Q29kZSA9PSA2MzI3Mikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25SYW5nZUxlbmd0aCA9IE1hdGguYWJzKHRoaXMuaW5wdXRTZXJ2aWNlLmlucHV0U2VsZWN0aW9uLnNlbGVjdGlvbkVuZCAtIHRoaXMuaW5wdXRTZXJ2aWNlLmlucHV0U2VsZWN0aW9uLnNlbGVjdGlvblN0YXJ0KTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvblJhbmdlTGVuZ3RoID09IHRoaXMuaW5wdXRTZXJ2aWNlLnJhd1ZhbHVlLmxlbmd0aCB8fCB0aGlzLmlucHV0U2VydmljZS52YWx1ZSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uUmFuZ2VMZW5ndGggPT0gMCAmJiAhaXNOYU4odGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UucmVtb3ZlTnVtYmVyKGtleUNvZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLmlucHV0U2VydmljZS52YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoa2V5Q29kZSA9PT0gOCB8fCBrZXlDb2RlID09PSA0NikgJiYgc2VsZWN0aW9uUmFuZ2VMZW5ndGggIT0gMCAmJiAhaXNOYU4odGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UucmVtb3ZlTnVtYmVyKGtleUNvZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLmlucHV0U2VydmljZS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVLZXlwcmVzcyhldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVhZE9ubHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGtleUNvZGUgPSBldmVudC53aGljaCB8fCBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlDb2RlO1xuXG4gICAgICAgIGlmIChrZXlDb2RlID09IHVuZGVmaW5lZCB8fCBbOSwgMTNdLmluZGV4T2Yoa2V5Q29kZSkgIT0gLTEgfHwgdGhpcy5pc0Fycm93RW5kSG9tZUtleUluRmlyZWZveChldmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSA0MzpcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VydmljZS5jaGFuZ2VUb1Bvc2l0aXZlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ1OlxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLmNoYW5nZVRvTmVnYXRpdmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRTZXJ2aWNlLmNhbklucHV0TW9yZU51bWJlcnMgJiYgKCFpc05hTih0aGlzLmlucHV0U2VydmljZS52YWx1ZSkgfHwgU3RyaW5nLmZyb21DaGFyQ29kZShrZXlDb2RlKS5tYXRjaCgvXFxkLykgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UuYWRkTnVtYmVyKGtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLmlucHV0U2VydmljZS52YWx1ZSk7XG4gICAgfVxuXG4gICAgaGFuZGxlS2V5dXAoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0U2VydmljZS5maXhDdXJzb3JQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIGhhbmRsZVBhc3RlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkT25seSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5pbnB1dFNlcnZpY2UudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMuaW5wdXRTZXJ2aWNlLnZhbHVlKTtcbiAgICAgICAgfSwgMSk7XG4gICAgfVxuXG4gICAgdXBkYXRlT3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFNlcnZpY2UudXBkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBnZXRPbk1vZGVsQ2hhbmdlKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25Nb2RlbENoYW5nZTtcbiAgICB9XG5cbiAgICBzZXRPbk1vZGVsQ2hhbmdlKGNhbGxiYWNrRnVuY3Rpb246IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGNhbGxiYWNrRnVuY3Rpb247XG4gICAgfVxuXG4gICAgZ2V0T25Nb2RlbFRvdWNoZWQoKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbk1vZGVsVG91Y2hlZDtcbiAgICB9XG5cbiAgICBzZXRPbk1vZGVsVG91Y2hlZChjYWxsYmFja0Z1bmN0aW9uOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gY2FsbGJhY2tGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRTZXJ2aWNlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROZXdLZXlDb2RlKG9sZFN0cmluZzogc3RyaW5nLCBuZXdTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGlmIChvbGRTdHJpbmcubGVuZ3RoID4gbmV3U3RyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IG5ld1N0cmluZy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgaWYgKG9sZFN0cmluZy5sZW5ndGggPT0geCB8fCBvbGRTdHJpbmdbeF0gIT0gbmV3U3RyaW5nW3hdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1N0cmluZy5jaGFyQ29kZUF0KHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0Fycm93RW5kSG9tZUtleUluRmlyZWZveChldmVudDogYW55KSB7XG4gICAgICAgIGlmIChbMzUsIDM2LCAzNywgMzgsIDM5LCA0MF0uaW5kZXhPZihldmVudC5rZXlDb2RlKSAhPSAtMSAmJiAoZXZlbnQuY2hhckNvZGUgPT0gdW5kZWZpbmVkIHx8IGV2ZW50LmNoYXJDb2RlID09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmVhZE9ubHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0bWxJbnB1dEVsZW1lbnQgJiYgdGhpcy5odG1sSW5wdXRFbGVtZW50LnJlYWRPbmx5O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q3Vyc29yUG9zaXRpb24oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgcmF3VmFsdWVXaXRob3V0U3VmZml4RW5kUG9zaXRpb24gPSB0aGlzLmlucHV0U2VydmljZS5nZXRSYXdWYWx1ZVdpdGhvdXRTdWZmaXhFbmRQb3NpdGlvbigpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKHJhd1ZhbHVlV2l0aG91dFN1ZmZpeEVuZFBvc2l0aW9uLCByYXdWYWx1ZVdpdGhvdXRTdWZmaXhFbmRQb3NpdGlvbik7XG4gICAgICAgIH0sIDApO1xuICAgIH1cbn0iXX0=