UNPKG

@neocomplexx/ngx-neo-completer-mat

Version:
221 lines 30.6 kB
import { ChangeDetectorRef, Directive, Host, Input, TemplateRef, ViewContainerRef } from '@angular/core'; import { timer } from 'rxjs'; import { catchError, take } from 'rxjs/operators'; import { CtrCompleter } from './ctr-completer'; import { MIN_SEARCH_LENGTH, PAUSE, CLEAR_TIMEOUT, isNil } from '../globals'; import * as i0 from "@angular/core"; import * as i1 from "./ctr-completer"; export class CtrListContext { constructor(results, searching, searchInitialized, isOpen) { this.results = results; this.searching = searching; this.searchInitialized = searchInitialized; this.isOpen = isOpen; } } // tslint:disable:no-non-null-assertion // tslint:disable-next-line:directive-class-suffix export class CtrList { constructor(completer, templateRef, viewContainer, cd) { this.completer = completer; this.templateRef = templateRef; this.viewContainer = viewContainer; this.cd = cd; this.ctrListMinSearchLength = MIN_SEARCH_LENGTH; this.ctrListPause = PAUSE; this.ctrListAutoMatch = false; this.ctrListAutoHighlight = false; this.ctrListDisplaySearching = true; // private results: CompleterItem[] = []; this.term = null; // private searching = false; this.searchTimer = null; this.clearTimer = null; this.ctx = new CtrListContext([], false, false, false); this._initialValue = null; this.viewRef = null; } ngOnInit() { this.completer.registerList(this); this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, new CtrListContext([], false, false, false)); } set dataService(newService) { this._dataService = newService; this.dataServiceSubscribe(); } set initialValue(value) { if (this._dataService && typeof this._dataService.convertToItem === 'function') { setTimeout(() => { if (value) { const initialItem = this._dataService.convertToItem(value); if (initialItem) { this.completer.onSelected(initialItem, false); } } }); } else if (!this._dataService) { this._initialValue = value; } } search(term) { if (!isNil(term) && term.length >= this.ctrListMinSearchLength && this.term !== term) { if (this.searchTimer) { this.searchTimer.unsubscribe(); this.searchTimer = null; } if (!this.ctx.searching) { if (this.ctrListDisplaySearching) { this.ctx.results = []; } this.ctx.searching = true; this.ctx.searchInitialized = true; this.refreshTemplate(); } if (this.clearTimer) { this.clearTimer.unsubscribe(); } this.searchTimer = timer(this.ctrListPause).pipe(take(1)).subscribe(() => { this.searchTimerComplete(term); }); } else if (!isNil(term) && term.length < this.ctrListMinSearchLength) { this.clear(); this.term = ''; } } clear() { if (this.searchTimer) { this.searchTimer.unsubscribe(); } this.clearTimer = timer(CLEAR_TIMEOUT).pipe(take(1)).subscribe(() => { this._clear(); }); } open() { if (!this.ctx.searchInitialized) { this.search(''); } this.refreshTemplate(); } isOpen(open) { this.ctx.isOpen = open; } _clear() { if (this.searchTimer) { this.searchTimer.unsubscribe(); this.searchTimer = null; } if (this.dataService) { this.dataService.cancel(); } this.viewContainer.clear(); this.viewRef = null; } searchTimerComplete(term) { // Begin the search if (isNil(term) || term.length < this.ctrListMinSearchLength) { this.ctx.searching = false; return; } this.term = term; this._dataService.search(term); } refreshTemplate() { // create the template if it doesn't exist if (!this.viewRef) { this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, this.ctx); } else if (!this.viewRef.destroyed) { // refresh the template this.viewRef.context.isOpen = this.ctx.isOpen; this.viewRef.context.results = this.ctx.results; this.viewRef.context.searching = this.ctx.searching; this.viewRef.context.searchInitialized = this.ctx.searchInitialized; this.viewRef.detectChanges(); } this.cd.markForCheck(); } getBestMatchIndex() { if (!this.ctx.results || !this.term) { return null; } // First try to find the exact term let bestMatch = this.ctx.results.findIndex(item => item.title.toLowerCase() === this.term.toLocaleLowerCase()); // If not try to find the first item that starts with the term if (bestMatch < 0) { bestMatch = this.ctx.results.findIndex(item => item.title.toLowerCase().startsWith(this.term.toLocaleLowerCase())); } // If not try to find the first item that includes the term if (bestMatch < 0) { bestMatch = this.ctx.results.findIndex(item => item.title.toLowerCase().includes(this.term.toLocaleLowerCase())); } return bestMatch < 0 ? null : bestMatch; } dataServiceSubscribe() { if (this._dataService) { this._dataService.pipe(catchError(err => { console.error(err); console.error('Unexpected error in dataService: errors should be handled by the dataService Observable'); return []; })) .subscribe(results => { this.ctx.searchInitialized = true; this.ctx.searching = false; this.ctx.results = results; if (this.ctrListAutoMatch && results && results.length === 1 && results[0].title && !isNil(this.term) && results[0].title.toLocaleLowerCase() === this.term.toLocaleLowerCase()) { // Do automatch this.completer.onSelected(results[0]); return; } if (this._initialValue) { this.initialValue = this._initialValue; this._initialValue = null; } this.refreshTemplate(); if (this.ctrListAutoHighlight) { this.completer.autoHighlightIndex = this.getBestMatchIndex(); } }); if (this._dataService.dataSourceChange) { this._dataService.dataSourceChange.subscribe(() => { this.term = null; this.ctx.searchInitialized = false; this.ctx.searching = false; this.ctx.results = []; this.refreshTemplate(); this.completer.onDataSourceChange(); }); } } } } CtrList.ɵfac = function CtrList_Factory(t) { return new (t || CtrList)(i0.ɵɵdirectiveInject(i1.CtrCompleter, 1), i0.ɵɵdirectiveInject(i0.TemplateRef), i0.ɵɵdirectiveInject(i0.ViewContainerRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; CtrList.ɵdir = i0.ɵɵdefineDirective({ type: CtrList, selectors: [["", "ctrList", ""]], inputs: { ctrListMinSearchLength: "ctrListMinSearchLength", ctrListPause: "ctrListPause", ctrListAutoMatch: "ctrListAutoMatch", ctrListAutoHighlight: "ctrListAutoHighlight", ctrListDisplaySearching: "ctrListDisplaySearching", dataService: ["ctrList", "dataService"], initialValue: ["ctrListInitialValue", "initialValue"] } }); /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(CtrList, [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[ctrList]', }] }], function () { return [{ type: i1.CtrCompleter, decorators: [{ type: Host }] }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, { ctrListMinSearchLength: [{ type: Input }], ctrListPause: [{ type: Input }], ctrListAutoMatch: [{ type: Input }], ctrListAutoHighlight: [{ type: Input }], ctrListDisplaySearching: [{ type: Input }], dataService: [{ type: Input, args: ['ctrList'] }], initialValue: [{ type: Input, args: ['ctrListInitialValue'] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWxpc3QuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1jb21wbGV0ZXItbWF0LyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvY3RyLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUU1RSxNQUFNLE9BQU8sY0FBYztJQUN2QixZQUNXLE9BQStCLEVBQy9CLFNBQWtCLEVBQ2xCLGlCQUEwQixFQUMxQixNQUFlO1FBSGYsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUNsQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUztJQUN0QixDQUFDO0NBQ1I7QUFNRCx1Q0FBdUM7QUFDdkMsa0RBQWtEO0FBQ2xELE1BQU0sT0FBTyxPQUFPO0lBaUJoQixZQUNvQixTQUF1QixFQUMvQixXQUF3QyxFQUN4QyxhQUErQixFQUMvQixFQUFxQjtRQUhiLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQTZCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXBCakIsMkJBQXNCLEdBQUcsaUJBQWlCLENBQUM7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ZSxFQUFFLENBQUM7Z0JBRXZCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUNoRTtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRVAsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2dCQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO29CQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztvQkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7SUFDTCxDQUFDOzs4REEzTVEsT0FBTzs0Q0FBUCxPQUFPO2tEQUFQLE9BQU87Y0FObkIsU0FBUztlQUFDO2dCQUNQLDhDQUE4QztnQkFDOUMsUUFBUSxFQUFFLFdBQVc7YUFDeEI7O3NCQXFCUSxJQUFJOztrQkFqQlIsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBQ0wsS0FBSzs7a0JBMEJMLEtBQUs7bUJBQUMsU0FBUzs7a0JBTWYsS0FBSzttQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBIb3N0LCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHR5cGUgeyBFbWJlZGRlZFZpZXdSZWYsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDdHJDb21wbGV0ZXIgfSBmcm9tICcuL2N0ci1jb21wbGV0ZXInO1xyXG5pbXBvcnQgdHlwZSB7IENvbXBsZXRlckxpc3QgfSBmcm9tICcuL2N0ci1jb21wbGV0ZXInO1xyXG5pbXBvcnQgeyBDb21wbGV0ZXJEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY29tcGxldGVyLWRhdGEnO1xyXG5pbXBvcnQgeyBDb21wbGV0ZXJJdGVtIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wbGV0ZXItaXRlbSc7XHJcbmltcG9ydCB7IE1JTl9TRUFSQ0hfTEVOR1RILCBQQVVTRSwgQ0xFQVJfVElNRU9VVCwgaXNOaWwgfSBmcm9tICcuLi9nbG9iYWxzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDdHJMaXN0Q29udGV4dCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgcmVzdWx0czogQ29tcGxldGVySXRlbVtdIHwgbnVsbCxcclxuICAgICAgICBwdWJsaWMgc2VhcmNoaW5nOiBib29sZWFuLFxyXG4gICAgICAgIHB1YmxpYyBzZWFyY2hJbml0aWFsaXplZDogYm9vbGVhbixcclxuICAgICAgICBwdWJsaWMgaXNPcGVuOiBib29sZWFuXHJcbiAgICApIHsgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICAgIHNlbGVjdG9yOiAnW2N0ckxpc3RdJyxcclxufSlcclxuLy8gdHNsaW50OmRpc2FibGU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XHJcbmV4cG9ydCBjbGFzcyBDdHJMaXN0IGltcGxlbWVudHMgT25Jbml0LCBDb21wbGV0ZXJMaXN0IHtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdHJMaXN0TWluU2VhcmNoTGVuZ3RoID0gTUlOX1NFQVJDSF9MRU5HVEg7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdFBhdXNlID0gUEFVU0U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdEF1dG9NYXRjaCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGN0ckxpc3RBdXRvSGlnaGxpZ2h0ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3RyTGlzdERpc3BsYXlTZWFyY2hpbmcgPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX2RhdGFTZXJ2aWNlOiBDb21wbGV0ZXJEYXRhO1xyXG4gICAgLy8gcHJpdmF0ZSByZXN1bHRzOiBDb21wbGV0ZXJJdGVtW10gPSBbXTtcclxuICAgIHByaXZhdGUgdGVybTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvLyBwcml2YXRlIHNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lcjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIGNsZWFyVGltZXI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjdHggPSBuZXcgQ3RyTGlzdENvbnRleHQoW10sIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8Q3RyTGlzdENvbnRleHQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEhvc3QoKSBwcml2YXRlIGNvbXBsZXRlcjogQ3RyQ29tcGxldGVyLFxyXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPEN0ckxpc3RDb250ZXh0PixcclxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmNvbXBsZXRlci5yZWdpc3Rlckxpc3QodGhpcyk7XHJcbiAgICAgICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhcclxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVJlZixcclxuICAgICAgICAgICAgbmV3IEN0ckxpc3RDb250ZXh0KFtdLCBmYWxzZSwgZmFsc2UsIGZhbHNlKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCdjdHJMaXN0JylcclxuICAgIHB1YmxpYyBzZXQgZGF0YVNlcnZpY2UobmV3U2VydmljZTogQ29tcGxldGVyRGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2RhdGFTZXJ2aWNlID0gbmV3U2VydmljZTtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlU3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCdjdHJMaXN0SW5pdGlhbFZhbHVlJylcclxuICAgIHB1YmxpYyBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGF0YVNlcnZpY2UgJiYgdHlwZW9mIHRoaXMuX2RhdGFTZXJ2aWNlLmNvbnZlcnRUb0l0ZW0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IHRoaXMuX2RhdGFTZXJ2aWNlLmNvbnZlcnRUb0l0ZW0hKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZChpbml0aWFsSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZWFyY2godGVybTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFpc05pbCh0ZXJtKSAmJiB0ZXJtLmxlbmd0aCA+PSB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGggJiYgdGhpcy50ZXJtICE9PSB0ZXJtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY3R4LnNlYXJjaGluZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3RyTGlzdERpc3BsYXlTZWFyY2hpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5yZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVGVtcGxhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclRpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gdGltZXIodGhpcy5jdHJMaXN0UGF1c2UpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXJDb21wbGV0ZSh0ZXJtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwodGVybSkgJiYgdGVybS5sZW5ndGggPCB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnRlcm0gPSAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGVhclRpbWVyID0gdGltZXIoQ0xFQVJfVElNRU9VVCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGVhcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVuKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2goJycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc09wZW4ob3BlbjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuY3R4LmlzT3BlbiA9IG9wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2xlYXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUaW1lci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5jYW5jZWwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMudmlld1JlZiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lckNvbXBsZXRlKHRlcm06IHN0cmluZykge1xyXG4gICAgICAgIC8vIEJlZ2luIHRoZSBzZWFyY2hcclxuICAgICAgICBpZiAoaXNOaWwodGVybSkgfHwgdGVybS5sZW5ndGggPCB0aGlzLmN0ckxpc3RNaW5TZWFyY2hMZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcclxuICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5zZWFyY2godGVybSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWZyZXNoVGVtcGxhdGUoKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0XHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhcclxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVSZWYsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmlld1JlZi5kZXN0cm95ZWQpIHtcclxuICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgdGVtcGxhdGVcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LmlzT3BlbiA9IHRoaXMuY3R4LmlzT3BlbjtcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmIS5jb250ZXh0LnJlc3VsdHMgPSB0aGlzLmN0eC5yZXN1bHRzO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQuc2VhcmNoaW5nID0gdGhpcy5jdHguc2VhcmNoaW5nO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdSZWYhLmNvbnRleHQuc2VhcmNoSW5pdGlhbGl6ZWQgPSB0aGlzLmN0eC5zZWFyY2hJbml0aWFsaXplZDtcclxuICAgICAgICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJlc3RNYXRjaEluZGV4KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jdHgucmVzdWx0cyB8fCAhdGhpcy50ZXJtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIGV4YWN0IHRlcm1cclxuICAgICAgICBsZXQgYmVzdE1hdGNoID0gdGhpcy5jdHgucmVzdWx0cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLnRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgLy8gSWYgbm90IHRyeSB0byBmaW5kIHRoZSBmaXJzdCBpdGVtIHRoYXQgc3RhcnRzIHdpdGggdGhlIHRlcm1cclxuICAgICAgICBpZiAoYmVzdE1hdGNoIDwgMCkge1xyXG4gICAgICAgICAgICBiZXN0TWF0Y2ggPSB0aGlzLmN0eC5yZXN1bHRzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0udGl0bGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBub3QgdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBpbmNsdWRlcyB0aGUgdGVybVxyXG4gICAgICAgIGlmIChiZXN0TWF0Y2ggPCAwKSB7XHJcbiAgICAgICAgICAgIGJlc3RNYXRjaCA9IHRoaXMuY3R4LnJlc3VsdHMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS50aXRsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJlc3RNYXRjaCA8IDAgPyBudWxsIDogYmVzdE1hdGNoO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2VTdWJzY3JpYmUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFTZXJ2aWNlLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gZGF0YVNlcnZpY2U6IGVycm9ycyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgZGF0YVNlcnZpY2UgT2JzZXJ2YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHguc2VhcmNoSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnJlc3VsdHMgPSByZXN1bHRzO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdHJMaXN0QXV0b01hdGNoICYmIHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPT09IDEgJiYgcmVzdWx0c1swXS50aXRsZSAmJiAhaXNOaWwodGhpcy50ZXJtKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWzBdLnRpdGxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IHRoaXMudGVybSEudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBhdXRvbWF0Y2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub25TZWxlY3RlZChyZXN1bHRzWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuX2luaXRpYWxWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRlbXBsYXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN0ckxpc3RBdXRvSGlnaGxpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLmF1dG9IaWdobGlnaHRJbmRleCA9IHRoaXMuZ2V0QmVzdE1hdGNoSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhU2VydmljZS5kYXRhU291cmNlQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhU2VydmljZS5kYXRhU291cmNlQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXJtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0eC5zZWFyY2hJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3R4LnJlc3VsdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUZW1wbGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==