UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

812 lines 67.7 kB
/** * @fileoverview added by tsickle * Generated from: date-range-picker.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Component, forwardRef, Input, Output, EventEmitter, ElementRef, ViewContainerRef, Renderer2, HostListener, ViewChild, TemplateRef } from '@angular/core'; import { CdkOverlayOrigin } from '@angular/cdk/overlay'; import { SelectDateRangeChangeReason } from './date-range-change-event-args.model'; import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service'; import { I18nService } from '@duoduo-oba/ng-devui/i18n'; import { DefaultDateConverter } from '@duoduo-oba/ng-devui/utils'; import { cornerFadeInOut } from '@duoduo-oba/ng-devui/utils'; import { Subject, fromEvent } from 'rxjs'; import { distinctUntilChanged, debounceTime } from 'rxjs/operators'; var DateRangePickerComponent = /** @class */ (function () { function DateRangePickerComponent(elementRef, viewContainerRef, renderer, datePickerConfig, i18n) { var _this = this; this.elementRef = elementRef; this.viewContainerRef = viewContainerRef; this.renderer = renderer; this.datePickerConfig = datePickerConfig; this.i18n = i18n; this.selectedRange = [null, null]; this.showTime = false; this.hideOnRangeSelected = false; this.splitter = ' - '; this.selectedRangeChange = new EventEmitter(); this._isOpen = false; this.clickShow = false; this.currentCalendars = [null, null]; this.hoverOnDate = new Subject(); this.datepickerPosition = 'bottom'; this.onChange = (/** * @param {?} _ * @return {?} */ function (_) { return null; }); this.onTouched = (/** * @return {?} */ function () { return null; }); this.chooseDate = (/** * @param {?} range * @return {?} */ function (range) { _this.writeValue(range); _this.notifyValueChange(range, SelectDateRangeChangeReason.date); if (!_this.showTime && _this.hideOnRangeSelected) { _this.hide(); } }); this.clearAll = (/** * @return {?} */ function () { _this.rangeChange({ selectedRange: [null, null] }); }); this._dateConfig = datePickerConfig['dateConfig']; this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter(); this.inputSub = fromEvent(this.elementRef.nativeElement, 'input') .pipe(debounceTime(300)).subscribe((/** * @param {?} event * @return {?} */ function (event) { _this.transUserInputToDatepicker(event); })); } Object.defineProperty(DateRangePickerComponent.prototype, "dateConfig", { get: /** * @return {?} */ function () { return this._dateConfig; }, set: /** * @param {?} dateConfig * @return {?} */ function (dateConfig) { if (dateConfig) { this._dateConfig = dateConfig; this._dateFormat = this.showTime ? dateConfig.format.time : dateConfig.format.date; } else { this._dateConfig = this.datePickerConfig.dateConfig; } }, enumerable: true, configurable: true }); Object.defineProperty(DateRangePickerComponent.prototype, "dateFormat", { get: /** * @return {?} */ function () { return this._dateFormat; }, set: /** * @param {?} dateFormat * @return {?} */ function (dateFormat) { if (this._dateFormat !== dateFormat) { this._dateFormat = dateFormat; } }, enumerable: true, configurable: true }); Object.defineProperty(DateRangePickerComponent.prototype, "maxDate", { get: /** * @return {?} */ function () { return this._maxDate; }, set: /** * @param {?} date * @return {?} */ function (date) { /** @type {?} */ var parseDate = this.convertDate(date); if (parseDate) { this._maxDate = parseDate; } }, enumerable: true, configurable: true }); Object.defineProperty(DateRangePickerComponent.prototype, "minDate", { get: /** * @return {?} */ function () { return this._minDate; }, set: /** * @param {?} date * @return {?} */ function (date) { /** @type {?} */ var parseDate = this.convertDate(date); if (parseDate) { this._minDate = parseDate; } }, enumerable: true, configurable: true }); Object.defineProperty(DateRangePickerComponent.prototype, "isOpen", { get: /** * @return {?} */ function () { return this._isOpen; }, set: /** * @param {?} isOpen * @return {?} */ function (isOpen) { this._isOpen = isOpen; if (!isOpen && !this.rangeEnd) { this.rangeStart = null; } }, enumerable: true, configurable: true }); /** * @return {?} */ DateRangePickerComponent.prototype.ngOnInit = /** * @return {?} */ function () { this._minDate = this.minDate ? new Date(this.minDate) : new Date(this.dateConfig.min, 0, 1, 0, 0, 0); this._maxDate = this.maxDate ? new Date(this.maxDate) : new Date(this.dateConfig.max, 11, 31, 23, 59, 59); this.setI18nText(); this.updateCdkConnectedOverlayOrigin(); this.subscribeHoverActions(); }; /** * @param {?} fn * @return {?} */ DateRangePickerComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ DateRangePickerComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * @param {?} selectedRange * @return {?} */ DateRangePickerComponent.prototype.writeValue = /** * @param {?} selectedRange * @return {?} */ function (selectedRange) { var _a; if (selectedRange) { this.selectedRange = selectedRange; if (Array.isArray(this.selectedRange)) { _a = tslib_1.__read(this.selectedRange, 2), this.rangeStart = _a[0], this.rangeEnd = _a[1]; } this.writeModelValue(selectedRange); } }; /** * @return {?} */ DateRangePickerComponent.prototype.setI18nText = /** * @return {?} */ function () { var _this = this; this.i18nLocale = this.i18n.getI18nText().locale; this.i18nSubscription = this.i18n.langChange().subscribe((/** * @param {?} data * @return {?} */ function (data) { _this.i18nLocale = data.locale; })); }; /** * @param {?} data * @return {?} */ DateRangePickerComponent.prototype.rangeChange = /** * @param {?} data * @return {?} */ function (data) { this.chooseDate(data.selectedRange); }; /** * @return {?} */ DateRangePickerComponent.prototype.updateCdkConnectedOverlayOrigin = /** * @return {?} */ function () { if (this.elementRef.nativeElement) { this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(this.elementRef.nativeElement); } }; /** * @param {?} $event * @param {?=} clickShow * @return {?} */ DateRangePickerComponent.prototype.toggle = /** * @param {?} $event * @param {?=} clickShow * @return {?} */ function ($event, clickShow) { this.isOpen = !this.isOpen; this.clickShow = clickShow; }; /** * @return {?} */ DateRangePickerComponent.prototype.hide = /** * @return {?} */ function () { this.isOpen = false; }; /** * @private * @param {?} input * @return {?} */ DateRangePickerComponent.prototype.writeModelValue = /** * @private * @param {?} input * @return {?} */ function (input) { if (Array.isArray(input) && input.every((/** * @param {?} _ * @return {?} */ function (_) { return !!_; }))) { this.renderer.setProperty(this.elementRef.nativeElement, 'value', this.formatDateRange(input)); } else { this.renderer.setProperty(this.elementRef.nativeElement, 'value', ''); } }; /** * @private * @param {?} arr * @return {?} */ DateRangePickerComponent.prototype.formatDateRange = /** * @private * @param {?} arr * @return {?} */ function (arr) { var _this = this; return arr.map((/** * @param {?} date * @param {?} i * @return {?} */ function (date, i) { return date ? _this.dateConverter.format(date, _this.dateFormat, _this.locale || _this.i18nLocale) : ['Start', 'End'][i]; })).join(this.splitter); }; /** * @param {?} $event * @return {?} */ DateRangePickerComponent.prototype.onBlur = /** * @param {?} $event * @return {?} */ function ($event) { this.onTouched(); }; /** * @param {?} $event * @return {?} */ DateRangePickerComponent.prototype.onDocumentClick = /** * @param {?} $event * @return {?} */ function ($event) { if (this.templateWrap && this.templateWrap.nativeElement.contains($event.target) && !this.hideOnRangeSelected) { this.isOpen = true; } else if (this.elementRef.nativeElement !== $event.target && !this.clickShow) { this.isOpen = false; } else { this.clickShow = false; } }; /** * @param {?} position * @return {?} */ DateRangePickerComponent.prototype.onPositionChange = /** * @param {?} position * @return {?} */ function (position) { switch (position.connectionPair.overlayY) { case 'top': case 'center': this.datepickerPosition = 'bottom'; break; case 'bottom': this.datepickerPosition = 'top'; } }; /** * @param {?} date * @return {?} */ DateRangePickerComponent.prototype.convertDate = /** * @param {?} date * @return {?} */ function (date) { return date ? this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale) : null; }; /** * @param {?} event * @return {?} */ DateRangePickerComponent.prototype.selectingDate = /** * @param {?} event * @return {?} */ function (event) { this.hoverOnDate.next(event); }; /** * @return {?} */ DateRangePickerComponent.prototype.subscribeHoverActions = /** * @return {?} */ function () { var _this = this; this.hoverOnDate.pipe(distinctUntilChanged()).subscribe((/** * @param {?} date * @return {?} */ function (date) { _this.previewRangeEnd(date); })); }; /** * @param {?} date * @return {?} */ DateRangePickerComponent.prototype.previewRangeEnd = /** * @param {?} date * @return {?} */ function (date) { if (date) { this.leftPicker['previewEnd'] = date; this.rightPicker['previewEnd'] = date; } }; /** * @param {?} rangeStart * @param {?} picker * @return {?} */ DateRangePickerComponent.prototype.syncRangeStart = /** * @param {?} rangeStart * @param {?} picker * @return {?} */ function (rangeStart, picker) { picker.selectRange(rangeStart, true); }; /** * @param {?} currentCalender * @param {?} orientation * @return {?} */ DateRangePickerComponent.prototype.syncPickerPair = /** * @param {?} currentCalender * @param {?} orientation * @return {?} */ function (currentCalender, orientation) { switch (orientation) { case 'left': this.currentCalendars[0] = currentCalender; break; case 'right': this.currentCalendars[1] = currentCalender; break; } }; /** * @param {?} range * @param {?=} reason * @return {?} */ DateRangePickerComponent.prototype.notifyValueChange = /** * @param {?} range * @param {?=} reason * @return {?} */ function (range, reason) { /** @type {?} */ var currentReason; this.onChange(range); if (reason === undefined) { currentReason = SelectDateRangeChangeReason.time; } else { currentReason = reason; } this.selectedRangeChange.emit({ reason: currentReason, selectedRange: range }); }; /** * @return {?} */ DateRangePickerComponent.prototype.consolidateTime = /** * @return {?} */ function () { /** @type {?} */ var rangeStart = this.rangeStart; /** @type {?} */ var rangeEnd = this.rangeEnd; /** @type {?} */ var rangeStartTime = this.leftPicker['currentTime']; /** @type {?} */ var rangeEndTime = this.rightPicker['currentTime']; this.rangeStart = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate(), rangeStartTime.hour, rangeStartTime.minute, rangeStartTime.second); this.rangeEnd = new Date(rangeEnd.getFullYear(), rangeEnd.getMonth(), rangeEnd.getDate(), rangeEndTime.hour, rangeEndTime.minute, rangeEndTime.second); /** @type {?} */ var newRange = [this.rangeStart, this.rangeEnd]; this.onTouched(); this.writeValue(newRange); this.notifyValueChange(newRange, SelectDateRangeChangeReason.button); this.hide(); }; /** * @private * @param {?} event * @return {?} */ DateRangePickerComponent.prototype.transUserInputToDatepicker = /** * @private * @param {?} event * @return {?} */ function (event) { var _this = this; if (!this.showTime && !this.disabled) { /** @type {?} */ var value = event.target.value; if (!value) { this.clearAll(); return; } /** @type {?} */ var valueList = value.split(this.splitter); /** @type {?} */ var valueFormat = void 0; // 如果拆出来6个,则为日期间分隔符和年月日间分隔符相同的情况,此情况允许 if (valueList.length === 6 && valueList.every((/** * @param {?} val * @return {?} */ function (val) { return !!val; }))) { /** @type {?} */ var curValueList_1 = []; valueList.forEach((/** * @param {?} val * @param {?} index * @return {?} */ function (val, index) { // 根据下标,前三个组装在一起,后三个组装在一起,不需要考虑分隔符,后面会format if ((index + 1) % 3 === 1) { curValueList_1.push(val); } else { curValueList_1[Math.ceil(index / 3) - 1] = curValueList_1[Math.ceil(index / 3) - 1] + '-' + val; } })); valueList = curValueList_1; } // 不管拆出来是6还是2个,都需要组装成2个日期 if (valueList.length === 2 && valueList.every((/** * @param {?} val * @return {?} */ function (val) { return !!val; }))) { if (valueList[0] !== valueList[1]) { // 判断前后两日期是否相等 /** @type {?} */ var valueTimeList = valueList.map((/** * @param {?} val * @return {?} */ function (val) { return (new Date(val + " 00:00:00")).getTime(); })); valueFormat = this.formatDateRange(valueList.map((/** * @param {?} numValue * @return {?} */ function (numValue) { return new Date(numValue); }))); if (value === valueFormat && !valueTimeList.every((/** * @param {?} val * @return {?} */ function (val) { return val >= _this.minDate.getTime() && val <= _this.maxDate.getTime(); }))) { // 判断前后俩日期是否小于最小或大于最大,若是则不合法,恢复之前的 this.writeValue(this.selectedRange); return; } else { // 判断前后俩日期是否大于最小,小于最大,若是则合法,进行如下操作 // 此时包括value为NaN既日期格式不正确的情况,对其进行处理下方判断会过滤掉 valueList = valueList.map((/** * @param {?} val * @return {?} */ function (val) { return new Date(val).getTime(); })).sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a - b; })).map((/** * @param {?} numValue * @return {?} */ function (numValue) { return new Date(numValue); })); } } else { // 前后相等的情况下恢复之前的 this.writeValue(this.selectedRange); return; } if (valueFormat && value === valueFormat) { this.chooseDate(valueList); } } } else { this.writeValue(this.selectedRange); } }; /** * @return {?} */ DateRangePickerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.hide(); if (this.inputSub) { this.inputSub.unsubscribe(); } if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } }; DateRangePickerComponent.decorators = [ { type: Component, args: [{ selector: '[dDateRangePicker]', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return DateRangePickerComponent; })), multi: true }], exportAs: 'dateRangePicker', template: "\n <ng-template cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (backdropClick)=\"isOpen=false\"\n (positionChange)=\"onPositionChange($event)\">\n <div [@cornerFadeInOut]=\"isOpen ? datepickerPosition : 'void'\" class=\"devui-date-range-wrapper\">\n <div class=\"devui-date-range-picker\">\n <d-datepicker-range-single [locale]=\"locale || i18nLocale\" class=\"devui-date-picker\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\" [dateConverter]=\"dateConverter\" (rangeSelected)=\"rangeChange($event)\"\n [dateFormat]=\"dateFormat\" [dateConfig]=\"dateConfig\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\" (hoverOnDate)=\"selectingDate($event)\" [rangePicker]=\"true\"\n [selectedRange]=\"[rangeStart, rangeEnd]\" (rangeSelecting)=\"syncRangeStart($event, rightPicker)\"\n (syncPickerPair)=\"syncPickerPair($event, 'left')\"\n [currentCalendars]=\"currentCalendars\"\n [showTime]=\"showTime\"\n #leftPicker></d-datepicker-range-single>\n <d-datepicker-range-single [locale]=\"locale || i18nLocale\" class=\"devui-date-picker\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\" [dateConverter]=\"dateConverter\" (rangeSelected)=\"rangeChange($event)\"\n [dateFormat]=\"dateFormat\" [dateConfig]=\"dateConfig\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\" (hoverOnDate)=\"selectingDate($event)\" [rangePicker]=\"true\"\n [selectedRange]=\"[rangeStart, rangeEnd]\" (rangeSelecting)=\"syncRangeStart($event, leftPicker)\"\n (syncPickerPair)=\"syncPickerPair($event, 'right')\" [isAuxiliary]=\"true\"\n [currentCalendars]=\"currentCalendars\"\n [showTime]=\"showTime\"\n (consolidateTime)=\"consolidateTime()\"\n #rightPicker></d-datepicker-range-single>\n </div>\n <div class=\"devui-date-range-custom\" *ngIf=\"customViewTemplate\" #templateWrap>\n <ng-template\n [ngTemplateOutlet]=\"customViewTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: this,\n clearAll: clearAll,\n chooseDate: chooseDate,\n rangeStart: rangeStart,\n rangeEnd: rangeEnd\n }\"\n ></ng-template>\n </div>\n </div>\n </ng-template>\n ", animations: [ cornerFadeInOut ], styles: [".devui-date-range-wrapper{display:-webkit-inline-box!important;display:inline-flex!important;box-shadow:0 4px 8px 0 rgba(41,48,64,.2);background-color:#fff;-webkit-transform:perspective(1px) translate3d(0,0,0);transform:perspective(1px) translate3d(0,0,0);-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.devui-date-range-wrapper .devui-date-range-picker{display:-webkit-inline-box!important;display:inline-flex!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.devui-date-range-wrapper .devui-date-range-picker::after{content:'';position:absolute;top:29px;width:100%;height:1px;border-bottom:1px solid #adb0b8}.devui-date-range-wrapper .devui-date-range-custom{width:500px;border-top:1px solid #adb0b8}.devui-date-picker:not(:last-child){margin-right:20px}"] }] } ]; /** @nocollapse */ DateRangePickerComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: ViewContainerRef }, { type: Renderer2 }, { type: DatePickerConfig }, { type: I18nService } ]; }; DateRangePickerComponent.propDecorators = { dateConfig: [{ type: Input }], dateFormat: [{ type: Input }], maxDate: [{ type: Input }], minDate: [{ type: Input }], locale: [{ type: Input }], cssClass: [{ type: Input }], disabled: [{ type: Input }], dateConverter: [{ type: Input }], selectedRange: [{ type: Input }], showTime: [{ type: Input }], hideOnRangeSelected: [{ type: Input }], customViewTemplate: [{ type: Input }], splitter: [{ type: Input }], selectedRangeChange: [{ type: Output }], leftPicker: [{ type: ViewChild, args: ['leftPicker', { static: false },] }], rightPicker: [{ type: ViewChild, args: ['rightPicker', { static: false },] }], templateWrap: [{ type: ViewChild, args: ['templateWrap', { static: false },] }], onBlur: [{ type: HostListener, args: ['blur', ['$event'],] }], onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; return DateRangePickerComponent; }()); export { DateRangePickerComponent }; if (false) { /** @type {?} */ DateRangePickerComponent.prototype.locale; /** @type {?} */ DateRangePickerComponent.prototype.cssClass; /** @type {?} */ DateRangePickerComponent.prototype.disabled; /** @type {?} */ DateRangePickerComponent.prototype.dateConverter; /** @type {?} */ DateRangePickerComponent.prototype.selectedRange; /** @type {?} */ DateRangePickerComponent.prototype.showTime; /** @type {?} */ DateRangePickerComponent.prototype.hideOnRangeSelected; /** @type {?} */ DateRangePickerComponent.prototype.customViewTemplate; /** @type {?} */ DateRangePickerComponent.prototype.splitter; /** @type {?} */ DateRangePickerComponent.prototype.selectedRangeChange; /** @type {?} */ DateRangePickerComponent.prototype.leftPicker; /** @type {?} */ DateRangePickerComponent.prototype.rightPicker; /** @type {?} */ DateRangePickerComponent.prototype.templateWrap; /** * @type {?} * @private */ DateRangePickerComponent.prototype._isOpen; /** * @type {?} * @private */ DateRangePickerComponent.prototype._dateConfig; /** * @type {?} * @private */ DateRangePickerComponent.prototype._dateFormat; /** * @type {?} * @private */ DateRangePickerComponent.prototype._maxDate; /** * @type {?} * @private */ DateRangePickerComponent.prototype._minDate; /** * @type {?} * @private */ DateRangePickerComponent.prototype.clickShow; /** * @type {?} * @private */ DateRangePickerComponent.prototype.inputSub; /** @type {?} */ DateRangePickerComponent.prototype.currentCalendars; /** @type {?} */ DateRangePickerComponent.prototype.cdkConnectedOverlayOrigin; /** @type {?} */ DateRangePickerComponent.prototype.i18nLocale; /** * @type {?} * @private */ DateRangePickerComponent.prototype.i18nSubscription; /** @type {?} */ DateRangePickerComponent.prototype.hoverOnDate; /** @type {?} */ DateRangePickerComponent.prototype.datepickerPosition; /** @type {?} */ DateRangePickerComponent.prototype.rangeStart; /** @type {?} */ DateRangePickerComponent.prototype.rangeEnd; /** * @type {?} * @private */ DateRangePickerComponent.prototype.onChange; /** * @type {?} * @private */ DateRangePickerComponent.prototype.onTouched; /** @type {?} */ DateRangePickerComponent.prototype.chooseDate; /** @type {?} */ DateRangePickerComponent.prototype.clearAll; /** * @type {?} * @private */ DateRangePickerComponent.prototype.elementRef; /** * @type {?} * @private */ DateRangePickerComponent.prototype.viewContainerRef; /** * @type {?} * @private */ DateRangePickerComponent.prototype.renderer; /** * @type {?} * @private */ DateRangePickerComponent.prototype.datePickerConfig; /** * @type {?} * @private */ DateRangePickerComponent.prototype.i18n; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvZGF0ZXBpY2tlci8iLCJzb3VyY2VzIjpbImRhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBRVYsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxFQUNWLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFFVCxXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUF5RCxNQUFNLHNCQUFzQixDQUFDO0FBRS9HLE9BQU8sRUFBa0MsMkJBQTJCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNuSCxPQUFPLEVBQUUsdUJBQXVCLElBQUksZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRTtJQXFKRSxrQ0FBb0IsVUFBc0IsRUFBVSxnQkFBa0MsRUFDbEUsUUFBbUIsRUFBVSxnQkFBa0MsRUFBVSxJQUFpQjtRQUQ5RyxpQkFXQztRQVhtQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsRSxhQUFRLEdBQVIs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QUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOztJQTRKNUMsK0JBQUM7Q0FBQSxBQTNZRCxJQTJZQztTQS9VWSx3QkFBd0I7OztJQTBEbkMsMENBQXdCOztJQUN4Qiw0Q0FBMEI7O0lBQzFCLDRDQUEyQjs7SUFDM0IsaURBQXNDOztJQUN0QyxpREFBc0M7O0lBQ3RDLDRDQUEwQjs7SUFDMUIsdURBQXFDOztJQUNyQyxzREFBOEM7O0lBQzlDLDRDQUE0Qjs7SUFDNUIsdURBQW1GOztJQUNuRiw4Q0FBbUU7O0lBQ25FLCtDQUFxRTs7SUFDckUsZ0RBQXVFOzs7OztJQUN2RSwyQ0FBd0I7Ozs7O0lBQ3hCLCtDQUF5Qjs7Ozs7SUFDekIsK0NBQTRCOzs7OztJQUM1Qiw0Q0FBdUI7Ozs7O0lBQ3ZCLDRDQUF1Qjs7Ozs7SUFDdkIsNkNBQTBCOzs7OztJQUMxQiw0Q0FBK0I7O0lBQy9CLG9EQUF1Qzs7SUFDdkMsNkRBQXNDOztJQUN0Qyw4Q0FBMkM7Ozs7O0lBQzNDLG9EQUF1Qzs7SUFDdkMsK0NBQXFEOztJQUNyRCxzREFBcUQ7O0lBQ3JELDhDQUFXOztJQUNYLDRDQUFTOzs7OztJQUNULDRDQUFvQzs7Ozs7SUFDcEMsNkNBQStCOztJQW9EL0IsOENBSUM7O0lBNExELDRDQUVDOzs7OztJQXBQVyw4Q0FBOEI7Ozs7O0lBQUUsb0RBQTBDOzs7OztJQUMxRSw0Q0FBMkI7Ozs7O0lBQUUsb0RBQTBDOzs7OztJQUFFLHdDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgZm9yd2FyZFJlZixcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBFbGVtZW50UmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBWaWV3Q2hpbGQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFRlbXBsYXRlUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSwgVmVydGljYWxDb25uZWN0aW9uUG9zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBEYXRlQ29udmVydGVyIH0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xyXG5pbXBvcnQgeyBTZWxlY3REYXRlUmFuZ2VDaGFuZ2VFdmVudEFyZ3MsIFNlbGVjdERhdGVSYW5nZUNoYW5nZVJlYXNvbiB9IGZyb20gJy4vZGF0ZS1yYW5nZS1jaGFuZ2UtZXZlbnQtYXJncy5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJDb25maWdTZXJ2aWNlIGFzIERhdGVQaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSTE4blNlcnZpY2UsIEkxOG5JbnRlcmZhY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgRGVmYXVsdERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IGNvcm5lckZhZGVJbk91dCB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgU3ViamVjdCwgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnW2REYXRlUmFuZ2VQaWNrZXJdJyxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dLFxyXG4gIGV4cG9ydEFzOiAnZGF0ZVJhbmdlUGlja2VyJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPG5nLXRlbXBsYXRlIGNkay1jb25uZWN0ZWQtb3ZlcmxheVxyXG4gICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5cIlxyXG4gICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW5cIlxyXG4gICAgICAgICAgICAgICAgIChiYWNrZHJvcENsaWNrKT1cImlzT3Blbj1mYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICA8ZGl2IFtAY29ybmVyRmFkZUluT3V0XT1cImlzT3BlbiA/IGRhdGVwaWNrZXJQb3NpdGlvbiA6ICd2b2lkJ1wiIGNsYXNzPVwiZGV2dWktZGF0ZS1yYW5nZS13cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldnVpLWRhdGUtcmFuZ2UtcGlja2VyXCI+XHJcbiAgICAgICAgICA8ZC1kYXRlcGlja2VyLXJhbmdlLXNpbmdsZSBbbG9jYWxlXT1cImxvY2FsZSB8fCBpMThuTG9jYWxlXCIgY2xhc3M9XCJkZXZ1aS1kYXRlLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nzc0NsYXNzXT1cImNzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbZGF0ZUNvbnZlcnRlcl09XCJkYXRlQ29udmVydGVyXCIgKHJhbmdlU2VsZWN0ZWQpPVwicmFuZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtkYXRlQ29uZmlnXT1cImRhdGVDb25maWdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIiAoaG92ZXJPbkRhdGUpPVwic2VsZWN0aW5nRGF0ZSgkZXZlbnQpXCIgW3JhbmdlUGlja2VyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFJhbmdlXT1cIltyYW5nZVN0YXJ0LCByYW5nZUVuZF1cIiAocmFuZ2VTZWxlY3RpbmcpPVwic3luY1JhbmdlU3RhcnQoJGV2ZW50LCByaWdodFBpY2tlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzeW5jUGlja2VyUGFpcik9XCJzeW5jUGlja2VyUGFpcigkZXZlbnQsICdsZWZ0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50Q2FsZW5kYXJzXT1cImN1cnJlbnRDYWxlbmRhcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJzaG93VGltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2xlZnRQaWNrZXI+PC9kLWRhdGVwaWNrZXItcmFuZ2Utc2luZ2xlPlxyXG4gICAgICAgICAgPGQtZGF0ZXBpY2tlci1yYW5nZS1zaW5nbGUgW2xvY2FsZV09XCJsb2NhbGUgfHwgaTE4bkxvY2FsZVwiIGNsYXNzPVwiZGV2dWktZGF0ZS1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjc3NDbGFzc109XCJjc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2Fi