ngx-pluto
Version:
367 lines • 27.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, ViewChild, forwardRef, Output, EventEmitter, ChangeDetectorRef } from "@angular/core";
import { NpDatePickerService } from "./date-picker.service";
import * as moment_ from 'moment';
/** @type {?} */
const moment = moment_;
import { NpDatePickerPopup } from "./components/date-picker-popup";
import { ComponentPortal } from "@angular/cdk/portal";
import { DATE_FORMAT, DATE_TIME_FORMAT } from "./date-picker-const";
import { NpInput } from "../input";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
/**
* Date picker组件
*/
export class NpDatePicker {
/**
* @param {?} datePickerService
* @param {?} cdf
*/
constructor(datePickerService, cdf) {
this.datePickerService = datePickerService;
this.cdf = cdf;
/**
* Placeholder
*/
this.placeholder = '';
/**
* 已选时间
*/
this.date = null;
/**
* 日期时间展示格式,默认只展示日期
*/
this.format = DATE_FORMAT;
/**
* 是否展示时间,默认不展示
*/
this.isShowTime = false;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
*/
this.footerItems = [];
/**
* 当为datetime-picker时,底部面板最右侧展示的确认按钮名称
*/
this.confirmButtonText = '确认';
this.onDateChanged = new EventEmitter();
this.isHover = false;
this.emitChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
}
/**
* @return {?}
*/
ngOnInit() {
this.overlayRef = this.datePickerService.getOverlayRef(this.datePickerInput.npInput);
if (this.isShowTime) {
this.format = DATE_TIME_FORMAT;
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) { }
/**
* @return {?}
*/
onToggleDatePickerPopup() {
if (this.isDisabled) {
return;
}
if (this.overlayRef.hasAttached()) {
this.closePopup();
return;
}
this.datePickerPopupRef = this.overlayRef.attach(new ComponentPortal(NpDatePickerPopup));
this.datePickerPopupRef.instance.date = moment(this.date);
this.datePickerPopupRef.instance.datePickerType = this.isShowTime ? 'datetime-picker' : 'date-picker';
this.datePickerPopupRef.instance.footerItems = this.footerItems;
this.datePickerPopupRef.instance.isShowTime = this.isShowTime;
this.datePickerPopupRef.instance.confirmButtonText = this.confirmButtonText;
this.subscribeNotifyEvents();
this.overlayRef.backdropClick().subscribe((/**
* @return {?}
*/
() => {
this.closePopup();
}));
}
/**
* @param {?} data
* @return {?}
*/
onBlur(data) {
if (this.datePickerService.isValid(data.value)) {
this.date = moment(data.value, this.format).clone();
}
else {
// 如果输入日期不合法,默认当前时间
this.date = moment().clone();
}
this.syncValue();
this.emitChange(this.date);
this.onDateChanged.emit(this.date);
}
/**
* @return {?}
*/
onClear() {
if (this.isDisabled) {
return;
}
this.date = null;
this.syncValue();
this.emitChange(this.date);
this.onDateChanged.emit(this.date);
}
/**
* @return {?}
*/
onMouseenter() {
this.isHover = true;
}
/**
* @return {?}
*/
onMouseleave() {
this.isHover = false;
}
//#region Private methods
/**
* 每次this.date改变时,这个方法都必须要调用
* @private
* @return {?}
*/
syncValue() {
if (this.date && this.datePickerService.isValid(this.date)) {
this.value = moment(this.date, this.format).format(this.format);
}
else {
this.value = '';
}
}
/**
* @private
* @return {?}
*/
closePopup() {
if (this.overlayRef.hasAttached()) {
this.overlayRef.detach();
}
}
/**
* @private
* @return {?}
*/
subscribeNotifyEvents() {
this.datePickerPopupRef.instance.onDayClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
this.emitDataAndClosePopup(res.date);
}));
this.datePickerPopupRef.instance.onItemLabelClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
if (res.value instanceof Function) {
this.emitDataAndClosePopup(res.value());
}
else {
this.emitDataAndClosePopup(moment(res.value));
}
this.closePopup();
}));
if (this.isShowTime) {
this.datePickerPopupRef.instance.onTimeClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
/** @type {?} */
let date = moment(moment(this.date).format(DATE_FORMAT) + ' ' + res);
this.emitDataAndClosePopup(date);
}));
this.datePickerPopupRef.instance.onConfirmClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
/** @type {?} */
let date = moment(moment(this.date).format(DATE_FORMAT) + ' ' + res);
this.emitDataAndClosePopup(date);
this.closePopup();
}));
}
}
/**
* @private
* @param {?} date
* @return {?}
*/
emitDataAndClosePopup(date) {
this.date = date;
this.syncValue();
this.emitChange(moment(this.date));
this.onDateChanged.emit(moment(this.date));
this.datePickerInput.focus();
if (!this.isShowTime) {
this.closePopup();
}
}
//#endregion
//#region Implement for ControlValueAccessor
/**
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
this.date = obj;
this.syncValue();
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.emitChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) { }
}
NpDatePicker.decorators = [
{ type: Component, args: [{
selector: `np-date-picker`,
template: "<div class=\"np-date-picker-wrapper flex-wrap col-flex\" (mouseenter)=\"onMouseenter()\" (mouseleave)=\"onMouseleave()\">\r\n <i *ngIf=\"!isHover\" class=\"far fa-calendar\"></i>\r\n <i *ngIf=\"isHover\" class=\"fas fa-times-circle\" (click)=\"onClear()\"></i>\r\n <np-input #datePickerInput [label]=\"label\" [isRequired]=\"isRequired\" [isDisabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\" [errorMessage]=\"errorMessage\" [(ngModel)]=\"value\" (click)=\"onToggleDatePickerPopup()\"\r\n (onBlur)=\"onBlur($event)\">\r\n </np-input>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => NpDatePicker)),
multi: true,
}
],
styles: [".np-date-picker-wrapper{position:relative}.np-date-picker-wrapper>.far.fa-calendar,.np-date-picker-wrapper>.fas.fa-times-circle{position:absolute;right:10px;line-height:34px;font-size:15px;cursor:pointer;z-index:1}.np-date-picker-wrapper .np-input-wrapper .np-input{width:220px}"]
}] }
];
/** @nocollapse */
NpDatePicker.ctorParameters = () => [
{ type: NpDatePickerService },
{ type: ChangeDetectorRef }
];
NpDatePicker.propDecorators = {
label: [{ type: Input }],
isRequired: [{ type: Input }],
placeholder: [{ type: Input }],
errorMessage: [{ type: Input }],
isDisabled: [{ type: Input }],
date: [{ type: Input }],
format: [{ type: Input }],
isShowTime: [{ type: Input }],
footerItems: [{ type: Input }],
confirmButtonText: [{ type: Input }],
onDateChanged: [{ type: Output }],
datePickerInput: [{ type: ViewChild, args: ['datePickerInput',] }]
};
if (false) {
/**
* 标签
* @type {?}
*/
NpDatePicker.prototype.label;
/**
* 是否必填,true仅在标签前面添加红色*号, false不加
* @type {?}
*/
NpDatePicker.prototype.isRequired;
/**
* Placeholder
* @type {?}
*/
NpDatePicker.prototype.placeholder;
/**
* 校验错误时显示错误信息
* @type {?}
*/
NpDatePicker.prototype.errorMessage;
/**
* 是否禁用
* @type {?}
*/
NpDatePicker.prototype.isDisabled;
/**
* 已选时间
* @type {?}
*/
NpDatePicker.prototype.date;
/**
* 日期时间展示格式,默认只展示日期
* @type {?}
*/
NpDatePicker.prototype.format;
/**
* 是否展示时间,默认不展示
* @type {?}
*/
NpDatePicker.prototype.isShowTime;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
* @type {?}
*/
NpDatePicker.prototype.footerItems;
/**
* 当为datetime-picker时,底部面板最右侧展示的确认按钮名称
* @type {?}
*/
NpDatePicker.prototype.confirmButtonText;
/** @type {?} */
NpDatePicker.prototype.onDateChanged;
/** @type {?} */
NpDatePicker.prototype.datePickerInput;
/** @type {?} */
NpDatePicker.prototype.datePickerPopupRef;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.overlayRef;
/** @type {?} */
NpDatePicker.prototype.isHover;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.emitChange;
/**
* 日期输入框文本值,每当this.date改变时此值会同步改变
* @type {?}
*/
NpDatePicker.prototype.value;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.datePickerService;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.cdf;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQWdCLGlCQUFpQixFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUM3TSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7O01BQU8sTUFBTSxHQUFHLE9BQU87QUFFekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQW9CekUsTUFBTSxPQUFPLFlBQVk7Ozs7O0lBcUN2QixZQUFvQixpQkFBc0MsRUFBVSxHQUFzQjtRQUF0RSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXFCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7Ozs7UUE5QmpGLGdCQUFXLEdBQVcsRUFBRSxDQUFDOzs7O1FBT3pCLFNBQUksR0FBNEIsSUFBSSxDQUFDOzs7O1FBRXJDLFdBQU0sR0FBVyxXQUFXLENBQUM7Ozs7UUFFN0IsZUFBVSxHQUFZLEtBQUssQ0FBQzs7OztRQUU1QixnQkFBVyxHQUEyQixFQUFFLENBQUM7Ozs7UUFFekMsc0JBQWlCLEdBQVcsSUFBSSxDQUFDO1FBRWhDLGtCQUFh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LDRCQUE4Qzs7Ozs7SUFFOUMsOEJBQXNDOzs7OztJQUV0QyxrQ0FBcUM7Ozs7O0lBRXJDLG1DQUFrRDs7Ozs7SUFFbEQseUNBQTBDOztJQUUxQyxxQ0FBa0Q7O0lBRWxELHVDQUF1RDs7SUFDdkQsMENBQW9EOzs7OztJQUVwRCxrQ0FBK0I7O0lBQy9CLCtCQUF5Qjs7Ozs7SUFFekIsa0NBQXFDOzs7OztJQUdyQyw2QkFBYzs7Ozs7SUFFRix5Q0FBOEM7Ozs7O0lBQUUsMkJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBmb3J3YXJkUmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb21wb25lbnRSZWYsIENoYW5nZURldGVjdG9yUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5wRGF0ZVBpY2tlclNlcnZpY2UsIERheURhdGFQZXJNb250aCB9IGZyb20gXCIuL2RhdGUtcGlja2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnOyBjb25zdCBtb21lbnQgPSBtb21lbnRfXHJcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcclxuaW1wb3J0IHsgTnBEYXRlUGlja2VyUG9wdXAgfSBmcm9tIFwiLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLXBvcHVwXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvcG9ydGFsXCI7XHJcbmltcG9ydCB7IERBVEVfRk9STUFULCBEQVRFX1RJTUVfRk9STUFUIH0gZnJvbSBcIi4vZGF0ZS1waWNrZXItY29uc3RcIjtcclxuaW1wb3J0IHsgTnBJbnB1dCB9IGZyb20gXCIuLi9pbnB1dFwiO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgRGF0ZVBpY2tlckZvb3Rlckl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLWZvb3RlclwiO1xyXG5cclxuLyoqXHJcbiAqIERhdGUgcGlja2Vy57uE5Lu2XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogYG5wLWRhdGUtcGlja2VyYCxcclxuICB0ZW1wbGF0ZVVybDogJ2RhdGUtcGlja2VyLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydkYXRlLXBpY2tlci5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5wRGF0ZVBpY2tlciksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOcERhdGVQaWNrZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKirmoIfnrb4gKi9cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuW/heWhq++8jHRydWXku4XlnKjmoIfnrb7liY3pnaLmt7vliqDnuqLoibIq5Y+377yMIGZhbHNl5LiN5YqgKi9cclxuICBASW5wdXQoKSBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gIC8qKlBsYWNlaG9sZGVyICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIC8qKuagoemqjOmUmeivr+aXtuaYvuekuumUmeivr+S/oeaBryAqL1xyXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuemgeeUqCAqL1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8qKuW3sumAieaXtumXtCAqL1xyXG4gIEBJbnB1dCgpIGRhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nID0gbnVsbDtcclxuICAvKirml6XmnJ/ml7bpl7TlsZXnpLrmoLzlvI/vvIzpu5jorqTlj6rlsZXnpLrml6XmnJ8gKi9cclxuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZyA9IERBVEVfRk9STUFUO1xyXG4gIC8qKuaYr+WQpuWxleekuuaXtumXtO+8jOm7mOiupOS4jeWxleekuiAqL1xyXG4gIEBJbnB1dCgpIGlzU2hvd1RpbWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKirmmL7npLrlnKhmb290ZXLlt6bkvqfnmoToh6rlrprkuYnml7bpl7TmoIfnrb7mlbDnu4TvvIzlpoLigJzmmKjlpKnigJ3nrYkgKi9cclxuICBASW5wdXQoKSBmb290ZXJJdGVtczogRGF0ZVBpY2tlckZvb3Rlckl0ZW1bXSA9IFtdO1xyXG4gIC8qKuW9k+S4umRhdGV0aW1lLXBpY2tlcuaXtu+8jOW6lemDqOmdouadv+acgOWPs+S+p+WxleekuueahOehruiupOaMiemSruWQjeensCAqL1xyXG4gIEBJbnB1dCgpIGNvbmZpcm1CdXR0b25UZXh0OiBzdHJpbmcgPSAn56Gu6K6kJztcclxuXHJcbiAgQE91dHB1dCgpIG9uRGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlcklucHV0JykgZGF0ZVBpY2tlcklucHV0OiBOcElucHV0O1xyXG4gIGRhdGVQaWNrZXJQb3B1cFJlZjogQ29tcG9uZW50UmVmPE5wRGF0ZVBpY2tlclBvcHVwPjtcclxuXHJcbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xyXG4gIGlzSG92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLmRhdGXmlLnlj5jml7bmraTlgLzkvJrlkIzmraXmlLnlj5gqL1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZVBpY2tlclNlcnZpY2U6IE5wRGF0ZVBpY2tlclNlcnZpY2UsIHByaXZhdGUgY2RmOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRPdmVybGF5UmVmKHRoaXMuZGF0ZVBpY2tlcklucHV0Lm5wSW5wdXQpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd1RpbWUpIHtcclxuICAgICAgdGhpcy5mb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQgeyB9XHJcblxyXG4gIG9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTnBEYXRlUGlja2VyUG9wdXApKTtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmRhdGUgPSBtb21lbnQodGhpcy5kYXRlKTtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmRhdGVQaWNrZXJUeXBlID0gdGhpcy5pc1Nob3dUaW1lID8gJ2RhdGV0aW1lLXBpY2tlcicgOiAnZGF0ZS1waWNrZXInO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZm9vdGVySXRlbXMgPSB0aGlzLmZvb3Rlckl0ZW1zO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuaXNTaG93VGltZSA9IHRoaXMuaXNTaG93VGltZTtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmNvbmZpcm1CdXR0b25UZXh0ID0gdGhpcy5jb25maXJtQnV0dG9uVGV4dDtcclxuICAgIHRoaXMuc3Vic2NyaWJlTm90aWZ5RXZlbnRzKCk7XHJcblxyXG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKGRhdGE6IHsgdmFsdWU6IGFueSwgZXZlbnQ6IGFueSB9KSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKGRhdGEudmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuZGF0ZSA9IG1vbWVudChkYXRhLnZhbHVlLCB0aGlzLmZvcm1hdCkuY2xvbmUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWmguaenOi+k+WFpeaXpeacn+S4jeWQiOazle+8jOm7mOiupOW9k+WJjeaXtumXtFxyXG4gICAgICB0aGlzLmRhdGUgPSBtb21lbnQoKS5jbG9uZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3luY1ZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5kYXRlKTtcclxuICAgIHRoaXMub25EYXRlQ2hhbmdlZC5lbWl0KHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyKCkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRlID0gbnVsbDtcclxuICAgIHRoaXMuc3luY1ZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5kYXRlKTtcclxuICAgIHRoaXMub25EYXRlQ2hhbmdlZC5lbWl0KHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlZW50ZXIoKSB7XHJcbiAgICB0aGlzLmlzSG92ZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZWxlYXZlKCkge1xyXG4gICAgdGhpcy5pc0hvdmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gUHJpdmF0ZSBtZXRob2RzXHJcblxyXG4gIC8qKuavj+asoXRoaXMuZGF0ZeaUueWPmOaXtu+8jOi/meS4quaWueazlemDveW/hemhu+imgeiwg+eUqCAqL1xyXG4gIHByaXZhdGUgc3luY1ZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZSAmJiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmlzVmFsaWQodGhpcy5kYXRlKSkge1xyXG4gICAgICB0aGlzLnZhbHVlID0gbW9tZW50KHRoaXMuZGF0ZSwgdGhpcy5mb3JtYXQpLmZvcm1hdCh0aGlzLmZvcm1hdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlUG9wdXAoKSB7XHJcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVOb3RpZnlFdmVudHMoKSB7XHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkRheUNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IERheURhdGFQZXJNb250aCkgPT4ge1xyXG4gICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChyZXMuZGF0ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkl0ZW1MYWJlbENsaWNrZWQuc3Vic2NyaWJlKChyZXM6IERhdGVQaWNrZXJGb290ZXJJdGVtKSA9PiB7XHJcbiAgICAgIGlmIChyZXMudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKHJlcy52YWx1ZSgpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChtb21lbnQocmVzLnZhbHVlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93VGltZSkge1xyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vblRpbWVDbGlja2VkLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgZGF0ZSA9IG1vbWVudChtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoREFURV9GT1JNQVQpICsgJyAnICsgcmVzKTtcclxuICAgICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChkYXRlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkNvbmZpcm1DbGlja2VkLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgZGF0ZSA9IG1vbWVudChtb21lbnQodGhpcy5kYXRlKS5mb3JtYXQoREFURV9GT1JNQVQpICsgJyAnICsgcmVzKTtcclxuICAgICAgICB0aGlzLmVtaXREYXRhQW5kQ2xvc2VQb3B1cChkYXRlKTtcclxuICAgICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXREYXRhQW5kQ2xvc2VQb3B1cChkYXRlOiBtb21lbnRfLk1vbWVudCkge1xyXG4gICAgdGhpcy5kYXRlID0gZGF0ZTtcclxuICAgIHRoaXMuc3luY1ZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UobW9tZW50KHRoaXMuZGF0ZSkpO1xyXG4gICAgdGhpcy5vbkRhdGVDaGFuZ2VkLmVtaXQobW9tZW50KHRoaXMuZGF0ZSkpO1xyXG4gICAgdGhpcy5kYXRlUGlja2VySW5wdXQuZm9jdXMoKTtcclxuICAgIGlmICghdGhpcy5pc1Nob3dUaW1lKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudCBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGUgPSBvYmo7XHJcbiAgICB0aGlzLnN5bmNWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59Il19