@neocomplexx/ngx-neo-completer-mat
Version:
300 lines • 33.3 kB
JavaScript
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';
import * as i0 from "@angular/core";
import * as i1 from "./ctr-completer";
import * as i2 from "@angular/forms";
// 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;
// tslint:disable-next-line:directive-class-suffix
export 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.ɵfac = function CtrInput_Factory(t) { return new (t || CtrInput)(i0.ɵɵdirectiveInject(i1.CtrCompleter, 1), i0.ɵɵdirectiveInject(i2.NgModel), i0.ɵɵdirectiveInject(i0.ElementRef)); };
CtrInput.ɵdir = i0.ɵɵdefineDirective({ type: CtrInput, selectors: [["", "ctrInput", ""]], hostBindings: function CtrInput_HostBindings(rf, ctx) { if (rf & 1) {
i0.ɵɵlistener("keyup", function CtrInput_keyup_HostBindingHandler($event) { return ctx.keyupHandler($event); })("paste", function CtrInput_paste_HostBindingHandler($event) { return ctx.pasteHandler($event); })("keydown", function CtrInput_keydown_HostBindingHandler($event) { return ctx.keydownHandler($event); })("blur", function CtrInput_blur_HostBindingHandler($event) { return ctx.onBlur($event); })("focus", function CtrInput_focus_HostBindingHandler() { return ctx.onfocus(); })("click", function CtrInput_click_HostBindingHandler($event) { return ctx.onClick($event); });
} }, inputs: { clearSelected: "clearSelected", clearUnselected: "clearUnselected", overrideSuggested: "overrideSuggested", fillHighlighted: "fillHighlighted", openOnFocus: "openOnFocus", openOnClick: "openOnClick", selectOnClick: "selectOnClick", selectOnFocus: "selectOnFocus", autoSelectOnEnter: "autoSelectOnEnter" }, outputs: { ngModelChange: "ngModelChange" } });
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(CtrInput, [{
type: Directive,
args: [{
// tslint:disable-next-line:directive-selector
selector: '[ctrInput]',
}]
}], function () { return [{ type: i1.CtrCompleter, decorators: [{
type: Host
}] }, { type: i2.NgModel }, { type: i0.ElementRef }]; }, { clearSelected: [{
type: Input,
args: ['clearSelected']
}], clearUnselected: [{
type: Input,
args: ['clearUnselected']
}], overrideSuggested: [{
type: Input,
args: ['overrideSuggested']
}], fillHighlighted: [{
type: Input,
args: ['fillHighlighted']
}], openOnFocus: [{
type: Input,
args: ['openOnFocus']
}], openOnClick: [{
type: Input,
args: ['openOnClick']
}], selectOnClick: [{
type: Input,
args: ['selectOnClick']
}], selectOnFocus: [{
type: Input,
args: ['selectOnFocus']
}], autoSelectOnEnter: [{
type: Input,
args: ['autoSelectOnEnter']
}], ngModelChange: [{
type: Output
}], keyupHandler: [{
type: HostListener,
args: ['keyup', ['$event']]
}], pasteHandler: [{
type: HostListener,
args: ['paste', ['$event']]
}], keydownHandler: [{
type: HostListener,
args: ['keydown', ['$event']]
}], onBlur: [{
type: HostListener,
args: ['blur', ['$event']]
}], onfocus: [{
type: HostListener,
args: ['focus', []]
}], onClick: [{
type: HostListener,
args: ['click', ['$event']]
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3RyLWlucHV0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tY29tcGxldGVyLW1hdC8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2N0ci1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7QUFHbkMsa0JBQWtCO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDbkIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBTXBCLGtEQUFrRDtBQUNsRCxNQUFNLE9BQU8sUUFBUTtJQWtCakIsWUFB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LEtBQUs7bUJBQUMsbUJBQW1COztrQkFDekIsS0FBSzttQkFBQyxpQkFBaUI7O2tCQUN2QixLQUFLO21CQUFDLGFBQWE7O2tCQUNuQixLQUFLO21CQUFDLGFBQWE7O2tCQUNuQixLQUFLO21CQUFDLGVBQWU7O2tCQUNyQixLQUFLO21CQUFDLGVBQWU7O2tCQUNyQixLQUFLO21CQUFDLG1CQUFtQjs7a0JBRXpCLE1BQU07O2tCQStDTixZQUFZO21CQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0JBc0JoQyxZQUFZO21CQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0JBS2hDLFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOztrQkEwQ2xDLFlBQVk7bUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDOztrQkFtQi9CLFlBQVk7bUJBQUMsT0FBTyxFQUFFLEVBQUU7O2tCQWdCeEIsWUFBWTttQkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IHRpbWVyLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IENvbXBsZXRlckl0ZW0gfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBsZXRlci1pdGVtJztcclxuaW1wb3J0IHsgQ3RyQ29tcGxldGVyIH0gZnJvbSAnLi9jdHItY29tcGxldGVyJztcclxuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi9nbG9iYWxzJztcclxuXHJcblxyXG4vLyBrZXlib2FyZCBldmVudHNcclxuY29uc3QgS0VZX0RXID0gNDA7XHJcbmNvbnN0IEtFWV9SVCA9IDM5O1xyXG5jb25zdCBLRVlfVVAgPSAzODtcclxuY29uc3QgS0VZX0xGID0gMzc7XHJcbmNvbnN0IEtFWV9FUyA9IDI3O1xyXG5jb25zdCBLRVlfRU4gPSAxMztcclxuY29uc3QgS0VZX1RBQiA9IDk7XHJcbmNvbnN0IEtFWV9CSyA9IDg7XHJcbmNvbnN0IEtFWV9TSCA9IDE2O1xyXG5jb25zdCBLRVlfQ0wgPSAyMDtcclxuY29uc3QgS0VZX0YxID0gMTEyO1xyXG5jb25zdCBLRVlfRjEyID0gMTIzO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ1tjdHJJbnB1dF0nLFxyXG59KVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxyXG5leHBvcnQgY2xhc3MgQ3RySW5wdXQge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8taW5wdXQtcmVuYW1lXHJcbiAgICBASW5wdXQoJ2NsZWFyU2VsZWN0ZWQnKSBwdWJsaWMgY2xlYXJTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCdjbGVhclVuc2VsZWN0ZWQnKSBwdWJsaWMgY2xlYXJVbnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICBASW5wdXQoJ292ZXJyaWRlU3VnZ2VzdGVkJykgcHVibGljIG92ZXJyaWRlU3VnZ2VzdGVkID0gZmFsc2U7XHJcbiAgICBASW5wdXQoJ2ZpbGxIaWdobGlnaHRlZCcpIHB1YmxpYyBmaWxsSGlnaGxpZ2h0ZWQgPSB0cnVlO1xyXG4gICAgQElucHV0KCdvcGVuT25Gb2N1cycpIHB1YmxpYyBvcGVuT25Gb2N1cyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCdvcGVuT25DbGljaycpIHB1YmxpYyBvcGVuT25DbGljayA9IGZhbHNlO1xyXG4gICAgQElucHV0KCdzZWxlY3RPbkNsaWNrJykgcHVibGljIHNlbGVjdE9uQ2xpY2sgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgnc2VsZWN0T25Gb2N1cycpIHB1YmxpYyBzZWxlY3RPbkZvY3VzID0gZmFsc2U7XHJcbiAgICBASW5wdXQoJ2F1dG9TZWxlY3RPbkVudGVyJykgcHVibGljIGF1dG9TZWxlY3RPbkVudGVyID0gdHJ1ZTtcclxuXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG5nTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIHByaXZhdGUgX3NlYXJjaFN0ciA9ICcnO1xyXG4gICAgcHJpdmF0ZSBfZGlzcGxheVN0ciA9ICcnO1xyXG4gICAgcHJpdmF0ZSBibHVyVGltZXI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBIb3N0KCkgcHJpdmF0ZSBjb21wbGV0ZXI6IEN0ckNvbXBsZXRlciwgcHJpdmF0ZSBuZ01vZGVsOiBOZ01vZGVsLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VsZWN0ZWQuc3Vic2NyaWJlKChpdGVtOiBDb21wbGV0ZXJJdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gJyc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IGl0ZW0udGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbXBsZXRlci5oaWdobGlnaHRlZC5zdWJzY3JpYmUoKGl0ZW06IENvbXBsZXRlckl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSBpdGVtLnRpdGxlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdNb2RlbENoYW5nZS5lbWl0KGl0ZW0udGl0bGUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5U3RyID0gdGhpcy5zZWFyY2hTdHI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29tcGxldGVyLmRhdGFTb3VyY2VDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuc2VhcmNoKHRoaXMuc2VhcmNoU3RyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmdNb2RlbC52YWx1ZUNoYW5nZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5uZ01vZGVsLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05pbCh2YWx1ZSkgJiYgdGhpcy5fZGlzcGxheVN0ciAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hTdHIgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLnNlYXJjaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMga2V5dXBIYW5kbGVyKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0xGIHx8IGV2ZW50LmtleUNvZGUgPT09IEtFWV9SVCB8fCBldmVudC5rZXlDb2RlID09PSBLRVlfVEFCKSB7XHJcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9VUCB8fCBldmVudC5rZXlDb2RlID09PSBLRVlfRU4pIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtFWV9EVykge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWFyY2godGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS0VZX0VTKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVNlYXJjaFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBwYXN0ZUhhbmRsZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBrZXlkb3duSGFuZGxlcihldmVudDogYW55KSB7XHJcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2g7XHJcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEtFWV9FTikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0ZXIuaGFzSGlnaGxpZ2h0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9TZWxlY3RPbkVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIubmV4dFJvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfRFcpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5uZXh0Um93KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBLRVlfVVApIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIucHJldlJvdygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX1RBQikge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gS0VZX0JLKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IEtFWV9FUykge1xyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gSUUxMC8xMSAjMjcyXHJcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgSUUgY2xlYXJzIHRoZSBpbnB1dCB0ZXh0XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGtleUNvZGUgIT09IDAgJiYga2V5Q29kZSAhPT0gS0VZX1NIICYmIGtleUNvZGUgIT09IEtFWV9DTCAmJlxyXG4gICAgICAgICAgICAgICAgKGtleUNvZGUgPD0gS0VZX0YxIHx8IGtleUNvZGUgPj0gS0VZX0YxMikgJiZcclxuICAgICAgICAgICAgICAgICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNhbmNlbCBCbHVyIGZvciBJRVxyXG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc0NhbmNlbEJsdXIoKSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZm9jdXMgYmFja1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29tcGxldGVyLmlzT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IHRpbWVyKDIwMCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kb0JsdXIoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJywgW10pXHJcbiAgICBwdWJsaWMgb25mb2N1cygpIHtcclxuICAgICAgICBpZiAodGhpcy5ibHVyVGltZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T25Gb2N1cykge1xyXG4gICAgICAgICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcGVuT25Gb2N1cykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RPbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wZW5PbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5pc09wZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzZWFyY2hTdHIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFN0cjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNlYXJjaFN0cih0ZXJtOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hTdHIgPSB0ZXJtO1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlTdHIgPSB0ZXJtO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlci5oYXNIaWdobGlnaHRlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFN0ciA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWxlY3RDdXJyZW50KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm92ZXJyaWRlU3VnZ2VzdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVyLm9uU2VsZWN0ZWQoeyB0aXRsZTogdGhpcy5zZWFyY2hTdHIsIG9yaWdpbmFsT2JqZWN0OiBudWxsIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyVW5zZWxlY3RlZCAmJiAhdGhpcy5jb21wbGV0ZXIuaGFzU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UuZW1pdCh0aGlzLnNlYXJjaFN0cik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZXIuY2xlYXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXN0b3JlU2VhcmNoVmFsdWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbEhpZ2hsaWdodGVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwbGF5U3RyICE9PSB0aGlzLnNlYXJjaFN0cikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheVN0ciA9IHRoaXMuc2VhcmNoU3RyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZG9CbHVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJsdXJUaW1lcikge1xyXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vdmVycmlkZVN1Z2dlc3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlci5vblNlbGVjdGVkKHsgdGl0bGU6IHRoaXMuc2VhcmNoU3RyLCBvcmlnaW5hbE9iamVjdDogbnVsbCB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhclVuc2VsZWN0ZWQgJiYgIXRoaXMuY29tcGxldGVyLmhhc1NlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hTdHIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2VhcmNoVmFsdWUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuY2xlYXIoKTtcclxuICAgIH1cclxufVxyXG4iXX0=