UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

404 lines (403 loc) 31 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, HostBinding, NgZone } from '@angular/core'; import { CustomInputService } from './custom-input.service'; var CustomInput = /** @class */ (function () { function CustomInput(_ref, _customInputService, _ngZone) { var _this = this; this._ref = _ref; this._customInputService = _customInputService; this._ngZone = _ngZone; this.keyboardPrefixCls = 'am-number-keyboard'; this.focus = false; this._value = ''; this._defaultValue = ''; this._placeholder = ''; this._editable = true; this._disabled = false; this._setFocus = false; this.onChange = new EventEmitter(); this.onBlur = new EventEmitter(); this.onFocus = new EventEmitter(); this.clsFakeContainer = true; this.inputFocus = function () { _this.removeBlurListener(); /** @type {?} */ var focus = _this.focus; if (!focus || _this._setFocus) { _this.onInputFocus(); } setTimeout(function () { _this.addBlurListener(); }, 50); }; this.doBlur = function (ev) { /** @type {?} */ var value = _this._value; /** @type {?} */ var parentFound = false; /** @type {?} */ var isInput = false; /** @type {?} */ var isKeyboard = false; /** @type {?} */ var isClear = false; /** @type {?} */ var target = ev.target; while (target && target !== null && !parentFound) { if (target === _this._ref.nativeElement) { parentFound = true; } if (target.localName === 'custominput') { isInput = true; } if (target.localName === 'customkeyboard') { isKeyboard = true; } if (target.className.indexOf('am-input-clear') >= 0) { isClear = true; } target = target.parentElement; } // 当点击目标是本身的时候,获取焦点、不隐藏keyboard // 当点击目标不是本身但是其他的custom-input时,失去焦点、不隐藏keyboard // 当点击目标是keyboard时,不失去焦点,不隐藏keyboard if (parentFound) { _this.focus = true; } else if (isInput) { _this._setFocus = false; _this.focus = false; _this.onBlur.emit(_this._value); } if (_this.focus && isKeyboard) { _this.focus = true; _this.onKeyboardClick(CustomInputService.clickValue); } if (!parentFound && !isInput && !isKeyboard && !isClear && !_this._setFocus) { _this.focus = false; _this._setFocus = false; _this.onBlur.emit(_this._value); CustomInputService.hideKeyboard(); } _this.setFakeInputCls(); }; this.removeBlurListener = function () { document.removeEventListener('click', _this.doBlur, false); }; this.addBlurListener = function () { document.addEventListener('click', _this.doBlur, false); }; this.onInputBlur = function (value) { _this.focus = false; _this.setFakeInputCls(); _this.onBlur.emit(_this._value); CustomInputService.hideKeyboard(); }; this.onInputFocus = function () { _this.onFocus.emit(_this._value); _this.focus = true; _this._setFocus = false; _this.setFakeInputCls(); setTimeout(function () { CustomInputService.showKeyboard(); }, 100); }; this.setFakeInputCls = function () { var _a; _this.fakeInputCls = (_a = {}, _a["fake-input"] = true, _a['fake-input-disabled'] = _this._disabled, _a['focus'] = _this.focus, _a); }; this.setContainerCls = function () { _this.clsFakeContainerLeft = _this._moneyKeyboardAlign === 'left'; }; this.onKeyboardClick = function (keyboardItemValue) { /** @type {?} */ var valueAfterChange; // 删除键 if (keyboardItemValue === 'delete') { valueAfterChange = _this._value.substring(0, _this._value.length - 1); _this.onChange.emit(valueAfterChange); // 确认键 } else if (keyboardItemValue === 'confirm') { valueAfterChange = _this._value; _this.onChange.emit(valueAfterChange); _this.onInputBlur(_this._value); // 收起键 } else if (keyboardItemValue === 'hide') { valueAfterChange = _this._value; _this.onInputBlur(valueAfterChange); } else { if (_this._maxLength !== undefined && +_this._maxLength >= 0 && (_this._value + keyboardItemValue).length > _this._maxLength) { valueAfterChange = (_this._value + keyboardItemValue).substr(0, _this._maxLength); _this.onChange.emit(valueAfterChange); } else { valueAfterChange = _this._value + keyboardItemValue; _this.onChange.emit(valueAfterChange); } } _this._ngZone.run(function () { _this._value = valueAfterChange; }); }; } Object.defineProperty(CustomInput.prototype, "value", { get: /** * @return {?} */ function () { return this._value; }, set: /** * @param {?} v * @return {?} */ function (v) { if (typeof v === undefined || v === null) { this._value = ''; } else if (this._maxLength !== undefined && this._maxLength >= 0) { this._value = v.substr(0, this._maxLength); } else { this._value = v; } }, enumerable: true, configurable: true }); Object.defineProperty(CustomInput.prototype, "defaultValue", { set: /** * @param {?} value * @return {?} */ function (value) { this._defaultValue = value; this._value = this._defaultValue; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInput.prototype, "maxLength", { set: /** * @param {?} value * @return {?} */ function (value) { this._maxLength = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInput.prototype, "placeholder", { get: /** * @return {?} */ function () { return this._placeholder; }, set: /** * @param {?} value * @return {?} */ function (value) { this._placeholder = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInput.prototype, "editable", { set: /** * @param {?} value * @return {?} */ function (value) { this._editable = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInput.prototype, "disabled", { set: /** * @param {?} value * @return {?} */ function (value) { this._disabled = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInput.prototype, "moneyKeyboardAlign", { set: /** * @param {?} value * @return {?} */ function (value) { this._moneyKeyboardAlign = value; this.setContainerCls(); }, enumerable: true, configurable: true }); Object.defineProperty(CustomInput.prototype, "setFocus", { set: /** * @param {?} value * @return {?} */ function (value) { if (value) { this._setFocus = value.focus; if (this._setFocus) { this.inputFocus(); } } }, enumerable: true, configurable: true }); /** * @return {?} */ CustomInput.prototype.onFakeInputClick = /** * @return {?} */ function () { if (this._preventKeyboard) { return; } this.inputFocus(); }; /** * @return {?} */ CustomInput.prototype.ngOnInit = /** * @return {?} */ function () { this._preventKeyboard = this._disabled || !this._editable; this.setFakeInputCls(); this.setContainerCls(); }; /** * @return {?} */ CustomInput.prototype.ngOnDestroy = /** * @return {?} */ function () { this.removeBlurListener(); if (CustomInputService) { CustomInputService.hideKeyboard(); CustomInputService.compRef = null; } /** @type {?} */ var container = document.querySelector("#" + this.keyboardPrefixCls + "-container"); if (container) { container.remove(); } }; CustomInput.decorators = [ { type: Component, args: [{ selector: 'CustomInput', template: "<div *ngIf=\"value===''\" class=\"fake-input-placeholder\">\n {{placeholder}}\n</div>\n<div [ngClass]=\"fakeInputCls\" (click)=\"onFakeInputClick()\">\n {{value}}\n</div>\n", encapsulation: ViewEncapsulation.None, providers: [CustomInputService] }] } ]; /** @nocollapse */ CustomInput.ctorParameters = function () { return [ { type: ElementRef }, { type: CustomInputService }, { type: NgZone } ]; }; CustomInput.propDecorators = { value: [{ type: Input }], defaultValue: [{ type: Input }], maxLength: [{ type: Input }], placeholder: [{ type: Input }], editable: [{ type: Input }], disabled: [{ type: Input }], moneyKeyboardAlign: [{ type: Input }], setFocus: [{ type: Input }], onChange: [{ type: Output }], onBlur: [{ type: Output }], onFocus: [{ type: Output }], clsFakeContainer: [{ type: HostBinding, args: ['class.fake-input-container',] }], clsFakeContainerLeft: [{ type: HostBinding, args: ['class.fake-input-container-left',] }] }; return CustomInput; }()); export { CustomInput }; if (false) { /** @type {?} */ CustomInput.prototype.keyboardPrefixCls; /** @type {?} */ CustomInput.prototype.fakeInputCls; /** @type {?} */ CustomInput.prototype.focus; /** @type {?} */ CustomInput.prototype._value; /** @type {?} */ CustomInput.prototype._defaultValue; /** @type {?} */ CustomInput.prototype._placeholder; /** @type {?} */ CustomInput.prototype._maxLength; /** @type {?} */ CustomInput.prototype._editable; /** @type {?} */ CustomInput.prototype._disabled; /** @type {?} */ CustomInput.prototype._setFocus; /** @type {?} */ CustomInput.prototype._preventKeyboard; /** @type {?} */ CustomInput.prototype._moneyKeyboardAlign; /** @type {?} */ CustomInput.prototype.onChange; /** @type {?} */ CustomInput.prototype.onBlur; /** @type {?} */ CustomInput.prototype.onFocus; /** @type {?} */ CustomInput.prototype.clsFakeContainer; /** @type {?} */ CustomInput.prototype.clsFakeContainerLeft; /** @type {?} */ CustomInput.prototype.inputFocus; /** @type {?} */ CustomInput.prototype.doBlur; /** @type {?} */ CustomInput.prototype.removeBlurListener; /** @type {?} */ CustomInput.prototype.addBlurListener; /** @type {?} */ CustomInput.prototype.onInputBlur; /** @type {?} */ CustomInput.prototype.onInputFocus; /** @type {?} */ CustomInput.prototype.setFakeInputCls; /** @type {?} */ CustomInput.prototype.setContainerCls; /** @type {?} */ CustomInput.prototype.onKeyboardClick; /** @type {?} */ CustomInput.prototype._ref; /** @type {?} */ CustomInput.prototype._customInputService; /** @type {?} */ CustomInput.prototype._ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW5wdXQtaXRlbS9jdXN0b20taW5wdXQvY3VzdG9tLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04saUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0lBc0YxRCxxQkFBb0IsSUFBZ0IsRUFBVSxtQkFBdUMsRUFBVSxPQUFlO1FBQTlHLGlCQUFrSDtRQUE5RixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVE7aUNBN0VsRixvQkFBb0I7cUJBRS9CLEtBQUs7c0JBRUcsRUFBRTs2QkFDSyxFQUFFOzRCQUNILEVBQUU7eUJBRUosSUFBSTt5QkFDSixLQUFLO3lCQUNMLEtBQUs7d0JBd0RKLElBQUksWUFBWSxFQUFPO3NCQUV6QixJQUFJLFlBQVksRUFBTzt1QkFFdEIsSUFBSSxZQUFZLEVBQU87Z0NBR3hCLElBQUk7MEJBYW5CO1lBQ1gsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O1lBQzFCLElBQU0sS0FBSyxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFJLENBQUMsU0FBUyxFQUFFO2dCQUM1QixLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDckI7WUFDRCxVQUFVLENBQUM7Z0JBQ1QsS0FBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3hCLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDUjtzQkFFUSxVQUFB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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSG9zdEJpbmRpbmcsXG4gIE5nWm9uZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEN1c3RvbUlucHV0U2VydmljZSB9IGZyb20gJy4vY3VzdG9tLWlucHV0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDdXN0b21JbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20taW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtDdXN0b21JbnB1dFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUlucHV0IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBrZXlib2FyZFByZWZpeENsczogc3RyaW5nID0gJ2FtLW51bWJlci1rZXlib2FyZCc7XG4gIGZha2VJbnB1dENsczogb2JqZWN0O1xuICBmb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9tYXhMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zZXRGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wcmV2ZW50S2V5Ym9hcmQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX21vbmV5S2V5Ym9hcmRBbGlnbjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX21heExlbmd0aCA+PSAwKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHYuc3Vic3RyKDAsIHRoaXMuX21heExlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZWRpdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lZGl0YWJsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1vbmV5S2V5Ym9hcmRBbGlnbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbW9uZXlLZXlib2FyZEFsaWduID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2V0Rm9jdXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3NldEZvY3VzID0gdmFsdWUuZm9jdXM7XG4gICAgICBpZiAodGhpcy5fc2V0Rm9jdXMpIHtcbiAgICAgICAgdGhpcy5pbnB1dEZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uRm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mYWtlLWlucHV0LWNvbnRhaW5lcicpXG4gIGNsc0Zha2VDb250YWluZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZha2UtaW5wdXQtY29udGFpbmVyLWxlZnQnKVxuICBjbHNGYWtlQ29udGFpbmVyTGVmdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX2N1c3RvbUlucHV0U2VydmljZTogQ3VzdG9tSW5wdXRTZXJ2aWNlLCBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge31cblxuICBvbkZha2VJbnB1dENsaWNrKCkge1xuICAgIGlmICh0aGlzLl9wcmV2ZW50S2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnB1dEZvY3VzKCk7XG4gIH1cblxuICBpbnB1dEZvY3VzID0gKCkgPT4ge1xuICAgIHRoaXMucmVtb3ZlQmx1ckxpc3RlbmVyKCk7XG4gICAgY29uc3QgZm9jdXMgPSB0aGlzLmZvY3VzO1xuICAgIGlmICghZm9jdXMgfHwgdGhpcy5fc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMub25JbnB1dEZvY3VzKCk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hZGRCbHVyTGlzdGVuZXIoKTtcbiAgICB9LCA1MCk7XG4gIH07XG5cbiAgZG9CbHVyID0gZXYgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgLy8g54K55Ye75piv5ZCm5piv57uE5Lu25pys6LqrXG4gICAgbGV0IHBhcmVudEZvdW5kID0gZmFsc2U7XG4gICAgLy8g54K55Ye755uu5qCH5piv5ZCm5pivY3VzdG9tLWlucHV0XG4gICAgbGV0IGlzSW5wdXQgPSBmYWxzZTtcbiAgICAvLyDngrnlh7vnm67moIfmmK/lkKbmmK9jdXN0b20ta2V5Ym9hcmRcbiAgICBsZXQgaXNLZXlib2FyZCA9IGZhbHNlO1xuICAgIGxldCBpc0NsZWFyID0gZmFsc2U7XG4gICAgbGV0IHRhcmdldCA9IGV2LnRhcmdldDtcbiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gbnVsbCAmJiAhcGFyZW50Rm91bmQpIHtcbiAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX3JlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHBhcmVudEZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnY3VzdG9taW5wdXQnKSB7XG4gICAgICAgIGlzSW5wdXQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC5sb2NhbE5hbWUgPT09ICdjdXN0b21rZXlib2FyZCcpIHtcbiAgICAgICAgaXNLZXlib2FyZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdhbS1pbnB1dC1jbGVhcicpID49IDApIHtcbiAgICAgICAgaXNDbGVhciA9IHRydWU7XG4gICAgICB9XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgLy8g5b2T54K55Ye755uu5qCH5piv5pys6Lqr55qE5pe25YCZ77yM6I635Y+W54Sm54K544CB5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICAvLyDlvZPngrnlh7vnm67moIfkuI3mmK/mnKzouqvkvYbmmK/lhbbku5bnmoRjdXN0b20taW5wdXTml7bvvIzlpLHljrvnhKbngrnjgIHkuI3pmpDol49rZXlib2FyZFxuICAgIC8vIOW9k+eCueWHu+ebruagh+aYr2tleWJvYXJk5pe277yM5LiN5aSx5Y6754Sm54K577yM5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICBpZiAocGFyZW50Rm91bmQpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaXNJbnB1dCkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMub25CbHVyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb2N1cyAmJiBpc0tleWJvYXJkKSB7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMub25LZXlib2FyZENsaWNrKEN1c3RvbUlucHV0U2VydmljZS5jbGlja1ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCFwYXJlbnRGb3VuZCAmJiAhaXNJbnB1dCAmJiAhaXNLZXlib2FyZCAmJiAhaXNDbGVhciAmJiAhdGhpcy5fc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRGYWtlSW5wdXRDbHMoKTtcbiAgfTtcblxuICByZW1vdmVCbHVyTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmRvQmx1ciwgZmFsc2UpO1xuICB9O1xuXG4gIGFkZEJsdXJMaXN0ZW5lciA9ICgpID0+IHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9CbHVyLCBmYWxzZSk7XG4gIH07XG5cbiAgb25JbnB1dEJsdXIgPSB2YWx1ZSA9PiB7XG4gICAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLmhpZGVLZXlib2FyZCgpO1xuICB9O1xuXG4gIG9uSW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLm9uRm9jdXMuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5fc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLnNob3dLZXlib2FyZCgpO1xuICAgIH0sIDEwMCk7XG4gIH07XG5cbiAgc2V0RmFrZUlucHV0Q2xzID0gKCkgPT4ge1xuICAgIHRoaXMuZmFrZUlucHV0Q2xzID0ge1xuICAgICAgW2BmYWtlLWlucHV0YF06IHRydWUsXG4gICAgICBbJ2Zha2UtaW5wdXQtZGlzYWJsZWQnXTogdGhpcy5fZGlzYWJsZWQsXG4gICAgICBbJ2ZvY3VzJ106IHRoaXMuZm9jdXNcbiAgICB9O1xuICB9O1xuXG4gIHNldENvbnRhaW5lckNscyA9ICgpID0+IHtcbiAgICB0aGlzLmNsc0Zha2VDb250YWluZXJMZWZ0ID0gdGhpcy5fbW9uZXlLZXlib2FyZEFsaWduID09PSAnbGVmdCc7XG4gIH07XG5cbiAgb25LZXlib2FyZENsaWNrID0ga2V5Ym9hcmRJdGVtVmFsdWUgPT4ge1xuICAgIGxldCB2YWx1ZUFmdGVyQ2hhbmdlO1xuICAgIC8vIOWIoOmZpOmUrlxuICAgIGlmIChrZXlib2FyZEl0ZW1WYWx1ZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZS5zdWJzdHJpbmcoMCwgdGhpcy5fdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgICAvLyDnoa7orqTplK5cbiAgICB9IGVsc2UgaWYgKGtleWJvYXJkSXRlbVZhbHVlID09PSAnY29uZmlybScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIHRoaXMub25JbnB1dEJsdXIodGhpcy5fdmFsdWUpO1xuICAgICAgLy8g5pS26LW36ZSuXG4gICAgfSBlbHNlIGlmIChrZXlib2FyZEl0ZW1WYWx1ZSA9PT0gJ2hpZGUnKSB7XG4gICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gdGhpcy5fdmFsdWU7XG4gICAgICB0aGlzLm9uSW5wdXRCbHVyKHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX21heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICt0aGlzLl9tYXhMZW5ndGggPj0gMCAmJlxuICAgICAgICAodGhpcy5fdmFsdWUgKyBrZXlib2FyZEl0ZW1WYWx1ZSkubGVuZ3RoID4gdGhpcy5fbWF4TGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgdmFsdWVBZnRlckNoYW5nZSA9ICh0aGlzLl92YWx1ZSArIGtleWJvYXJkSXRlbVZhbHVlKS5zdWJzdHIoMCwgdGhpcy5fbWF4TGVuZ3RoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlICsga2V5Ym9hcmRJdGVtVmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlQWZ0ZXJDaGFuZ2U7XG4gICAgfSk7XG4gIH07XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fcHJldmVudEtleWJvYXJkID0gdGhpcy5fZGlzYWJsZWQgfHwgIXRoaXMuX2VkaXRhYmxlO1xuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gICAgdGhpcy5zZXRDb250YWluZXJDbHMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlQmx1ckxpc3RlbmVyKCk7XG4gICAgaWYgKEN1c3RvbUlucHV0U2VydmljZSkge1xuICAgICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLmhpZGVLZXlib2FyZCgpO1xuICAgICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLmNvbXBSZWYgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHt0aGlzLmtleWJvYXJkUHJlZml4Q2xzfS1jb250YWluZXJgKTtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=