ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
631 lines • 52.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Input, Output, Component, forwardRef, ElementRef, TemplateRef, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core';
import { ModalOptions } from './modal-options.provider';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ModalRef } from './modal-ref.class';
/**
* @template T, R
*/
var ModalComponent = /** @class */ (function (_super) {
tslib_1.__extends(ModalComponent, _super);
function ModalComponent(option, elementRef) {
var _this = _super.call(this) || this;
_this.option = option;
_this.elementRef = elementRef;
_this.autoFocus = { focus: true, date: new Date() };
_this.transitionName = '';
_this.maskTransitionName = '';
_this.wrapCls = {};
_this.cls = {};
_this.btnGroupClass = {};
_this.data = {
text: '',
password: ''
};
_this.onClose = new EventEmitter();
_this.afterOpenEmitter = new EventEmitter();
_this.afterCloseEmitter = new EventEmitter();
return _this;
}
Object.defineProperty(ModalComponent.prototype, "title", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.title = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "closable", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.closable = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "maskClosable", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.maskClosable = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "popup", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.popup = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "animationType", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.animationType = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "transparent", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.transparent = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "footer", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.footer = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "platform", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.platform = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "className", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.className = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "wrapClassName", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.wrapClassName = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "actions", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.footer = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "defaultValue", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.defaultValue = value !== undefined ? value : ['', ''];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "type", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.type = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "placeholders", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.placeholders = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "operation", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.option.operation = value;
this.setClassMap();
},
enumerable: true,
configurable: true
});
/**
* @param {?} event
* @return {?}
*/
ModalComponent.prototype.panend = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.option.closable || this.option.maskClosable || this.option.popup) {
if ((event && event.target && event.target.getAttribute('role') === 'dialog') ||
event.target.getAttribute('role') === 'close') {
event.preventDefault();
event.stopPropagation();
if (this.option.close) {
this.option.close();
}
else {
this.onClose.emit();
this.leaveAnimation();
}
}
}
};
/**
* @param {?} value
* @return {?}
*/
ModalComponent.prototype.isTemplateRef = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value instanceof TemplateRef;
};
/**
* @param {?} value
* @return {?}
*/
ModalComponent.prototype.isNoTitle = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value === '' || value === null || value === undefined;
};
/**
* @param {?} visible
* @return {?}
*/
ModalComponent.prototype.setTransitionName = /**
* @param {?} visible
* @return {?}
*/
function (visible) {
if (!visible) {
this.leaveAnimation();
}
else {
if (this.option.animated) {
if (this.option.transparent) {
if (this.setActiveName(this.option.transitionName)) {
this.transitionName = this.setActiveName(this.option.transitionName);
this.maskTransitionName = this.setActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setActiveName('am-fade');
}
}
else {
if (this.setActiveName(this.option.transitionName)) {
this.transitionName = this.setActiveName(this.option.transitionName);
this.maskTransitionName = this.setActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setActiveName('am-slide-up');
}
}
if (this.option.popup) {
this.transitionName =
this.option.animationType === 'slide-up'
? this.setActiveName('am-slide-up')
: this.setActiveName('am-slide-down');
this.maskTransitionName = this.setActiveName('am-fade');
}
}
this.setClassMap();
}
};
/**
* @param {?} name
* @return {?}
*/
ModalComponent.prototype.setActiveName = /**
* @param {?} name
* @return {?}
*/
function (name) {
return name.length > 0 ? name + "-enter " + name + "-enter-active" : null;
};
/**
* @param {?} name
* @return {?}
*/
ModalComponent.prototype.setLeaveActiveName = /**
* @param {?} name
* @return {?}
*/
function (name) {
return name.length > 0 ? name + "-leave " + name + "-leave-active" : null;
};
/**
* @return {?}
*/
ModalComponent.prototype.setClassMap = /**
* @return {?}
*/
function () {
var _a, _b, _c;
this.wrapCls = (_a = {},
_a[this.option.wrapClassName] = true,
_a[this.option.prefixCls + "-wrap-popup"] = this.option.popup,
_a);
this.cls = (_b = {},
_b[this.option.className] = true,
_b[this.option.prefixCls + "-transparent"] = this.option.transparent,
_b[this.option.prefixCls + "-popup"] = this.option.popup,
_b[this.option.prefixCls + "-popup-" + this.option.animationType] = this.option.popup && this.option.animationType,
_b[this.option.prefixCls + "-android"] = this.option.platform === 'android',
_b);
this.btnGroupClass = (_c = {},
_c[this.option.prefixCls + "-button-group-" + (this.option.footer.length === 2 && !this.option.operation ? 'h' : 'v')] = true,
_c[this.option.prefixCls + "-button-group-" + (this.option.operation ? 'operation' : 'normal')] = true,
_c);
};
/**
* @param {?} type
* @param {?} value
* @return {?}
*/
ModalComponent.prototype.inputChange = /**
* @param {?} type
* @param {?} value
* @return {?}
*/
function (type, value) {
this.data[type] = value;
};
/**
* @return {?}
*/
ModalComponent.prototype.leaveAnimation = /**
* @return {?}
*/
function () {
var _this = this;
if (this.option.animated) {
if (this.option.transparent) {
if (this.setLeaveActiveName(this.option.transitionName)) {
this.transitionName = this.setLeaveActiveName(this.option.transitionName);
this.maskTransitionName = this.setLeaveActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setLeaveActiveName('am-fade');
}
}
else {
if (this.setLeaveActiveName(this.option.transitionName)) {
this.transitionName = this.setLeaveActiveName(this.option.transitionName);
this.maskTransitionName = this.setLeaveActiveName(this.option.maskTransitionName);
}
else {
this.transitionName = this.maskTransitionName = this.setLeaveActiveName('am-slide-up');
}
}
if (this.option.popup) {
this.transitionName =
this.option.animationType === 'slide-up'
? this.setLeaveActiveName('am-slide-up')
: this.setLeaveActiveName('am-slide-down');
this.maskTransitionName = this.setLeaveActiveName('am-fade');
}
}
setTimeout((/**
* @return {?}
*/
function () {
_this.option.visible = false;
if (_this.onChanged) {
_this.onChanged(_this.option.visible);
}
}), 200);
};
/**
* @param {?} value
* @return {?}
*/
ModalComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
this.option.visible = value;
}
this.setTransitionName(value);
};
/**
* @param {?} fn
* @return {?}
*/
ModalComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChanged = fn;
};
/**
* @param {?} fn
* @return {?}
*/
ModalComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
Object.defineProperty(ModalComponent.prototype, "afterOpen", {
get: /**
* @return {?}
*/
function () {
return this.afterOpenEmitter.asObservable();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ModalComponent.prototype, "afterClose", {
get: /**
* @return {?}
*/
function () {
return this.afterCloseEmitter.asObservable();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ModalComponent.prototype.getInstance = /**
* @return {?}
*/
function () {
return this;
};
/**
* @return {?}
*/
ModalComponent.prototype.getElement = /**
* @return {?}
*/
function () {
return this.elementRef && this.elementRef.nativeElement;
};
/**
* @return {?}
*/
ModalComponent.prototype.close = /**
* @return {?}
*/
function () {
if (this.option.closeWithAnimation) {
this.option.closeWithAnimation();
}
else {
this.onClose.emit();
this.leaveAnimation();
}
};
/**
* @return {?}
*/
ModalComponent.prototype.triggerOk = /**
* @return {?}
*/
function () {
if (this.option.footer.length > 1) {
/** @type {?} */
var button = this.option.footer[1];
button.onPress();
}
};
/**
* @return {?}
*/
ModalComponent.prototype.triggerCancel = /**
* @return {?}
*/
function () {
if (this.option.footer.length > 0) {
/** @type {?} */
var button = this.option.footer[0];
button.onPress();
}
};
/**
* @return {?}
*/
ModalComponent.prototype.destroy = /**
* @return {?}
*/
function () {
this.close();
};
ModalComponent.decorators = [
{ type: Component, args: [{
selector: 'Modal',
template: "<div *ngIf=\"option.visible\">\n <div class=\"{{ option.prefixCls }}-mask {{ maskTransitionName }}\"></div>\n <div role=\"dialog\" class=\"{{ option.prefixCls }}-wrap {{ transitionName }}\" [ngClass]=\"wrapCls\">\n <div role=\"document\" class=\"{{ option.prefixCls }}\" [ngClass]=\"cls\">\n <div class=\"{{ option.prefixCls }}-content\">\n <div *ngIf=\"option.closable\" style=\"width: 100%; height: 21px;\">\n <div role=\"close\" class=\"{{ option.prefixCls }}-close\">\n <span role=\"close\" class=\"{{ option.prefixCls }}-close-x\"></span>\n </div>\n </div>\n <div *ngIf=\"!isNoTitle(option.title)\" class=\"{{ option.prefixCls }}-header\">\n <div *ngIf=\"!isTemplateRef(option.title)\" class=\"{{ option.prefixCls }}-title\">{{ option.title }}</div>\n <ng-template *ngIf=\"isTemplateRef(option.title)\" [ngTemplateOutlet]=\"option.title\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-body\">\n <ng-content></ng-content>\n <div *ngIf=\"!isTemplateRef(option.message)\" class=\"{{ option.prefixCls }}-alert-content\">\n {{ option.message }}\n </div>\n <ng-template *ngIf=\"isTemplateRef(option.message)\" [ngTemplateOutlet]=\"option.message\"></ng-template>\n <ng-template *ngIf=\"option.type === 'default'\" [ngTemplateOutlet]=\"promptDefault\"></ng-template>\n <ng-template *ngIf=\"option.type === 'secure-text'\" [ngTemplateOutlet]=\"promptSecure\"></ng-template>\n <ng-template *ngIf=\"option.type === 'login-password'\" [ngTemplateOutlet]=\"promptPassword\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-footer\">\n <div [ngClass]=\"btnGroupClass\" role=\"group\">\n <div\n Button\n role=\"button\"\n *ngFor=\"let button of option.footer\"\n [className]=\"'am-modal-button'\"\n [ngStyle]=\"button.style\"\n (onClick)=\"button.onPress()\"\n >\n {{ button.text }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #promptPassword>\n <div class=\"{{ option.prefixCls }}-input-container\">\n <div class=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[1] || ''\"\n [(ngModel)]=\"option.defaultValue[1]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptSecure>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptDefault>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n </div>\n</ng-template>\n",
encapsulation: ViewEncapsulation.None,
providers: [
ModalOptions,
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return ModalComponent; })),
multi: true
}
]
}] }
];
/** @nocollapse */
ModalComponent.ctorParameters = function () { return [
{ type: ModalOptions },
{ type: ElementRef }
]; };
ModalComponent.propDecorators = {
title: [{ type: Input }],
closable: [{ type: Input }],
maskClosable: [{ type: Input }],
popup: [{ type: Input }],
animationType: [{ type: Input }],
transparent: [{ type: Input }],
footer: [{ type: Input }],
platform: [{ type: Input }],
className: [{ type: Input }],
wrapClassName: [{ type: Input }],
actions: [{ type: Input }],
defaultValue: [{ type: Input }],
type: [{ type: Input }],
placeholders: [{ type: Input }],
operation: [{ type: Input }],
onClose: [{ type: Output }],
afterOpenEmitter: [{ type: Output }],
afterCloseEmitter: [{ type: Output }],
panend: [{ type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }]
};
return ModalComponent;
}(ModalRef));
export { ModalComponent };
if (false) {
/** @type {?} */
ModalComponent.prototype.autoFocus;
/** @type {?} */
ModalComponent.prototype.transitionName;
/** @type {?} */
ModalComponent.prototype.maskTransitionName;
/** @type {?} */
ModalComponent.prototype.wrapCls;
/** @type {?} */
ModalComponent.prototype.cls;
/** @type {?} */
ModalComponent.prototype.btnGroupClass;
/** @type {?} */
ModalComponent.prototype.data;
/** @type {?} */
ModalComponent.prototype.onChanged;
/** @type {?} */
ModalComponent.prototype.onTouched;
/** @type {?} */
ModalComponent.prototype.onClose;
/** @type {?} */
ModalComponent.prototype.afterOpenEmitter;
/** @type {?} */
ModalComponent.prototype.afterCloseEmitter;
/** @type {?} */
ModalComponent.prototype.option;
/** @type {?} */
ModalComponent.prototype.elementRef;
}
var ModalServiceComponent = /** @class */ (function (_super) {
tslib_1.__extends(ModalServiceComponent, _super);
function ModalServiceComponent(option, elementRef) {
var _this = _super.call(this, option, elementRef) || this;
_this.option = option;
_this.elementRef = elementRef;
_this.setTransitionName(_this.option.visible);
return _this;
}
ModalServiceComponent.decorators = [
{ type: Component, args: [{
selector: 'ModalService',
template: "<div *ngIf=\"option.visible\">\n <div class=\"{{ option.prefixCls }}-mask {{ maskTransitionName }}\"></div>\n <div role=\"dialog\" class=\"{{ option.prefixCls }}-wrap {{ transitionName }}\" [ngClass]=\"wrapCls\">\n <div role=\"document\" class=\"{{ option.prefixCls }}\" [ngClass]=\"cls\">\n <div class=\"{{ option.prefixCls }}-content\">\n <div *ngIf=\"option.closable\" style=\"width: 100%; height: 21px;\">\n <div role=\"close\" class=\"{{ option.prefixCls }}-close\">\n <span role=\"close\" class=\"{{ option.prefixCls }}-close-x\"></span>\n </div>\n </div>\n <div *ngIf=\"!isNoTitle(option.title)\" class=\"{{ option.prefixCls }}-header\">\n <div *ngIf=\"!isTemplateRef(option.title)\" class=\"{{ option.prefixCls }}-title\">{{ option.title }}</div>\n <ng-template *ngIf=\"isTemplateRef(option.title)\" [ngTemplateOutlet]=\"option.title\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-body\">\n <ng-content></ng-content>\n <div *ngIf=\"!isTemplateRef(option.message)\" class=\"{{ option.prefixCls }}-alert-content\">\n {{ option.message }}\n </div>\n <ng-template *ngIf=\"isTemplateRef(option.message)\" [ngTemplateOutlet]=\"option.message\"></ng-template>\n <ng-template *ngIf=\"option.type === 'default'\" [ngTemplateOutlet]=\"promptDefault\"></ng-template>\n <ng-template *ngIf=\"option.type === 'secure-text'\" [ngTemplateOutlet]=\"promptSecure\"></ng-template>\n <ng-template *ngIf=\"option.type === 'login-password'\" [ngTemplateOutlet]=\"promptPassword\"></ng-template>\n </div>\n <div class=\"{{ option.prefixCls }}-footer\">\n <div [ngClass]=\"btnGroupClass\" role=\"group\">\n <div\n Button\n role=\"button\"\n *ngFor=\"let button of option.footer\"\n [className]=\"'am-modal-button'\"\n [ngStyle]=\"button.style\"\n (onClick)=\"button.onPress()\"\n >\n {{ button.text }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #promptPassword>\n <div class=\"{{ option.prefixCls }}-input-container\">\n <div class=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[1] || ''\"\n [(ngModel)]=\"option.defaultValue[1]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptSecure>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'password'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('password', $event)\"\n />\n </div>\n </div>\n</ng-template>\n<ng-template #promptDefault>\n <div className=\"{{ option.prefixCls }}-input-container\">\n <div className=\"{{ option.prefixCls }}-input\">\n <input\n #inputElement\n autofocus\n [type]=\"'text'\"\n [placeholder]=\"option.placeholders[0] || ''\"\n [(ngModel)]=\"option.defaultValue[0]\"\n (ngModelChange)=\"inputChange('text', $event)\"\n />\n </div>\n </div>\n</ng-template>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
ModalServiceComponent.ctorParameters = function () { return [
{ type: ModalOptions },
{ type: ElementRef }
]; };
return ModalServiceComponent;
}(ModalComponent));
export { ModalServiceComponent };
if (false) {
/** @type {?} */
ModalServiceComponent.prototype.option;
/** @type {?} */
ModalServiceComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJtb2RhbC9tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFDN0M7SUFhc0QsMENBQWM7SUErR2xFLHdCQUFtQixNQUFvQixFQUFTLFVBQXNCO1FBQXRFLFlBQ0UsaUJBQU8sU0FDUjtRQUZrQixZQUFNLEdBQU4sTUFBTSxDQUFjO1FBQVMsZ0JBQVUsR0FBVixVQUFVLENBQVk7UUE5R3RFLGVBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QyxvQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1Qix3QkFBa0IsR0FBVyxFQUFFLENBQUM7UUFDaEMsYUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixTQUFHLEdBQVcsRUFBRSxDQUFDO1FBQ2pCLG1CQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLFVBQUksR0FBRztZQUNMLElBQUksRUFBRSxFQUFFO1lBQ1IsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFDO1FBMkVGLGFBQU8sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRCxzQkFBZ0IsR0FBc0IsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUvRCx1QkFBaUIsR0FB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e1xuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBDb21wb25lbnQsXG4gIGZvcndhcmRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbE9wdGlvbnMgfSBmcm9tICcuL21vZGFsLW9wdGlvbnMucHJvdmlkZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTW9kYWxSZWYgfSBmcm9tICcuL21vZGFsLXJlZi5jbGFzcyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdNb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIE1vZGFsT3B0aW9ucyxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1vZGFsQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsQ29tcG9uZW50PFQgPSBhbnksIFIgPSBhbnk+IGV4dGVuZHMgTW9kYWxSZWY8VCwgUj4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIGF1dG9Gb2N1cyA9IHsgZm9jdXM6IHRydWUsIGRhdGU6IG5ldyBEYXRlKCkgfTtcbiAgdHJhbnNpdGlvbk5hbWU6IHN0cmluZyA9ICcnO1xuICBtYXNrVHJhbnNpdGlvbk5hbWU6IHN0cmluZyA9ICcnO1xuICB3cmFwQ2xzOiBvYmplY3QgPSB7fTtcbiAgY2xzOiBvYmplY3QgPSB7fTtcbiAgYnRuR3JvdXBDbGFzczogb2JqZWN0ID0ge307XG4gIGRhdGEgPSB7XG4gICAgdGV4dDogJycsXG4gICAgcGFzc3dvcmQ6ICcnXG4gIH07XG5cbiAgb25DaGFuZ2VkOiAodmlzaWFibGU6IGJvb2xlYW4pID0+IHt9O1xuICBvblRvdWNoZWQ6ICgpID0+IHt9O1xuXG4gIEBJbnB1dCgpXG4gIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMub3B0aW9uLnRpdGxlID0gdmFsdWU7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgY2xvc2FibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbi5jbG9zYWJsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXNrQ2xvc2FibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbi5tYXNrQ2xvc2FibGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcG9wdXAodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbi5wb3B1cCA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgYW5pbWF0aW9uVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb24uYW5pbWF0aW9uVHlwZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdHJhbnNwYXJlbnQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbi50cmFuc3BhcmVudCA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZm9vdGVyKHZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5vcHRpb24uZm9vdGVyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBsYXRmb3JtKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9wdGlvbi5wbGF0Zm9ybSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgY2xhc3NOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9wdGlvbi5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHdyYXBDbGFzc05hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9uLndyYXBDbGFzc05hbWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGFjdGlvbnModmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLm9wdGlvbi5mb290ZXIgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMub3B0aW9uLmRlZmF1bHRWYWx1ZSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsnJywgJyddO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9wdGlvbi50eXBlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBsYWNlaG9sZGVycyh2YWx1ZTogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMub3B0aW9uLnBsYWNlaG9sZGVycyA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBvcGVyYXRpb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9wdGlvbi5vcGVyYXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgYWZ0ZXJPcGVuRW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKVxuICBhZnRlckNsb3NlRW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMub3B0aW9uLmNsb3NhYmxlIHx8IHRoaXMub3B0aW9uLm1hc2tDbG9zYWJsZSB8fCB0aGlzLm9wdGlvbi5wb3B1cCkge1xuICAgICAgaWYgKFxuICAgICAgICAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2RpYWxvZycpIHx8XG4gICAgICAgIGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2Nsb3NlJ1xuICAgICAgKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb24uY2xvc2UpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbi5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25DbG9zZS5lbWl0KCk7XG4gICAgICAgICAgdGhpcy5sZWF2ZUFuaW1hdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIG9wdGlvbjogTW9kYWxPcHRpb25zLCBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBpc1RlbXBsYXRlUmVmKHZhbHVlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cblxuICBpc05vVGl0bGUodmFsdWU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICBzZXRUcmFuc2l0aW9uTmFtZSh2aXNpYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICB0aGlzLmxlYXZlQW5pbWF0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbi5hbmltYXRlZCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb24udHJhbnNwYXJlbnQpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXRBY3RpdmVOYW1lKHRoaXMub3B0aW9uLnRyYW5zaXRpb25OYW1lKSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0QWN0aXZlTmFtZSh0aGlzLm9wdGlvbi50cmFuc2l0aW9uTmFtZSk7XG4gICAgICAgICAgICB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0QWN0aXZlTmFtZSh0aGlzLm9wdGlvbi5tYXNrVHJhbnNpdGlvbk5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID0gdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldEFjdGl2ZU5hbWUoJ2FtLWZhZGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2V0QWN0aXZlTmFtZSh0aGlzLm9wdGlvbi50cmFuc2l0aW9uTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldEFjdGl2ZU5hbWUodGhpcy5vcHRpb24udHJhbnNpdGlvbk5hbWUpO1xuICAgICAgICAgICAgdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldEFjdGl2ZU5hbWUodGhpcy5vcHRpb24ubWFza1RyYW5zaXRpb25OYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRBY3RpdmVOYW1lKCdhbS1zbGlkZS11cCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb24ucG9wdXApIHtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID1cbiAgICAgICAgICAgIHRoaXMub3B0aW9uLmFuaW1hdGlvblR5cGUgPT09ICdzbGlkZS11cCdcbiAgICAgICAgICAgICAgPyB0aGlzLnNldEFjdGl2ZU5hbWUoJ2FtLXNsaWRlLXVwJylcbiAgICAgICAgICAgICAgOiB0aGlzLnNldEFjdGl2ZU5hbWUoJ2FtLXNsaWRlLWRvd24nKTtcbiAgICAgICAgICB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0QWN0aXZlTmFtZSgnYW0tZmFkZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0QWN0aXZlTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAwID8gYCR7bmFtZX0tZW50ZXIgJHtuYW1lfS1lbnRlci1hY3RpdmVgIDogbnVsbDtcbiAgfVxuXG4gIHNldExlYXZlQWN0aXZlTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAwID8gYCR7bmFtZX0tbGVhdmUgJHtuYW1lfS1sZWF2ZS1hY3RpdmVgIDogbnVsbDtcbiAgfVxuXG4gIHNldENsYXNzTWFwKCkge1xuICAgIHRoaXMud3JhcENscyA9IHtcbiAgICAgIFt0aGlzLm9wdGlvbi53cmFwQ2xhc3NOYW1lXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLm9wdGlvbi5wcmVmaXhDbHN9LXdyYXAtcG9wdXBgXTogdGhpcy5vcHRpb24ucG9wdXBcbiAgICB9O1xuXG4gICAgdGhpcy5jbHMgPSB7XG4gICAgICBbdGhpcy5vcHRpb24uY2xhc3NOYW1lXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLm9wdGlvbi5wcmVmaXhDbHN9LXRyYW5zcGFyZW50YF06IHRoaXMub3B0aW9uLnRyYW5zcGFyZW50LFxuICAgICAgW2Ake3RoaXMub3B0aW9uLnByZWZpeENsc30tcG9wdXBgXTogdGhpcy5vcHRpb24ucG9wdXAsXG4gICAgICBbYCR7dGhpcy5vcHRpb24ucHJlZml4Q2xzfS1wb3B1cC0ke3RoaXMub3B0aW9uLmFuaW1hdGlvblR5cGV9YF06IHRoaXMub3B0aW9uLnBvcHVwICYmIHRoaXMub3B0aW9uLmFuaW1hdGlvblR5cGUsXG4gICAgICBbYCR7dGhpcy5vcHRpb24ucHJlZml4Q2xzfS1hbmRyb2lkYF06IHRoaXMub3B0aW9uLnBsYXRmb3JtID09PSAnYW5kcm9pZCdcbiAgICB9O1xuXG4gICAgdGhpcy5idG5Hcm91cENsYXNzID0ge1xuICAgICAgW2Ake3RoaXMub3B0aW9uLnByZWZpeENsc30tYnV0dG9uLWdyb3VwLSR7XG4gICAgICAgIHRoaXMub3B0aW9uLmZvb3Rlci5sZW5ndGggPT09IDIgJiYgIXRoaXMub3B0aW9uLm9wZXJhdGlvbiA/ICdoJyA6ICd2J1xuICAgICAgfWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMub3B0aW9uLnByZWZpeENsc30tYnV0dG9uLWdyb3VwLSR7dGhpcy5vcHRpb24ub3BlcmF0aW9uID8gJ29wZXJhdGlvbicgOiAnbm9ybWFsJ31gXTogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBpbnB1dENoYW5nZSh0eXBlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIGxlYXZlQW5pbWF0aW9uKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbi5hbmltYXRlZCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uLnRyYW5zcGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnNldExlYXZlQWN0aXZlTmFtZSh0aGlzLm9wdGlvbi50cmFuc2l0aW9uTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRMZWF2ZUFjdGl2ZU5hbWUodGhpcy5vcHRpb24udHJhbnNpdGlvbk5hbWUpO1xuICAgICAgICAgIHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRMZWF2ZUFjdGl2ZU5hbWUodGhpcy5vcHRpb24ubWFza1RyYW5zaXRpb25OYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID0gdGhpcy5tYXNrVHJhbnNpdGlvbk5hbWUgPSB0aGlzLnNldExlYXZlQWN0aXZlTmFtZSgnYW0tZmFkZScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5zZXRMZWF2ZUFjdGl2ZU5hbWUodGhpcy5vcHRpb24udHJhbnNpdGlvbk5hbWUpKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKHRoaXMub3B0aW9uLnRyYW5zaXRpb25OYW1lKTtcbiAgICAgICAgICB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKHRoaXMub3B0aW9uLm1hc2tUcmFuc2l0aW9uTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9IHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRMZWF2ZUFjdGl2ZU5hbWUoJ2FtLXNsaWRlLXVwJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbi5wb3B1cCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25OYW1lID1cbiAgICAgICAgICB0aGlzLm9wdGlvbi5hbmltYXRpb25UeXBlID09PSAnc2xpZGUtdXAnXG4gICAgICAgICAgICA/IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKCdhbS1zbGlkZS11cCcpXG4gICAgICAgICAgICA6IHRoaXMuc2V0TGVhdmVBY3RpdmVOYW1lKCdhbS1zbGlkZS1kb3duJyk7XG4gICAgICAgIHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gdGhpcy5zZXRMZWF2ZUFjdGl2ZU5hbWUoJ2FtLWZhZGUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm9wdGlvbi52aXNpYmxlID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5vbkNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZWQodGhpcy5vcHRpb24u