ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
579 lines (578 loc) • 36 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
var TextareaItem = /** @class */ (function () {
function TextareaItem() {
this.prefixCls = 'am-textarea';
this.isTitleString = true;
this.maxLength = Infinity;
this._prefixListCls = 'am-list';
this._defaultValue = '';
this._placeholder = '';
this._editable = true;
this._disabled = false;
this._clear = false;
this._rows = 1;
this._error = false;
this._labelNumber = 5;
this._name = '';
this._focus = false;
this._autoFocus = false;
this._isClear = false;
this._isClickingClear = false;
this.onChange = new EventEmitter();
this.onBlur = new EventEmitter();
this.onFocus = new EventEmitter();
this.onErrorClick = new EventEmitter();
}
Object.defineProperty(TextareaItem.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this._value;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
if (typeof v === undefined || v === null) {
this._value = '';
}
this._value = v;
this.textRef.nativeElement.value = this._value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "defaultValue", {
get: /**
* @return {?}
*/
function () {
return this._defaultValue;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._defaultValue = value;
this._value = this._defaultValue;
this.textRef.nativeElement.value = this._value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "placeholder", {
get: /**
* @return {?}
*/
function () {
return this._placeholder;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._placeholder = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "editable", {
get: /**
* @return {?}
*/
function () {
return this._editable;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._editable = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "disabled", {
get: /**
* @return {?}
*/
function () {
return this._disabled;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = value;
this.setCls();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "clear", {
get: /**
* @return {?}
*/
function () {
return this._clear;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._clear = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "rows", {
get: /**
* @return {?}
*/
function () {
return this._rows;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._rows = value;
this.setCls();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "error", {
get: /**
* @return {?}
*/
function () {
return this._error;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._error = value;
this.setCls();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "labelNumber", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._labelNumber = value;
this.setCls();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "count", {
get: /**
* @return {?}
*/
function () {
return this._count;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._count = value;
this.setCls();
this.setCharacterLength();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "prefixListCls", {
get: /**
* @return {?}
*/
function () {
return this._prefixListCls;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._prefixListCls = value;
this.setCls();
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "name", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._name = value;
this.textRef.nativeElement.name = this._name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "autoHeight", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._autoHeight = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "title", {
get: /**
* @return {?}
*/
function () {
return this._title;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._title = value;
this.isTitleString = true;
if (typeof value !== 'string') {
this.isTitleString = false;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "focus", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value && value.focus) {
this.textRef.nativeElement.focus();
this.inputFocus('');
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextareaItem.prototype, "autoFocus", {
get: /**
* @return {?}
*/
function () {
return this._autoFocus;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._autoFocus = value;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
TextareaItem.prototype.setCls = /**
* @return {?}
*/
function () {
var _a, _b, _c, _d;
this.hasCount = this._count > 0 && this._rows > 1;
this.wrapCls = (_a = {},
_a[this._prefixListCls + "-item"] = true,
_a[this.prefixCls + "-item"] = true,
_a[this.prefixCls + "-disabled"] = this._disabled,
_a[this.prefixCls + "-error"] = this._error,
_a[this.prefixCls + "-focus"] = this._focus,
_a[this.prefixCls + "-item-single-line"] = this._rows === 1 && !this._autoHeight,
_a[this.prefixCls + "-has-count"] = this.hasCount,
_a);
this.labelCls = (_b = {},
_b[this.prefixCls + "-label"] = true,
_b[this.prefixCls + "-label-2"] = this._labelNumber === 2,
_b[this.prefixCls + "-label-3"] = this._labelNumber === 3,
_b[this.prefixCls + "-label-4"] = this._labelNumber === 4,
_b[this.prefixCls + "-label-5"] = this._labelNumber === 5,
_b[this.prefixCls + "-label-6"] = this._labelNumber === 6,
_b[this.prefixCls + "-label-7"] = this._labelNumber === 7,
_b);
this.controlCls = (_c = {}, _c[this.prefixCls + "-control"] = true, _c);
this.clearCls = (_d = {},
_d[this.prefixCls + "-clear-active"] = this._isClickingClear,
_d);
};
/**
* @return {?}
*/
TextareaItem.prototype.setCharacterLength = /**
* @return {?}
*/
function () {
this.characterLength = this.countSymbols(this._value);
if (this._count > 0) {
this.maxLength = this._count - this.characterLength + (this._value ? this._value.length : 0);
}
};
/**
* @param {?} e
* @return {?}
*/
TextareaItem.prototype.inputChange = /**
* @param {?} e
* @return {?}
*/
function (e) {
this._value = e;
this.textRef.nativeElement.value = this._value;
this.setCharacterLength();
this.onChange.emit(this._value);
};
/**
* @param {?} value
* @return {?}
*/
TextareaItem.prototype.inputFocus = /**
* @param {?} value
* @return {?}
*/
function (value) {
this._focus = true;
this.setCls();
if (value !== undefined) {
this.onFocus.emit(value);
}
};
/**
* @param {?} value
* @param {?} event
* @return {?}
*/
TextareaItem.prototype.inputBlur = /**
* @param {?} value
* @param {?} event
* @return {?}
*/
function (value, event) {
var _this = this;
setTimeout(function () {
_this._focus = false;
_this.setCls();
_this.onBlur.emit(value);
_this._isClear = false;
}, 100);
};
/**
* @return {?}
*/
TextareaItem.prototype.clearInput = /**
* @return {?}
*/
function () {
var _this = this;
this._isClickingClear = true;
this.setCls();
setTimeout(function () {
_this._value = '';
_this.inputChange('');
_this.inputFocus(_this._value);
_this._isClickingClear = false;
_this.setCls();
}, 100);
};
/**
* @param {?} e
* @return {?}
*/
TextareaItem.prototype.errorClick = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (this.onErrorClick) {
this.onErrorClick.emit(e);
}
};
/**
* @return {?}
*/
TextareaItem.prototype.reAlignHeight = /**
* @return {?}
*/
function () {
/** @type {?} */
var textareaDom = this.textRef.nativeElement;
textareaDom.style.height = '';
textareaDom.style.height = textareaDom.scrollHeight + "px";
};
/**
* @param {?=} text
* @return {?}
*/
TextareaItem.prototype.countSymbols = /**
* @param {?=} text
* @return {?}
*/
function (text) {
if (text === void 0) { text = ''; }
/** @type {?} */
var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]|\n/g;
return text.replace(regexAstralSymbols, '_').length;
};
/**
* @return {?}
*/
TextareaItem.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.setCls();
this.setCharacterLength();
this.textRef.nativeElement.value = this._value;
};
/**
* @return {?}
*/
TextareaItem.prototype.ngAfterContentChecked = /**
* @return {?}
*/
function () {
if (this._autoHeight && this._focus) {
this.reAlignHeight();
}
};
TextareaItem.decorators = [
{ type: Component, args: [{
selector: 'TextareaItem , nzm-textarea-item',
template: "<div [ngClass]=\"wrapCls\">\n <div *ngIf=\"title && isTitleString\" [ngClass]=\"labelCls\">{{title}}</div>\n <div *ngIf=\"title && !isTitleString\" [ngClass]=\"labelCls\">\n <ng-template [ngTemplateOutlet]=\"title\"></ng-template>\n </div>\n <div [ngClass]=\"controlCls\">\n <textarea #text\n [rows]=\"rows\"\n [maxlength]=\"maxLength\"\n [(ngModel)]=\"value\"\n [defaultValue]=\"defaultValue\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [readOnly]=\"!editable\"\n [autofocus]=\"autoFocus\"\n (ngModelChange)=\"inputChange($event)\"\n (blur)=\"inputBlur(value , $event)\"\n (focus)=\"inputFocus(value)\"\n ></textarea>\n </div>\n <div *ngIf=\"clear && editable && !disabled && (value && value.length >0 )\"\n class=\"{{prefixCls}}-clear\"\n [ngClass]=\"clearCls\"\n (click)=\"clearInput()\"\n ></div>\n <div *ngIf=\"error\" class=\"{{prefixCls}}-error-extra\" (click)=\"errorClick($event)\"></div>\n <span *ngIf=\"hasCount\" class=\"{{prefixCls}}-count\">\n <span>{{characterLength}}</span>/{{count}}\n </span>\n</div>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return TextareaItem; }),
multi: true
}
]
}] }
];
/** @nocollapse */
TextareaItem.ctorParameters = function () { return []; };
TextareaItem.propDecorators = {
textRef: [{ type: ViewChild, args: ['text',] }],
value: [{ type: Input }],
defaultValue: [{ type: Input }],
placeholder: [{ type: Input }],
editable: [{ type: Input }],
disabled: [{ type: Input }],
clear: [{ type: Input }],
rows: [{ type: Input }],
error: [{ type: Input }],
labelNumber: [{ type: Input }],
count: [{ type: Input }],
prefixListCls: [{ type: Input }],
name: [{ type: Input }],
autoHeight: [{ type: Input }],
title: [{ type: Input }],
focus: [{ type: Input }],
autoFocus: [{ type: Input }],
onChange: [{ type: Output }],
onBlur: [{ type: Output }],
onFocus: [{ type: Output }],
onErrorClick: [{ type: Output }]
};
return TextareaItem;
}());
export { TextareaItem };
if (false) {
/** @type {?} */
TextareaItem.prototype.prefixCls;
/** @type {?} */
TextareaItem.prototype.wrapCls;
/** @type {?} */
TextareaItem.prototype.labelCls;
/** @type {?} */
TextareaItem.prototype.controlCls;
/** @type {?} */
TextareaItem.prototype.clearCls;
/** @type {?} */
TextareaItem.prototype.hasCount;
/** @type {?} */
TextareaItem.prototype.characterLength;
/** @type {?} */
TextareaItem.prototype.isTitleString;
/** @type {?} */
TextareaItem.prototype.maxLength;
/** @type {?} */
TextareaItem.prototype._prefixListCls;
/** @type {?} */
TextareaItem.prototype._value;
/** @type {?} */
TextareaItem.prototype._defaultValue;
/** @type {?} */
TextareaItem.prototype._placeholder;
/** @type {?} */
TextareaItem.prototype._editable;
/** @type {?} */
TextareaItem.prototype._disabled;
/** @type {?} */
TextareaItem.prototype._clear;
/** @type {?} */
TextareaItem.prototype._rows;
/** @type {?} */
TextareaItem.prototype._count;
/** @type {?} */
TextareaItem.prototype._autoHeight;
/** @type {?} */
TextareaItem.prototype._error;
/** @type {?} */
TextareaItem.prototype._labelNumber;
/** @type {?} */
TextareaItem.prototype._name;
/** @type {?} */
TextareaItem.prototype._title;
/** @type {?} */
TextareaItem.prototype._focus;
/** @type {?} */
TextareaItem.prototype._autoFocus;
/** @type {?} */
TextareaItem.prototype._isClear;
/** @type {?} */
TextareaItem.prototype._isClickingClear;
/** @type {?} */
TextareaItem.prototype.textRef;
/** @type {?} */
TextareaItem.prototype.onChange;
/** @type {?} */
TextareaItem.prototype.onBlur;
/** @type {?} */
TextareaItem.prototype.onFocus;
/** @type {?} */
TextareaItem.prototype.onErrorClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRleHRhcmVhLWl0ZW0vdGV4dGFyZWEtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUdULFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFnTGpEO3lCQWxLb0IsYUFBYTs2QkFPUixJQUFJO3lCQUNULFFBQVE7OEJBRUgsU0FBUzs2QkFFRixFQUFFOzRCQUNILEVBQUU7eUJBQ0osSUFBSTt5QkFDSixLQUFLO3NCQUNSLEtBQUs7cUJBQ1AsQ0FBQztzQkFHQyxLQUFLOzRCQUNBLENBQUM7cUJBQ1IsRUFBRTtzQkFFQSxLQUFLOzBCQUNELEtBQUs7d0JBQ1AsS0FBSztnQ0FDRyxLQUFLO3dCQStIWCxJQUFJLFlBQVksRUFBTztzQkFFekIsSUFBSSxZQUFZLEVBQU87dUJBRXRCLElBQUksWUFBWSxFQUFPOzRCQUVsQixJQUFJLFlBQVksRUFBTztLQUV6QztJQWxJaEIsc0JBQ0ksK0JBQUs7Ozs7UUFEVDtZQUVFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNwQjs7Ozs7UUFDRCxVQUFVLENBQVM7WUFDakIsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7YUFDbEI7WUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNoRDs7O09BUEE7SUFRRCxz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LElBQUksQ0FBQyxNQUFNLENBQUM7S0FDaEQ7Ozs7SUFFRCw0Q0FBcUI7OztJQUFyQjtRQUNFLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ25DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN0QjtLQUNGOztnQkE3UUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxrQ0FBa0M7b0JBQzVDLGt0Q0FBNkM7b0JBQzdDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxZQUFZLEVBQVosQ0FBWSxDQUFDOzRCQUMzQyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7Ozs7MEJBK0JFLFNBQVMsU0FBQyxNQUFNO3dCQUdoQixLQUFLOytCQVdMLEtBQUs7OEJBU0wsS0FBSzsyQkFPTCxLQUFLOzJCQU9MLEtBQUs7d0JBUUwsS0FBSzt1QkFPTCxLQUFLO3dCQVFMLEtBQUs7OEJBUUwsS0FBSzt3QkFLTCxLQUFLO2dDQVNMLEtBQUs7dUJBUUwsS0FBSzs2QkFLTCxLQUFLO3dCQUlMLEtBQUs7d0JBV0wsS0FBSzs0QkFPTCxLQUFLOzJCQU9MLE1BQU07eUJBRU4sTUFBTTswQkFFTixNQUFNOytCQUVOLE1BQU07O3VCQXhMVDs7U0F3QmEsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgVGVtcGxhdGVSZWYsXG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnVGV4dGFyZWFJdGVtICwgbnptLXRleHRhcmVhLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGV4dGFyZWFJdGVtKSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUZXh0YXJlYUl0ZW0gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudENoZWNrZWQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS10ZXh0YXJlYSc7XG4gIHdyYXBDbHM6IG9iamVjdDtcbiAgbGFiZWxDbHM6IG9iamVjdDtcbiAgY29udHJvbENsczogb2JqZWN0O1xuICBjbGVhckNsczogb2JqZWN0O1xuICBoYXNDb3VudDogYm9vbGVhbjtcbiAgY2hhcmFjdGVyTGVuZ3RoOiBudW1iZXI7XG4gIGlzVGl0bGVTdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBtYXhMZW5ndGg6IG51bWJlciA9IEluZmluaXR5O1xuXG4gIHByaXZhdGUgX3ByZWZpeExpc3RDbHMgPSAnYW0tbGlzdCc7XG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfZWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9jbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yb3dzOiBudW1iZXIgPSAxO1xuICBwcml2YXRlIF9jb3VudDogbnVtYmVyO1xuICBwcml2YXRlIF9hdXRvSGVpZ2h0OiBib29sZWFuO1xuICBwcml2YXRlIF9lcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9sYWJlbE51bWJlcjogbnVtYmVyID0gNTtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3RpdGxlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICBwcml2YXRlIF9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hdXRvRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNDbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0NsaWNraW5nQ2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCd0ZXh0JylcbiAgdGV4dFJlZjtcblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICB0aGlzLnRleHRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkZWZhdWx0VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICB9XG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMudGV4dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlO1xuICB9XG4gIHNldCBlZGl0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2VkaXRhYmxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGNsZWFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jbGVhcjtcbiAgfVxuICBzZXQgY2xlYXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jbGVhciA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCByb3dzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3M7XG4gIH1cbiAgc2V0IHJvd3ModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3Jvd3MgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBlcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gIH1cbiAgc2V0IGVycm9yKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZXJyb3IgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBsYWJlbE51bWJlcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGFiZWxOdW1iZXIgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jb3VudDtcbiAgfVxuICBzZXQgY291bnQodmFsdWUpIHtcbiAgICB0aGlzLl9jb3VudCA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgdGhpcy5zZXRDaGFyYWN0ZXJMZW5ndGgoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcHJlZml4TGlzdENscygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wcmVmaXhMaXN0Q2xzO1xuICB9XG4gIHNldCBwcmVmaXhMaXN0Q2xzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wcmVmaXhMaXN0Q2xzID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICAgIHRoaXMudGV4dFJlZi5uYXRpdmVFbGVtZW50Lm5hbWUgPSB0aGlzLl9uYW1lO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBhdXRvSGVpZ2h0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYXV0b0hlaWdodCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gIH1cbiAgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgdGhpcy5fdGl0bGUgPSB2YWx1ZTtcbiAgICB0aGlzLmlzVGl0bGVTdHJpbmcgPSB0cnVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmlzVGl0bGVTdHJpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGZvY3VzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmZvY3VzKSB7XG4gICAgICB0aGlzLnRleHRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgdGhpcy5pbnB1dEZvY3VzKCcnKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGF1dG9Gb2N1cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b0ZvY3VzO1xuICB9XG4gIHNldCBhdXRvRm9jdXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hdXRvRm9jdXMgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25FcnJvckNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzZXRDbHMoKSB7XG4gICAgdGhpcy5oYXNDb3VudCA9IHRoaXMuX2NvdW50ID4gMCAmJiB0aGlzLl9yb3dzID4gMTtcbiAgICB0aGlzLndyYXBDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5fcHJlZml4TGlzdENsc30taXRlbWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1pdGVtYF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWRpc2FibGVkYF06IHRoaXMuX2Rpc2FibGVkLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1lcnJvcmBdOiB0aGlzLl9lcnJvcixcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tZm9jdXNgXTogdGhpcy5fZm9jdXMsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWl0ZW0tc2luZ2xlLWxpbmVgXTogdGhpcy5fcm93cyA9PT0gMSAmJiAhdGhpcy5fYXV0b0hlaWdodCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30taGFzLWNvdW50YF06IHRoaXMuaGFzQ291bnRcbiAgICB9O1xuICAgIHRoaXMubGFiZWxDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsYF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTJgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDIsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTNgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDMsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTRgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDQsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTVgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTZgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDYsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWxhYmVsLTdgXTogdGhpcy5fbGFiZWxOdW1iZXIgPT09IDdcbiAgICB9O1xuICAgIHRoaXMuY29udHJvbENscyA9IHsgW2Ake3RoaXMucHJlZml4Q2xzfS1jb250cm9sYF06IHRydWUgfTtcbiAgICB0aGlzLmNsZWFyQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jbGVhci1hY3RpdmVgXTogdGhpcy5faXNDbGlja2luZ0NsZWFyXG4gICAgfTtcbiAgfVxuICBzZXRDaGFyYWN0ZXJMZW5ndGgoKSB7XG4gICAgdGhpcy5jaGFyYWN0ZXJMZW5ndGggPSB0aGlzLmNvdW50U3ltYm9scyh0aGlzLl92YWx1ZSk7XG4gICAgaWYgKHRoaXMuX2NvdW50ID4gMCkge1xuICAgICAgdGhpcy5tYXhMZW5ndGggPSB0aGlzLl9jb3VudCAtIHRoaXMuY2hhcmFjdGVyTGVuZ3RoICsgKHRoaXMuX3ZhbHVlID8gdGhpcy5fdmFsdWUubGVuZ3RoIDogMCk7XG4gICAgfVxuICB9XG5cbiAgaW5wdXRDaGFuZ2UoZSkge1xuICAgIHRoaXMuX3ZhbHVlID0gZTtcbiAgICB0aGlzLnRleHRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIHRoaXMuc2V0Q2hhcmFjdGVyTGVuZ3RoKCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIGlucHV0Rm9jdXModmFsdWUpIHtcbiAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vbkZvY3VzLmVtaXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGlucHV0Qmx1cih2YWx1ZSwgZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2ZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLnNldENscygpO1xuICAgICAgdGhpcy5vbkJsdXIuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLl9pc0NsZWFyID0gZmFsc2U7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGNsZWFySW5wdXQoKSB7XG4gICAgdGhpcy5faXNDbGlja2luZ0NsZWFyID0gdHJ1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICAgIHRoaXMuaW5wdXRDaGFuZ2UoJycpO1xuICAgICAgdGhpcy5pbnB1dEZvY3VzKHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuX2lzQ2xpY2tpbmdDbGVhciA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICB9LCAxMDApO1xuICB9XG4gIGVycm9yQ2xpY2soZSkge1xuICAgIGlmICh0aGlzLm9uRXJyb3JDbGljaykge1xuICAgICAgdGhpcy5vbkVycm9yQ2xpY2suZW1pdChlKTtcbiAgICB9XG4gIH1cbiAgcmVBbGlnbkhlaWdodCgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYURvbSA9IHRoaXMudGV4dFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRleHRhcmVhRG9tLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIHRleHRhcmVhRG9tLnN0eWxlLmhlaWdodCA9IGAke3RleHRhcmVhRG9tLnNjcm9sbEhlaWdodH1weGA7XG4gIH1cblxuICBjb3VudFN5bWJvbHModGV4dCA9ICcnKSB7XG4gICAgY29uc3QgcmVnZXhBc3RyYWxTeW1ib2xzID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18XFxuL2c7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZShyZWdleEFzdHJhbFN5bWJvbHMsICdfJykubGVuZ3RoO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgICB0aGlzLnNldENoYXJhY3Rlckxlbmd0aCgpO1xuICAgIHRoaXMudGV4dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuX2F1dG9IZWlnaHQgJiYgdGhpcy5fZm9jdXMpIHtcbiAgICAgIHRoaXMucmVBbGlnbkhlaWdodCgpO1xuICAgIH1cbiAgfVxufVxuIl19