ng-devui
Version:
DevUI components based on Angular
227 lines • 37.7 kB
JavaScript
import { Component, ElementRef, EventEmitter, forwardRef, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { I18nService } from 'ng-devui/i18n';
import { DefaultDateConverter } from 'ng-devui/utils';
import { Subject } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators';
import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service';
import { SelectDateRangeChangeReason } from './date-range-change-event-args.model';
import * as i0 from "@angular/core";
import * as i1 from "./date-picker.config.service";
import * as i2 from "ng-devui/i18n";
import * as i3 from "@angular/common";
import * as i4 from "./single-date-range-picker.component";
export class DateRangePickerComponent {
set showTime(showTime) {
this._showTime = showTime;
}
get showTime() {
return typeof this._showTime === 'boolean' ? this._showTime : this.dateConfig.timePicker;
}
set dateConfig(dateConfig) {
if (this.checkDateConfig(dateConfig)) {
this._dateConfig = dateConfig;
}
else {
this._dateConfig = this.datePickerConfig.dateConfig;
}
}
get dateConfig() {
return this._dateConfig;
}
set maxDate(date) {
const parseDate = this.dateConverter.parse(date, this.dateFormat) || null;
if (parseDate) {
this._maxDate = parseDate;
}
}
get maxDate() {
return this._maxDate;
}
set minDate(date) {
const parseDate = this.dateConverter.parse(date, this.dateFormat) || null;
if (parseDate) {
this._minDate = parseDate;
}
}
get minDate() {
return this._minDate;
}
constructor(datePickerConfig, i18n) {
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.selectedRange = [null, null];
this.selectedRangeChange = new EventEmitter();
this.hide = new EventEmitter();
this.currentCalendars = [null, null];
this.hoverOnDate = new Subject();
this.onChange = (_) => null;
this.onTouched = () => null;
this.chooseDate = (range, reason) => {
const currentReason = typeof reason === 'number' ? reason : SelectDateRangeChangeReason.custom;
this.writeValue(range);
this.notifyValueChange(range, currentReason);
};
this.clearAll = (reason) => {
const currentReason = typeof reason === 'number' ? reason : SelectDateRangeChangeReason.custom;
this.chooseDate([null, null], currentReason);
};
this._dateConfig = datePickerConfig.dateConfig;
this.dateConverter = datePickerConfig.dateConfig.dateConverter || new DefaultDateConverter();
this.setI18nText();
}
checkDateConfig(dateConfig) {
if (!dateConfig) {
return false;
}
if (typeof dateConfig.timePicker !== 'boolean' || !dateConfig.max || !dateConfig.min || !dateConfig.format) {
return false;
}
return true;
}
ngOnChanges(changes) {
if (changes?.selectedRange?.currentValue) {
this.writeValue(this.selectedRange);
}
}
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.subscribeHoverActions();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
writeValue(selectedRange) {
if (selectedRange) {
this.selectedRange = selectedRange;
if (this.leftPicker) {
this.leftPicker.selectedRange = selectedRange;
}
if (this.rightPicker) {
this.rightPicker.selectedRange = selectedRange;
}
[this.rangeStart, this.rangeEnd] = this.selectedRange;
}
}
setI18nText() {
this.i18nLocale = this.i18n.getI18nText().locale;
this.i18nText = this.i18n.getI18nText().datePicker;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nLocale = data.locale;
this.i18nText = data.datePicker;
});
}
rangeChange(data) {
this.chooseDate(data.selectedRange, data.reason);
}
selectingDate(event) {
this.hoverOnDate.next(event);
}
subscribeHoverActions() {
this.hoverOnDate.pipe(distinctUntilChanged()).subscribe((date) => {
this.previewRangeEnd(date);
});
}
previewRangeEnd(date) {
this.leftPicker.previewEnd = date;
this.rightPicker.previewEnd = date;
}
syncRangeStart(rangeStart, picker) {
picker.selectRange(rangeStart, true);
}
syncPickerPair(currentCalender, orientation) {
switch (orientation) {
case 'left':
this.currentCalendars[0] = currentCalender;
break;
case 'right':
this.currentCalendars[1] = currentCalender;
break;
default:
}
}
notifyValueChange(range, reason) {
this.onChange(range);
this.onTouched();
this.selectedRangeChange.emit({
reason,
selectedRange: range,
});
}
consolidateTime() {
const rangeStart = this.rangeStart;
const rangeEnd = this.rangeEnd;
const rangeStartTime = this.leftPicker.currentTime;
const 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);
const newRange = [this.rangeStart, this.rangeEnd];
this.onTouched();
this.writeValue(newRange);
this.notifyValueChange(newRange, SelectDateRangeChangeReason.button);
this.hide.emit(true);
}
ngOnDestroy() {
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerComponent, deps: [{ token: i1.DatePickerConfigService }, { token: i2.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangePickerComponent, selector: "d-date-range-picker", inputs: { locale: "locale", cssClass: "cssClass", disabled: "disabled", dateConverter: "dateConverter", selectedRange: "selectedRange", dateFormat: "dateFormat", customViewTemplate: "customViewTemplate", showTime: "showTime", dateConfig: "dateConfig", maxDate: "maxDate", minDate: "minDate" }, outputs: { selectedRangeChange: "selectedRangeChange", hide: "hide" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DateRangePickerComponent),
multi: true,
},
], viewQueries: [{ propertyName: "leftPicker", first: true, predicate: ["leftPicker"], descendants: true }, { propertyName: "rightPicker", first: true, predicate: ["rightPicker"], descendants: true }, { propertyName: "templateWrap", first: true, predicate: ["templateWrap"], descendants: true }], exportAs: ["dateRangePicker"], usesOnChanges: true, ngImport: i0, template: "<div class=\"devui-date-range-picker\">\n <d-datepicker-range-single\n [locale]=\"locale || i18nLocale\"\n class=\"devui-date-picker\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n (rangeSelected)=\"rangeChange($event)\"\n [dateConfig]=\"dateConfig\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (hoverOnDate)=\"selectingDate($event)\"\n [rangePicker]=\"true\"\n [selectedRange]=\"[rangeStart, rangeEnd]\"\n (rangeSelecting)=\"syncRangeStart($event, rightPicker)\"\n (syncPickerPair)=\"syncPickerPair($event, 'left')\"\n [currentCalendars]=\"currentCalendars\"\n [showTime]=\"showTime\"\n #leftPicker\n ></d-datepicker-range-single>\n <d-datepicker-range-single\n [locale]=\"locale || i18nLocale\"\n class=\"devui-date-picker\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n (rangeSelected)=\"rangeChange($event)\"\n [dateConfig]=\"dateConfig\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (hoverOnDate)=\"selectingDate($event)\"\n [rangePicker]=\"true\"\n [selectedRange]=\"[rangeStart, rangeEnd]\"\n (rangeSelecting)=\"syncRangeStart($event, leftPicker)\"\n (syncPickerPair)=\"syncPickerPair($event, 'right')\"\n [isAuxiliary]=\"true\"\n [currentCalendars]=\"currentCalendars\"\n [showTime]=\"showTime\"\n (consolidateTime)=\"consolidateTime()\"\n #rightPicker\n ></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", styles: [".devui-date-range-wrapper{display:inline-flex!important;box-shadow:var(--devui-shadow-length-connected-overlay, 0 4px 12px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background-color:var(--devui-connected-overlay-bg, #ffffff);transform:perspective(1px) translateZ(0);flex-direction:column;border-radius:var(--devui-border-radius, 2px);margin:4px 0;-webkit-user-select:none;user-select:none}.devui-date-range-custom{width:500px;border-top:1px solid var(--devui-line, #dbdbdb)}.devui-date-picker:not(:last-child){margin-right:20px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.SingleDateRangePickerComponent, selector: "d-datepicker-range-single", inputs: ["selectedRange", "rangePicker", "isAuxiliary", "currentCalendars"], outputs: ["hoverOnDate", "rangeSelected", "rangeSelecting", "syncPickerPair", "consolidateTime"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerComponent, decorators: [{
type: Component,
args: [{ selector: 'd-date-range-picker', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DateRangePickerComponent),
multi: true,
},
], exportAs: 'dateRangePicker', preserveWhitespaces: false, template: "<div class=\"devui-date-range-picker\">\n <d-datepicker-range-single\n [locale]=\"locale || i18nLocale\"\n class=\"devui-date-picker\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n (rangeSelected)=\"rangeChange($event)\"\n [dateConfig]=\"dateConfig\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (hoverOnDate)=\"selectingDate($event)\"\n [rangePicker]=\"true\"\n [selectedRange]=\"[rangeStart, rangeEnd]\"\n (rangeSelecting)=\"syncRangeStart($event, rightPicker)\"\n (syncPickerPair)=\"syncPickerPair($event, 'left')\"\n [currentCalendars]=\"currentCalendars\"\n [showTime]=\"showTime\"\n #leftPicker\n ></d-datepicker-range-single>\n <d-datepicker-range-single\n [locale]=\"locale || i18nLocale\"\n class=\"devui-date-picker\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n (rangeSelected)=\"rangeChange($event)\"\n [dateConfig]=\"dateConfig\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (hoverOnDate)=\"selectingDate($event)\"\n [rangePicker]=\"true\"\n [selectedRange]=\"[rangeStart, rangeEnd]\"\n (rangeSelecting)=\"syncRangeStart($event, leftPicker)\"\n (syncPickerPair)=\"syncPickerPair($event, 'right')\"\n [isAuxiliary]=\"true\"\n [currentCalendars]=\"currentCalendars\"\n [showTime]=\"showTime\"\n (consolidateTime)=\"consolidateTime()\"\n #rightPicker\n ></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", styles: [".devui-date-range-wrapper{display:inline-flex!important;box-shadow:var(--devui-shadow-length-connected-overlay, 0 4px 12px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background-color:var(--devui-connected-overlay-bg, #ffffff);transform:perspective(1px) translateZ(0);flex-direction:column;border-radius:var(--devui-border-radius, 2px);margin:4px 0;-webkit-user-select:none;user-select:none}.devui-date-range-custom{width:500px;border-top:1px solid var(--devui-line, #dbdbdb)}.devui-date-picker:not(:last-child){margin-right:20px}\n"] }]
}], ctorParameters: () => [{ type: i1.DatePickerConfigService }, { type: i2.I18nService }], propDecorators: { locale: [{
type: Input
}], cssClass: [{
type: Input
}], disabled: [{
type: Input
}], dateConverter: [{
type: Input
}], selectedRange: [{
type: Input
}], dateFormat: [{
type: Input
}], customViewTemplate: [{
type: Input
}], selectedRangeChange: [{
type: Output
}], hide: [{
type: Output
}], leftPicker: [{
type: ViewChild,
args: ['leftPicker']
}], rightPicker: [{
type: ViewChild,
args: ['rightPicker']
}], templateWrap: [{
type: ViewChild,
args: ['templateWrap']
}], showTime: [{
type: Input
}], dateConfig: [{
type: Input
}], maxDate: [{
type: Input
}], minDate: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvZGF0ZXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUlMLE1BQU0sRUFFTixXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQWlCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQWlCLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixJQUFJLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUFrQywyQkFBMkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7QUFnQm5ILE1BQU0sT0FBTyx3QkFBd0I7SUEyQm5DLElBQWEsUUFBUSxDQUFDLFFBQWlCO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO0lBQzNGLENBQUM7SUFFRCxJQUFhLFVBQVUsQ0FBQyxVQUFlO1FBQ3JDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQ2hDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFhLE9BQU8sQ0FBQyxJQUFnQjtRQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUMxRSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQWEsT0FBTyxDQUFDLElBQWdCO1FBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDO1FBQzFFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsWUFBb0IsZ0JBQWtDLEVBQVUsSUFBaUI7UUFBN0QscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWE7UUFoRXhFLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFHNUIsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDekUsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFRdEMscUJBQWdCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFJdkMsZ0JBQVcsR0FBb0IsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUc3QyxhQUFRLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztRQUM1QixjQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBMEcvQixlQUFVLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTyxFQUFFLEVBQUU7WUFDOUIsTUFBTSxhQUFhLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQztZQUMvRixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO1FBNEVGLGFBQVEsR0FBRyxDQUFDLE1BQW9DLEVBQUUsRUFBRTtZQUNsRCxNQUFNLGFBQWEsR0FBRyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDO1lBQy9GLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO1FBaEpBLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1FBQy9DLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGFBQWEsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDN0YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxlQUFlLENBQUMsVUFBZTtRQUM3QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxPQUFPLFVBQVUsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0csT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxhQUFhO1FBQ3RCLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxVQUFrQixDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDekQsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsV0FBbUIsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQzFELENBQUM7WUFDRCxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQUk7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFRRCxhQUFhLENBQUMsS0FBSztRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMvRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxVQUFrQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUM5QyxDQUFDO0lBRUQsY0FBYyxDQUFDLFVBQVUsRUFBRSxNQUFXO1FBQ3BDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxjQUFjLENBQUMsZUFBdUIsRUFBRSxXQUFtQjtRQUN6RCxRQUFRLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO2dCQUMzQyxNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUM7Z0JBQzNDLE1BQU07WUFDUixRQUFRO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTTtRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzVCLE1BQU07WUFDTixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixNQUFNLGNBQWMsR0FBSSxJQUFJLENBQUMsVUFBa0IsQ0FBQyxXQUFXLENBQUM7UUFDNUQsTUFBTSxZQUFZLEdBQUksSUFBSSxDQUFDLFdBQW1CLENBQUMsV0FBVyxDQUFDO1FBQzNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQ3hCLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFDeEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUNyQixVQUFVLENBQUMsT0FBTyxFQUFFLEVBQ3BCLGNBQWMsQ0FBQyxJQUFJLEVBQ25CLGNBQWMsQ0FBQyxNQUFNLEVBQ3JCLGNBQWMsQ0FBQyxNQUFNLENBQ3RCLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksSUFBSSxDQUN0QixRQUFRLENBQUMsV0FBVyxFQUFFLEVBQ3RCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFDbkIsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUNsQixZQUFZLENBQUMsSUFBSSxFQUNqQixZQUFZLENBQUMsTUFBTSxFQUNuQixZQUFZLENBQUMsTUFBTSxDQUNwQixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7K0dBak5VLHdCQUF3QjttR0FBeEIsd0JBQXdCLDJaQVp4QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3ZELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRixvWEM5QkgsZzFEQXNEQTs7NEZEbEJhLHdCQUF3QjtrQkFkcEMsU0FBUzsrQkFDRSxxQkFBcUIsYUFDcEI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUseUJBQXlCLENBQUM7NEJBQ3ZELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGLFlBQ1MsaUJBQWlCLHVCQUdOLEtBQUs7c0hBR2pCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ2tCLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDRyxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0csWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQWVaLFFBQVE7c0JBQXBCLEtBQUs7Z0JBUU8sVUFBVTtzQkFBdEIsS0FBSztnQkFZTyxPQUFPO3NCQUFuQixLQUFLO2dCQVdPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJMThuSW50ZXJmYWNlLCBJMThuU2VydmljZSB9IGZyb20gJ25nLWRldnVpL2kxOG4nO1xyXG5pbXBvcnQgeyBEYXRlQ29udmVydGVyLCBEZWZhdWx0RGF0ZUNvbnZlcnRlciB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyQ29uZmlnU2VydmljZSBhcyBEYXRlUGlja2VyQ29uZmlnIH0gZnJvbSAnLi9kYXRlLXBpY2tlci5jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlbGVjdERhdGVSYW5nZUNoYW5nZUV2ZW50QXJncywgU2VsZWN0RGF0ZVJhbmdlQ2hhbmdlUmVhc29uIH0gZnJvbSAnLi9kYXRlLXJhbmdlLWNoYW5nZS1ldmVudC1hcmdzLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC1kYXRlLXJhbmdlLXBpY2tlcicsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxuICBleHBvcnRBczogJ2RhdGVSYW5nZVBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGxvY2FsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNzc0NsYXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGF0ZUNvbnZlcnRlcjogRGF0ZUNvbnZlcnRlcjtcclxuICBASW5wdXQoKSBzZWxlY3RlZFJhbmdlID0gW251bGwsIG51bGxdO1xyXG4gIEBJbnB1dCgpIGRhdGVGb3JtYXQ6IHN0cmluZztcclxuICBASW5wdXQoKSBjdXN0b21WaWV3VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERhdGVSYW5nZUNoYW5nZUV2ZW50QXJncz4oKTtcclxuICBAT3V0cHV0KCkgaGlkZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAVmlld0NoaWxkKCdsZWZ0UGlja2VyJykgbGVmdFBpY2tlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdyaWdodFBpY2tlcicpIHJpZ2h0UGlja2VyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlV3JhcCcpIHRlbXBsYXRlV3JhcDogRWxlbWVudFJlZjtcclxuICBwcml2YXRlIF9kYXRlQ29uZmlnOiBhbnk7XHJcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgX3Nob3dUaW1lOiBib29sZWFuO1xyXG4gIHB1YmxpYyBjdXJyZW50Q2FsZW5kYXJzID0gW251bGwsIG51bGxdO1xyXG4gIHB1YmxpYyBpMThuTG9jYWxlOiBJMThuSW50ZXJmYWNlWydsb2NhbGUnXTtcclxuICBwdWJsaWMgaTE4blRleHQ6IEkxOG5JbnRlcmZhY2VbJ2RhdGVQaWNrZXInXTtcclxuICBwcml2YXRlIGkxOG5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBob3Zlck9uRGF0ZTogU3ViamVjdDxvYmplY3Q+ID0gbmV3IFN1YmplY3Q8b2JqZWN0PigpO1xyXG4gIHJhbmdlU3RhcnQ7XHJcbiAgcmFuZ2VFbmQ7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IG51bGw7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiBudWxsO1xyXG5cclxuICBASW5wdXQoKSBzZXQgc2hvd1RpbWUoc2hvd1RpbWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dUaW1lID0gc2hvd1RpbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd1RpbWUoKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuX3Nob3dUaW1lID09PSAnYm9vbGVhbicgPyB0aGlzLl9zaG93VGltZSA6IHRoaXMuZGF0ZUNvbmZpZy50aW1lUGlja2VyO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IGRhdGVDb25maWcoZGF0ZUNvbmZpZzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaGVja0RhdGVDb25maWcoZGF0ZUNvbmZpZykpIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IGRhdGVDb25maWc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kYXRlQ29uZmlnID0gdGhpcy5kYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUNvbmZpZygpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCkgfHwgbnVsbDtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWF4RGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBtYXhEYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbWluRGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICBjb25zdCBwYXJzZURhdGUgPSB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2UoZGF0ZSwgdGhpcy5kYXRlRm9ybWF0KSB8fCBudWxsO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzLl9taW5EYXRlID0gcGFyc2VEYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG1pbkRhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZVBpY2tlckNvbmZpZzogRGF0ZVBpY2tlckNvbmZpZywgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSkge1xyXG4gICAgdGhpcy5fZGF0ZUNvbmZpZyA9IGRhdGVQaWNrZXJDb25maWcuZGF0ZUNvbmZpZztcclxuICAgIHRoaXMuZGF0ZUNvbnZlcnRlciA9IGRhdGVQaWNrZXJDb25maWcuZGF0ZUNvbmZpZy5kYXRlQ29udmVydGVyIHx8IG5ldyBEZWZhdWx0RGF0ZUNvbnZlcnRlcigpO1xyXG4gICAgdGhpcy5zZXRJMThuVGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tEYXRlQ29uZmlnKGRhdGVDb25maWc6IGFueSkge1xyXG4gICAgaWYgKCFkYXRlQ29uZmlnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgZGF0ZUNvbmZpZy50aW1lUGlja2VyICE9PSAnYm9vbGVhbicgfHwgIWRhdGVDb25maWcubWF4IHx8ICFkYXRlQ29uZmlnLm1pbiB8fCAhZGF0ZUNvbmZpZy5mb3JtYXQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcz8uc2VsZWN0ZWRSYW5nZT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnNlbGVjdGVkUmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5taW5EYXRlID8gbmV3IERhdGUodGhpcy5taW5EYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5taW4sIDAsIDEsIDAsIDAsIDApO1xyXG4gICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSA/IG5ldyBEYXRlKHRoaXMubWF4RGF0ZSkgOiBuZXcgRGF0ZSh0aGlzLmRhdGVDb25maWcubWF4LCAxMSwgMzEsIDIzLCA1OSwgNTkpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVIb3ZlckFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUoc2VsZWN0ZWRSYW5nZSk6IHZvaWQge1xyXG4gICAgaWYgKHNlbGVjdGVkUmFuZ2UpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlID0gc2VsZWN0ZWRSYW5nZTtcclxuICAgICAgaWYgKHRoaXMubGVmdFBpY2tlcikge1xyXG4gICAgICAgICh0aGlzLmxlZnRQaWNrZXIgYXMgYW55KS5zZWxlY3RlZFJhbmdlID0gc2VsZWN0ZWRSYW5nZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5yaWdodFBpY2tlcikge1xyXG4gICAgICAgICh0aGlzLnJpZ2h0UGlja2VyIGFzIGFueSkuc2VsZWN0ZWRSYW5nZSA9IHNlbGVjdGVkUmFuZ2U7XHJcbiAgICAgIH1cclxuICAgICAgW3RoaXMucmFuZ2VTdGFydCwgdGhpcy5yYW5nZUVuZF0gPSB0aGlzLnNlbGVjdGVkUmFuZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJMThuVGV4dCgpIHtcclxuICAgIHRoaXMuaTE4bkxvY2FsZSA9IHRoaXMuaTE4bi5nZXRJMThuVGV4dCgpLmxvY2FsZTtcclxuICAgIHRoaXMuaTE4blRleHQgPSB0aGlzLmkxOG4uZ2V0STE4blRleHQoKS5kYXRlUGlja2VyO1xyXG4gICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uID0gdGhpcy5pMThuLmxhbmdDaGFuZ2UoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5pMThuTG9jYWxlID0gZGF0YS5sb2NhbGU7XHJcbiAgICAgIHRoaXMuaTE4blRleHQgPSBkYXRhLmRhdGVQaWNrZXI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJhbmdlQ2hhbmdlKGRhdGEpIHtcclxuICAgIHRoaXMuY2hvb3NlRGF0ZShkYXRhLnNlbGVjdGVkUmFuZ2UsIGRhdGEucmVhc29uKTtcclxuICB9XHJcblxyXG4gIGNob29zZURhdGUgPSAocmFuZ2UsIHJlYXNvbj8pID0+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRSZWFzb24gPSB0eXBlb2YgcmVhc29uID09PSAnbnVtYmVyJyA/IHJlYXNvbiA6IFNlbGVjdERhdGVSYW5nZUNoYW5nZVJlYXNvbi5jdXN0b207XHJcbiAgICB0aGlzLndyaXRlVmFsdWUocmFuZ2UpO1xyXG4gICAgdGhpcy5ub3RpZnlWYWx1ZUNoYW5nZShyYW5nZSwgY3VycmVudFJlYXNvbik7XHJcbiAgfTtcclxuXHJcbiAgc2VsZWN0aW5nRGF0ZShldmVudCkge1xyXG4gICAgdGhpcy5ob3Zlck9uRGF0ZS5uZXh0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZUhvdmVyQWN0aW9ucygpIHtcclxuICAgIHRoaXMuaG92ZXJPbkRhdGUucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKGRhdGUpID0+IHtcclxuICAgICAgdGhpcy5wcmV2aWV3UmFuZ2VFbmQoZGF0ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByZXZpZXdSYW5nZUVuZChkYXRlKSB7XHJcbiAgICAodGhpcy5sZWZ0UGlja2VyIGFzIGFueSkucHJldmlld0VuZCA9IGRhdGU7XHJcbiAgICAodGhpcy5yaWdodFBpY2tlciBhcyBhbnkpLnByZXZpZXdFbmQgPSBkYXRlO1xyXG4gIH1cclxuXHJcbiAgc3luY1JhbmdlU3RhcnQocmFuZ2VTdGFydCwgcGlja2VyOiBhbnkpIHtcclxuICAgIHBpY2tlci5zZWxlY3RSYW5nZShyYW5nZVN0YXJ0LCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHN5bmNQaWNrZXJQYWlyKGN1cnJlbnRDYWxlbmRlcjogb2JqZWN0LCBvcmllbnRhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XHJcbiAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJzWzBdID0gY3VycmVudENhbGVuZGVyO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJzWzFdID0gY3VycmVudENhbGVuZGVyO1xyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBub3RpZnlWYWx1ZUNoYW5nZShyYW5nZSwgcmVhc29uKSB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHJhbmdlKTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkUmFuZ2VDaGFuZ2UuZW1pdCh7XHJcbiAgICAgIHJlYXNvbixcclxuICAgICAgc2VsZWN0ZWRSYW5nZTogcmFuZ2UsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbnNvbGlkYXRlVGltZSgpIHtcclxuICAgIGNvbnN0IHJhbmdlU3RhcnQgPSB0aGlzLnJhbmdlU3RhcnQ7XHJcbiAgICBjb25zdCByYW5nZUVuZCA9IHRoaXMucmFuZ2VFbmQ7XHJcbiAgICBjb25zdCByYW5nZVN0YXJ0VGltZSA9ICh0aGlzLmxlZnRQaWNrZXIgYXMgYW55KS5jdXJyZW50VGltZTtcclxuICAgIGNvbnN0IHJhbmdlRW5kVGltZSA9ICh0aGlzLnJpZ2h0UGlja2VyIGFzIGFueSkuY3VycmVudFRpbWU7XHJcbiAgICB0aGlzLnJhbmdlU3RhcnQgPSBuZXcgRGF0ZShcclxuICAgICAgcmFuZ2VTdGFydC5nZXRGdWxsWWVhcigpLFxyXG4gICAgICByYW5nZVN0YXJ0LmdldE1vbnRoKCksXHJcbiAgICAgIHJhbmdlU3RhcnQuZ2V0RGF0ZSgpLFxyXG4gICAgICByYW5nZVN0YXJ0VGltZS5ob3VyLFxyXG4gICAgICByYW5nZVN0YXJ0VGltZS5taW51dGUsXHJcbiAgICAgIHJhbmdlU3RhcnRUaW1lLnNlY29uZFxyXG4gICAgKTtcclxuICAgIHRoaXMucmFuZ2VFbmQgPSBuZXcgRGF0ZShcclxuICAgICAgcmFuZ2VFbmQuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgcmFuZ2VFbmQuZ2V0TW9udGgoKSxcclxuICAgICAgcmFuZ2VFbmQuZ2V0RGF0ZSgpLFxyXG4gICAgICByYW5nZUVuZFRpbWUuaG91cixcclxuICAgICAgcmFuZ2VFbmRUaW1lLm1pbnV0ZSxcclxuICAgICAgcmFuZ2VFbmRUaW1lLnNlY29uZFxyXG4gICAgKTtcclxuICAgIGNvbnN0IG5ld1JhbmdlID0gW3RoaXMucmFuZ2VTdGFydCwgdGhpcy5yYW5nZUVuZF07XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgdGhpcy53cml0ZVZhbHVlKG5ld1JhbmdlKTtcclxuICAgIHRoaXMubm90aWZ5VmFsdWVDaGFuZ2UobmV3UmFuZ2UsIFNlbGVjdERhdGVSYW5nZUNoYW5nZVJlYXNvbi5idXR0b24pO1xyXG4gICAgdGhpcy5oaWRlLmVtaXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmkxOG5TdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhckFsbCA9IChyZWFzb24/OiBTZWxlY3REYXRlUmFuZ2VDaGFuZ2VSZWFzb24pID0+IHtcclxuICAgIGNvbnN0IGN1cnJlbnRSZWFzb24gPSB0eXBlb2YgcmVhc29uID09PSAnbnVtYmVyJyA/IHJlYXNvbiA6IFNlbGVjdERhdGVSYW5nZUNoYW5nZVJlYXNvbi5jdXN0b207XHJcbiAgICB0aGlzLmNob29zZURhdGUoW251bGwsIG51bGxdLCBjdXJyZW50UmVhc29uKTtcclxuICB9O1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkZXZ1aS1kYXRlLXJhbmdlLXBpY2tlclwiPlxuICA8ZC1kYXRlcGlja2VyLXJhbmdlLXNpbmdsZVxuICAgIFtsb2NhbGVdPVwibG9jYWxlIHx8IGkxOG5Mb2NhbGVcIlxuICAgIGNsYXNzPVwiZGV2dWktZGF0ZS1waWNrZXJcIlxuICAgIFtjc3NDbGFzc109XCJjc3NDbGFzc1wiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbZGF0ZUNvbnZlcnRlcl09XCJkYXRlQ29udmVydGVyXCJcbiAgICAocmFuZ2VTZWxlY3RlZCk9XCJyYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgICBbZGF0ZUNvbmZpZ109XCJkYXRlQ29uZmlnXCJcbiAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAoaG92ZXJPbkRhdGUpPVwic2VsZWN0aW5nRGF0ZSgkZXZlbnQpXCJcbiAgICBbcmFuZ2VQaWNrZXJdPVwidHJ1ZVwiXG4gICAgW3NlbGVjdGVkUmFuZ2VdPVwiW3JhbmdlU3RhcnQsIHJhbmdlRW5kXVwiXG4gICAgKHJhbmdlU2VsZWN0aW5nKT1cInN5bmNSYW5nZVN0YXJ0KCRldmVudCwgcmlnaHRQaWNrZXIpXCJcbiAgICAoc3luY1BpY2tlclBhaXIpPVwic3luY1BpY2tlclBhaXIoJGV2ZW50LCAnbGVmdCcpXCJcbiAgICBbY3VycmVudENhbGVuZGFyc109XCJjdXJyZW50Q2FsZW5kYXJzXCJcbiAgICBbc2hvd1RpbWVdPVwic2hvd1RpbWVcIlxuICAgICNsZWZ0UGlja2VyXG4gID48L2QtZGF0ZXBpY2tlci1yYW5nZS1zaW5nbGU+XG4gIDxkLWRhdGVwaWNrZXItcmFuZ2Utc2luZ2xlXG4gICAgW2xvY2FsZV09XCJsb2NhbGUgfHwgaTE4bkxvY2FsZVwiXG4gICAgY2xhc3M9XCJkZXZ1aS1kYXRlLXBpY2tlclwiXG4gICAgW2Nzc0NsYXNzXT1cImNzc0NsYXNzXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtkYXRlQ29udmVydGVyXT1cImRhdGVDb252ZXJ0ZXJcIlxuICAgIChyYW5nZVNlbGVjdGVkKT1cInJhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgIFtkYXRlQ29uZmlnXT1cImRhdGVDb25maWdcIlxuICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgIChob3Zlck9uRGF0ZSk9XCJzZWxlY3RpbmdEYXRlKCRldmVudClcIlxuICAgIFtyYW5nZVBpY2tlcl09XCJ0cnVlXCJcbiAgICBbc2VsZWN0ZWRSYW5nZV09XCJbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdXCJcbiAgICAocmFuZ2VTZWxlY3RpbmcpPVwic3luY1JhbmdlU3RhcnQoJGV2ZW50LCBsZWZ0UGlja2VyKVwiXG4gICAgKHN5bmNQaWNrZXJQYWlyKT1cInN5bmNQaWNrZXJQYWlyKCRldmVudCwgJ3JpZ2h0JylcIlxuICAgIFtpc0F1eGlsaWFyeV09XCJ0cnVlXCJcbiAgICBbY3VycmVudENhbGVuZGFyc109XCJjdXJyZW50Q2FsZW5kYXJzXCJcbiAgICBbc2hvd1RpbWVdPVwic2hvd1RpbWVcIlxuICAgIChjb25zb2xpZGF0ZVRpbWUpPVwiY29uc29saWRhdGVUaW1lKClcIlxuICAgICNyaWdodFBpY2tlclxuICA+PC9kLWRhdGVwaWNrZXItcmFuZ2Utc2luZ2xlPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZGV2dWktZGF0ZS1yYW5nZS1jdXN0b21cIiAqbmdJZj1cImN1c3RvbVZpZXdUZW1wbGF0ZVwiICN0ZW1wbGF0ZVdyYXA+XG4gIDxuZy10ZW1wbGF0ZVxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbVZpZXdUZW1wbGF0ZVwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICRpbXBsaWNpdDogdGhpcyxcbiAgICAgIGNsZWFyQWxsOiBjbGVhckFsbCxcbiAgICAgIGNob29zZURhdGU6IGNob29zZURhdGUsXG4gICAgICByYW5nZVN0YXJ0OiByYW5nZVN0YXJ0LFxuICAgICAgcmFuZ2VFbmQ6IHJhbmdlRW5kXG4gICAgfVwiXG4gID48L25nLXRlbXBsYXRlPlxuPC9kaXY+XG4iXX0=