ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
462 lines • 33 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, HostBinding, NgZone } from '@angular/core';
import { CustomInputService } from './custom-input.service';
export class CustomInputComponent {
/**
* @param {?} _ref
* @param {?} _customInputService
* @param {?} _ngZone
*/
constructor(_ref, _customInputService, _ngZone) {
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 = (/**
* @return {?}
*/
() => {
this.removeBlurListener();
/** @type {?} */
const focus = this.focus;
if (!focus || this._setFocus) {
this.onInputFocus();
}
setTimeout((/**
* @return {?}
*/
() => {
this.addBlurListener();
}), 50);
});
this.doBlur = (/**
* @param {?} ev
* @return {?}
*/
ev => {
/** @type {?} */
const value = this._value;
// 点击是否是组件本身
/** @type {?} */
let parentFound = false;
// 点击目标是否是custom-input
/** @type {?} */
let isInput = false;
// 点击目标是否是custom-keyboard
/** @type {?} */
let isKeyboard = false;
/** @type {?} */
let isClear = false;
/** @type {?} */
let 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 = (/**
* @return {?}
*/
() => {
document.removeEventListener('click', this.doBlur, false);
});
this.addBlurListener = (/**
* @return {?}
*/
() => {
document.addEventListener('click', this.doBlur, false);
});
this.onInputBlur = (/**
* @param {?} value
* @return {?}
*/
value => {
this.focus = false;
this.setFakeInputCls();
this.onBlur.emit(this._value);
CustomInputService.hideKeyboard();
});
this.onInputFocus = (/**
* @return {?}
*/
() => {
this.onFocus.emit(this._value);
this.focus = true;
this._setFocus = false;
this.setFakeInputCls();
setTimeout((/**
* @return {?}
*/
() => {
CustomInputService.showKeyboard();
}), 100);
});
this.setFakeInputCls = (/**
* @return {?}
*/
() => {
this.fakeInputCls = {
[`fake-input`]: true,
['fake-input-disabled']: this._disabled,
['focus']: this.focus
};
});
this.setContainerCls = (/**
* @return {?}
*/
() => {
this.clsFakeContainerLeft = this._moneyKeyboardAlign === 'left';
});
this.onKeyboardClick = (/**
* @param {?} keyboardItemValue
* @return {?}
*/
keyboardItemValue => {
/** @type {?} */
let 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((/**
* @return {?}
*/
() => {
this._value = valueAfterChange;
}));
});
}
/**
* @return {?}
*/
get value() {
return this._value;
}
/**
* @param {?} v
* @return {?}
*/
set value(v) {
if (typeof v === 'undefined' || v === null) {
this._value = '';
}
else if (this._maxLength !== undefined && this._maxLength >= 0) {
this._value = v.toString().substr(0, this._maxLength);
}
else {
this._value = v.toString();
}
}
/**
* @param {?} value
* @return {?}
*/
set defaultValue(value) {
this._defaultValue = value;
if (!this._value) {
this._value = this._defaultValue.toString();
}
}
/**
* @param {?} value
* @return {?}
*/
set maxLength(value) {
this._maxLength = value;
}
/**
* @return {?}
*/
get placeholder() {
return this._placeholder;
}
/**
* @param {?} value
* @return {?}
*/
set placeholder(value) {
this._placeholder = value;
}
/**
* @param {?} value
* @return {?}
*/
set editable(value) {
this._editable = value;
}
/**
* @param {?} value
* @return {?}
*/
set disabled(value) {
this._disabled = value;
}
/**
* @return {?}
*/
get fontColor() {
return this._fontColor;
}
/**
* @param {?} value
* @return {?}
*/
set fontColor(value) {
this._fontColor = value;
}
/**
* @param {?} value
* @return {?}
*/
set moneyKeyboardAlign(value) {
this._moneyKeyboardAlign = value;
this.setContainerCls();
}
/**
* @param {?} value
* @return {?}
*/
set setFocus(value) {
if (value) {
this._setFocus = value.focus;
if (this._setFocus) {
this.inputFocus();
}
}
}
/**
* @return {?}
*/
onFakeInputClick() {
if (this._preventKeyboard) {
return;
}
this.inputFocus();
}
/**
* @return {?}
*/
ngOnInit() {
this._preventKeyboard = this._disabled || !this._editable;
this.setFakeInputCls();
this.setContainerCls();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.removeBlurListener();
if (CustomInputService) {
CustomInputService.hideKeyboard();
CustomInputService.compRef = null;
}
/** @type {?} */
const container = document.querySelector(`#${this.keyboardPrefixCls}-container`);
if (container) {
container.remove();
}
}
}
CustomInputComponent.decorators = [
{ type: Component, args: [{
selector: 'CustomInput',
template: "<div *ngIf=\"value === ''\" class=\"fake-input-placeholder\">\n {{ placeholder }}\n</div>\n<div [ngClass]=\"fakeInputCls\" [style.color]=\"fontColor\" (click)=\"onFakeInputClick()\">\n {{ value }}\n</div>\n",
encapsulation: ViewEncapsulation.None,
providers: [CustomInputService]
}] }
];
/** @nocollapse */
CustomInputComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: CustomInputService },
{ type: NgZone }
];
CustomInputComponent.propDecorators = {
value: [{ type: Input }],
defaultValue: [{ type: Input }],
maxLength: [{ type: Input }],
placeholder: [{ type: Input }],
editable: [{ type: Input }],
disabled: [{ type: Input }],
fontColor: [{ 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',] }]
};
if (false) {
/** @type {?} */
CustomInputComponent.prototype.keyboardPrefixCls;
/** @type {?} */
CustomInputComponent.prototype.fakeInputCls;
/** @type {?} */
CustomInputComponent.prototype.focus;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._value;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._defaultValue;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._placeholder;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._maxLength;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._editable;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._setFocus;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._preventKeyboard;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._moneyKeyboardAlign;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._fontColor;
/** @type {?} */
CustomInputComponent.prototype.onChange;
/** @type {?} */
CustomInputComponent.prototype.onBlur;
/** @type {?} */
CustomInputComponent.prototype.onFocus;
/** @type {?} */
CustomInputComponent.prototype.clsFakeContainer;
/** @type {?} */
CustomInputComponent.prototype.clsFakeContainerLeft;
/** @type {?} */
CustomInputComponent.prototype.inputFocus;
/** @type {?} */
CustomInputComponent.prototype.doBlur;
/** @type {?} */
CustomInputComponent.prototype.removeBlurListener;
/** @type {?} */
CustomInputComponent.prototype.addBlurListener;
/** @type {?} */
CustomInputComponent.prototype.onInputBlur;
/** @type {?} */
CustomInputComponent.prototype.onInputFocus;
/** @type {?} */
CustomInputComponent.prototype.setFakeInputCls;
/** @type {?} */
CustomInputComponent.prototype.setContainerCls;
/** @type {?} */
CustomInputComponent.prototype.onKeyboardClick;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._ref;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._customInputService;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW5wdXQtaXRlbS9jdXN0b20taW5wdXQvY3VzdG9tLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04saUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFRNUQsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7O0lBd0YvQixZQUFvQixJQUFnQixFQUFVLG1CQUF1QyxFQUFVLE9BQWU7UUFBMUYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBdkY5RyxzQkFBaUIsR0FBVyxvQkFBb0IsQ0FBQztRQUVqRCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBRWYsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUUxQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQWtFbkMsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXRELFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVwRCxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHckQscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBYWpDLGVBQVU7OztRQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUs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c0Q7O0lBQ3RELHNDQUNvRDs7SUFDcEQsdUNBQ3FEOztJQUVyRCxnREFDaUM7O0lBQ2pDLG9EQUM4Qjs7SUFXOUIsMENBU0M7O0lBRUQsc0NBOENDOztJQUVELGtEQUVDOztJQUVELCtDQUVDOztJQUVELDJDQUtDOztJQUVELDRDQVFDOztJQUVELCtDQU1DOztJQUVELCtDQUVDOztJQUVELCtDQStCQzs7Ozs7SUF4SVcsb0NBQXdCOzs7OztJQUFFLG1EQUErQzs7Ozs7SUFBRSx1Q0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBIb3N0QmluZGluZyxcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3VzdG9tSW5wdXRTZXJ2aWNlIH0gZnJvbSAnLi9jdXN0b20taW5wdXQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0N1c3RvbUlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW0N1c3RvbUlucHV0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGtleWJvYXJkUHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tbnVtYmVyLWtleWJvYXJkJztcbiAgZmFrZUlucHV0Q2xzOiBvYmplY3Q7XG4gIGZvY3VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX21heExlbmd0aDogbnVtYmVyO1xuICBwcml2YXRlIF9lZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3NldEZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZXZlbnRLZXlib2FyZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfbW9uZXlLZXlib2FyZEFsaWduOiBzdHJpbmc7XG4gIHByaXZhdGUgX2ZvbnRDb2xvcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyB8fCB2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fbWF4TGVuZ3RoID49IDApIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdi50b1N0cmluZygpLnN1YnN0cigwLCB0aGlzLl9tYXhMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHYudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZWRpdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lZGl0YWJsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGZvbnRDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9udENvbG9yO1xuICB9XG4gIHNldCBmb250Q29sb3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2ZvbnRDb2xvciA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtb25leUtleWJvYXJkQWxpZ24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX21vbmV5S2V5Ym9hcmRBbGlnbiA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNldEZvY3VzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1cyA9IHZhbHVlLmZvY3VzO1xuICAgICAgaWYgKHRoaXMuX3NldEZvY3VzKSB7XG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmFrZS1pbnB1dC1jb250YWluZXInKVxuICBjbHNGYWtlQ29udGFpbmVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mYWtlLWlucHV0LWNvbnRhaW5lci1sZWZ0JylcbiAgY2xzRmFrZUNvbnRhaW5lckxlZnQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9jdXN0b21JbnB1dFNlcnZpY2U6IEN1c3RvbUlucHV0U2VydmljZSwgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgb25GYWtlSW5wdXRDbGljaygpIHtcbiAgICBpZiAodGhpcy5fcHJldmVudEtleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5wdXRGb2N1cygpO1xuICB9XG5cbiAgaW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLnJlbW92ZUJsdXJMaXN0ZW5lcigpO1xuICAgIGNvbnN0IGZvY3VzID0gdGhpcy5mb2N1cztcbiAgICBpZiAoIWZvY3VzIHx8IHRoaXMuX3NldEZvY3VzKSB7XG4gICAgICB0aGlzLm9uSW5wdXRGb2N1cygpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYWRkQmx1ckxpc3RlbmVyKCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgZG9CbHVyID0gZXYgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgLy8g54K55Ye75piv5ZCm5piv57uE5Lu25pys6LqrXG4gICAgbGV0IHBhcmVudEZvdW5kID0gZmFsc2U7XG4gICAgLy8g54K55Ye755uu5qCH5piv5ZCm5pivY3VzdG9tLWlucHV0XG4gICAgbGV0IGlzSW5wdXQgPSBmYWxzZTtcbiAgICAvLyDngrnlh7vnm67moIfmmK/lkKbmmK9jdXN0b20ta2V5Ym9hcmRcbiAgICBsZXQgaXNLZXlib2FyZCA9IGZhbHNlO1xuICAgIGxldCBpc0NsZWFyID0gZmFsc2U7XG4gICAgbGV0IHRhcmdldCA9IGV2LnRhcmdldDtcbiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gbnVsbCAmJiAhcGFyZW50Rm91bmQpIHtcbiAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX3JlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHBhcmVudEZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnY3VzdG9taW5wdXQnKSB7XG4gICAgICAgIGlzSW5wdXQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC5sb2NhbE5hbWUgPT09ICdjdXN0b21rZXlib2FyZCcpIHtcbiAgICAgICAgaXNLZXlib2FyZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdhbS1pbnB1dC1jbGVhcicpID49IDApIHtcbiAgICAgICAgaXNDbGVhciA9IHRydWU7XG4gICAgICB9XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgLy8g5b2T54K55Ye755uu5qCH5piv5pys6Lqr55qE5pe25YCZ77yM6I635Y+W54Sm54K544CB5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICAvLyDlvZPngrnlh7vnm67moIfkuI3mmK/mnKzouqvkvYbmmK/lhbbku5bnmoRjdXN0b20taW5wdXTml7bvvIzlpLHljrvnhKbngrnjgIHkuI3pmpDol49rZXlib2FyZFxuICAgIC8vIOW9k+eCueWHu+ebruagh+aYr2tleWJvYXJk5pe277yM5LiN5aSx5Y6754Sm54K577yM5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICBpZiAocGFyZW50Rm91bmQpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaXNJbnB1dCkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMub25CbHVyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb2N1cyAmJiBpc0tleWJvYXJkKSB7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMub25LZXlib2FyZENsaWNrKEN1c3RvbUlucHV0U2VydmljZS5jbGlja1ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCFwYXJlbnRGb3VuZCAmJiAhaXNJbnB1dCAmJiAhaXNLZXlib2FyZCAmJiAhaXNDbGVhciAmJiAhdGhpcy5fc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRGYWtlSW5wdXRDbHMoKTtcbiAgfVxuXG4gIHJlbW92ZUJsdXJMaXN0ZW5lciA9ICgpID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9CbHVyLCBmYWxzZSk7XG4gIH1cblxuICBhZGRCbHVyTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmRvQmx1ciwgZmFsc2UpO1xuICB9XG5cbiAgb25JbnB1dEJsdXIgPSB2YWx1ZSA9PiB7XG4gICAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLmhpZGVLZXlib2FyZCgpO1xuICB9XG5cbiAgb25JbnB1dEZvY3VzID0gKCkgPT4ge1xuICAgIHRoaXMub25Gb2N1cy5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRGb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2Uuc2hvd0tleWJvYXJkKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHNldEZha2VJbnB1dENscyA9ICgpID0+IHtcbiAgICB0aGlzLmZha2VJbnB1dENscyA9IHtcbiAgICAgIFtgZmFrZS1pbnB1dGBdOiB0cnVlLFxuICAgICAgWydmYWtlLWlucHV0LWRpc2FibGVkJ106IHRoaXMuX2Rpc2FibGVkLFxuICAgICAgWydmb2N1cyddOiB0aGlzLmZvY3VzXG4gICAgfTtcbiAgfVxuXG4gIHNldENvbnRhaW5lckNscyA9ICgpID0+IHtcbiAgICB0aGlzLmNsc0Zha2VDb250YWluZXJMZWZ0ID0gdGhpcy5fbW9uZXlLZXlib2FyZEFsaWduID09PSAnbGVmdCc7XG4gIH1cblxuICBvbktleWJvYXJkQ2xpY2sgPSBrZXlib2FyZEl0ZW1WYWx1ZSA9PiB7XG4gICAgbGV0IHZhbHVlQWZ0ZXJDaGFuZ2U7XG4gICAgLy8g5Yig6Zmk6ZSuXG4gICAgaWYgKGtleWJvYXJkSXRlbVZhbHVlID09PSAnZGVsZXRlJykge1xuICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlLnN1YnN0cmluZygwLCB0aGlzLl92YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIC8vIOehruiupOmUrlxuICAgIH0gZWxzZSBpZiAoa2V5Ym9hcmRJdGVtVmFsdWUgPT09ICdjb25maXJtJykge1xuICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgdGhpcy5vbklucHV0Qmx1cih0aGlzLl92YWx1ZSk7XG4gICAgICAvLyDmlLbotbfplK5cbiAgICB9IGVsc2UgaWYgKGtleWJvYXJkSXRlbVZhbHVlID09PSAnaGlkZScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMub25JbnB1dEJsdXIodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgK3RoaXMuX21heExlbmd0aCA+PSAwICYmXG4gICAgICAgICh0aGlzLl92YWx1ZSArIGtleWJvYXJkSXRlbVZhbHVlKS5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGhcbiAgICAgICkge1xuICAgICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gKHRoaXMuX3ZhbHVlICsga2V5Ym9hcmRJdGVtVmFsdWUpLnN1YnN0cigwLCB0aGlzLl9tYXhMZW5ndGgpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gdGhpcy5fdmFsdWUgKyBrZXlib2FyZEl0ZW1WYWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVBZnRlckNoYW5nZTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX3ByZXZlbnRLZXlib2FyZCA9IHRoaXMuX2Rpc2FibGVkIHx8ICF0aGlzLl9lZGl0YWJsZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUJsdXJMaXN0ZW5lcigpO1xuICAgIGlmIChDdXN0b21JbnB1dFNlcnZpY2UpIHtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5jb21wUmVmID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5rZXlib2FyZFByZWZpeENsc30tY29udGFpbmVyYCk7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19