UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

577 lines 49.3 kB
/** * @fileoverview added by tsickle * Generated from: two-datepicker/two-datepicker.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, ViewChild, Input, HostListener, Output, EventEmitter } from '@angular/core'; import { CdkOverlayOrigin } from '@angular/cdk/overlay'; import { cornerFadeInOut } from '@duoduo-oba/ng-devui/utils'; import { Subject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; 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'; export class TwoDatePickerComponent { /** * @param {?} el * @param {?} datePickerConfig * @param {?} i18n */ constructor(el, datePickerConfig, i18n) { this.el = el; this.datePickerConfig = datePickerConfig; this.i18n = i18n; this.showTime = false; this.selectedRange = [null, null]; this.hideOnRangeSelected = true; this.selectRange = new EventEmitter(); this.datePosition = 'bottom'; this.selectDateSubject = new Subject(); this.hoverOnDate = new Subject(); this.switchOpenSub = new Subject(); this.today = new Date(); this.datepickerPosition = 'bottom'; this.currentCalendars = [null, null]; this.isOpen = false; this.startOpen = false; this.endOpen = false; this.onChange = (/** * @param {?} _ * @return {?} */ (_) => null); this.chooseDate = (/** * @param {?} range * @return {?} */ (range) => { if (range) { this.selectedRange = range; if (Array.isArray(this.selectedRange)) { [this.rangeStart, this.rangeEnd] = this.selectedRange; } } this.notifyValueChange(range); }); this.clear = (/** * @param {?} side * @return {?} */ (side) => { if (side === 'start') { this.selectStart(null); } else if (side === 'end') { this.selectEnd(null); } [this.rangeStart, this.rangeEnd] = this.selectedRange; }); this._dateConfig = datePickerConfig['dateConfig']; this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter(); } /** * @param {?} dateConfig * @return {?} */ set dateConfig(dateConfig) { if (dateConfig) { this._dateConfig = dateConfig; this._dateFormat = this.showTime ? dateConfig.format.time : dateConfig.format.date; } else { this._dateConfig = this.datePickerConfig.dateConfig; } } /** * @param {?} dateFormat * @return {?} */ set dateFormat(dateFormat) { if (this._dateFormat !== dateFormat) { this._dateFormat = dateFormat; } } /** * @param {?} date * @return {?} */ set maxDate(date) { /** @type {?} */ const parseDate = this.convertDate(date); if (parseDate) { this._maxDate = parseDate; } } /** * @param {?} date * @return {?} */ set minDate(date) { /** @type {?} */ const parseDate = this.convertDate(date); if (parseDate) { this._minDate = parseDate; } } /** * @param {?} side * @return {?} */ set whichOpen(side) { this._whichOpen = side; this.switchOpenSub.next(side); } /** * @return {?} */ get dateConfig() { return this._dateConfig; } /** * @return {?} */ get dateFormat() { return this._dateFormat; } /** * @return {?} */ get maxDate() { return this._maxDate; } /** * @return {?} */ get minDate() { return this._minDate; } /** * @return {?} */ get whichOpen() { return this._whichOpen; } /** * @param {?} $event * @return {?} */ onDocumentClick($event) { if (this.el.nativeElement !== $event.target) { this.isOpen = false; this.startOpen = false; this.endOpen = false; this.whichOpen = false; } } /** * @return {?} */ ngOnInit() { 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.el.nativeElement); this.subscribeHoverActions(); } /** * @return {?} */ isDisableToday() { if ((this.minDate.getTime() >= (this.today).getTime()) || (this.maxDate.getTime() <= (this.today).getTime())) { this.disableToday = true; } else { this.disableToday = false; } } /** * @param {?} event * @param {?} side * @return {?} */ toggle(event, side) { event.stopPropagation(); if (this.isOpen) { if (side === 'start') { if (this.startOpen) { this.startOpen = false; this.isOpen = false; this.whichOpen = false; } else if (this.endOpen) { this.startOpen = true; this.whichOpen = 'start'; } this.endOpen = false; } else if (side === 'end') { if (this.startOpen) { this.endOpen = true; this.whichOpen = 'end'; } else if (this.endOpen) { this.endOpen = false; this.isOpen = false; this.whichOpen = false; } this.startOpen = false; } } else { this.startOpen = side === 'start' ? true : false; this.endOpen = side === 'end' ? true : false; this.isOpen = true; this.whichOpen = side; } } /** * @param {?} position * @return {?} */ onPositionChange(position) { switch (position.connectionPair.overlayY) { case 'top': case 'center': this.datePosition = 'bottom'; break; case 'bottom': this.datePosition = 'top'; } } /** * @param {?} date * @return {?} */ convertDate(date) { return date ? this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale) : null; } /** * @param {?} date * @return {?} */ formatDate(date) { return date ? this.dateConverter.format(date, this.dateFormat, this.locale || this.i18nLocale) : null; } /** * @param {?} el * @return {?} */ updateCdkConnectedOverlayOrigin(el) { if (el) { this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(el); } else { this.cdkConnectedOverlayOrigin = undefined; } } /** * @param {?} currentCalender * @param {?} orientation * @return {?} */ syncPickerPair(currentCalender, orientation) { switch (orientation) { case 'left': this.currentCalendars[0] = currentCalender; break; case 'right': this.currentCalendars[1] = currentCalender; break; } } /** * @param {?} data * @return {?} */ rangeChange(data) { this.chooseDate(data.selectedRange); this.selectDateSubject.next({ side: 'start', date: this.rangeStart, onlyWrite: true }); this.selectDateSubject.next({ side: 'end', date: this.rangeEnd, onlyWrite: true }); } /** * @param {?} range * @return {?} */ notifyValueChange(range) { this.onChange(range); this.selectRange.emit(this.selectedRange); } /** * @param {?} event * @return {?} */ selectingDate(event) { this.hoverOnDate.next(event); } /** * @return {?} */ subscribeHoverActions() { this.hoverOnDate.pipe(distinctUntilChanged()).subscribe((/** * @param {?} date * @return {?} */ (date) => { this.previewRangeEnd(date); })); } /** * @param {?} date * @return {?} */ previewRangeEnd(date) { if (date) { this.leftPicker['previewEnd'] = date; this.rightPicker['previewEnd'] = date; } } /** * @param {?} rangeStart * @param {?} picker * @return {?} */ syncRangeStart(rangeStart, picker) { if (this.whichOpen === 'end') { this.selectEnd(rangeStart); } else if (this.whichOpen === 'start') { this.selectStart(rangeStart); } picker.selectRange(rangeStart, true); } /** * @param {?} date * @return {?} */ selectStart(date) { this.selectDateSubject.next({ side: 'start', date: date }); this.whichOpen = 'end'; this.startOpen = false; this.endOpen = true; this.selectedRange[0] = date; this.rangeStart = date; this.isDisableToday(); } /** * @param {?} date * @return {?} */ selectEnd(date) { this.selectDateSubject.next({ side: 'end', date: date }); this.selectedRange[1] = date; this.rangeEnd = date; if (!this.showTime && this.hideOnRangeSelected) { this.isOpen = false; this.startOpen = false; this.endOpen = false; this.whichOpen = false; } this.isDisableToday(); } /** * @return {?} */ consolidateTime() { } /** * @param {?} event * @return {?} */ chooseToday(event) { event.preventDefault(); event.stopPropagation(); if ((this.minDate.getTime() <= (this.today).getTime()) && (this.maxDate.getTime() >= (this.today).getTime())) { if (this.whichOpen === 'start') { this.selectStart(this.today); } else if (this.whichOpen === 'end') { this.selectEnd(this.today); } [this.rangeStart, this.rangeEnd] = this.selectedRange; } } /** * @param {?} event * @return {?} */ clearBtn(event) { event.preventDefault(); event.stopPropagation(); if (this.whichOpen) { this.clear(this.whichOpen); } } /** * @return {?} */ setI18nText() { this.i18nText = this.i18n.getI18nText().datePicker; this.i18nLocale = this.i18n.getI18nText().locale; this.i18nSubscription = this.i18n.langChange().subscribe((/** * @param {?} data * @return {?} */ (data) => { this.i18nText = data.datePicker; this.i18nLocale = data.locale; })); } /** * @return {?} */ ngOnDestroy() { this.isOpen = false; this.startOpen = false; this.endOpen = false; if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } } } TwoDatePickerComponent.decorators = [ { type: Component, args: [{ selector: '[dTwoDatePicker]', exportAs: 'twoDatePicker', template: "<ng-content></ng-content>\r\n<ng-template\r\n cdk-connected-overlay\r\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen\"\r\n (backdropClick)=\"isOpen = false\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n>\r\n <div [@cornerFadeInOut]=\"isOpen ? datepickerPosition : 'void'\" class=\"devui-two-date-wrapper\">\r\n <div class=\"devui-two-date-picker\">\r\n <d-two-datepicker-single\r\n class=\"devui-date-picker\"\r\n [locale]=\"locale\"\r\n [cssClass]=\"cssClass\"\r\n [disabled]=\"disabled\"\r\n [dateConverter]=\"dateConverter\"\r\n [dateFormat]=\"dateFormat\"\r\n [dateConfig]=\"dateConfig\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [rangePicker]=\"true\"\r\n [selectedRange]=\"[rangeStart, rangeEnd]\"\r\n [currentCalendars]=\"currentCalendars\"\r\n [showTime]=\"showTime\"\r\n (rangeSelected)=\"rangeChange($event)\"\r\n (hoverOnDate)=\"selectingDate($event)\"\r\n (rangeSelecting)=\"syncRangeStart($event, rightPicker)\"\r\n (syncPickerPair)=\"syncPickerPair($event, 'left')\"\r\n [whichOpen]=\"whichOpen\"\r\n #leftPicker\r\n >\r\n </d-two-datepicker-single>\r\n <d-two-datepicker-single\r\n class=\"devui-date-picker\"\r\n [locale]=\"locale\"\r\n [cssClass]=\"cssClass\"\r\n [disabled]=\"disabled\"\r\n [dateConverter]=\"dateConverter\"\r\n [dateFormat]=\"dateFormat\"\r\n [dateConfig]=\"dateConfig\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [rangePicker]=\"true\"\r\n [selectedRange]=\"[rangeStart, rangeEnd]\"\r\n [currentCalendars]=\"currentCalendars\"\r\n [showTime]=\"showTime\"\r\n (rangeSelected)=\"rangeChange($event)\"\r\n (hoverOnDate)=\"selectingDate($event)\"\r\n (rangeSelecting)=\"syncRangeStart($event, leftPicker)\"\r\n (syncPickerPair)=\"syncPickerPair($event, 'right')\"\r\n [isAuxiliary]=\"true\"\r\n (consolidateTime)=\"consolidateTime()\"\r\n [whichOpen]=\"whichOpen\"\r\n #rightPicker\r\n >\r\n </d-two-datepicker-single>\r\n </div>\r\n <div *ngIf=\"!customViewTemplate\" class=\"devui-two-date-footer devui-two-date-custom\">\r\n <a\r\n [ngClass]=\"{\r\n disabled: disableToday\r\n }\"\r\n (click)=\"chooseToday($event)\"\r\n >{{ i18nText.today }}</a\r\n >\r\n <d-button (btnClick)=\"clearBtn($event)\" bsSize=\"sm\">{{ i18nText.clear }}</d-button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", animations: [ cornerFadeInOut ], styles: [".devui-two-date-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-two-date-wrapper .devui-two-date-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-two-date-wrapper .devui-two-date-picker::after{content:'';position:absolute;top:29px;width:100%;height:1px;border-bottom:1px solid #adb0b8}.devui-two-date-wrapper .devui-two-date-custom{width:500px;border-top:1px solid #adb0b8}.devui-two-date-wrapper .devui-two-date-footer{padding:10px;display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}.devui-two-date-wrapper .devui-two-date-footer a{color:#5e7ce0;text-decoration:none;cursor:pointer}.devui-two-date-wrapper .devui-two-date-footer a.disabled{color:#adb0b8;cursor:not-allowed}.devui-date-picker:not(:last-child){margin-right:20px}.host-wrapper{color:red}:host ::ng-deep .devui-input-focus{border-color:#344899!important}"] }] } ]; /** @nocollapse */ TwoDatePickerComponent.ctorParameters = () => [ { type: ElementRef }, { type: DatePickerConfig }, { type: I18nService } ]; TwoDatePickerComponent.propDecorators = { locale: [{ type: Input }], cssClass: [{ type: Input }], disabled: [{ type: Input }], dateConverter: [{ type: Input }], selectedRange: [{ type: Input }], hideOnRangeSelected: [{ type: Input }], selectRange: [{ type: Output }], leftPicker: [{ type: ViewChild, args: ['leftPicker', { static: false },] }], rightPicker: [{ type: ViewChild, args: ['rightPicker', { static: false },] }], templateWrap: [{ type: ViewChild, args: ['templateWrap', { static: false },] }], dateConfig: [{ type: Input }], dateFormat: [{ type: Input }], onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; if (false) { /** @type {?} */ TwoDatePickerComponent.prototype.locale; /** @type {?} */ TwoDatePickerComponent.prototype.cssClass; /** @type {?} */ TwoDatePickerComponent.prototype.disabled; /** @type {?} */ TwoDatePickerComponent.prototype.dateConverter; /** @type {?} */ TwoDatePickerComponent.prototype.showTime; /** @type {?} */ TwoDatePickerComponent.prototype.selectedRange; /** @type {?} */ TwoDatePickerComponent.prototype.hideOnRangeSelected; /** @type {?} */ TwoDatePickerComponent.prototype.customViewTemplate; /** @type {?} */ TwoDatePickerComponent.prototype.selectRange; /** @type {?} */ TwoDatePickerComponent.prototype.leftPicker; /** @type {?} */ TwoDatePickerComponent.prototype.rightPicker; /** @type {?} */ TwoDatePickerComponent.prototype.templateWrap; /** @type {?} */ TwoDatePickerComponent.prototype.datePosition; /** @type {?} */ TwoDatePickerComponent.prototype.selectDateSubject; /** @type {?} */ TwoDatePickerComponent.prototype.hoverOnDate; /** @type {?} */ TwoDatePickerComponent.prototype.switchOpenSub; /** @type {?} */ TwoDatePickerComponent.prototype.today; /** @type {?} */ TwoDatePickerComponent.prototype.rangeStart; /** @type {?} */ TwoDatePickerComponent.prototype.rangeEnd; /** @type {?} */ TwoDatePickerComponent.prototype.disableToday; /** @type {?} */ TwoDatePickerComponent.prototype.i18nText; /** @type {?} */ TwoDatePickerComponent.prototype.i18nLocale; /** @type {?} */ TwoDatePickerComponent.prototype.i18nSubscription; /** @type {?} */ TwoDatePickerComponent.prototype.datepickerPosition; /** @type {?} */ TwoDatePickerComponent.prototype.currentCalendars; /** @type {?} */ TwoDatePickerComponent.prototype.cdkConnectedOverlayOrigin; /** @type {?} */ TwoDatePickerComponent.prototype.isOpen; /** * @type {?} * @private */ TwoDatePickerComponent.prototype.startOpen; /** * @type {?} * @private */ TwoDatePickerComponent.prototype.endOpen; /** * @type {?} * @private */ TwoDatePickerComponent.prototype._whichOpen; /** * @type {?} * @private */ TwoDatePickerComponent.prototype._dateConfig; /** * @type {?} * @private */ TwoDatePickerComponent.prototype._dateFormat; /** * @type {?} * @private */ TwoDatePickerComponent.prototype._maxDate; /** * @type {?} * @private */ TwoDatePickerComponent.prototype._minDate; /** * @type {?} * @private */ TwoDatePickerComponent.prototype.onChange; /** @type {?} */ TwoDatePickerComponent.prototype.chooseDate; /** @type {?} */ TwoDatePickerComponent.prototype.clear; /** @type {?} */ TwoDatePickerComponent.prototype.el; /** * @type {?} * @protected */ TwoDatePickerComponent.prototype.datePickerConfig; /** * @type {?} * @private */ TwoDatePickerComponent.prototype.i18n; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWRhdGVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvZGF0ZXBpY2tlci8iLCJzb3VyY2VzIjpbInR3by1kYXRlcGlja2VyL3R3by1kYXRlcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsVUFBVSxFQUVWLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUF5RCxNQUFNLHNCQUFzQixDQUFDO0FBQy9HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLElBQUksZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVd0RCxNQUFNLE9BQU8sc0JBQXNCOzs7Ozs7SUF1Q2pDLFlBQW1CLEVBQWMsRUFBWSxnQkFBa0MsRUFBVSxJQUFpQjtRQUF2RixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVkscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWE7UUFsQzFHLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDUixrQkFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUxQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFLM0MsaUJBQVksR0FB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QU0sRUFBRSxLQUFLLEVBQUU7MEJBQ3pDLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzJCQUMxQyxTQUFTLFNBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt5QkFnQzNDLEtBQUs7eUJBUUwsS0FBSzs4QkFzQ0wsWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOzs7O0lBekYxQyx3Q0FBd0I7O0lBQ3hCLDBDQUEwQjs7SUFDMUIsMENBQTJCOztJQUMzQiwrQ0FBc0M7O0lBQ3RDLDBDQUFpQjs7SUFDakIsK0NBQXNDOztJQUN0QyxxREFBb0M7O0lBQ3BDLG9EQUFxQzs7SUFDckMsNkNBQTJDOztJQUMzQyw0Q0FBbUU7O0lBQ25FLDZDQUFxRTs7SUFDckUsOENBQXVFOztJQUV2RSw4Q0FBK0M7O0lBQy9DLG1EQUFtRjs7SUFDbkYsNkNBQXFEOztJQUNyRCwrQ0FBaUY7O0lBQ2pGLHVDQUFtQjs7SUFDbkIsNENBQVc7O0lBQ1gsMENBQVM7O0lBQ1QsOENBQWE7O0lBQ2IsMENBQXNDOztJQUN0Qyw0Q0FBb0M7O0lBQ3BDLGtEQUErQjs7SUFDL0Isb0RBQXFEOztJQUVyRCxrREFBdUM7O0lBQ3ZDLDJEQUFtRDs7SUFDbkQsd0NBQXNCOzs7OztJQUN0QiwyQ0FBMEI7Ozs7O0lBQzFCLHlDQUF3Qjs7Ozs7SUFDeEIsNENBQXdDOzs7OztJQUN4Qyw2Q0FBeUI7Ozs7O0lBQ3pCLDZDQUE0Qjs7Ozs7SUFDNUIsMENBQXVCOzs7OztJQUN2QiwwQ0FBdUI7Ozs7O0lBQ3ZCLDBDQUFvQzs7SUE2SnBDLDRDQVFDOztJQW1GRCx1Q0FPQzs7SUE3UFcsb0NBQXFCOzs7OztJQUFFLGtEQUE0Qzs7Ozs7SUFBRSxzQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIElucHV0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSwgVmVydGljYWxDb25uZWN0aW9uUG9zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBjb3JuZXJGYWRlSW5PdXQgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGF0ZVBpY2tlckNvbmZpZ1NlcnZpY2UgYXMgRGF0ZVBpY2tlckNvbmZpZyB9IGZyb20gJy4uL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSTE4blNlcnZpY2UsIEkxOG5JbnRlcmZhY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgRGF0ZUNvbnZlcnRlciB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgRGVmYXVsdERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1tkVHdvRGF0ZVBpY2tlcl0nLFxyXG4gIGV4cG9ydEFzOiAndHdvRGF0ZVBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICd0d28tZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHdvLWRhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBjb3JuZXJGYWRlSW5PdXRcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUd29EYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGxvY2FsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNzc0NsYXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGF0ZUNvbnZlcnRlcjogRGF0ZUNvbnZlcnRlcjtcclxuICBzaG93VGltZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkUmFuZ2UgPSBbbnVsbCwgbnVsbF07XHJcbiAgQElucHV0KCkgaGlkZU9uUmFuZ2VTZWxlY3RlZCA9IHRydWU7XHJcbiAgY3VzdG9tVmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RSYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAVmlld0NoaWxkKCdsZWZ0UGlja2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGxlZnRQaWNrZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgncmlnaHRQaWNrZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcmlnaHRQaWNrZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVXcmFwJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRlbXBsYXRlV3JhcDogRWxlbWVudFJlZjtcclxuXHJcbiAgZGF0ZVBvc2l0aW9uOiBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MgPSAnYm90dG9tJztcclxuICBzZWxlY3REYXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHtzaWRlOiBTdHJpbmcsIGRhdGU6IERhdGUsIG9ubHlXcml0ZT86IEJvb2xlYW59PigpO1xyXG4gIGhvdmVyT25EYXRlOiBTdWJqZWN0PG9iamVjdD4gPSBuZXcgU3ViamVjdDxvYmplY3Q+KCk7XHJcbiAgc3dpdGNoT3BlblN1YjogU3ViamVjdDwnc3RhcnQnfCdlbmQnfGZhbHNlPiA9IG5ldyBTdWJqZWN0PCdzdGFydCd8J2VuZCd8ZmFsc2U+KCk7XHJcbiAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gIHJhbmdlU3RhcnQ7XHJcbiAgcmFuZ2VFbmQ7XHJcbiAgZGlzYWJsZVRvZGF5O1xyXG4gIGkxOG5UZXh0OiBJMThuSW50ZXJmYWNlWydkYXRlUGlja2VyJ107XHJcbiAgaTE4bkxvY2FsZTogSTE4bkludGVyZmFjZVsnbG9jYWxlJ107XHJcbiAgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGRhdGVwaWNrZXJQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zID0gJ2JvdHRvbSc7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50Q2FsZW5kYXJzID0gW251bGwsIG51bGxdO1xyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBDZGtPdmVybGF5T3JpZ2luO1xyXG4gIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXJ0T3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZW5kT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3doaWNoT3BlbjogJ3N0YXJ0J3wnZW5kJ3xmYWxzZTtcclxuICBwcml2YXRlIF9kYXRlQ29uZmlnOiBhbnk7XHJcbiAgcHJpdmF0ZSBfZGF0ZUZvcm1hdDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX21heERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfbWluRGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGVsOiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgZGF0ZVBpY2tlckNvbmZpZzogRGF0ZVBpY2tlckNvbmZpZywgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSkge1xyXG4gICAgdGhpcy5fZGF0ZUNvbmZpZyA9IGRhdGVQaWNrZXJDb25maWdbJ2RhdGVDb25maWcnXTtcclxuICAgIHRoaXMuZGF0ZUNvbnZlcnRlciA9IGRhdGVQaWNrZXJDb25maWdbJ2RhdGVDb25maWcnXS5kYXRlQ29udmVydGVyIHx8IG5ldyBEZWZhdWx0RGF0ZUNvbnZlcnRlcigpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IGRhdGVDb25maWcoZGF0ZUNvbmZpZzogYW55KSB7XHJcbiAgICBpZiAoZGF0ZUNvbmZpZykge1xyXG4gICAgICB0aGlzLl9kYXRlQ29uZmlnID0gZGF0ZUNvbmZpZztcclxuICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IHRoaXMuc2hvd1RpbWUgPyBkYXRlQ29uZmlnLmZvcm1hdC50aW1lIDogZGF0ZUNvbmZpZy5mb3JtYXQuZGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSB0aGlzLmRhdGVQaWNrZXJDb25maWcuZGF0ZUNvbmZpZztcclxuICAgIH1cclxuICB9XHJcbiAgQElucHV0KCkgc2V0IGRhdGVGb3JtYXQoZGF0ZUZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5fZGF0ZUZvcm1hdCAhPT0gZGF0ZUZvcm1hdCkge1xyXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gZGF0ZUZvcm1hdDtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5jb252ZXJ0RGF0ZShkYXRlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWF4RGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0IG1pbkRhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5jb252ZXJ0RGF0ZShkYXRlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWluRGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0IHdoaWNoT3BlbihzaWRlOiAnc3RhcnQnfCdlbmQnfGZhbHNlKSB7XHJcbiAgICB0aGlzLl93aGljaE9wZW4gPSBzaWRlO1xyXG4gICAgdGhpcy5zd2l0Y2hPcGVuU3ViLm5leHQoc2lkZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUNvbmZpZygpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlQ29uZmlnO1xyXG4gIH1cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0O1xyXG4gIH1cclxuICBnZXQgbWF4RGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xyXG4gIH1cclxuICBnZXQgbWluRGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xyXG4gIH1cclxuICBnZXQgd2hpY2hPcGVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3doaWNoT3BlbjtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soJGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5lbC5uYXRpdmVFbGVtZW50ICE9PSAkZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZW5kT3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLndoaWNoT3BlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5taW5EYXRlID8gbmV3IERhdGUodGhpcy5taW5EYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5taW4sIDAsIDEsIDAsIDAsIDApO1xyXG4gICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSA/IG5ldyBEYXRlKHRoaXMubWF4RGF0ZSkgOiBuZXcgRGF0ZSh0aGlzLmRhdGVDb25maWcubWF4LCAxMSwgMzEsIDIzLCA1OSwgNTkpO1xyXG4gICAgdGhpcy5zZXRJMThuVGV4dCgpO1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUhvdmVyQWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgaXNEaXNhYmxlVG9kYXkoKSB7XHJcbiAgICBpZiAoKHRoaXMubWluRGF0ZS5nZXRUaW1lKCkgPj0gKHRoaXMudG9kYXkpLmdldFRpbWUoKSkgfHwgKHRoaXMubWF4RGF0ZS5nZXRUaW1lKCkgPD0gKHRoaXMudG9kYXkpLmdldFRpbWUoKSkpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlVG9kYXkgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlVG9kYXkgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZShldmVudCwgc2lkZTogJ3N0YXJ0J3wnZW5kJykge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgaWYgKHNpZGUgPT09ICdzdGFydCcpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGFydE9wZW4pIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy53aGljaE9wZW4gPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZW5kT3Blbikge1xyXG4gICAgICAgICAgdGhpcy5zdGFydE9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy53aGljaE9wZW4gPSAnc3RhcnQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVuZE9wZW4gPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmIChzaWRlID09PSAnZW5kJykge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXJ0T3Blbikge1xyXG4gICAgICAgICAgdGhpcy5lbmRPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMud2hpY2hPcGVuID0gJ2VuZCc7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVuZE9wZW4pIHtcclxuICAgICAgICAgIHRoaXMuZW5kT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMud2hpY2hPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRPcGVuID0gc2lkZSA9PT0gJ3N0YXJ0JyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgdGhpcy5lbmRPcGVuID0gc2lkZSA9PT0gJ2VuZCcgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICAgICAgdGhpcy53aGljaE9wZW4gPSBzaWRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Qb3NpdGlvbkNoYW5nZShwb3NpdGlvbjogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSB7XHJcbiAgICBzd2l0Y2ggKHBvc2l0aW9uLmNvbm5lY3Rpb25QYWlyLm92ZXJsYXlZKSB7XHJcbiAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgIGNhc2UgJ2NlbnRlcic6XHJcbiAgICAgICAgdGhpcy5kYXRlUG9zaXRpb24gPSAnYm90dG9tJztcclxuICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgdGhpcy5kYXRlUG9zaXRpb24gPSAndG9wJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnZlcnREYXRlKGRhdGUpIHtcclxuICAgIHJldHVybiBkYXRlID9cclxuICAgICAgdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBmb3JtYXREYXRlKGRhdGUpIHtcclxuICAgIHJldHVybiBkYXRlID9cclxuICAgICAgdGhpcy5kYXRlQ29udmVydGVyLmZvcm1hdChkYXRlLCB0aGlzLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlIHx8IHRoaXMuaTE4bkxvY2FsZSkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbihlbDogRWxlbWVudFJlZikge1xyXG4gICAgaWYgKGVsKSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IG5ldyBDZGtPdmVybGF5T3JpZ2luKGVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN5bmNQaWNrZXJQYWlyKGN1cnJlbnRDYWxlbmRlcjogb2JqZWN0LCBvcmllbnRhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyc1swXSA9IGN1cnJlbnRDYWxlbmRlcjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyc1sxXSA9IGN1cnJlbnRDYWxlbmRlcjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJhbmdlQ2hhbmdlKGRhdGEpIHtcclxuICAgIHRoaXMuY2hvb3NlRGF0ZShkYXRhLnNlbGVjdGVkUmFuZ2UpO1xyXG4gICAgdGhpcy5zZWxlY3REYXRlU3ViamVjdC5uZXh0KHtzaWRlOiAnc3RhcnQnLCBkYXRlOiB0aGlzLnJhbmdlU3RhcnQsIG9ubHlXcml0ZTogdHJ1ZX0pO1xyXG4gICAgdGhpcy5zZWxlY3REYXRlU3ViamVjdC5uZXh0KHtzaWRlOiAnZW5kJywgZGF0ZTogdGhpcy5yYW5nZUVuZCwgb25seVdyaXRlOiB0cnVlfSk7XHJcbiAgfVxyXG5cclxuICBjaG9vc2VEYXRlID0gKHJhbmdlKSA9PiB7XHJcbiAgICBpZiAocmFuZ2UpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlID0gcmFuZ2U7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWRSYW5nZSkpIHtcclxuICAgICAgICBbdGhpcy5yYW5nZVN0YXJ0LCB0aGlzLnJhbmdlRW5kXSA9IHRoaXMuc2VsZWN0ZWRSYW5nZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ub3RpZnlWYWx1ZUNoYW5nZShyYW5nZSk7XHJcbiAgfVxyXG5cclxuICBub3RpZnlWYWx1ZUNoYW5nZShyYW5nZSkge1xyXG4gICAgdGhpcy5vbkNoYW5nZShyYW5nZSk7XHJcbiAgICB0aGlzLnNlbGVjdFJhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGluZ0RhdGUoZXZlbnQpIHtcclxuICAgIHRoaXMuaG92ZXJPbkRhdGUubmV4dChldmVudCk7XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVIb3ZlckFjdGlvbnMoKSB7XHJcbiAgICB0aGlzLmhvdmVyT25EYXRlLnBpcGUoXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICkuc3Vic2NyaWJlKChkYXRlKSA9PiB7XHJcbiAgICAgIHRoaXMucHJldmlld1JhbmdlRW5kKGRhdGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcmV2aWV3UmFuZ2VFbmQoZGF0ZSkge1xyXG4gICAgaWYgKGRhdGUpIHtcclxuICAgICAgdGhpcy5sZWZ0UGlja2VyWydwcmV2aWV3RW5kJ10gPSBkYXRlO1xyXG4gICAgICB0aGlzLnJpZ2h0UGlja2VyWydwcmV2aWV3RW5kJ10gPSBkYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3luY1JhbmdlU3RhcnQocmFuZ2VTdGFydCwgcGlja2VyOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLndoaWNoT3BlbiA9PT0gJ2VuZCcpIHtcclxuICAgICAgdGhpcy5zZWxlY3RFbmQocmFuZ2VTdGFydCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMud2hpY2hPcGVuID09PSAnc3RhcnQnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0U3RhcnQocmFuZ2VTdGFydCk7XHJcbiAgICB9XHJcbiAgICBwaWNrZXIuc2VsZWN0UmFuZ2UocmFuZ2VTdGFydCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdGFydChkYXRlOiBEYXRlKSB7XHJcbiAgICB0aGlzLnNlbGVjdERhdGVTdWJqZWN0Lm5leHQoe3NpZGU6ICdzdGFydCcsIGRhdGU6IGRhdGV9KTtcclxuICAgIHRoaXMud2hpY2hPcGVuID0gJ2VuZCc7XHJcbiAgICB0aGlzLnN0YXJ0T3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5lbmRPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZVswXSA9IGRhdGU7XHJcbiAgICB0aGlzLnJhbmdlU3RhcnQgPSBkYXRlO1xyXG4gICAgdGhpcy5pc0Rpc2FibGVUb2RheSgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0RW5kKGRhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuc2VsZWN0RGF0ZVN1YmplY3QubmV4dCh7c2lkZTogJ2VuZCcsIGRhdGU6IGRhdGV9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZVsxXSA9IGRhdGU7XHJcbiAgICB0aGlzLnJhbmdlRW5kID0gZGF0ZTtcclxuICAgIGlmICghdGhpcy5zaG93VGltZSAmJiB0aGlzLmhpZGVPblJhbmdlU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGFydE9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5lbmRPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMud2hpY2hPcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzRGlzYWJsZVRvZGF5KCk7XHJcbiAgfVxyXG5cclxuICBjb25zb2xpZGF0ZVRpbWUoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgY2hvb3NlVG9kYXkoZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICgodGhpcy5taW5EYXRlLmdldFRpbWUoKSA8PSAodGhpcy50b2RheSkuZ2V0VGltZSgpKSAmJiAodGhpcy5tYXhEYXRlLmdldFRpbWUoKSA+PSAodGhpcy50b2RheSkuZ2V0VGltZSgpKSkge1xyXG4gICAgICBpZiAodGhpcy53aGljaE9wZW4gPT09ICdzdGFydCcpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdFN0YXJ0KHRoaXMudG9kYXkpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMud2hpY2hPcGVuID09PSAnZW5kJykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0RW5kKHRoaXMudG9kYXkpO1xyXG4gICAgICB9XHJcbiAgICAgIFt0aGlzLnJhbmdlU3RhcnQsIHRoaXMucmFuZ2VFbmRdID0gdGhpcy5zZWxlY3RlZFJhbmdlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJCdG4oZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLndoaWNoT3Blbikge1xyXG4gICAgICB0aGlzLmNsZWFyKHRoaXMud2hpY2hPcGVuKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyID0gKHNpZGU6ICdzdGFydCd8J2VuZCcpID0+IHtcclxuICAgIGlmIChzaWRlID09PSAnc3RhcnQnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0U3RhcnQobnVsbCk7XHJcbiAgICB9IGVsc2UgaWYgKHNpZGUgPT09ICdlbmQnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0RW5kKG51bGwpO1xyXG4gICAgfVxyXG4gICAgW3RoaXMucmFuZ2VTdGFydCwgdGhpcy5yYW5nZUVuZF0gPSB0aGlzLnNlbGVjdGVkUmFuZ2U7XHJcbiAgfVxyXG5cclxuICBzZXRJMThuVGV4dCgpIHtcclxuICAgIHRoaXMuaTE4blRleHQgPSB0aGlzLmkxOG4uZ2V0STE4blRleHQoKS5kYXRlUGlja2VyO1xyXG4gICAgdGhpcy5pMThuTG9jYWxlID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkubG9jYWxlO1xyXG4gICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uID0gdGhpcy5pMThuLmxhbmdDaGFuZ2UoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5pMThuVGV4dCA9IGRhdGEuZGF0ZVBpY2tlcjtcclxuICAgICAgdGhpcy5pMThuTG9jYWxlID0gZGF0YS5sb2NhbGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmVuZE9wZW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmkxOG5TdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==