UNPKG

@neocomplexx/ngx-neo-completer

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

331 lines 32.6 kB
import { __decorate, __metadata, __param } from "tslib"; import { Directive, ElementRef, EventEmitter, Host, HostListener, Input, Output } from '@angular/core'; import { NgModel } from '@angular/forms'; import { timer } from 'rxjs'; import { take } from 'rxjs/operators'; import { CtrCompleter } from './ctr-completer'; import { isNil } from '../globals'; // keyboard events const KEY_DW = 40; const KEY_RT = 39; const KEY_UP = 38; const KEY_LF = 37; const KEY_ES = 27; const KEY_EN = 13; const KEY_TAB = 9; const KEY_BK = 8; const KEY_SH = 16; const KEY_CL = 20; const KEY_F1 = 112; const KEY_F12 = 123; let CtrInput = // tslint:disable-next-line:directive-class-suffix class CtrInput { constructor(completer, ngModel, el) { this.completer = completer; this.ngModel = ngModel; this.el = el; // tslint:disable:no-input-rename this.clearSelected = false; this.clearUnselected = false; this.overrideSuggested = false; this.fillHighlighted = true; this.openOnFocus = false; this.openOnClick = false; this.selectOnClick = false; this.selectOnFocus = false; this.autoSelectOnEnter = true; this.ngModelChange = new EventEmitter(); this._searchStr = ''; this._displayStr = ''; this.blurTimer = null; this.completer.selected.subscribe((item) => { if (!item) { return; } if (this.clearSelected) { this.searchStr = ''; } else { this.searchStr = item.title; } this.ngModelChange.emit(this.searchStr); }); this.completer.highlighted.subscribe((item) => { if (this.fillHighlighted) { if (item) { this._displayStr = item.title; this.ngModelChange.emit(item.title); } else { this._displayStr = this.searchStr; this.ngModelChange.emit(this.searchStr); } } }); this.completer.dataSourceChange.subscribe(() => { this.completer.search(this.searchStr); }); if (this.ngModel.valueChanges) { this.ngModel.valueChanges.subscribe(value => { if (!isNil(value) && this._displayStr !== value) { if (this.searchStr !== value) { this.completer.search(value); } this.searchStr = value; } }); } } keyupHandler(event) { if (event.keyCode === KEY_LF || event.keyCode === KEY_RT || event.keyCode === KEY_TAB) { // do nothing return; } if (event.keyCode === KEY_UP || event.keyCode === KEY_EN) { event.preventDefault(); } else if (event.keyCode === KEY_DW) { event.preventDefault(); this.completer.search(this.searchStr); } else if (event.keyCode === KEY_ES) { if (this.completer.isOpen) { this.restoreSearchValue(); this.completer.clear(); event.stopPropagation(); event.preventDefault(); } } } pasteHandler(event) { this.completer.open(); } keydownHandler(event) { const keyCode = event.keyCode || event.which; if (keyCode === KEY_EN) { if (this.completer.hasHighlighted()) { event.preventDefault(); } else { if (this.autoSelectOnEnter) { event.preventDefault(); this.completer.open(); this.completer.nextRow(); } } this.handleSelection(); } else if (keyCode === KEY_DW) { event.preventDefault(); this.completer.open(); this.completer.nextRow(); } else if (keyCode === KEY_UP) { event.preventDefault(); this.completer.prevRow(); } else if (keyCode === KEY_TAB) { this.handleSelection(); } else if (keyCode === KEY_BK) { this.completer.open(); } else if (keyCode === KEY_ES) { // This is very specific to IE10/11 #272 // without this, IE clears the input text event.preventDefault(); if (this.completer.isOpen) { event.stopPropagation(); } } else { if (keyCode !== 0 && keyCode !== KEY_SH && keyCode !== KEY_CL && (keyCode <= KEY_F1 || keyCode >= KEY_F12) && !event.ctrlKey && !event.metaKey && !event.altKey) { this.completer.open(); } } } onBlur(event) { // Check if we need to cancel Blur for IE if (this.completer.isCancelBlur()) { setTimeout(() => { // get the focus back this.el.nativeElement.focus(); }, 0); return; } if (this.completer.isOpen) { this.blurTimer = timer(200).pipe(take(1)).subscribe(() => this.doBlur()); } } onfocus() { if (this.blurTimer) { this.blurTimer.unsubscribe(); this.blurTimer = null; } if (this.selectOnFocus) { this.el.nativeElement.select(); } if (this.openOnFocus) { this.completer.open(); } } onClick(event) { if (this.selectOnClick) { this.el.nativeElement.select(); } if (this.openOnClick) { if (this.completer.isOpen) { this.completer.clear(); } else { this.completer.open(); } } } get searchStr() { return this._searchStr; } set searchStr(term) { this._searchStr = term; this._displayStr = term; } handleSelection() { if (this.completer.hasHighlighted()) { this._searchStr = ''; this.completer.selectCurrent(); } else if (this.overrideSuggested) { this.completer.onSelected({ title: this.searchStr, originalObject: null }); } else { if (this.clearUnselected && !this.completer.hasSelected) { this.searchStr = ''; this.ngModelChange.emit(this.searchStr); } this.completer.clear(); } } restoreSearchValue() { if (this.fillHighlighted) { if (this._displayStr !== this.searchStr) { this._displayStr = this.searchStr; this.ngModelChange.emit(this.searchStr); } } } doBlur() { if (this.blurTimer) { this.blurTimer.unsubscribe(); this.blurTimer = null; } if (this.overrideSuggested) { this.completer.onSelected({ title: this.searchStr, originalObject: null }); } else { if (this.clearUnselected && !this.completer.hasSelected) { this.searchStr = ''; this.ngModelChange.emit(this.searchStr); } else { this.restoreSearchValue(); } } this.completer.clear(); } }; CtrInput.ctorParameters = () => [ { type: CtrCompleter, decorators: [{ type: Host }] }, { type: NgModel }, { type: ElementRef } ]; __decorate([ Input('clearSelected'), __metadata("design:type", Object) ], CtrInput.prototype, "clearSelected", void 0); __decorate([ Input('clearUnselected'), __metadata("design:type", Object) ], CtrInput.prototype, "clearUnselected", void 0); __decorate([ Input('overrideSuggested'), __metadata("design:type", Object) ], CtrInput.prototype, "overrideSuggested", void 0); __decorate([ Input('fillHighlighted'), __metadata("design:type", Object) ], CtrInput.prototype, "fillHighlighted", void 0); __decorate([ Input('openOnFocus'), __metadata("design:type", Object) ], CtrInput.prototype, "openOnFocus", void 0); __decorate([ Input('openOnClick'), __metadata("design:type", Object) ], CtrInput.prototype, "openOnClick", void 0); __decorate([ Input('selectOnClick'), __metadata("design:type", Object) ], CtrInput.prototype, "selectOnClick", void 0); __decorate([ Input('selectOnFocus'), __metadata("design:type", Object) ], CtrInput.prototype, "selectOnFocus", void 0); __decorate([ Input('autoSelectOnEnter'), __metadata("design:type", Object) ], CtrInput.prototype, "autoSelectOnEnter", void 0); __decorate([ Output(), __metadata("design:type", EventEmitter) ], CtrInput.prototype, "ngModelChange", void 0); __decorate([ HostListener('keyup', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "keyupHandler", null); __decorate([ HostListener('paste', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "pasteHandler", null); __decorate([ HostListener('keydown', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "keydownHandler", null); __decorate([ HostListener('blur', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "onBlur", null); __decorate([ HostListener('focus', []), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], CtrInput.prototype, "onfocus", null); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], CtrInput.prototype, "onClick", null); CtrInput = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: '[ctrInput]', }) // tslint:disable-next-line:directive-class-suffix , __param(0, Host()), __metadata("design:paramtypes", [CtrCompleter, NgModel, ElementRef]) ], CtrInput); export { CtrInput }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWlucHV0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tY29tcGxldGVyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvY3RyLWlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHbkMsa0JBQWtCO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDbkIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBT3BCLElBQWEsUUFBUTtBQURyQixrREFBa0Q7QUFDbEQsTUFBYSxRQUFRO0lBa0Jq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QUFyQixLQUFLLENBQUMsYUFBYSxDQUFDOzs2Q0FBNEI7QUFDM0I7SUFBckIsS0FBSyxDQUFDLGFBQWEsQ0FBQzs7NkNBQTRCO0FBQ3pCO0lBQXZCLEtBQUssQ0FBQyxlQUFlLENBQUM7OytDQUE4QjtBQUM3QjtJQUF2QixLQUFLLENBQUMsZUFBZSxDQUFDOzsrQ0FBOEI7QUFDekI7SUFBM0IsS0FBSyxDQUFDLG1CQUFtQixDQUFDOzttREFBaUM7QUFFbEQ7SUFBVCxNQUFNLEVBQUU7OEJBQXVCLFlBQVk7K0NBQTJCO0FBZ0R2RTtJQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7Ozs0Q0FvQmpDO0FBR0Q7SUFEQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7NENBR2pDO0FBR0Q7SUFEQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7OENBd0NuQztBQUdEO0lBREMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7O3NDQWlCaEM7QUFHRDtJQURDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDOzs7O3VDQWN6QjtBQUdEO0lBREMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7O3VDQWFqQztBQWhMUSxRQUFRO0lBTHBCLFNBQVMsQ0FBQztRQUNQLDhDQUE4QztRQUM5QyxRQUFRLEVBQUUsWUFBWTtLQUN6QixDQUFDO0lBQ0Ysa0RBQWtEOztJQW1CakMsV0FBQSxJQUFJLEVBQUUsQ0FBQTtxQ0FBb0IsWUFBWSxFQUFtQixPQUFPLEVBQWMsVUFBVTtHQWxCNUYsUUFBUSxDQXNPcEI7U0F0T1ksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0LCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0aW1lciwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDb21wbGV0ZXJJdGVtIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wbGV0ZXItaXRlbSc7XG5pbXBvcnQgeyBDdHJDb21wbGV0ZXIgfSBmcm9tICcuL2N0ci1jb21wbGV0ZXInO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi9nbG9iYWxzJztcblxuXG4vLyBrZXlib2FyZCBldmVudHNcbmNvbnN0IEtFWV9EVyA9IDQwO1xuY29uc3QgS0VZX1JUID0gMzk7XG5jb25zdCBLRVlfVVAgPSAzODtcbmNvbnN0IEtFWV9MRiA9IDM3O1xuY29uc3QgS0VZX0VTID0gMjc7XG5jb25zdCBLRVlfRU4gPSAxMztcbmNvbnN0IEtFWV9UQUIgPSA5O1xuY29uc3QgS0VZX0JLID0gODtcbmNvbnN0IEtFWV9TSCA9IDE2O1xuY29uc3QgS0VZX0NMID0gMjA7XG5jb25zdCBLRVlfRjEgPSAxMTI7XG5jb25zdCBLRVlfRjEyID0gMTIzO1xuXG5ARGlyZWN0aXZlKHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbY3RySW5wdXRdJyxcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIEN0cklucHV0IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1pbnB1dC1yZW5hbWVcbiAgICBASW5wdXQoJ2NsZWFyU2VsZWN0ZWQnKSBwdWJsaWMgY2xlYXJTZWxlY3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgnY2xlYXJVbnNlbGVjdGVkJykgcHVibGljIGNsZWFyVW5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgnb3ZlcnJpZGVTdWdnZXN0ZWQnKSBwdWJsaWMgb3ZlcnJpZGVTdWdnZXN0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoJ2ZpbGxIaWdobGlnaHRlZCcpIHB1YmxpYyBmaWxsSGlnaGxpZ2h0ZWQgPSB0cnVlO1xuICAgIEBJbnB1dCgnb3Blbk9uRm9jdXMnKSBwdWJsaWMgb3Blbk9uRm9jdXMgPSBmYWxzZTtcbiAgICBASW5wdXQoJ29wZW5PbkNsaWNrJykgcHVibGljIG9wZW5PbkNsaWNrID0gZmFsc2U7XG4gICAgQElucHV0KCdzZWxlY3RPbkNsaWNrJykgcHVibGljIHNlbGVjdE9uQ2xpY2sgPSBmYWxzZTtcbiAgICBASW5wdXQoJ3NlbGVjdE9uRm9jdXMnKSBwdWJsaWMgc2VsZWN0T25Gb2N1cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgnYXV0b1NlbGVjdE9uRW50ZXInKSBwdWJsaWMgYXV0b1NlbGVjdE9uRW50ZXIgPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBuZ01vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHByaXZhdGUgX3NlYXJjaFN0ciA9ICcnO1xuICAgIHByaXZhdGUgX2Rpc3BsYXlTdHIgPSAnJztcbiAgICBwcml2YXRlIGJsdXJUaW1lcjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIHByaXZhdGUgY29tcGxldGVyOiBDdHJDb21wbGV0ZXIsIHByaXZhdGUgbmdNb2RlbDogTmdNb2RlbCwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWxlY3RlZC5zdWJzY3JpYmUoKGl0ZW06IENvbXBsZXRlckl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IGl0ZW0udGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFN0cik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tcGxldGVyLmhpZ2hsaWdodGVkLnN1YnNjcmliZSgoaXRlbTogQ29tcGxldGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheVN0ciA9IGl0ZW0udGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KGl0ZW0udGl0bGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSB0aGlzLnNlYXJjaFN0cjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuZGF0YVNvdXJjZUNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VhcmNoKHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMubmdNb2RlbC52YWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMubmdNb2RlbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmlsKHZhbHVlKSAmJiB0aGlzLl9kaXNwbGF5U3RyICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hTdHIgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWFyY2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGtleXVwSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfTEYgfHwgZXZlbnQua2V5Q29kZSA9PT0gS0VZX1JUIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9UQUIpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLRVlfVVAgfHwgZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VOKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9EVykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLnNlYXJjaCh0aGlzLnNlYXJjaFN0cik7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VTKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2VhcmNoVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIHBhc3RlSGFuZGxlcihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMga2V5ZG93bkhhbmRsZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDtcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEtFWV9FTikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmhhc0hpZ2hsaWdodGVkKCkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvU2VsZWN0T25FbnRlcikge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm5leHRSb3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IEtFWV9EVykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm5leHRSb3coKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfVVApIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5wcmV2Um93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX1RBQikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfQkspIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfRVMpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdmVyeSBzcGVjaWZpYyB0byBJRTEwLzExICMyNzJcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgSUUgY2xlYXJzIHRoZSBpbnB1dCB0ZXh0XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGtleUNvZGUgIT09IDAgJiYga2V5Q29kZSAhPT0gS0VZX1NIICYmIGtleUNvZGUgIT09IEtFWV9DTCAmJlxuICAgICAgICAgICAgICAgIChrZXlDb2RlIDw9IEtFWV9GMSB8fCBrZXlDb2RlID49IEtFWV9GMTIpICYmXG4gICAgICAgICAgICAgICAgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmFsdEtleVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQmx1cihldmVudDogYW55KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gY2FuY2VsIEJsdXIgZm9yIElFXG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc0NhbmNlbEJsdXIoKSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZm9jdXMgYmFja1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IHRpbWVyKDIwMCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kb0JsdXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycsIFtdKVxuICAgIHB1YmxpYyBvbmZvY3VzKCkge1xuICAgICAgICBpZiAodGhpcy5ibHVyVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYmx1clRpbWVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RPbkZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcGVuT25Gb2N1cykge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3Blbk9uQ2xpY2spIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaFN0cigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlYXJjaFN0cih0ZXJtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoU3RyID0gdGVybTtcbiAgICAgICAgdGhpcy5fZGlzcGxheVN0ciA9IHRlcm07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5oYXNIaWdobGlnaHRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hTdHIgPSAnJztcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLnNlbGVjdEN1cnJlbnQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJyaWRlU3VnZ2VzdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vblNlbGVjdGVkKHsgdGl0bGU6IHRoaXMuc2VhcmNoU3RyLCBvcmlnaW5hbE9iamVjdDogbnVsbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyVW5zZWxlY3RlZCAmJiAhdGhpcy5jb21wbGV0ZXIuaGFzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVTZWFyY2hWYWx1ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcGxheVN0ciAhPT0gdGhpcy5zZWFyY2hTdHIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5U3RyID0gdGhpcy5zZWFyY2hTdHI7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkb0JsdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmJsdXJUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuYmx1clRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm92ZXJyaWRlU3VnZ2VzdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vblNlbGVjdGVkKHsgdGl0bGU6IHRoaXMuc2VhcmNoU3RyLCBvcmlnaW5hbE9iamVjdDogbnVsbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyVW5zZWxlY3RlZCAmJiAhdGhpcy5jb21wbGV0ZXIuaGFzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VhcmNoU3RyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2VhcmNoVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XG4gICAgfVxufVxuIl19