UNPKG

ng-zorro-antd-mobile

Version:

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

527 lines (526 loc) 44.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ViewEncapsulation, Input, Output, HostBinding, EventEmitter } from '@angular/core'; import zhCN from './locale/zh_CN'; import enUS from './locale/en_US'; import { LocaleProviderService } from '../locale-provider/locale-provider.service'; import { mergeDateTime } from './util/index'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; /** * @record */ export function StateType() { } /** @type {?} */ StateType.prototype.showTimePicker; /** @type {?|undefined} */ StateType.prototype.timePickerTitle; /** @type {?|undefined} */ StateType.prototype.startDate; /** @type {?|undefined} */ StateType.prototype.endDate; /** @type {?|undefined} */ StateType.prototype.disConfirmBtn; /** @type {?|undefined} */ StateType.prototype.clientHight; var CalendarComponent = /** @class */ (function () { function CalendarComponent(_localeProviderService) { var _this = this; this._localeProviderService = _localeProviderService; this.isShow = false; this.showClear = false; this.props = /** @type {?} */ ({ visible: false, showHeader: true, locale: zhCN, pickTime: false, showShortcut: false, prefixCls: 'rmc-calendar', type: 'range', defaultTimeValue: new Date(2000, 0, 1, 8) }); this.state = /** @type {?} */ ({ showTimePicker: false, timePickerTitle: '', startDate: undefined, endDate: undefined, disConfirmBtn: true, clientHight: 0 }); this._unsubscribe$ = new Subject(); this.onCancel = new EventEmitter(); this.onConfirm = new EventEmitter(); this.onSelectHasDisableDate = new EventEmitter(); this.class = 'am-calendar'; this.selectDate = function (date, useDateTime, oldState, props) { if (useDateTime === void 0) { useDateTime = false; } if (oldState === void 0) { oldState = {}; } if (props === void 0) { props = _this.props; } if (!date) { return /** @type {?} */ ({}); } /** @type {?} */ var newState = /** @type {?} */ ({}); var type = props.type, pickTime = props.pickTime, defaultTimeValue = props.defaultTimeValue, _a = props.locale, locale = _a === void 0 ? /** @type {?} */ ({}) : _a; /** @type {?} */ var newDate = pickTime && !useDateTime ? mergeDateTime(date, defaultTimeValue) : date; var startDate = oldState.startDate, endDate = oldState.endDate; switch (type) { case 'one': newState = tslib_1.__assign({}, newState, { startDate: newDate, disConfirmBtn: false }); if (pickTime) { newState = tslib_1.__assign({}, newState, { timePickerTitle: locale.selectTime, showTimePicker: true }); } break; case 'range': if (!startDate || endDate) { newState = tslib_1.__assign({}, newState, { startDate: newDate, endDate: undefined, disConfirmBtn: true }); if (pickTime) { newState = tslib_1.__assign({}, newState, { timePickerTitle: locale.selectStartTime, showTimePicker: true }); } } else { newState = tslib_1.__assign({}, newState, { timePickerTitle: +newDate >= +startDate ? locale.selectEndTime : locale.selectStartTime, disConfirmBtn: false, endDate: pickTime && !useDateTime && +newDate >= +startDate ? new Date(+mergeDateTime(newDate, startDate) + 3600000) : newDate }); } break; } return newState; }; this.onSelectedDate = function (date) { var _a = _this.state, startDate = _a.startDate, endDate = _a.endDate; var onSelect = _this.props.onSelect; if (onSelect) { /** @type {?} */ var value = onSelect(date, [startDate, endDate]); if (value) { _this.shortcutSelect(value[0], value[1]); return; } } _this.state = tslib_1.__assign({}, _this.state, _this.selectDate(date, false, { startDate: startDate, endDate: endDate })); _this.showClear = !!_this.state.startDate; }; this.triggerSelectHasDisableDate = function (date) { _this.triggerClear(); _this.onSelectHasDisableDate && _this.onSelectHasDisableDate.emit(date); }; this.onClose = function () { _this.state = /** @type {?} */ ({ showTimePicker: false, timePickerTitle: '', startDate: undefined, endDate: undefined, disConfirmBtn: true, clientHight: 0 }); _this.showClear = !!_this.state.startDate; }; this.triggerConfirm = function () { var _a = _this.state, startDate = _a.startDate, endDate = _a.endDate; if (startDate && endDate && +startDate > +endDate) { _this.onClose(); return _this.onConfirm && _this.onConfirm.emit({ startDate: endDate, endDate: startDate }); } _this.onConfirm && _this.onConfirm.emit({ startDate: startDate, endDate: endDate }); _this.onClose(); }; this.triggerClear = function () { // 清除数据做延迟,否则同步刷新数据导致报错 setTimeout(function () { _this.state = tslib_1.__assign({}, _this.state, { startDate: undefined, endDate: undefined, showTimePicker: false }); _this.props.onClear && _this.props.onClear(); _this.showClear = !!_this.state.startDate; }, 0); }; this.onTimeChange = function (date) { var _a = _this.state, startDate = _a.startDate, endDate = _a.endDate; if (endDate) { _this.state.endDate = date; } else if (startDate) { _this.state.startDate = date; } }; this.shortcutSelect = function (startDate, endDate, props) { if (props === void 0) { props = _this.props; } _this.state = tslib_1.__assign({}, _this.state, { startDate: startDate, showTimePicker: false }, _this.selectDate(endDate, true, { startDate: startDate }, props)); _this.showClear = !!_this.state.startDate; }; this.setClientHeight = function (height) { _this.state.clientHight = height; }; } Object.defineProperty(CalendarComponent.prototype, "locale", { set: /** * @param {?} value * @return {?} */ function (value) { if (value === 'enUS') { this.props.locale = enUS; } else if (value === 'zhCN') { this.props.locale = zhCN; } this._unsubscribe$.next(); this._unsubscribe$.complete(); }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "defaultTimeValue", { set: /** * @param {?} value * @return {?} */ function (value) { if (value) { this.props.defaultTimeValue = value; } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "prefixCls", { set: /** * @param {?} value * @return {?} */ function (value) { if (value) { this.props.prefixCls = value; } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "enterDirection", { set: /** * @param {?} value * @return {?} */ function (value) { this._enterDirection = value; if (this._enterDirection === 'horizontal') { this.contentAnimateClass = 'slideH-enter slideH-enter-active'; } else { this.contentAnimateClass = 'slideV-enter slideV-enter-active'; } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "visible", { set: /** * @param {?} value * @return {?} */ function (value) { var _this = this; this.props.visible = value; if (value === true || value === 'true') { this.showAnimation(); this.isShow = true; } else { this.hideAnimation(); setTimeout(function () { _this.isShow = false; }, 300); } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "getDateExtra", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.getDateExtra = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "defaultDate", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.defaultDate = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "minDate", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.minDate = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "maxDate", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.maxDate = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "pickTime", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.pickTime = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "type", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.type = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "showShortcut", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.showShortcut = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "rowSize", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.rowSize = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "infinite", { set: /** * @param {?} value * @return {?} */ function (value) { }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "defaultValue", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.defaultValue = value; if (value) { this.receiveProps(this.props); } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "onSelect", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.onSelect = value; }, enumerable: true, configurable: true }); /** * @param {?} nextProps * @return {?} */ CalendarComponent.prototype.receiveProps = /** * @param {?} nextProps * @return {?} */ function (nextProps) { if (nextProps.visible && nextProps.defaultValue) { this.shortcutSelect(nextProps.defaultValue[0], nextProps.defaultValue[1], nextProps); } }; /** * @return {?} */ CalendarComponent.prototype.showAnimation = /** * @return {?} */ function () { if (this._enterDirection === 'horizontal') { this.contentAnimateClass = 'slideH-enter slideH-enter-active'; } else { this.contentAnimateClass = 'slideV-enter slideV-enter-active'; } this.maskAnimateClass = 'fade-enter fade-enter-active'; }; /** * @return {?} */ CalendarComponent.prototype.hideAnimation = /** * @return {?} */ function () { if (this._enterDirection === 'horizontal') { this.contentAnimateClass = 'slideH-leave slideH-leave-active'; } else { this.contentAnimateClass = 'slideV-leave slideV-leave-active'; } this.maskAnimateClass = 'fade-leave fade-leave-active'; }; /** * @return {?} */ CalendarComponent.prototype.triggerCancel = /** * @return {?} */ function () { this.props.onCancel && this.props.onCancel(); this.onClose(); this.onCancel && this.onCancel.emit(); }; /** * @return {?} */ CalendarComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var defaultValue = this.props.defaultValue; if (defaultValue) { this.state = tslib_1.__assign({}, this.state, this.selectDate(defaultValue[1], true, { startDate: defaultValue[0] }, this.props)); } this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(function (_) { _this.props.locale = /** @type {?} */ (tslib_1.__assign({}, _this._localeProviderService.getLocaleSubObj('Calendar'))); }); }; /** * @return {?} */ CalendarComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this._unsubscribe$.next(); this._unsubscribe$.complete(); }; CalendarComponent.decorators = [ { type: Component, args: [{ selector: 'Calendar, nzm-calendar', template: "<span *ngIf=\"isShow\">\n <div class=\"{{'mask ' + maskAnimateClass}}\"></div>\n</span>\n<span *ngIf=\"isShow\">\n <div class=\"{{'content animate ' + contentAnimateClass}}\">\n <CalendarHeader [locale]=\"props.locale\"\n [closeIcon]=\"closeIconHtml\"\n [showClear]=\"showClear\"\n (onCancel)=\"triggerCancel()\"\n (onClear)=\"triggerClear()\"\n ></CalendarHeader>\n <CalendarDatePicker [propsData]=\"props\"\n [endDate]=\"state.endDate\"\n [startDate]=\"state.startDate\"\n [onCellClick]=\"onSelectedDate\"\n [onSelectHasDisableDate]=\"triggerSelectHasDisableDate\"\n [onLayout]=\"setClientHeight\"\n ></CalendarDatePicker>\n <CalendarTimePicker *ngIf=\"state.showTimePicker\"\n [propsData]=\"props\"\n [title]=\"state.timePickerTitle\"\n [clientHeight]=\"state.clientHight\"\n [prefixCls]=\"props.timePickerPrefixCls\"\n [defaultValue]=\"props.defaultTimeValue\"\n [pickerPrefixCls]=\"props.timePickerPickerPrefixCls\"\n [value]=\"state.endDate ? state.endDate : state.startDate\"\n [onValueChange]=\"onTimeChange\"\n ></CalendarTimePicker>\n <CalendarShortcutPanel *ngIf=\"props.showShortcut && !state.showTimePicker\"\n [locale]=\"props.locale\"\n [onSelect]=\"shortcutSelect\"\n ></CalendarShortcutPanel>\n <CalendarConfirmPanel *ngIf=\"state.startDate\"\n [startDateTime]=\"state.startDate\"\n [endDateTime]=\"state.endDate\"\n [propsData]=\"props\"\n [disableBtn]=\"state.disConfirmBtn\"\n [formatStr]=\"props.pickTime ? props.locale.dateTimeFormat : props.locale.dateFormat\"\n [onConfirm]=\"triggerConfirm\"\n ></CalendarConfirmPanel>\n </div>\n</span>\n<ng-template #closeIconHtml>\n <Icon [type]=\"'cross'\"></Icon>\n</ng-template>\n", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ CalendarComponent.ctorParameters = function () { return [ { type: LocaleProviderService } ]; }; CalendarComponent.propDecorators = { locale: [{ type: Input }], defaultTimeValue: [{ type: Input }], prefixCls: [{ type: Input }], enterDirection: [{ type: Input }], visible: [{ type: Input }], getDateExtra: [{ type: Input }], defaultDate: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], pickTime: [{ type: Input }], type: [{ type: Input }], showShortcut: [{ type: Input }], rowSize: [{ type: Input }], infinite: [{ type: Input }], defaultValue: [{ type: Input }], onSelect: [{ type: Input }], onCancel: [{ type: Output }], onConfirm: [{ type: Output }], onSelectHasDisableDate: [{ type: Output }], class: [{ type: HostBinding, args: ['class',] }] }; return CalendarComponent; }()); export { CalendarComponent }; if (false) { /** @type {?} */ CalendarComponent.prototype.isShow; /** @type {?} */ CalendarComponent.prototype.contentAnimateClass; /** @type {?} */ CalendarComponent.prototype.maskAnimateClass; /** @type {?} */ CalendarComponent.prototype.showClear; /** @type {?} */ CalendarComponent.prototype.props; /** @type {?} */ CalendarComponent.prototype.state; /** @type {?} */ CalendarComponent.prototype._unsubscribe$; /** @type {?} */ CalendarComponent.prototype._enterDirection; /** @type {?} */ CalendarComponent.prototype.onCancel; /** @type {?} */ CalendarComponent.prototype.onConfirm; /** @type {?} */ CalendarComponent.prototype.onSelectHasDisableDate; /** @type {?} */ CalendarComponent.prototype.class; /** @type {?} */ CalendarComponent.prototype.selectDate; /** @type {?} */ CalendarComponent.prototype.onSelectedDate; /** @type {?} */ CalendarComponent.prototype.triggerSelectHasDisableDate; /** @type {?} */ CalendarComponent.prototype.onClose; /** @type {?} */ CalendarComponent.prototype.triggerConfirm; /** @type {?} */ CalendarComponent.prototype.triggerClear; /** @type {?} */ CalendarComponent.prototype.onTimeChange; /** @type {?} */ CalendarComponent.prototype.shortcutSelect; /** @type {?} */ CalendarComponent.prototype.setClientHeight; /** @type {?} */ CalendarComponent.prototype._localeProviderService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJjYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULGlCQUFpQixFQUNqQixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEMsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBb0o3QiwyQkFBb0Isc0JBQTZDO1FBQWpFLGlCQUFxRTtRQUFqRCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO3NCQWpJL0MsS0FBSzt5QkFHRixLQUFLO3VDQUVsQjtZQUNOLE9BQU8sRUFBRSxLQUFLO1lBQ2QsVUFBVSxFQUFFLElBQUk7WUFDaEIsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsS0FBSztZQUNmLFlBQVksRUFBRSxLQUFLO1lBQ25CLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLElBQUksRUFBRSxPQUFPO1lBQ2IsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdCO3VDQUVOO1lBQ04sY0FBYyxFQUFFLEtBQUs7WUFDckIsZUFBZSxFQUFFLEVBQUU7WUFDbkIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsT0FB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QVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQy9COztnQkF0VUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLDJ0RUFBd0M7b0JBQ3hDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzs7OztnQkFwQlEscUJBQXFCOzs7eUJBa0QzQixLQUFLO21DQVdMLEtBQUs7NEJBTUwsS0FBSztpQ0FNTCxLQUFLOzBCQVNMLEtBQUs7K0JBYUwsS0FBSzs4QkFJTCxLQUFLOzBCQUlMLEtBQUs7MEJBSUwsS0FBSzsyQkFJTCxLQUFLO3VCQUlMLEtBQUs7K0JBSUwsS0FBSzswQkFJTCxLQUFLOzJCQUlMLEtBQUs7K0JBRUwsS0FBSzsyQkFRTCxLQUFLOzJCQUlMLE1BQU07NEJBRU4sTUFBTTt5Q0FFTixNQUFNO3dCQUdOLFdBQVcsU0FBQyxPQUFPOzs0QkFsS3RCOztTQW1DYSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4vZGF0ZS9EYXRhVHlwZXMnO1xuaW1wb3J0IHpoQ04gZnJvbSAnLi9sb2NhbGUvemhfQ04nO1xuaW1wb3J0IGVuVVMgZnJvbSAnLi9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IFByb3BzVHlwZSBmcm9tICcuL2NhbGVuZGFyLnByb3BzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2NhbGVQcm92aWRlclNlcnZpY2UgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWVyZ2VEYXRlVGltZSB9IGZyb20gJy4vdXRpbC9pbmRleCc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB7IFByb3BzVHlwZSB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHlwZSB7XG4gIHNob3dUaW1lUGlja2VyOiBib29sZWFuO1xuICB0aW1lUGlja2VyVGl0bGU/OiBzdHJpbmc7XG4gIHN0YXJ0RGF0ZT86IERhdGU7XG4gIGVuZERhdGU/OiBEYXRlO1xuICBkaXNDb25maXJtQnRuPzogYm9vbGVhbjtcbiAgY2xpZW50SGlnaHQ/OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0NhbGVuZGFyLCBuem0tY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBpc1Nob3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29udGVudEFuaW1hdGVDbGFzczogc3RyaW5nO1xuICBtYXNrQW5pbWF0ZUNsYXNzOiBzdHJpbmc7XG4gIHNob3dDbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3BzID0ge1xuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIHNob3dIZWFkZXI6IHRydWUsXG4gICAgbG9jYWxlOiB6aENOLFxuICAgIHBpY2tUaW1lOiBmYWxzZSxcbiAgICBzaG93U2hvcnRjdXQ6IGZhbHNlLFxuICAgIHByZWZpeENsczogJ3JtYy1jYWxlbmRhcicsXG4gICAgdHlwZTogJ3JhbmdlJyxcbiAgICBkZWZhdWx0VGltZVZhbHVlOiBuZXcgRGF0ZSgyMDAwLCAwLCAxLCA4KVxuICB9IGFzIFByb3BzVHlwZTtcblxuICBzdGF0ZSA9IHtcbiAgICBzaG93VGltZVBpY2tlcjogZmFsc2UsXG4gICAgdGltZVBpY2tlclRpdGxlOiAnJyxcbiAgICBzdGFydERhdGU6IHVuZGVmaW5lZCxcbiAgICBlbmREYXRlOiB1bmRlZmluZWQsXG4gICAgZGlzQ29uZmlybUJ0bjogdHJ1ZSxcbiAgICBjbGllbnRIaWdodDogMFxuICB9IGFzIFN0YXRlVHlwZTtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9lbnRlckRpcmVjdGlvbjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsb2NhbGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09ICdlblVTJykge1xuICAgICAgdGhpcy5wcm9wcy5sb2NhbGUgPSBlblVTO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICd6aENOJykge1xuICAgICAgdGhpcy5wcm9wcy5sb2NhbGUgPSB6aENOO1xuICAgIH1cblxuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRUaW1lVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMuZGVmYXVsdFRpbWVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcHJlZml4Q2xzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnByb3BzLnByZWZpeENscyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZW50ZXJEaXJlY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLl9lbnRlckRpcmVjdGlvbiA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9lbnRlckRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVILWVudGVyIHNsaWRlSC1lbnRlci1hY3RpdmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVWLWVudGVyIHNsaWRlVi1lbnRlci1hY3RpdmUnO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdmlzaWJsZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMudmlzaWJsZSA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLnNob3dBbmltYXRpb24oKTtcbiAgICAgIHRoaXMuaXNTaG93ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlQW5pbWF0aW9uKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBnZXREYXRlRXh0cmEodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmdldERhdGVFeHRyYSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0RGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuZGVmYXVsdERhdGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWluRGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMubWluRGF0ZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXhEYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5tYXhEYXRlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBpY2tUaW1lKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5waWNrVGltZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB0eXBlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy50eXBlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNob3dTaG9ydGN1dCh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuc2hvd1Nob3J0Y3V0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHJvd1NpemUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLnJvd1NpemUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgaW5maW5pdGUodmFsdWUpIHt9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnJlY2VpdmVQcm9wcyh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG9uU2VsZWN0KHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5vblNlbGVjdCA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNhbmNlbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ29uZmlybTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uU2VsZWN0SGFzRGlzYWJsZURhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGNsYXNzOiBzdHJpbmcgPSAnYW0tY2FsZW5kYXInO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvY2FsZVByb3ZpZGVyU2VydmljZTogTG9jYWxlUHJvdmlkZXJTZXJ2aWNlKSB7fVxuXG4gIHJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IFByb3BzVHlwZSkge1xuICAgIGlmIChuZXh0UHJvcHMudmlzaWJsZSAmJiBuZXh0UHJvcHMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLnNob3J0Y3V0U2VsZWN0KG5leHRQcm9wcy5kZWZhdWx0VmFsdWVbMF0sIG5leHRQcm9wcy5kZWZhdWx0VmFsdWVbMV0sIG5leHRQcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgc2hvd0FuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5fZW50ZXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlSC1lbnRlciBzbGlkZUgtZW50ZXItYWN0aXZlJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlVi1lbnRlciBzbGlkZVYtZW50ZXItYWN0aXZlJztcbiAgICB9XG4gICAgdGhpcy5tYXNrQW5pbWF0ZUNsYXNzID0gJ2ZhZGUtZW50ZXIgZmFkZS1lbnRlci1hY3RpdmUnO1xuICB9XG5cbiAgaGlkZUFuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5fZW50ZXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlSC1sZWF2ZSBzbGlkZUgtbGVhdmUtYWN0aXZlJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlVi1sZWF2ZSBzbGlkZVYtbGVhdmUtYWN0aXZlJztcbiAgICB9XG4gICAgdGhpcy5tYXNrQW5pbWF0ZUNsYXNzID0gJ2ZhZGUtbGVhdmUgZmFkZS1sZWF2ZS1hY3RpdmUnO1xuICB9XG5cbiAgc2VsZWN0RGF0ZSA9IChcbiAgICBkYXRlOiBEYXRlLFxuICAgIHVzZURhdGVUaW1lID0gZmFsc2UsXG4gICAgb2xkU3RhdGU6IHsgc3RhcnREYXRlPzogRGF0ZTsgZW5kRGF0ZT86IERhdGUgfSA9IHt9LFxuICAgIHByb3BzID0gdGhpcy5wcm9wc1xuICApID0+IHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiB7fSBhcyBTdGF0ZVR5cGU7XG4gICAgfVxuICAgIGxldCBuZXdTdGF0ZSA9IHt9IGFzIFN0YXRlVHlwZTtcbiAgICBjb25zdCB7IHR5cGUsIHBpY2tUaW1lLCBkZWZhdWx0VGltZVZhbHVlLCBsb2NhbGUgPSB7fSBhcyBNb2RlbHMuTG9jYWxlIH0gPSBwcm9wcztcbiAgICBjb25zdCBuZXdEYXRlID0gcGlja1RpbWUgJiYgIXVzZURhdGVUaW1lID8gbWVyZ2VEYXRlVGltZShkYXRlLCBkZWZhdWx0VGltZVZhbHVlKSA6IGRhdGU7XG4gICAgY29uc3QgeyBzdGFydERhdGUsIGVuZERhdGUgfSA9IG9sZFN0YXRlO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdvbmUnOlxuICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICBzdGFydERhdGU6IG5ld0RhdGUsXG4gICAgICAgICAgZGlzQ29uZmlybUJ0bjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBpY2tUaW1lKSB7XG4gICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICAgIHRpbWVQaWNrZXJUaXRsZTogbG9jYWxlLnNlbGVjdFRpbWUsXG4gICAgICAgICAgICBzaG93VGltZVBpY2tlcjogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgaWYgKCFzdGFydERhdGUgfHwgZW5kRGF0ZSkge1xuICAgICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICAgICAgICBzdGFydERhdGU6IG5ld0RhdGUsXG4gICAgICAgICAgICBlbmREYXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkaXNDb25maXJtQnRuOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocGlja1RpbWUpIHtcbiAgICAgICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICAgICAgdGltZVBpY2tlclRpdGxlOiBsb2NhbGUuc2VsZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBzaG93VGltZVBpY2tlcjogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICAgIHRpbWVQaWNrZXJUaXRsZTogK25ld0RhdGUgPj0gK3N0YXJ0RGF0ZSA/IGxvY2FsZS5zZWxlY3RFbmRUaW1lIDogbG9jYWxlLnNlbGVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGRpc0NvbmZpcm1CdG46IGZhbHNlLFxuICAgICAgICAgICAgZW5kRGF0ZTpcbiAgICAgICAgICAgICAgcGlja1RpbWUgJiYgIXVzZURhdGVUaW1lICYmICtuZXdEYXRlID49ICtzdGFydERhdGVcbiAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKCttZXJnZURhdGVUaW1lKG5ld0RhdGUsIHN0YXJ0RGF0ZSkgKyAzNjAwMDAwKVxuICAgICAgICAgICAgICAgIDogbmV3RGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWREYXRlID0gKGRhdGU6IERhdGUpID0+IHtcbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IG9uU2VsZWN0IH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKG9uU2VsZWN0KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9uU2VsZWN0KGRhdGUsIFtzdGFydERhdGUsIGVuZERhdGVdKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNob3J0Y3V0U2VsZWN0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgIC4uLnRoaXMuc2VsZWN0RGF0ZShkYXRlLCBmYWxzZSwgeyBzdGFydERhdGUsIGVuZERhdGUgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5zaG93Q2xlYXIgPSAhIXRoaXMuc3RhdGUuc3RhcnREYXRlO1xuICB9XG5cbiAgdHJpZ2dlclNlbGVjdEhhc0Rpc2FibGVEYXRlID0gKGRhdGU6IERhdGVbXSkgPT4ge1xuICAgIHRoaXMudHJpZ2dlckNsZWFyKCk7XG4gICAgdGhpcy5vblNlbGVjdEhhc0Rpc2FibGVEYXRlICYmIHRoaXMub25TZWxlY3RIYXNEaXNhYmxlRGF0ZS5lbWl0KGRhdGUpO1xuICB9XG5cbiAgb25DbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2hvd1RpbWVQaWNrZXI6IGZhbHNlLFxuICAgICAgdGltZVBpY2tlclRpdGxlOiAnJyxcbiAgICAgIHN0YXJ0RGF0ZTogdW5kZWZpbmVkLFxuICAgICAgZW5kRGF0ZTogdW5kZWZpbmVkLFxuICAgICAgZGlzQ29uZmlybUJ0bjogdHJ1ZSxcbiAgICAgIGNsaWVudEhpZ2h0OiAwXG4gICAgfSBhcyBTdGF0ZVR5cGU7XG4gICAgdGhpcy5zaG93Q2xlYXIgPSAhIXRoaXMuc3RhdGUuc3RhcnREYXRlO1xuICB9XG5cbiAgdHJpZ2dlckNvbmZpcm0gPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFydERhdGUsIGVuZERhdGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlICYmICtzdGFydERhdGUgPiArZW5kRGF0ZSkge1xuICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICByZXR1cm4gdGhpcy5vbkNvbmZpcm0gJiYgdGhpcy5vbkNvbmZpcm0uZW1pdCh7IHN0YXJ0RGF0ZTogZW5kRGF0ZSwgZW5kRGF0ZTogc3RhcnREYXRlIH0pO1xuICAgIH1cbiAgICB0aGlzLm9uQ29uZmlybSAmJiB0aGlzLm9uQ29uZmlybS5lbWl0KHsgc3RhcnREYXRlLCBlbmREYXRlIH0pO1xuICAgIHRoaXMub25DbG9zZSgpO1xuICB9XG5cbiAgdHJpZ2dlckNhbmNlbCgpIHtcbiAgICB0aGlzLnByb3BzLm9uQ2FuY2VsICYmIHRoaXMucHJvcHMub25DYW5jZWwoKTtcbiAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICB0aGlzLm9uQ2FuY2VsICYmIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgdHJpZ2dlckNsZWFyID0gKCkgPT4ge1xuICAgIC8vIOa4hemZpOaVsOaNruWBmuW7tui/n++8jOWQpuWImeWQjOatpeWIt+aWsOaVsOaNruWvvOiHtOaKpemUmVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgLi4ueyBzdGFydERhdGU6IHVuZGVmaW5lZCwgZW5kRGF0ZTogdW5kZWZpbmVkLCBzaG93VGltZVBpY2tlcjogZmFsc2UgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucHJvcHMub25DbGVhciAmJiB0aGlzLnByb3BzLm9uQ2xlYXIoKTtcbiAgICAgIHRoaXMuc2hvd0NsZWFyID0gISF0aGlzLnN0YXRlLnN0YXJ0RGF0ZTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIG9uVGltZUNoYW5nZSA9IChkYXRlOiBEYXRlKSA9PiB7XG4gICAgY29uc3QgeyBzdGFydERhdGUsIGVuZERhdGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKGVuZERhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGUuZW5kRGF0ZSA9IGRhdGU7XG4gICAgfSBlbHNlIGlmIChzdGFydERhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGUuc3RhcnREYXRlID0gZGF0ZTtcbiAgICB9XG4gIH1cblxuICBzaG9ydGN1dFNlbGVjdCA9IChzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUsIHByb3BzID0gdGhpcy5wcm9wcykgPT4ge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgLi4ueyBzdGFydERhdGUsIHNob3dUaW1lUGlja2VyOiBmYWxzZSB9LFxuICAgICAgLi4udGhpcy5zZWxlY3REYXRlKGVuZERhdGUsIHRydWUsIHsgc3RhcnREYXRlIH0sIHByb3BzKVxuICAgIH07XG4gICAgdGhpcy5zaG93Q2xlYXIgPSAhIXRoaXMuc3RhdGUuc3RhcnREYXRlO1xuICB9XG5cbiAgc2V0Q2xpZW50SGVpZ2h0ID0gKGhlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zdGF0ZS5jbGllbnRIaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMucHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0RGF0ZShkZWZhdWx0VmFsdWVbMV0sIHRydWUsIHsgc3RhcnREYXRlOiBkZWZhdWx0VmFsdWVbMF0gfSwgdGhpcy5wcm9wcylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9jYWxlUHJvdmlkZXJTZXJ2aWNlLmxvY2FsZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxvY2FsZSA9IHsgLi4udGhpcy5fbG9jYWxlUHJvdmlkZXJTZXJ2aWNlLmdldExvY2FsZVN1Yk9iaignQ2FsZW5kYXInKSB9IGFzIE1vZGVscy5Mb2NhbGU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=