@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
623 lines • 50.4 kB
JavaScript
/**
* @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';
var TagsInputComponent = /** @class */ (function () {
function TagsInputComponent() {
/**
* 【必选】记录输入的标签
*/
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 {?}
*/
TagsInputComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.newTag = '';
this.searchFn = (/**
* @param {?} term
* @return {?}
*/
function (term) {
return of((_this.suggestionList ? _this.suggestionList : [])
.filter((/**
* @param {?} item
* @return {?}
*/
function (item) { return term === '' ? true : _this.caseSensitivity ?
(item[_this.displayProperty]).indexOf(term) !== -1 :
(item[_this.displayProperty]).toLowerCase().indexOf(term.toLowerCase()) !== -1; })));
});
this.registerFilterChange();
};
/**
* @param {?} changes
* @return {?}
*/
TagsInputComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (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 {?}
*/
TagsInputComponent.prototype.registerFilterChange = /**
* @return {?}
*/
function () {
var _this = this;
this.sourceSubscription = new BehaviorSubject('');
this.sourceSubscription.pipe(map((/**
* @param {?} term
* @return {?}
*/
function (term) {
_this.tagIsValid();
return term;
})), switchMap((/**
* @param {?} term
* @return {?}
*/
function (term) { return _this.searchFn(term); })))
.subscribe((/**
* @param {?} options
* @return {?}
*/
function (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 {?}
*/
function (e) { return e['target'].value; })), filter((/**
* @param {?} term
* @return {?}
*/
function (term) { return true; })), debounceTime(100) // hard code need refactory
).subscribe((/**
* @param {?} term
* @return {?}
*/
function (term) { return _this.sourceSubscription.next(term); }));
};
/**
* @return {?}
*/
TagsInputComponent.prototype.reduceSuggestionList = /**
* @return {?}
*/
function () {
var _this = this;
if (this.isReduce) {
return;
}
if (this.suggestionList.length > 0 && this.tags.length > 0) {
this.isReduce = true;
this.suggestionList = this.suggestionList.filter((/**
* @param {?} suggestion
* @return {?}
*/
function (suggestion) {
return _this.tags.findIndex((/**
* @param {?} tag
* @return {?}
*/
function (tag) { return _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 {?}
*/
TagsInputComponent.prototype.host_click = /**
* @return {?}
*/
function () {
this.tagInputElement.nativeElement.focus();
this.selectIndex = 0;
};
/**
* @param {?} event
* @return {?}
*/
TagsInputComponent.prototype.input_keydown = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
/** @type {?} */
var 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 {?}
*/
function () {
_this.addSuggestionByIndex(_this.selectIndex, _this.availableOptions[_this.selectIndex]);
}), 50);
}
else {
this.addTag();
}
}
else {
// 添加输入的值
this.addTag();
}
};
/**
* @param {?} index
* @return {?}
*/
TagsInputComponent.prototype.select = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (index < 0) {
index = this.suggestionList.length - 1;
}
else if (index >= this.suggestionList.length) {
index = 0;
}
this.selectIndex = index;
};
/**
* @param {?} event
* @return {?}
*/
TagsInputComponent.prototype.input_focus = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.showSuggestionList = true;
};
/**
* @param {?} event
* @return {?}
*/
TagsInputComponent.prototype.input_blur = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (isEmpty(this.newTag)) {
return;
}
this.addTag();
};
/**
* @param {?} index
* @param {?} value
* @return {?}
*/
TagsInputComponent.prototype.addSuggestionByIndex = /**
* @param {?} index
* @param {?} value
* @return {?}
*/
function (index, value) {
var _this = this;
if (index < 0 || index >= this.availableOptions.length || this.maxTags <= this.tags.length
|| this.tags.findIndex((/**
* @param {?} item
* @return {?}
*/
function (item) { return _this.caseSensitivity ? item[_this.displayProperty] === value[_this.displayProperty]
: item[_this.displayProperty].toLowerCase() === value[_this.displayProperty].toLowerCase(); })) !== -1) {
return;
}
this.canAdd().then((/**
* @param {?} result
* @return {?}
*/
function (result) {
if (!result) {
return;
}
_this.tags.push(_this.availableOptions[index]);
_this.valueChange.emit(_this.availableOptions[index]);
/** @type {?} */
var suggestionListIndex = _this.suggestionList.findIndex((/**
* @param {?} item
* @return {?}
*/
function (item) {
return _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 {?}
*/
TagsInputComponent.prototype.removeTag = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (index < 0 || index >= this.tags.length) {
return;
}
this.availableOptions.push(this.tags[index]);
this.suggestionList = this.availableOptions;
/** @type {?} */
var tag = this.tags[index];
this.tags.splice(index, 1);
this.valueChange.emit(tag);
};
/**
* @return {?}
*/
TagsInputComponent.prototype.tagIsValid = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var tag = this.newTag;
/** @type {?} */
var tmp = this.displayProperty;
/** @type {?} */
var result = tag && tag.length >= this.minLength
&& tag.length <= this.maxLength
&& this.suggestionList.findIndex((/**
* @param {?} item
* @return {?}
*/
function (item) { return _this.caseSensitivity ? item[tmp] === tag
: item[tmp].toLowerCase() === tag.toLowerCase(); })) === -1
&& this.tags.findIndex((/**
* @param {?} item
* @return {?}
*/
function (item) { return _this.caseSensitivity ? item[tmp] === tag
: item[tmp].toLowerCase() === tag.toLowerCase(); })) === -1
&& !this.isEmptyString(tag);
this.newTagValid = tag === '' || !!result;
return result;
};
/**
* @param {?} tag
* @return {?}
*/
TagsInputComponent.prototype.isEmptyString = /**
* @param {?} tag
* @return {?}
*/
function (tag) {
/** @type {?} */
var temp = tag.match(/\s/g);
if (temp) {
return tag.length === temp.length;
}
else {
return false;
}
};
/**
* @return {?}
*/
TagsInputComponent.prototype.addTag = /**
* @return {?}
*/
function () {
var _this = this;
this.canAdd().then((/**
* @param {?} result
* @return {?}
*/
function (result) {
if (result && _this.maxTags > _this.tags.length) {
if (_this.tagIsValid()) {
/** @type {?} */
var obj = {};
obj[_this.displayProperty] = _this.newTag;
_this.tags.push(obj);
_this.valueChange.emit(_this.newTag);
// this.availableOptions = this.suggestionList;
}
setTimeout((/**
* @return {?}
*/
function () {
// 放在timeout里是因为如果用空格添加tag,会导致添加之后输入框里有个空格。
_this.newTag = '';
}), 50);
}
else {
_this.newTagValid = false;
}
}));
this.sourceSubscription.next('');
};
/**
* @return {?}
*/
TagsInputComponent.prototype.canAdd = /**
* @return {?}
*/
function () {
/** @type {?} */
var checkResult = Promise.resolve(true);
if (this.checkBeforeAdd) {
/** @type {?} */
var 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 {?}
*/
TagsInputComponent.prototype.onDocumentClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.showSuggestionList && !this.selectBoxElement.nativeElement.contains($event.target)) {
this.showSuggestionList = false;
}
};
/**
* @return {?}
*/
TagsInputComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
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'],] }]
};
return TagsInputComponent;
}());
export { TagsInputComponent };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS90YWdzLWlucHV0LyIsInNvdXJjZXMiOlsidGFncy5pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFDakMsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RTtJQUFBOzs7O1FBV1csU0FBSSxHQUFHLEVBQUUsQ0FBQzs7OztRQUlWLG9CQUFlLEdBQUcsTUFBTSxDQUFDOzs7O1FBSXpCLGdCQUFXLEdBQUcsRUFBRSxDQUFDOzs7O1FBSWpCLGNBQVMsR0FBRyxDQUFDLENBQUM7Ozs7UUFJZCxjQUFTLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O1FBSTVDLFlBQU8sR0FBRyxDQUFDLENBQUM7Ozs7UUFJWixZQUFPLEdBQVcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O1FBSTFDLGVBQVUsR0FBRyxJQUFJLENBQUM7Ozs7UUFJbEIsbUJBQWMsR0FBUSxFQUFFLENBQUM7Ozs7UUFJekIsaUJBQVksR0FBRyxJQUFJLENBQUM7Ozs7UUFJcEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7Ozs7UUFNdkIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSzNDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FB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RUFBRTttQ0FDdEMsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7a0NBNk92QyxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBYTVDLHlCQUFDO0NBQUEsQUF0VEQsSUFzVEM7U0EvU1ksa0JBQWtCOzs7Ozs7SUFJN0Isa0NBQW1COzs7OztJQUluQiw2Q0FBa0M7Ozs7O0lBSWxDLHlDQUEwQjs7Ozs7SUFJMUIsdUNBQXVCOzs7OztJQUl2Qix1Q0FBcUQ7Ozs7O0lBSXJELHFDQUFxQjs7Ozs7SUFJckIscUNBQW1EOzs7OztJQUluRCx3Q0FBMkI7Ozs7O0lBSTNCLDRDQUFrQzs7Ozs7SUFJbEMsMENBQTZCOzs7OztJQUk3Qiw2Q0FBaUM7O0lBRWpDLDRDQUE4Rjs7Ozs7SUFJOUYseUNBQTJDOztJQUUzQyw2Q0FBcUU7O0lBQ3JFLDhDQUF1RTs7SUFFdkUsb0NBQVk7O0lBQ1osZ0RBQTJCOztJQUMzQiw4Q0FBc0I7O0lBQ3RCLHlDQUFvQjs7SUFDcEIsc0NBQWlCOztJQUNqQixzQ0FBb0Y7Ozs7O0lBQ3BGLGdEQUFpRDs7Ozs7SUFDakQsa0NBWUU7O0lBRUYseUNBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoLWVzL2lzRW1wdHknO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtdGFncy1pbnB1dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZ3MuaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RhZ3MuaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICBleHBvcnRBczogJ1RhZ3NJbnB1dCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWdzSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuICAvKipcclxuICAqIOOAkOW/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