UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

551 lines 47.6 kB
/** * @fileoverview added by tsickle * Generated from: tags.input.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core'; import isEmpty from 'lodash-es/isEmpty'; import { BehaviorSubject, fromEvent, of } from 'rxjs'; import { debounceTime, filter, map, switchMap } from 'rxjs/operators'; export class TagsInputComponent { constructor() { /** * 【必选】记录输入的标签 */ this.tags = []; /** * 【可选】使用的属性名 */ this.displayProperty = 'name'; /** * 【可选】输入的placeholder */ this.placeholder = ''; /** * 【可选】输入标签的最小长度 */ this.minLength = 3; /** * 【可选】输入标签的最大长度 */ this.maxLength = Number.MAX_SAFE_INTEGER; /** * 【可选】标签的最小个数 */ this.minTags = 0; /** * 【可选】标签的最大个数 */ this.maxTags = Number.MAX_SAFE_INTEGER; /** * 【可选】输入框的spellcheck */ this.spellcheck = true; /** * 【可选】下拉选项 */ this.suggestionList = []; /** * 是否按空格添加tag */ this.isAddBySpace = true; /** * 大小写敏感 */ this.caseSensitivity = false; /** * 输出函数,当选中某个选项项后,将会调用此函数,参数为当前选择项的值。如果需要获取所有选择状态的值,请参考(ngModelChange)方法 */ this.valueChange = new EventEmitter(); this.newTag = ''; this.showSuggestionList = false; this.availableOptions = []; this.newTagValid = false; this.isReduce = false; this.KEYS = { backspace: 8, tab: 9, enter: 13, escape: 27, space: 32, up: 38, down: 40, left: 37, right: 39, delete: 46, comma: 188 }; // 下拉选中suggestionList的item索引 this.selectIndex = 0; } /** * @return {?} */ ngOnInit() { this.newTag = ''; this.searchFn = (/** * @param {?} term * @return {?} */ (term) => { return of((this.suggestionList ? this.suggestionList : []) .filter((/** * @param {?} item * @return {?} */ item => term === '' ? true : this.caseSensitivity ? (item[this.displayProperty]).indexOf(term) !== -1 : (item[this.displayProperty]).toLowerCase().indexOf(term.toLowerCase()) !== -1))); }); this.registerFilterChange(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes && changes.suggestionList && changes.suggestionList.currentValue) { this.reduceSuggestionList(); if (this.sourceSubscription && this.searchFn) { this.sourceSubscription.next(''); } } if (changes && changes.tags && changes.tags.currentValue) { this.reduceSuggestionList(); } } /** * @return {?} */ registerFilterChange() { this.sourceSubscription = new BehaviorSubject(''); this.sourceSubscription.pipe(map((/** * @param {?} term * @return {?} */ term => { this.tagIsValid(); return term; })), switchMap((/** * @param {?} term * @return {?} */ term => this.searchFn(term)))) .subscribe((/** * @param {?} options * @return {?} */ options => { this.availableOptions = options; if (!this.availableOptions || this.availableOptions.length <= 0) { this.selectIndex = -1; } else { this.selectIndex = 0; } })); fromEvent(this.tagInputElement.nativeElement, 'input') .pipe(map((/** * @param {?} e * @return {?} */ (e) => e['target'].value)), filter((/** * @param {?} term * @return {?} */ term => true)), debounceTime(100) // hard code need refactory ).subscribe((/** * @param {?} term * @return {?} */ term => this.sourceSubscription.next(term))); } /** * @return {?} */ reduceSuggestionList() { if (this.isReduce) { return; } if (this.suggestionList.length > 0 && this.tags.length > 0) { this.isReduce = true; this.suggestionList = this.suggestionList.filter((/** * @param {?} suggestion * @return {?} */ suggestion => { return this.tags.findIndex((/** * @param {?} tag * @return {?} */ tag => this.caseSensitivity ? tag[this.displayProperty] === suggestion[this.displayProperty] : tag[this.displayProperty].toLowerCase() === suggestion[this.displayProperty].toLowerCase())) === -1; })); if (this.sourceSubscription && this.searchFn) { this.sourceSubscription.next(''); } } } /** * @return {?} */ host_click() { this.tagInputElement.nativeElement.focus(); this.selectIndex = 0; } /** * @param {?} event * @return {?} */ input_keydown(event) { /** @type {?} */ const hotkeys = [this.KEYS.enter, this.KEYS.tab, this.KEYS.up, this.KEYS.down]; if (this.isAddBySpace) { hotkeys.push(this.KEYS.space); } if (hotkeys.indexOf(event.keyCode) === -1) { return; } else if (event.keyCode === this.KEYS.down) { // 向下选择选项 this.select(++this.selectIndex); } else if (event.keyCode === this.KEYS.up) { // 向上选择选项 this.select(--this.selectIndex); } else if (event.keyCode === this.KEYS.enter || event.keyCode === this.KEYS.tab) { if (this.selectIndex !== -1) { // 回车或tab添加selectIndex的值 setTimeout((/** * @return {?} */ () => { this.addSuggestionByIndex(this.selectIndex, this.availableOptions[this.selectIndex]); }), 50); } else { this.addTag(); } } else { // 添加输入的值 this.addTag(); } } /** * @param {?} index * @return {?} */ select(index) { if (index < 0) { index = this.suggestionList.length - 1; } else if (index >= this.suggestionList.length) { index = 0; } this.selectIndex = index; } /** * @param {?} event * @return {?} */ input_focus(event) { this.showSuggestionList = true; } /** * @param {?} event * @return {?} */ input_blur(event) { if (isEmpty(this.newTag)) { return; } this.addTag(); } /** * @param {?} index * @param {?} value * @return {?} */ addSuggestionByIndex(index, value) { if (index < 0 || index >= this.availableOptions.length || this.maxTags <= this.tags.length || this.tags.findIndex((/** * @param {?} item * @return {?} */ item => this.caseSensitivity ? item[this.displayProperty] === value[this.displayProperty] : item[this.displayProperty].toLowerCase() === value[this.displayProperty].toLowerCase())) !== -1) { return; } this.canAdd().then((/** * @param {?} result * @return {?} */ result => { if (!result) { return; } this.tags.push(this.availableOptions[index]); this.valueChange.emit(this.availableOptions[index]); /** @type {?} */ const suggestionListIndex = this.suggestionList.findIndex((/** * @param {?} item * @return {?} */ item => this.caseSensitivity ? item[this.displayProperty] === value[this.displayProperty] : item[this.displayProperty].toLowerCase() === value[this.displayProperty].toLowerCase())); this.suggestionList.splice(suggestionListIndex, 1); this.newTag = ''; this.sourceSubscription.next(this.newTag); })); } /** * @param {?} index * @return {?} */ removeTag(index) { if (index < 0 || index >= this.tags.length) { return; } this.availableOptions.push(this.tags[index]); this.suggestionList = this.availableOptions; /** @type {?} */ const tag = this.tags[index]; this.tags.splice(index, 1); this.valueChange.emit(tag); } /** * @return {?} */ tagIsValid() { /** @type {?} */ const tag = this.newTag; /** @type {?} */ const tmp = this.displayProperty; /** @type {?} */ const result = tag && tag.length >= this.minLength && tag.length <= this.maxLength && this.suggestionList.findIndex((/** * @param {?} item * @return {?} */ item => this.caseSensitivity ? item[tmp] === tag : item[tmp].toLowerCase() === tag.toLowerCase())) === -1 && this.tags.findIndex((/** * @param {?} item * @return {?} */ item => this.caseSensitivity ? item[tmp] === tag : item[tmp].toLowerCase() === tag.toLowerCase())) === -1 && !this.isEmptyString(tag); this.newTagValid = tag === '' || !!result; return result; } /** * @param {?} tag * @return {?} */ isEmptyString(tag) { /** @type {?} */ const temp = tag.match(/\s/g); if (temp) { return tag.length === temp.length; } else { return false; } } /** * @return {?} */ addTag() { this.canAdd().then((/** * @param {?} result * @return {?} */ result => { if (result && this.maxTags > this.tags.length) { if (this.tagIsValid()) { /** @type {?} */ const obj = {}; obj[this.displayProperty] = this.newTag; this.tags.push(obj); this.valueChange.emit(this.newTag); // this.availableOptions = this.suggestionList; } setTimeout((/** * @return {?} */ () => { // 放在timeout里是因为如果用空格添加tag,会导致添加之后输入框里有个空格。 this.newTag = ''; }), 50); } else { this.newTagValid = false; } })); this.sourceSubscription.next(''); } /** * @return {?} */ canAdd() { /** @type {?} */ let checkResult = Promise.resolve(true); if (this.checkBeforeAdd) { /** @type {?} */ const result = this.checkBeforeAdd(this.newTag); if (typeof result !== 'undefined') { if (result.then) { checkResult = result; } else if (result.subscribe) { checkResult = ((/** @type {?} */ (result))).toPromise(); } else { checkResult = Promise.resolve(result); } } } return checkResult; } /** * @param {?} $event * @return {?} */ onDocumentClick($event) { if (this.showSuggestionList && !this.selectBoxElement.nativeElement.contains($event.target)) { this.showSuggestionList = false; } } /** * @return {?} */ ngOnDestroy() { if (this.sourceSubscription) { this.sourceSubscription.unsubscribe(); } } } TagsInputComponent.decorators = [ { type: Component, args: [{ selector: 'd-tags-input', template: "<div #selectBox class=\"devui-tags-host\" tabindex=\"-1\" (click)=\"host_click()\">\r\n <div class=\"devui-tags\">\r\n <ul class=\"devui-tag-list\">\r\n <li class=\"devui-tag-item\" *ngFor=\"let tag of tags; let index = index\">\r\n <span>{{ tag[displayProperty] }}</span>\r\n <a class=\"remove-button\" (click)=\"removeTag(index)\">\u00D7</a>\r\n </li>\r\n </ul>\r\n <input\r\n #tagInput\r\n class=\"input devui-input\"\r\n [(ngModel)]=\"newTag\"\r\n (keydown)=\"input_keydown($event)\"\r\n (focus)=\"input_focus($event)\"\r\n (blur)=\"input_blur($event)\"\r\n (trim)=\"(false)\"\r\n [placeholder]=\"placeholder\"\r\n [spellcheck]=\"spellcheck\"\r\n [ngClass]=\"{ 'invalid-tag': !newTagValid }\"\r\n type=\"text\"\r\n />\r\n </div>\r\n <div class=\"devui-tags-autocomplete\" *ngIf=\"showSuggestionList && availableOptions?.length\">\r\n <ul class=\"devui-suggestion-list\">\r\n <li\r\n class=\"devui-suggestion-item\"\r\n *ngFor=\"let item of availableOptions; let index = index\"\r\n [ngClass]=\"{ selected: index === selectIndex }\"\r\n (mousedown)=\"addSuggestionByIndex(index, item)\"\r\n >\r\n {{ item[displayProperty] }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>\r\n", exportAs: 'TagsInput', styles: [":host{display:block}.devui-tags-host{position:relative;height:100%}.devui-tags-host:active{outline:0}.devui-tags{-moz-appearance:textfield;-webkit-appearance:textfield;padding:2px 5px;overflow:hidden;word-wrap:break-word;cursor:text;background-color:#fff;border:1px solid #adb0b8;border-radius:1px;height:100%}.devui-tags:hover{border-color:#344899}.devui-tags.focused{outline:0}.devui-tags .devui-tag-list{margin:0;padding:0;list-style-type:none}.devui-tags .devui-tag-item{margin:2px;padding:0 5px;display:inline-block;min-height:20px;line-height:20px;border-radius:1px;color:#252b3a;background-color:#eef0f5}.devui-tags .devui-tag-item .remove-button{margin:0 0 0 5px;padding:0;border:none;background:0 0;cursor:pointer;vertical-align:top;font-size:16px;line-height:20px;color:#252b3a}.devui-tags .devui-tag-item .remove-button:hover{text-decoration:none}.devui-tags input.devui-input{border:0;outline:0;float:left;width:100%;height:26px;font-size:14px;padding-left:5px}.devui-tags input.devui-input::-ms-clear{display:none}.devui-tags-autocomplete{margin-top:5px;position:absolute;padding:5px 0;z-index:99999;width:100%;background-color:#fff;border:#adb0b8;box-shadow:0 5px 10px rgba(41,48,64,.2)}.devui-tags-autocomplete .devui-suggestion-list{margin:0;padding:0;list-style-type:none;max-height:280px;overflow-y:auto;position:relative}.devui-tags-autocomplete .devui-suggestion-list .devui-suggestion-item{padding:5px 10px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;line-height:20px;color:#252b3a;background-color:#fff}.devui-tags-autocomplete .devui-suggestion-list .devui-suggestion-item:hover{background-color:#f2f5fc}.devui-tags-autocomplete .devui-suggestion-list .devui-suggestion-item.selected{color:#5e7ce0;background-color:#f2f5fc}"] }] } ]; TagsInputComponent.propDecorators = { tags: [{ type: Input }], displayProperty: [{ type: Input }], placeholder: [{ type: Input }], minLength: [{ type: Input }], maxLength: [{ type: Input }], minTags: [{ type: Input }], maxTags: [{ type: Input }], spellcheck: [{ type: Input }], suggestionList: [{ type: Input }], isAddBySpace: [{ type: Input }], caseSensitivity: [{ type: Input }], checkBeforeAdd: [{ type: Input }], valueChange: [{ type: Output }], tagInputElement: [{ type: ViewChild, args: ['tagInput', { static: true },] }], selectBoxElement: [{ type: ViewChild, args: ['selectBox', { static: true },] }], onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; if (false) { /** * 【必选】记录输入的标签 * @type {?} */ TagsInputComponent.prototype.tags; /** * 【可选】使用的属性名 * @type {?} */ TagsInputComponent.prototype.displayProperty; /** * 【可选】输入的placeholder * @type {?} */ TagsInputComponent.prototype.placeholder; /** * 【可选】输入标签的最小长度 * @type {?} */ TagsInputComponent.prototype.minLength; /** * 【可选】输入标签的最大长度 * @type {?} */ TagsInputComponent.prototype.maxLength; /** * 【可选】标签的最小个数 * @type {?} */ TagsInputComponent.prototype.minTags; /** * 【可选】标签的最大个数 * @type {?} */ TagsInputComponent.prototype.maxTags; /** * 【可选】输入框的spellcheck * @type {?} */ TagsInputComponent.prototype.spellcheck; /** * 【可选】下拉选项 * @type {?} */ TagsInputComponent.prototype.suggestionList; /** * 是否按空格添加tag * @type {?} */ TagsInputComponent.prototype.isAddBySpace; /** * 大小写敏感 * @type {?} */ TagsInputComponent.prototype.caseSensitivity; /** @type {?} */ TagsInputComponent.prototype.checkBeforeAdd; /** * 输出函数,当选中某个选项项后,将会调用此函数,参数为当前选择项的值。如果需要获取所有选择状态的值,请参考(ngModelChange)方法 * @type {?} */ TagsInputComponent.prototype.valueChange; /** @type {?} */ TagsInputComponent.prototype.tagInputElement; /** @type {?} */ TagsInputComponent.prototype.selectBoxElement; /** @type {?} */ TagsInputComponent.prototype.newTag; /** @type {?} */ TagsInputComponent.prototype.showSuggestionList; /** @type {?} */ TagsInputComponent.prototype.availableOptions; /** @type {?} */ TagsInputComponent.prototype.newTagValid; /** @type {?} */ TagsInputComponent.prototype.isReduce; /** @type {?} */ TagsInputComponent.prototype.searchFn; /** * @type {?} * @private */ TagsInputComponent.prototype.sourceSubscription; /** * @type {?} * @private */ TagsInputComponent.prototype.KEYS; /** @type {?} */ TagsInputComponent.prototype.selectIndex; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS90YWdzLWlucHV0LyIsInNvdXJjZXMiOlsidGFncy5pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFDakMsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVF0RSxNQUFNLE9BQU8sa0JBQWtCO0lBUC9COzs7O1FBV1csU0FBSSxHQUFHLEVBQUUsQ0FBQzs7OztRQUlWLG9CQUFlLEdBQUcsTUFBTSxDQUFDOzs7O1FBSXpCLGdCQUFXLEdBQUcsRUFBRSxDQUFDOzs7O1FBSWpCLGNBQVMsR0FBRyxDQUFDLENBQUM7Ozs7UUFJZCxjQUFTLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O1FBSTVDLFlBQU8sR0FBRyxDQUFDLENBQUM7Ozs7UUFJWixZQUFPLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O1FBSTFDLGVBQVUsR0FBRyxJQUFJLENBQUM7Ozs7UUFJbEIsbUJBQWMsR0FBUSxFQUFFLENBQUM7Ozs7UUFJekIsaUJBQVksR0FBRyxJQUFJLENBQUM7Ozs7UUFJcEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7Ozs7UUFNdkIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSzNDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IscUJBQWdC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QTZCOzs7OztJQUk3Qiw2Q0FBaUM7O0lBRWpDLDRDQUE4Rjs7Ozs7SUFJOUYseUNBQTJDOztJQUUzQyw2Q0FBcUU7O0lBQ3JFLDhDQUF1RTs7SUFFdkUsb0NBQVk7O0lBQ1osZ0RBQTJCOztJQUMzQiw4Q0FBc0I7O0lBQ3RCLHlDQUFvQjs7SUFDcEIsc0NBQWlCOztJQUNqQixzQ0FBb0Y7Ozs7O0lBQ3BGLGdEQUFpRDs7Ozs7SUFDakQsa0NBWUU7O0lBRUYseUNBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoLWVzL2lzRW1wdHknO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtdGFncy1pbnB1dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZ3MuaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RhZ3MuaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBleHBvcnRBczogJ1RhZ3NJbnB1dCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWdzSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICAvKipcclxuICAqIOOAkOW/hemAieOAkeiusOW9lei+k+WFpeeahOagh+etvlxyXG4gICovXHJcbiAgQElucHV0KCkgdGFncyA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkeS9v+eUqOeahOWxnuaAp+WQjVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRpc3BsYXlQcm9wZXJ0eSA9ICduYW1lJztcclxuICAvKipcclxuICAgKiDjgJDlj6/pgInjgJHovpPlhaXnmoRwbGFjZWhvbGRlclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XHJcbiAgLyoqXHJcbiAgICog44CQ5Y+v6YCJ44CR6L6T5YWl5qCH562+55qE5pyA5bCP6ZW/5bqmXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWluTGVuZ3RoID0gMztcclxuICAvKipcclxuICAgKiDjgJDlj6/pgInjgJHovpPlhaXmoIfnrb7nmoTmnIDlpKfplb/luqZcclxuICAgKi9cclxuICBASW5wdXQoKSBtYXhMZW5ndGg6IG51bWJlciA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkeagh+etvueahOacgOWwj+S4quaVsFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG1pblRhZ3MgPSAwO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkeagh+etvueahOacgOWkp+S4quaVsFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG1heFRhZ3M6IG51bWJlciA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xyXG4gIC8qKlxyXG4gICAqIOOAkOWPr+mAieOAkei+k+WFpeahhueahHNwZWxsY2hlY2tcclxuICAgKi9cclxuICBASW5wdXQoKSBzcGVsbGNoZWNrID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiDjgJDlj6/pgInjgJHkuIvmi4npgInpoblcclxuICAgKi9cclxuICBASW5wdXQoKSBzdWdnZXN0aW9uTGlzdDogYW55ID0gW107XHJcbiAgLyoqXHJcbiAgICog5piv5ZCm5oyJ56m65qC85re75YqgdGFnXHJcbiAgICovXHJcbiAgQElucHV0KCkgaXNBZGRCeVNwYWNlID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiDlpKflsI/lhpnmlY/mhJ9cclxuICAgKi9cclxuICBASW5wdXQoKSBjYXNlU2Vuc2l0aXZpdHkgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgY2hlY2tCZWZvcmVBZGQ6IChuZXdUYWc6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIC8qKlxyXG4gKiDovpPlh7rlh73mlbDvvIzlvZPpgInkuK3mn5DkuKrpgInpobnpobnlkI7vvIzlsIbkvJrosIPnlKjmraTlh73mlbDvvIzlj4LmlbDkuLrlvZPliY3pgInmi6npobnnmoTlgLzjgILlpoLmnpzpnIDopoHojrflj5bmiYDmnInpgInmi6nnirbmgIHnmoTlgLzvvIzor7flj4LogIMobmdNb2RlbENoYW5nZSnmlrnms5VcclxuICovXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAVmlld0NoaWxkKCd0YWdJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIHRhZ0lucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RCb3gnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzZWxlY3RCb3hFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICBuZXdUYWcgPSAnJztcclxuICBzaG93U3VnZ2VzdGlvbkxpc3QgPSBmYWxzZTtcclxuICBhdmFpbGFibGVPcHRpb25zID0gW107XHJcbiAgbmV3VGFnVmFsaWQgPSBmYWxzZTtcclxuICBpc1JlZHVjZSA9IGZhbHNlO1xyXG4gIHNlYXJjaEZuOiAodGVybTogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PHsgaWQ6IHN0cmluZyB8IG51bWJlciwgb3B0aW9uOiBhbnkgfT4+O1xyXG4gIHByaXZhdGUgc291cmNlU3Vic2NyaXB0aW9uOiBCZWhhdmlvclN1YmplY3Q8YW55PjtcclxuICBwcml2YXRlIEtFWVM6IGFueSA9IHtcclxuICAgIGJhY2tzcGFjZTogOCxcclxuICAgIHRhYjogOSxcclxuICAgIGVudGVyOiAxMyxcclxuICAgIGVzY2FwZTogMjcsXHJcbiAgICBzcGFjZTogMzIsXHJcbiAgICB1cDogMzgsXHJcbiAgICBkb3duOiA0MCxcclxuICAgIGxlZnQ6IDM3LFxyXG4gICAgcmlnaHQ6IDM5LFxyXG4gICAgZGVsZXRlOiA0NixcclxuICAgIGNvbW1hOiAxODhcclxuICB9O1xyXG4gIC8vIOS4i+aLiemAieS4rXN1Z2dlc3Rpb25MaXN055qEaXRlbee0ouW8lVxyXG4gIHNlbGVjdEluZGV4ID0gMDtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLm5ld1RhZyA9ICcnO1xyXG4gICAgdGhpcy5zZWFyY2hGbiA9ICh0ZXJtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIG9mKCh0aGlzLnN1Z2dlc3Rpb25MaXN0ID8gdGhpcy5zdWdnZXN0aW9uTGlzdCA6IFtdKVxyXG4gICAgICAgIC5maWx0ZXIoaXRlbSA9PiB0ZXJtID09PSAnJyA/IHRydWUgOiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/XHJcbiAgICAgICAgKGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldKS5pbmRleE9mKHRlcm0pICE9PSAtMSA6XHJcbiAgICAgICAgKGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGVybS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZWdpc3RlckZpbHRlckNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5zdWdnZXN0aW9uTGlzdCAmJiBjaGFuZ2VzLnN1Z2dlc3Rpb25MaXN0LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnJlZHVjZVN1Z2dlc3Rpb25MaXN0KCk7XHJcbiAgICAgIGlmICh0aGlzLnNvdXJjZVN1YnNjcmlwdGlvbiAmJiB0aGlzLnNlYXJjaEZuKSB7XHJcbiAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpcHRpb24ubmV4dCgnJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMudGFncyAmJiBjaGFuZ2VzLnRhZ3MuY3VycmVudFZhbHVlICkge1xyXG4gICAgICB0aGlzLnJlZHVjZVN1Z2dlc3Rpb25MaXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3RlckZpbHRlckNoYW5nZSgpIHtcclxuICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KCcnKTtcclxuICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLnBpcGUoXHJcbiAgICAgIG1hcCh0ZXJtID0+IHtcclxuICAgICAgICB0aGlzLnRhZ0lzVmFsaWQoKTtcclxuICAgICAgICByZXR1cm4gdGVybTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCh0ZXJtID0+IHRoaXMuc2VhcmNoRm4odGVybSkpLFxyXG4gICAgIClcclxuICAgICAuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF2YWlsYWJsZU9wdGlvbnMgfHwgdGhpcy5hdmFpbGFibGVPcHRpb25zLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdEluZGV4ID0gLTE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0SW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBmcm9tRXZlbnQodGhpcy50YWdJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2lucHV0JylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChlOiBIVE1MU2VsZWN0RWxlbWVudCkgPT4gZVsndGFyZ2V0J10udmFsdWUpLFxyXG4gICAgICAgIGZpbHRlcih0ZXJtID0+IHRydWUpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApIC8vIGhhcmQgY29kZSBuZWVkIHJlZmFjdG9yeVxyXG4gICAgICApLnN1YnNjcmliZSh0ZXJtID0+IHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLm5leHQodGVybSkpO1xyXG4gIH1cclxuXHJcbiAgcmVkdWNlU3VnZ2VzdGlvbkxpc3QoKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlZHVjZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdWdnZXN0aW9uTGlzdC5sZW5ndGggPiAwICYmIHRoaXMudGFncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaXNSZWR1Y2UgPSB0cnVlO1xyXG4gICAgICB0aGlzLnN1Z2dlc3Rpb25MaXN0ID0gdGhpcy5zdWdnZXN0aW9uTGlzdC5maWx0ZXIoIHN1Z2dlc3Rpb24gPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3MuZmluZEluZGV4KHRhZyA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/XHJcbiAgICAgICAgICB0YWdbdGhpcy5kaXNwbGF5UHJvcGVydHldID09PSBzdWdnZXN0aW9uW3RoaXMuZGlzcGxheVByb3BlcnR5XSA6XHJcbiAgICAgICAgICB0YWdbdGhpcy5kaXNwbGF5UHJvcGVydHldLnRvTG93ZXJDYXNlKCkgPT09IHN1Z2dlc3Rpb25bdGhpcy5kaXNwbGF5UHJvcGVydHldLnRvTG93ZXJDYXNlKCkpID09PSAtMTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICh0aGlzLnNvdXJjZVN1YnNjcmlwdGlvbiAmJiB0aGlzLnNlYXJjaEZuKSB7XHJcbiAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpcHRpb24ubmV4dCgnJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhvc3RfY2xpY2soKSB7XHJcbiAgICB0aGlzLnRhZ0lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB0aGlzLnNlbGVjdEluZGV4ID0gMDtcclxuICB9XHJcblxyXG4gIGlucHV0X2tleWRvd24oZXZlbnQpIHtcclxuICAgIGNvbnN0IGhvdGtleXMgPSBbdGhpcy5LRVlTLmVudGVyLCB0aGlzLktFWVMudGFiLCB0aGlzLktFWVMudXAsIHRoaXMuS0VZUy5kb3duXTtcclxuICAgIGlmICh0aGlzLmlzQWRkQnlTcGFjZSkge1xyXG4gICAgICBob3RrZXlzLnB1c2godGhpcy5LRVlTLnNwYWNlKTtcclxuICAgIH1cclxuICAgIGlmIChob3RrZXlzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPT09IC0xKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gdGhpcy5LRVlTLmRvd24pIHtcclxuICAgICAgLy8g5ZCR5LiL6YCJ5oup6YCJ6aG5XHJcbiAgICAgIHRoaXMuc2VsZWN0KCsrdGhpcy5zZWxlY3RJbmRleCk7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IHRoaXMuS0VZUy51cCkge1xyXG4gICAgICAvLyDlkJHkuIrpgInmi6npgInpoblcclxuICAgICAgdGhpcy5zZWxlY3QoLS10aGlzLnNlbGVjdEluZGV4KTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gdGhpcy5LRVlTLmVudGVyIHx8IGV2ZW50LmtleUNvZGUgPT09IHRoaXMuS0VZUy50YWIpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgLy8g5Zue6L2m5oiWdGFi5re75Yqgc2VsZWN0SW5kZXjnmoTlgLxcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuYWRkU3VnZ2VzdGlvbkJ5SW5kZXgodGhpcy5zZWxlY3RJbmRleCwgdGhpcy5hdmFpbGFibGVPcHRpb25zW3RoaXMuc2VsZWN0SW5kZXhdKTtcclxuICAgICAgICB9LCA1MCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRUYWcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5re75Yqg6L6T5YWl55qE5YC8XHJcbiAgICAgIHRoaXMuYWRkVGFnKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3QgKGluZGV4KSB7XHJcbiAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgIGluZGV4ID0gdGhpcy5zdWdnZXN0aW9uTGlzdC5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIGlmIChpbmRleCA+PSB0aGlzLnN1Z2dlc3Rpb25MaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0SW5kZXggPSBpbmRleDtcclxuICB9XHJcblxyXG4gIGlucHV0X2ZvY3VzKGV2ZW50KSB7XHJcbiAgICB0aGlzLnNob3dTdWdnZXN0aW9uTGlzdCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBpbnB1dF9ibHVyKGV2ZW50KSB7XHJcbiAgICBpZiAoaXNFbXB0eSh0aGlzLm5ld1RhZykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hZGRUYWcoKTtcclxuICB9XHJcblxyXG4gIGFkZFN1Z2dlc3Rpb25CeUluZGV4KGluZGV4LCB2YWx1ZSkge1xyXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmF2YWlsYWJsZU9wdGlvbnMubGVuZ3RoIHx8IHRoaXMubWF4VGFncyA8PSB0aGlzLnRhZ3MubGVuZ3RoXHJcbiAgICAgIHx8IHRoaXMudGFncy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/IGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldID09PSB2YWx1ZVt0aGlzLmRpc3BsYXlQcm9wZXJ0eV1cclxuICAgICAgICA6IGl0ZW1bdGhpcy5kaXNwbGF5UHJvcGVydHldLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlW3RoaXMuZGlzcGxheVByb3BlcnR5XS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW5BZGQoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFncy5wdXNoKHRoaXMuYXZhaWxhYmxlT3B0aW9uc1tpbmRleF0pO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5hdmFpbGFibGVPcHRpb25zW2luZGV4XSk7XHJcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25MaXN0SW5kZXggPSB0aGlzLnN1Z2dlc3Rpb25MaXN0LmZpbmRJbmRleChpdGVtID0+XHJcbiAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZpdHkgPyBpdGVtW3RoaXMuZGlzcGxheVByb3BlcnR5XSAgPT09IHZhbHVlW3RoaXMuZGlzcGxheVByb3BlcnR5XSA6XHJcbiAgICAgICAgICBpdGVtW3RoaXMuZGlzcGxheVByb3BlcnR5XS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZVt0aGlzLmRpc3BsYXlQcm9wZXJ0eV0udG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgIHRoaXMuc3VnZ2VzdGlvbkxpc3Quc3BsaWNlKHN1Z2dlc3Rpb25MaXN0SW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLm5ld1RhZyA9ICcnO1xyXG4gICAgICB0aGlzLnNvdXJjZVN1YnNjcmlwdGlvbi5uZXh0KHRoaXMubmV3VGFnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGFnKGluZGV4KSB7XHJcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMudGFncy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hdmFpbGFibGVPcHRpb25zLnB1c2godGhpcy50YWdzW2luZGV4XSk7XHJcbiAgICB0aGlzLnN1Z2dlc3Rpb25MaXN0ID0gdGhpcy5hdmFpbGFibGVPcHRpb25zO1xyXG4gICAgY29uc3QgdGFnID0gdGhpcy50YWdzW2luZGV4XTtcclxuICAgIHRoaXMudGFncy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRhZyk7XHJcbiAgfVxyXG5cclxuICB0YWdJc1ZhbGlkKCkge1xyXG4gICAgY29uc3QgdGFnID0gdGhpcy5uZXdUYWc7XHJcbiAgICBjb25zdCB0bXAgPSB0aGlzLmRpc3BsYXlQcm9wZXJ0eTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRhZyAmJiB0YWcubGVuZ3RoID49IHRoaXMubWluTGVuZ3RoXHJcbiAgICAgICYmIHRhZy5sZW5ndGggPD0gdGhpcy5tYXhMZW5ndGhcclxuICAgICAgJiYgdGhpcy5zdWdnZXN0aW9uTGlzdC5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/IGl0ZW1bdG1wXSA9PT0gdGFnXHJcbiAgICAgICAgICA6IGl0ZW1bdG1wXS50b0xvd2VyQ2FzZSgpID09PSB0YWcudG9Mb3dlckNhc2UoKSkgPT09IC0xXHJcbiAgICAgICYmIHRoaXMudGFncy5maW5kSW5kZXgoaXRlbSA9PiB0aGlzLmNhc2VTZW5zaXRpdml0eSA/ICBpdGVtW3RtcF0gPT09IHRhZ1xyXG4gICAgICAgICAgOiBpdGVtW3RtcF0udG9Mb3dlckNhc2UoKSA9PT0gdGFnLnRvTG93ZXJDYXNlKCkpID09PSAtMVxyXG4gICAgICAmJiAhdGhpcy5pc0VtcHR5U3RyaW5nKHRhZyk7XHJcbiAgICB0aGlzLm5ld1RhZ1ZhbGlkID0gdGFnID09PSAnJyB8fCAhIXJlc3VsdDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBpc0VtcHR5U3RyaW5nKHRhZykge1xyXG4gICAgY29uc3QgdGVtcCA9IHRhZy5tYXRjaCgvXFxzL2cpO1xyXG4gICAgaWYgKHRlbXApIHtcclxuICAgICAgcmV0dXJuIHRhZy5sZW5ndGggPT09IHRlbXAubGVuZ3RoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVGFnKCkge1xyXG4gICAgdGhpcy5jYW5BZGQoKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQgJiYgdGhpcy5tYXhUYWdzID4gdGhpcy50YWdzLmxlbmd0aCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRhZ0lzVmFsaWQoKSkge1xyXG4gICAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgICBvYmpbdGhpcy5kaXNwbGF5UHJvcGVydHldID0gdGhpcy5uZXdUYWc7XHJcbiAgICAgICAgICB0aGlzLnRhZ3MucHVzaChvYmopO1xyXG4gICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMubmV3VGFnKTtcclxuICAgICAgICAgIC8vIHRoaXMuYXZhaWxhYmxlT3B0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbkxpc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy8g5pS+5ZyodGltZW91dOmHjOaYr+WboOS4uuWmguaenOeUqOepuuagvOa3u+WKoHRhZ++8jOS8muWvvOiHtOa3u+WKoOS5i+WQjui+k+WFpeahhumHjOacieS4quepuuagvOOAglxyXG4gICAgICAgICAgdGhpcy5uZXdUYWcgPSAnJztcclxuICAgICAgICB9LCA1MCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5uZXdUYWdWYWxpZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLm5leHQoJycpO1xyXG4gIH1cclxuXHJcbiAgY2FuQWRkKCkge1xyXG4gICAgbGV0IGNoZWNrUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgaWYgKHRoaXMuY2hlY2tCZWZvcmVBZGQpIHtcclxuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmNoZWNrQmVmb3JlQWRkKHRoaXMubmV3VGFnKTtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC50aGVuKSB7XHJcbiAgICAgICAgICBjaGVja1Jlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdWJzY3JpYmUpIHtcclxuICAgICAgICAgIGNoZWNrUmVzdWx0ID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS50b1Byb21pc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2hlY2tSZXN1bHQgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjaGVja1Jlc3VsdDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soJGV2ZW50OiBFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuc2hvd1N1Z2dlc3Rpb25MaXN0ICYmICF0aGlzLnNlbGVjdEJveEVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucygkZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLnNob3dTdWdnZXN0aW9uTGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgaWYgKHRoaXMuc291cmNlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc291cmNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19