UNPKG

@neocomplexx/ngx-neo-completer

Version:

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

388 lines (387 loc) 36.9 kB
'use strict'; import { __decorate, __metadata } from "tslib"; import { ChangeDetectorRef, Component, Input, Output, EventEmitter, ViewChild, forwardRef, ElementRef } from '@angular/core'; import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms'; import { CtrCompleter } from '../directives/ctr-completer'; import { CompleterService } from '../services/completer-service'; import { MAX_CHARS, MIN_SEARCH_LENGTH, PAUSE, TEXT_SEARCHING, TEXT_NO_RESULTS } from '../globals'; const noop = () => { }; const ɵ0 = noop; const COMPLETER_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CompleterCmp), multi: true }; let CompleterCmp = // tslint:disable-next-line:component-class-suffix class CompleterCmp { constructor(completerService, cdr) { this.completerService = completerService; this.cdr = cdr; this.inputName = ''; this.inputId = ''; this.pause = PAUSE; this.minSearchLength = MIN_SEARCH_LENGTH; this.maxChars = MAX_CHARS; this.overrideSuggested = false; this.clearSelected = false; this.clearUnselected = false; this.fillHighlighted = true; this.placeholder = ''; this.autoMatch = false; this.disableInput = false; this.autofocus = false; this.openOnFocus = false; this.openOnClick = false; this.selectOnClick = false; this.autoHighlight = false; this.autoSelectOnEnter = true; this.selected = new EventEmitter(); this.highlighted = new EventEmitter(); // tslint:disable:no-output-rename this.blurEvent = new EventEmitter(); this.click = new EventEmitter(); this.focusEvent = new EventEmitter(); this.opened = new EventEmitter(); this.keyup = new EventEmitter(); this.keydown = new EventEmitter(); this.searchStr = ''; this.control = new FormControl(''); this.displaySearching = true; this.displayNoResults = true; this._textNoResults = TEXT_NO_RESULTS; this._textSearching = TEXT_SEARCHING; this._onTouchedCallback = noop; this._onChangeCallback = noop; this._focus = false; this._open = false; } get value() { return this.searchStr; } set value(v) { if (v !== this.searchStr) { this.searchStr = v; } // Propagate the change in any case this._onChangeCallback(v); } ngAfterViewInit() { if (this.autofocus) { this._focus = true; } } ngAfterViewChecked() { if (this._focus) { setTimeout(() => { this.ctrInput.nativeElement.focus(); this._focus = false; }, 0); } } onTouched() { this._onTouchedCallback(); } writeValue(value) { this.searchStr = value; } registerOnChange(fn) { this._onChangeCallback = fn; } registerOnTouched(fn) { this._onTouchedCallback = fn; } setDisabledState(isDisabled) { this.disableInput = isDisabled; } set datasource(source) { if (source) { if (source instanceof Array) { this.dataService = this.completerService.local(source); } else if (typeof (source) === 'string') { this.dataService = this.completerService.remote(source); } else { this.dataService = source; } } } set textNoResults(text) { if (this._textNoResults !== text) { this._textNoResults = text; this.displayNoResults = !!this._textNoResults && this._textNoResults !== 'false'; } } set textSearching(text) { if (this._textSearching !== text) { this._textSearching = text; this.displaySearching = !!this._textSearching && this._textSearching !== 'false'; } } ngOnInit() { this.completer.selected.subscribe((item) => { this.selected.emit(item); }); this.completer.highlighted.subscribe((item) => { this.highlighted.emit(item); }); this.completer.opened.subscribe((isOpen) => { this._open = isOpen; this.opened.emit(isOpen); }); } onBlur() { this.blurEvent.emit(); this.onTouched(); this.cdr.detectChanges(); } onFocus() { this.focusEvent.emit(); this.onTouched(); } onClick(event) { this.click.emit(event); this.onTouched(); } onKeyup(event) { this.keyup.emit(event); } onKeydown(event) { this.keydown.emit(event); } onChange(value) { this.value = value; } open() { this.completer.open(); } close() { this.completer.clear(); } focus() { if (this.ctrInput) { this.ctrInput.nativeElement.focus(); } else { this._focus = true; } } blur() { if (this.ctrInput) { this.ctrInput.nativeElement.blur(); } else { this._focus = false; } } isOpen() { return this._open; } }; CompleterCmp.ctorParameters = () => [ { type: CompleterService }, { type: ChangeDetectorRef } ]; __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "dataService", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "inputName", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "inputId", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "pause", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "minSearchLength", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "maxChars", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "overrideSuggested", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "clearSelected", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "clearUnselected", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "fillHighlighted", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "placeholder", void 0); __decorate([ Input(), __metadata("design:type", String) ], CompleterCmp.prototype, "matchClass", void 0); __decorate([ Input(), __metadata("design:type", Number) ], CompleterCmp.prototype, "fieldTabindex", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "autoMatch", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "disableInput", void 0); __decorate([ Input(), __metadata("design:type", String) ], CompleterCmp.prototype, "inputClass", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "autofocus", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "openOnFocus", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "openOnClick", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "selectOnClick", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "initialValue", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "autoHighlight", void 0); __decorate([ Input(), __metadata("design:type", Object) ], CompleterCmp.prototype, "autoSelectOnEnter", void 0); __decorate([ Output(), __metadata("design:type", Object) ], CompleterCmp.prototype, "selected", void 0); __decorate([ Output(), __metadata("design:type", Object) ], CompleterCmp.prototype, "highlighted", void 0); __decorate([ Output('blur'), __metadata("design:type", Object) ], CompleterCmp.prototype, "blurEvent", void 0); __decorate([ Output(), __metadata("design:type", Object) ], CompleterCmp.prototype, "click", void 0); __decorate([ Output('focus'), __metadata("design:type", Object) ], CompleterCmp.prototype, "focusEvent", void 0); __decorate([ Output(), __metadata("design:type", Object) ], CompleterCmp.prototype, "opened", void 0); __decorate([ Output(), __metadata("design:type", EventEmitter) ], CompleterCmp.prototype, "keyup", void 0); __decorate([ Output(), __metadata("design:type", EventEmitter) ], CompleterCmp.prototype, "keydown", void 0); __decorate([ ViewChild(CtrCompleter, { static: true }), __metadata("design:type", CtrCompleter) ], CompleterCmp.prototype, "completer", void 0); __decorate([ ViewChild('ctrInput', { static: true }), __metadata("design:type", ElementRef) ], CompleterCmp.prototype, "ctrInput", void 0); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], CompleterCmp.prototype, "datasource", null); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], CompleterCmp.prototype, "textNoResults", null); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], CompleterCmp.prototype, "textSearching", null); CompleterCmp = __decorate([ Component({ // tslint:disable:max-line-length selector: 'neo-completer', template: ` <div class="completer-holder" ctrCompleter> <input #ctrInput [attr.id]="inputId.length > 0 ? inputId : null" type="search" class="completer-input" ctrInput [ngClass]="inputClass" [(ngModel)]="searchStr" (ngModelChange)="onChange($event)" [attr.name]="inputName" [placeholder]="placeholder" [attr.maxlength]="maxChars" [tabindex]="fieldTabindex" [disabled]="disableInput" [clearSelected]="clearSelected" [clearUnselected]="clearUnselected" [overrideSuggested]="overrideSuggested" [openOnFocus]="openOnFocus" [fillHighlighted]="fillHighlighted" [openOnClick]="openOnClick" [selectOnClick]="selectOnClick" [autoSelectOnEnter]="autoSelectOnEnter" (blur)="onBlur()" (focus)="onFocus()" (keyup)="onKeyup($event)" (keydown)="onKeydown($event)" (click)="onClick($event)" autocomplete="off" autocorrect="off" autocapitalize="off" /> <div class="completer-dropdown-holder" *ctrList="dataService; minSearchLength: minSearchLength; pause: pause; autoMatch: autoMatch; initialValue: initialValue; autoHighlight: autoHighlight; displaySearching: displaySearching; let items = results; let searchActive = searching; let isInitialized = searchInitialized; let isOpen = isOpen;"> <div class="completer-dropdown" ctrDropdown *ngIf="isInitialized && isOpen && (( items?.length > 0|| (displayNoResults && !searchActive)) || (searchActive && displaySearching))"> <div *ngIf="searchActive && displaySearching" class="completer-searching">{{_textSearching}}</div> <div *ngIf="!searchActive && (!items || items?.length === 0)" class="completer-no-results">{{_textNoResults}}</div> <div class="completer-row-wrapper" *ngFor="let item of items; let rowIndex=index"> <div class="completer-row" [ctrRow]="rowIndex" [dataItem]="item"> <div *ngIf="item.image || item.image === ''" class="completer-image-holder"> <img *ngIf="item.image != ''" src="{{item.image}}" class="completer-image" /> <div *ngIf="item.image === ''" class="completer-image-default"></div> </div> <div class="completer-item-text" [ngClass]="{'completer-item-text-image': item.image || item.image === '' }"> <completer-list-item class="completer-title" [text]="item.title" [matchClass]="matchClass" [searchStr]="searchStr" [type]="'title'"></completer-list-item> <completer-list-item *ngIf="item.description && item.description != ''" class="completer-description" [text]="item.description" [matchClass]="matchClass" [searchStr]="searchStr" [type]="'description'"> </completer-list-item> </div> </div> </div> </div> </div> </div> `, providers: [COMPLETER_CONTROL_VALUE_ACCESSOR], styles: [".completer-dropdown{border-radius:0;width:calc(100% - 30px);cursor:pointer;z-index:9999;position:absolute;background-color:#fff;max-height:200px;height:200px;overflow-y:auto;overflow-x:hidden;border:1px solid #ececec}.completer-row{color:#000;width:100%;padding:5px 12px}.completer-selected-row{background-color:#add8e6;color:#fff}.completer-description{font-size:14px}.completer-image-default{width:16px;height:16px;background-image:url(demo/res/img/default.png)}.completer-image-holder{float:left;width:10%}.completer-item-text-image{float:right;width:90%}"] }) // tslint:disable-next-line:component-class-suffix , __metadata("design:paramtypes", [CompleterService, ChangeDetectorRef]) ], CompleterCmp); export { CompleterCmp }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGVyLWNtcC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWNvbXBsZXRlci8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NvbXBsZXRlci1jbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUNiLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0gsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0FBRXZCLE1BQU0sZ0NBQWdDLEdBQUc7SUFDckMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQztJQUMzQyxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFzREYsSUFBYSxZQUFZO0FBRHpCLGtEQUFrRDtBQUNsRCxNQUFhLFlBQVk7SUFrRHJCLFlBQW9CLGdCQUFrQyxFQUFVLEdBQXNCO1FBQWxFLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWhEdEUsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixVQUFLLEdBQUcsS0FBSyxDQUFD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aUNBQWlDO1FBQ2pDLFFBQVEsRUFBRSxlQUFlO1FBQ3pCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTJDVDtRQUVELFNBQVMsRUFBRSxDQUFDLGdDQUFnQyxDQUFDOztLQUNoRCxDQUFDO0lBQ0Ysa0RBQWtEOztxQ0FtRFIsZ0JBQWdCLEVBQWUsaUJBQWlCO0dBbEQ3RSxZQUFZLENBcU14QjtTQXJNWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDdHJDb21wbGV0ZXIgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2N0ci1jb21wbGV0ZXInO1xuaW1wb3J0IHsgQ29tcGxldGVyRGF0YSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbXBsZXRlci1kYXRhJztcbmltcG9ydCB7IENvbXBsZXRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb21wbGV0ZXItc2VydmljZSc7XG5pbXBvcnQgeyBDb21wbGV0ZXJJdGVtIH0gZnJvbSAnLi9jb21wbGV0ZXItaXRlbSc7XG5pbXBvcnQgeyBNQVhfQ0hBUlMsIE1JTl9TRUFSQ0hfTEVOR1RILCBQQVVTRSwgVEVYVF9TRUFSQ0hJTkcsIFRFWFRfTk9fUkVTVUxUUyB9IGZyb20gJy4uL2dsb2JhbHMnO1xuXG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuXG5jb25zdCBDT01QTEVURVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21wbGV0ZXJDbXApLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5cbkBDb21wb25lbnQoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aFxuICAgIHNlbGVjdG9yOiAnbmVvLWNvbXBsZXRlcicsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1ob2xkZXJcIiBjdHJDb21wbGV0ZXI+XG4gICAgICAgICAgICA8aW5wdXQgI2N0cklucHV0IFthdHRyLmlkXT1cImlucHV0SWQubGVuZ3RoID4gMCA/IGlucHV0SWQgOiBudWxsXCIgdHlwZT1cInNlYXJjaFwiIGNsYXNzPVwiY29tcGxldGVyLWlucHV0XCIgY3RySW5wdXQgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hTdHJcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCIgW2F0dHIubmFtZV09XCJpbnB1dE5hbWVcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJtYXhDaGFyc1wiIFt0YWJpbmRleF09XCJmaWVsZFRhYmluZGV4XCIgW2Rpc2FibGVkXT1cImRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgICAgICAgW2NsZWFyU2VsZWN0ZWRdPVwiY2xlYXJTZWxlY3RlZFwiIFtjbGVhclVuc2VsZWN0ZWRdPVwiY2xlYXJVbnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbb3ZlcnJpZGVTdWdnZXN0ZWRdPVwib3ZlcnJpZGVTdWdnZXN0ZWRcIiBbb3Blbk9uRm9jdXNdPVwib3Blbk9uRm9jdXNcIiBbZmlsbEhpZ2hsaWdodGVkXT1cImZpbGxIaWdobGlnaHRlZFwiXG4gICAgICAgICAgICAgICAgW29wZW5PbkNsaWNrXT1cIm9wZW5PbkNsaWNrXCIgW3NlbGVjdE9uQ2xpY2tdPVwic2VsZWN0T25DbGlja1wiIFthdXRvU2VsZWN0T25FbnRlcl09XCJhdXRvU2VsZWN0T25FbnRlclwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIiAoZm9jdXMpPVwib25Gb2N1cygpXCIgKGtleXVwKT1cIm9uS2V5dXAoJGV2ZW50KVwiIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIC8+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItZHJvcGRvd24taG9sZGVyXCJcbiAgICAgICAgICAgICAgICAqY3RyTGlzdD1cImRhdGFTZXJ2aWNlO1xuICAgICAgICAgICAgICAgICAgICBtaW5TZWFyY2hMZW5ndGg6IG1pblNlYXJjaExlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcGF1c2U6IHBhdXNlO1xuICAgICAgICAgICAgICAgICAgICBhdXRvTWF0Y2g6IGF1dG9NYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9IaWdobGlnaHQ6IGF1dG9IaWdobGlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTZWFyY2hpbmc6IGRpc3BsYXlTZWFyY2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hBY3RpdmUgPSBzZWFyY2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc0luaXRpYWxpemVkID0gc2VhcmNoSW5pdGlhbGl6ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc09wZW4gPSBpc09wZW47XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1kcm9wZG93blwiIGN0ckRyb3Bkb3duICpuZ0lmPVwiaXNJbml0aWFsaXplZCAmJiBpc09wZW4gJiYgKCggaXRlbXM/Lmxlbmd0aCA+IDB8fCAoZGlzcGxheU5vUmVzdWx0cyAmJiAhc2VhcmNoQWN0aXZlKSkgfHwgKHNlYXJjaEFjdGl2ZSAmJiBkaXNwbGF5U2VhcmNoaW5nKSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlYXJjaEFjdGl2ZSAmJiBkaXNwbGF5U2VhcmNoaW5nXCIgY2xhc3M9XCJjb21wbGV0ZXItc2VhcmNoaW5nXCI+e3tfdGV4dFNlYXJjaGluZ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2VhcmNoQWN0aXZlICYmICghaXRlbXMgfHwgaXRlbXM/Lmxlbmd0aCA9PT0gMClcIiBjbGFzcz1cImNvbXBsZXRlci1uby1yZXN1bHRzXCI+e3tfdGV4dE5vUmVzdWx0c319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItcm93LXdyYXBwZXJcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IHJvd0luZGV4PWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLXJvd1wiIFtjdHJSb3ddPVwicm93SW5kZXhcIiBbZGF0YUl0ZW1dPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmltYWdlIHx8IGl0ZW0uaW1hZ2UgPT09ICcnXCIgY2xhc3M9XCJjb21wbGV0ZXItaW1hZ2UtaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpdGVtLmltYWdlICE9ICcnXCIgc3JjPVwie3tpdGVtLmltYWdlfX1cIiBjbGFzcz1cImNvbXBsZXRlci1pbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmltYWdlID09PSAnJ1wiIGNsYXNzPVwiY29tcGxldGVyLWltYWdlLWRlZmF1bHRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLWl0ZW0tdGV4dFwiIFtuZ0NsYXNzXT1cInsnY29tcGxldGVyLWl0ZW0tdGV4dC1pbWFnZSc6IGl0ZW0uaW1hZ2UgfHwgaXRlbS5pbWFnZSA9PT0gJycgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxldGVyLWxpc3QtaXRlbSBjbGFzcz1cImNvbXBsZXRlci10aXRsZVwiIFt0ZXh0XT1cIml0ZW0udGl0bGVcIiBbbWF0Y2hDbGFzc109XCJtYXRjaENsYXNzXCIgW3NlYXJjaFN0cl09XCJzZWFyY2hTdHJcIiBbdHlwZV09XCIndGl0bGUnXCI+PC9jb21wbGV0ZXItbGlzdC1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxldGVyLWxpc3QtaXRlbSAqbmdJZj1cIml0ZW0uZGVzY3JpcHRpb24gJiYgaXRlbS5kZXNjcmlwdGlvbiAhPSAnJ1wiIGNsYXNzPVwiY29tcGxldGVyLWRlc2NyaXB0aW9uXCIgW3RleHRdPVwiaXRlbS5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Y2hDbGFzc109XCJtYXRjaENsYXNzXCIgW3NlYXJjaFN0cl09XCJzZWFyY2hTdHJcIiBbdHlwZV09XCInZGVzY3JpcHRpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGxldGVyLWxpc3QtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICAgIHN0eWxlVXJsczogWydjb21wbGV0ZXItY21wLnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtDT01QTEVURVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIENvbXBsZXRlckNtcCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhU2VydmljZTogQ29tcGxldGVyRGF0YTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXROYW1lID0gJyc7XG4gICAgQElucHV0KCkgcHVibGljIGlucHV0SWQgPSAnJztcbiAgICBASW5wdXQoKSBwdWJsaWMgcGF1c2UgPSBQQVVTRTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluU2VhcmNoTGVuZ3RoID0gTUlOX1NFQVJDSF9MRU5HVEg7XG4gICAgQElucHV0KCkgcHVibGljIG1heENoYXJzID0gTUFYX0NIQVJTO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvdmVycmlkZVN1Z2dlc3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjbGVhclNlbGVjdGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGNsZWFyVW5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWxsSGlnaGxpZ2h0ZWQgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlciA9ICcnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXRjaENsYXNzOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGZpZWxkVGFiaW5kZXg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b01hdGNoID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVJbnB1dCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbnB1dENsYXNzOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGF1dG9mb2N1cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcGVuT25Gb2N1cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvcGVuT25DbGljayA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RPbkNsaWNrID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGluaXRpYWxWYWx1ZTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhdXRvSGlnaGxpZ2h0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGF1dG9TZWxlY3RPbkVudGVyID0gdHJ1ZTtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbXBsZXRlckl0ZW0+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBoaWdobGlnaHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVySXRlbT4oKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgQE91dHB1dCgnYmx1cicpIHB1YmxpYyBibHVyRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBjbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCdmb2N1cycpIHB1YmxpYyBmb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMga2V5dXA6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMga2V5ZG93bjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKEN0ckNvbXBsZXRlciwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGNvbXBsZXRlcjogQ3RyQ29tcGxldGVyO1xuICAgIEBWaWV3Q2hpbGQoJ2N0cklucHV0JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGN0cklucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIHNlYXJjaFN0ciA9ICcnO1xuICAgIHB1YmxpYyBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgICBwdWJsaWMgZGlzcGxheVNlYXJjaGluZyA9IHRydWU7XG4gICAgcHVibGljIGRpc3BsYXlOb1Jlc3VsdHMgPSB0cnVlO1xuICAgIHB1YmxpYyBfdGV4dE5vUmVzdWx0cyA9IFRFWFRfTk9fUkVTVUxUUztcbiAgICBwdWJsaWMgX3RleHRTZWFyY2hpbmcgPSBURVhUX1NFQVJDSElORztcblxuICAgIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIF9mb2N1cyA9IGZhbHNlO1xuICAgIHByaXZhdGUgX29wZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcGxldGVyU2VydmljZTogQ29tcGxldGVyU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICAgIGdldCB2YWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5zZWFyY2hTdHI7IH1cblxuICAgIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICAgICAgaWYgKHYgIT09IHRoaXMuc2VhcmNoU3RyKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IHY7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBjaGFuZ2UgaW4gYW55IGNhc2VcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9mb2N1cykge1xuICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RySW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblRvdWNoZWQoKSB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnNlYXJjaFN0ciA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVJbnB1dCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGRhdGFzb3VyY2Uoc291cmNlOiBDb21wbGV0ZXJEYXRhIHwgc3RyaW5nIHwgQXJyYXk8YW55Pikge1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlID0gdGhpcy5jb21wbGV0ZXJTZXJ2aWNlLmxvY2FsKHNvdXJjZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoc291cmNlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlID0gdGhpcy5jb21wbGV0ZXJTZXJ2aWNlLnJlbW90ZShzb3VyY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlID0gc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHRleHROb1Jlc3VsdHModGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXh0Tm9SZXN1bHRzICE9PSB0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0Tm9SZXN1bHRzID0gdGV4dDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5vUmVzdWx0cyA9ICEhdGhpcy5fdGV4dE5vUmVzdWx0cyAmJiB0aGlzLl90ZXh0Tm9SZXN1bHRzICE9PSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHRleHRTZWFyY2hpbmcodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXh0U2VhcmNoaW5nICE9PSB0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl90ZXh0U2VhcmNoaW5nID0gdGV4dDtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVNlYXJjaGluZyA9ICEhdGhpcy5fdGV4dFNlYXJjaGluZyAmJiB0aGlzLl90ZXh0U2VhcmNoaW5nICE9PSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5zZWxlY3RlZC5zdWJzY3JpYmUoKGl0ZW06IENvbXBsZXRlckl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLmhpZ2hsaWdodGVkLnN1YnNjcmliZSgoaXRlbTogQ29tcGxldGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZC5lbWl0KGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIub3BlbmVkLnN1YnNjcmliZSgoaXNPcGVuOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuID0gaXNPcGVuO1xuICAgICAgICAgICAgdGhpcy5vcGVuZWQuZW1pdChpc09wZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmJsdXJFdmVudC5lbWl0KCk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1cygpIHtcbiAgICAgICAgdGhpcy5mb2N1c0V2ZW50LmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbGljayhldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuY2xpY2suZW1pdChldmVudCk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5dXAoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmtleXVwLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmtleWRvd24uZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuKCkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3RySW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3RySW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGJsdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN0cklucHV0KSB7XG4gICAgICAgICAgICB0aGlzLmN0cklucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc09wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICAgIH1cbn1cbiJdfQ==