@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
739 lines • 57.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: datepicker.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, Input, ElementRef, forwardRef, ViewContainerRef, Output, EventEmitter, ComponentFactoryResolver, Renderer2, Injector, HostListener, TemplateRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { DatepickerComponent } from './datepicker.component';
import { SelectDateChangeReason } from './date-change-event-args.model';
import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service';
import { DefaultDateConverter } from '@duoduo-oba/ng-devui/utils';
import { I18nService } from '@duoduo-oba/ng-devui/i18n';
import { animate, AnimationBuilder, style } from '@angular/animations';
import { fromEvent } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
/** @type {?} */
var easeInQuint = 'cubic-bezier(0.755, 0.05, 0.855, 0.06)';
/** @type {?} */
var easeOutQuint = 'cubic-bezier(0.23, 1, 0.32, 1)';
/** @type {?} */
var animationDuration = '200ms';
var DatepickerDirective = /** @class */ (function () {
function DatepickerDirective(elementRef, viewContainerRef, componentFactoryResolver, renderer2, injector, datePickerConfig, i18n, builder) {
var _this = this;
this.elementRef = elementRef;
this.viewContainerRef = viewContainerRef;
this.componentFactoryResolver = componentFactoryResolver;
this.renderer2 = renderer2;
this.injector = injector;
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.builder = builder;
this.direction = 'down';
this.autoOpen = false;
this.selectedDateChange = new EventEmitter();
this.isOpen = false;
this.onChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { return null; });
this.onTouched = (/**
* @return {?}
*/
function () { return null; });
this._dateConfig = datePickerConfig['dateConfig'];
this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter();
this.selectedDate = null;
/** @type {?} */
var factory = this.componentFactoryResolver.resolveComponentFactory(DatepickerComponent);
this.cmpRef = this.viewContainerRef.createComponent(factory, this.viewContainerRef.length, this.injector);
this.inputSub = fromEvent(this.elementRef.nativeElement, 'input')
.pipe(debounceTime(300)).subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
_this.transUserInputToDatepicker(event);
}));
}
Object.defineProperty(DatepickerDirective.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(DatepickerDirective.prototype, "dateFormat", {
get: /**
* @return {?}
*/
function () {
return this._dateFormat;
},
set: /**
* @param {?} dateFormat
* @return {?}
*/
function (dateFormat) {
if (this._dateFormat !== dateFormat) {
this._dateFormat = dateFormat;
this.writeModelValue({ selectedDate: this.selectedDate, reason: SelectDateChangeReason.format });
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "maxDate", {
get: /**
* @return {?}
*/
function () {
return this._maxDate;
},
set: /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale);
if (parseDate) {
this._maxDate = parseDate;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "minDate", {
get: /**
* @return {?}
*/
function () {
return this._minDate;
},
set: /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale);
if (parseDate) {
this._minDate = parseDate;
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
DatepickerDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.showTime = this.showTime || this.dateConfig.timePicker;
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);
/** @type {?} */
var target = this.cmpRef.location.nativeElement;
this.applyPopupStyling(target);
/** @type {?} */
var component = this.cmpRef.instance;
this.renderer2.setStyle(target, 'display', 'none');
component.writeValue(this.selectedDate);
this.fillPopupData();
component.ngOnInit();
component.registerOnChange((/**
* @param {?} selectedDate
* @return {?}
*/
function (selectedDate) {
_this.writeValue(selectedDate);
_this.onChange(selectedDate);
}));
component.selectedDateChange.subscribe((/**
* @param {?} arg
* @return {?}
*/
function (arg) {
if (arg.reason === SelectDateChangeReason.date && !_this.showTime ||
arg.reason === SelectDateChangeReason.button) {
_this.hide();
}
}));
if (this.autoOpen) {
this.show();
}
this.setI18nText();
};
/**
* @param {?} obj
* @return {?}
*/
DatepickerDirective.prototype.writeValue = /**
* @param {?} obj
* @return {?}
*/
function (obj) {
/** @type {?} */
var curDate;
if (obj && typeof obj === 'object' && obj.hasOwnProperty('selectedDate')) {
curDate = obj.selectedDate;
}
else {
curDate = obj;
}
this.selectedDate = curDate ?
this.dateConverter.parse(curDate, this.dateFormat, this.locale || this.i18nLocale) : null;
this.writeModelValue(obj);
};
/**
* @param {?} fn
* @return {?}
*/
DatepickerDirective.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
DatepickerDirective.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @private
* @return {?}
*/
DatepickerDirective.prototype.setI18nText = /**
* @private
* @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;
}));
};
/**
* @private
* @param {?} date
* @param {?} direction
* @return {?}
*/
DatepickerDirective.prototype.parseDateFunc = /**
* @private
* @param {?} date
* @param {?} direction
* @return {?}
*/
function (date, direction) {
/** @type {?} */
var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale);
if (parseDate) {
this[direction] = date;
}
};
/**
* @private
* @param {?} nativeElement
* @return {?}
*/
DatepickerDirective.prototype.applyPopupStyling = /**
* @private
* @param {?} nativeElement
* @return {?}
*/
function (nativeElement) {
this.renderer2.addClass(nativeElement, 'devui-dropdown-menu');
this.renderer2.setStyle(nativeElement, 'padding', '0px');
if (this.direction === 'up') {
this.renderer2.setStyle(nativeElement, 'top', 'auto');
this.renderer2.setStyle(nativeElement, 'bottom', '100%');
}
};
/**
* @return {?}
*/
DatepickerDirective.prototype.hide = /**
* @return {?}
*/
function () {
/** @type {?} */
var playAnimation = this.isOpen !== false;
this.isOpen = false;
if (playAnimation) {
this.playAnimation();
}
};
/**
* @private
* @param {?} selectDateObj
* @return {?}
*/
DatepickerDirective.prototype.writeModelValue = /**
* @private
* @param {?} selectDateObj
* @return {?}
*/
function (selectDateObj) {
/** @type {?} */
var selectDate;
/** @type {?} */
var dateReason = SelectDateChangeReason.time;
if (selectDateObj && typeof selectDateObj === 'object' && selectDateObj.hasOwnProperty('selectedDate')) {
selectDate = selectDateObj.selectedDate;
dateReason = selectDateObj.reason;
}
else {
selectDate = selectDateObj;
}
if (selectDate) {
selectDate = new Date(selectDate);
}
else {
selectDate = null;
}
/** @type {?} */
var value = selectDate ? this.dateConverter.format(selectDate, this.dateFormat, this.locale || this.i18nLocale) : '';
this.renderer2.setProperty(this.elementRef.nativeElement, 'value', value);
if (this.isOpen) {
this.cmpRef.instance.writeValue(this.selectedDate);
}
this.selectedDateChange.emit({
reason: dateReason,
selectedDate: this.selectedDate
});
};
/**
* @return {?}
*/
DatepickerDirective.prototype.show = /**
* @return {?}
*/
function () {
/** @type {?} */
var component = this.cmpRef.instance;
component.writeValue(this.selectedDate);
this.fillPopupData();
/** @type {?} */
var playAnimation = this.isOpen !== true;
this.isOpen = true;
if (playAnimation) {
this.playAnimation();
}
};
/**
* @param {?} $event
* @return {?}
*/
DatepickerDirective.prototype.toggle = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if ($event) {
$event.stopPropagation();
}
if (this.isOpen) {
this.hide();
return;
}
this.show();
};
/**
* @private
* @return {?}
*/
DatepickerDirective.prototype.fillPopupData = /**
* @private
* @return {?}
*/
function () {
var _this = this;
['showTime', 'maxDate', 'minDate', 'cssClass', 'disabled', 'dateConverter', 'locale', 'dateFormat', 'yearNumber', 'dateConfig',
'customViewTemplate']
.forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
if (_this[key] !== undefined) {
_this.cmpRef.instance[key] = _this[key];
}
}));
};
/**
* @param {?} $event
* @return {?}
*/
DatepickerDirective.prototype.onBlur = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.onTouched();
};
/**
* @param {?} $event
* @return {?}
*/
DatepickerDirective.prototype.onDocumentClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.elementRef.nativeElement !== $event.target) {
this.hide();
}
};
/**
* @return {?}
*/
DatepickerDirective.prototype.clearAll = /**
* @return {?}
*/
function () {
this.cmpRef.instance.clearAll();
};
/**
* @private
* @param {?} direction
* @return {?}
*/
DatepickerDirective.prototype.popIn = /**
* @private
* @param {?} direction
* @return {?}
*/
function (direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 100%', display: 'inline-block' }),
animate(animationDuration + " " + easeOutQuint, style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 100%' })),
];
case 'bottom':
default:
return [
style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 0%', display: 'inline-block' }),
animate(animationDuration + " " + easeOutQuint, style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 0%' })),
];
}
};
/**
* @private
* @param {?} direction
* @return {?}
*/
DatepickerDirective.prototype.popOut = /**
* @private
* @param {?} direction
* @return {?}
*/
function (direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 100%' }),
animate(animationDuration + " " + easeInQuint, style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 100%' }))
];
case 'bottom':
default:
return [
style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 0%' }),
animate(animationDuration + " " + easeInQuint, style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 0%' }))
];
}
};
/**
* @private
* @return {?}
*/
DatepickerDirective.prototype.playAnimation = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.player) {
this.player.destroy();
}
/** @type {?} */
var direction = '';
switch (this.direction) {
case 'down':
direction = 'bottom';
break;
case 'up':
direction = 'top';
break;
default:
direction = 'bottom';
}
/** @type {?} */
var metadata = this.isOpen ? this.popIn(direction) : this.popOut(direction);
/** @type {?} */
var factory = this.builder.build(metadata);
this.renderer2.setStyle(this.cmpRef.location.nativeElement, 'display', 'inline-block');
this.player = factory.create(this.cmpRef.location.nativeElement);
this.player.onDone((/**
* @return {?}
*/
function () {
if (!_this.isOpen) {
/** @type {?} */
var targetElement = _this.cmpRef.location.nativeElement;
_this.renderer2.setStyle(targetElement, 'display', 'none');
}
}));
this.player.play();
};
/**
* @private
* @param {?} event
* @return {?}
*/
DatepickerDirective.prototype.transUserInputToDatepicker = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.showTime && !this.disabled) {
/** @type {?} */
var value = event.target.value;
/** @type {?} */
var valueDate = new Date(value);
/** @type {?} */
var valueFormat = this.dateConverter.format(valueDate, this.dateFormat, this.locale || this.i18nLocale);
if (value && value === valueFormat) {
if (valueDate.getTime() < this.minDate.getTime() || valueDate.getTime() > this.maxDate.getTime()) {
this.elementRef.nativeElement.value =
this.dateConverter.format(this.selectedDate, this.dateFormat, this.locale || this.i18nLocale);
}
else {
this.cmpRef.instance.chooseDate(value);
}
}
else if (!value) {
this.clearAll();
}
}
else {
this.elementRef.nativeElement.value =
this.dateConverter.format(this.selectedDate, this.dateFormat, this.locale || this.i18nLocale);
}
};
/**
* @return {?}
*/
DatepickerDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.inputSub) {
this.inputSub.unsubscribe();
}
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
};
DatepickerDirective.decorators = [
{ type: Directive, args: [{
selector: '[dDatepicker]:not([appendToBody])',
exportAs: 'datepicker',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return DatepickerDirective; })),
multi: true
}]
},] }
];
/** @nocollapse */
DatepickerDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: ComponentFactoryResolver },
{ type: Renderer2 },
{ type: Injector },
{ type: DatePickerConfig },
{ type: I18nService },
{ type: AnimationBuilder }
]; };
DatepickerDirective.propDecorators = {
dateConfig: [{ type: Input }],
dateFormat: [{ type: Input }],
maxDate: [{ type: Input }],
minDate: [{ type: Input }],
locale: [{ type: Input }],
showTime: [{ type: Input }],
cssClass: [{ type: Input }],
disabled: [{ type: Input }],
dateConverter: [{ type: Input }],
yearNumber: [{ type: Input }],
direction: [{ type: Input }],
customViewTemplate: [{ type: Input }],
autoOpen: [{ type: Input }],
selectedDateChange: [{ type: Output }],
onBlur: [{ type: HostListener, args: ['blur', ['$event'],] }],
onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
return DatepickerDirective;
}());
export { DatepickerDirective };
if (false) {
/** @type {?} */
DatepickerDirective.prototype.locale;
/** @type {?} */
DatepickerDirective.prototype.showTime;
/** @type {?} */
DatepickerDirective.prototype.cssClass;
/** @type {?} */
DatepickerDirective.prototype.disabled;
/** @type {?} */
DatepickerDirective.prototype.dateConverter;
/** @type {?} */
DatepickerDirective.prototype.yearNumber;
/** @type {?} */
DatepickerDirective.prototype.direction;
/** @type {?} */
DatepickerDirective.prototype.customViewTemplate;
/** @type {?} */
DatepickerDirective.prototype.autoOpen;
/** @type {?} */
DatepickerDirective.prototype.selectedDateChange;
/** @type {?} */
DatepickerDirective.prototype.selectedDate;
/** @type {?} */
DatepickerDirective.prototype.isOpen;
/** @type {?} */
DatepickerDirective.prototype._dateConfig;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype._dateFormat;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype._maxDate;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype._minDate;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.cmpRef;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.player;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.inputSub;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.i18nSubscription;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.i18nLocale;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.onChange;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.onTouched;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.elementRef;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.renderer2;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.injector;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.datePickerConfig;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.i18n;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.builder;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kYXRlcGlja2VyLyIsInNvdXJjZXMiOlsiZGF0ZXBpY2tlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFnQixnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUN0Ryx3QkFBd0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQ3pFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQTZCLHNCQUFzQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkcsT0FBTyxFQUFFLHVCQUF1QixJQUFJLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUNMLE9BQU8sRUFDUCxnQkFBZ0IsRUFHaEIsS0FBSyxFQUNOLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOztJQUV4QyxXQUFXLEdBQUcsd0NBQXdDOztJQUN0RCxZQUFZLEdBQUcsZ0NBQWdDOztJQUMvQyxpQkFBaUIsR0FBRyxPQUFPO0FBRWpDO0lBaUZFLDZCQUFvQixVQUFzQixFQUFVLGdCQUFrQyxFQUNsRSx3QkFBa0QsRUFBVSxTQUFvQixFQUNoRixRQUFrQixFQUFVLGdCQUFrQyxF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e1xyXG4gIERpcmVjdGl2ZSwgT25Jbml0LCBJbnB1dCwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgQ29tcG9uZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlcixcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIFJlbmRlcmVyMiwgSW5qZWN0b3IsIEhvc3RMaXN0ZW5lciwgVGVtcGxhdGVSZWYsIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IERhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2VsZWN0RGF0ZUNoYW5nZUV2ZW50QXJncywgU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbiB9IGZyb20gJy4vZGF0ZS1jaGFuZ2UtZXZlbnQtYXJncy5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJDb25maWdTZXJ2aWNlIGFzIERhdGVQaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGVmYXVsdERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuSW50ZXJmYWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcbmltcG9ydCB7XHJcbiAgYW5pbWF0ZSxcclxuICBBbmltYXRpb25CdWlsZGVyLFxyXG4gIEFuaW1hdGlvbk1ldGFkYXRhLFxyXG4gIEFuaW1hdGlvblBsYXllcixcclxuICBzdHlsZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5jb25zdCBlYXNlSW5RdWludCA9ICdjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KSc7XHJcbmNvbnN0IGVhc2VPdXRRdWludCA9ICdjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSknO1xyXG5jb25zdCBhbmltYXRpb25EdXJhdGlvbiA9ICcyMDBtcyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRGF0ZXBpY2tlcl06bm90KFthcHBlbmRUb0JvZHldKScsXHJcbiAgZXhwb3J0QXM6ICdkYXRlcGlja2VyJyxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVwaWNrZXJEaXJlY3RpdmUpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0ZUNvbmZpZyhkYXRlQ29uZmlnOiBhbnkpIHtcclxuICAgIGlmIChkYXRlQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlQ29uZmlnO1xyXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gdGhpcy5zaG93VGltZSA/IGRhdGVDb25maWcuZm9ybWF0LnRpbWUgOiBkYXRlQ29uZmlnLmZvcm1hdC5kYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kYXRlQ29uZmlnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGVDb25maWcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZUNvbmZpZztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRlRm9ybWF0KGRhdGVGb3JtYXQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuX2RhdGVGb3JtYXQgIT09IGRhdGVGb3JtYXQpIHtcclxuICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7XHJcbiAgICAgIHRoaXMud3JpdGVNb2RlbFZhbHVlKHtzZWxlY3RlZERhdGU6IHRoaXMuc2VsZWN0ZWREYXRlLCByZWFzb246IFNlbGVjdERhdGVDaGFuZ2VSZWFzb24uZm9ybWF0fSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWF4RGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBtYXhEYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbWluRGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICBjb25zdCBwYXJzZURhdGUgPSB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2UoZGF0ZSwgdGhpcy5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSB8fCB0aGlzLmkxOG5Mb2NhbGUpO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzLl9taW5EYXRlID0gcGFyc2VEYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG1pbkRhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcclxuICB9XHJcbiAgQElucHV0KCkgbG9jYWxlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2hvd1RpbWU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkYXRlQ29udmVydGVyOiBEYXRlQ29udmVydGVyO1xyXG4gIEBJbnB1dCgpIHllYXJOdW1iZXI6IG51bWJlcjtcclxuICBASW5wdXQoKSBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicgPSAnZG93bic7XHJcbiAgQElucHV0KCkgY3VzdG9tVmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIGF1dG9PcGVuID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0RGF0ZUNoYW5nZUV2ZW50QXJncz4oKTtcclxuICBzZWxlY3RlZERhdGU6IERhdGU7XHJcbiAgaXNPcGVuID0gZmFsc2U7XHJcbiAgX2RhdGVDb25maWc6IGFueTtcclxuICBwcml2YXRlIF9kYXRlRm9ybWF0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgY21wUmVmOiBDb21wb25lbnRSZWY8RGF0ZXBpY2tlckNvbXBvbmVudD47XHJcbiAgcHJpdmF0ZSBwbGF5ZXI6IEFuaW1hdGlvblBsYXllcjtcclxuICBwcml2YXRlIGlucHV0U3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBpMThuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBpMThuTG9jYWxlOiBJMThuSW50ZXJmYWNlWydsb2NhbGUnXTtcclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4gbnVsbDtcclxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgZGF0ZVBpY2tlckNvbmZpZzogRGF0ZVBpY2tlckNvbmZpZywgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIpIHtcclxuICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlUGlja2VyQ29uZmlnWydkYXRlQ29uZmlnJ107XHJcbiAgICB0aGlzLmRhdGVDb252ZXJ0ZXIgPSBkYXRlUGlja2VyQ29uZmlnWydkYXRlQ29uZmlnJ10uZGF0ZUNvbnZlcnRlciB8fCBuZXcgRGVmYXVsdERhdGVDb252ZXJ0ZXIoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShEYXRlcGlja2VyQ29tcG9uZW50KTtcclxuICAgIHRoaXMuY21wUmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB0aGlzLnZpZXdDb250YWluZXJSZWYubGVuZ3RoLCB0aGlzLmluamVjdG9yKTtcclxuXHJcbiAgICB0aGlzLmlucHV0U3ViID0gZnJvbUV2ZW50KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaW5wdXQnKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKVxyXG4gICAgICApLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFuc1VzZXJJbnB1dFRvRGF0ZXBpY2tlcihldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNob3dUaW1lID0gdGhpcy5zaG93VGltZSB8fCB0aGlzLmRhdGVDb25maWcudGltZVBpY2tlcjtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLm1pbkRhdGUgPyBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpIDogbmV3IERhdGUodGhpcy5kYXRlQ29uZmlnLm1pbiwgMCwgMSwgMCwgMCwgMCk7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5tYXhEYXRlID8gbmV3IERhdGUodGhpcy5tYXhEYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5tYXgsIDExLCAzMSwgMjMsIDU5LCA1OSk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNtcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5hcHBseVBvcHVwU3R5bGluZyh0YXJnZXQpO1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jbXBSZWYuaW5zdGFuY2U7XHJcbiAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZSh0YXJnZXQsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgIGNvbXBvbmVudC53cml0ZVZhbHVlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIHRoaXMuZmlsbFBvcHVwRGF0YSgpO1xyXG4gICAgY29tcG9uZW50Lm5nT25Jbml0KCk7XHJcblxyXG4gICAgY29tcG9uZW50LnJlZ2lzdGVyT25DaGFuZ2Uoc2VsZWN0ZWREYXRlID0+IHtcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKHNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0ZWREYXRlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbXBvbmVudC5zZWxlY3RlZERhdGVDaGFuZ2Uuc3Vic2NyaWJlKChhcmc6IFNlbGVjdERhdGVDaGFuZ2VFdmVudEFyZ3MpID0+IHtcclxuICAgICAgaWYgKGFyZy5yZWFzb24gPT09IFNlbGVjdERhdGVDaGFuZ2VSZWFzb24uZGF0ZSAmJiAhdGhpcy5zaG93VGltZSB8fFxyXG4gICAgICAgYXJnLnJlYXNvbiA9PT0gU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbi5idXR0b24pIHtcclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYXV0b09wZW4pIHtcclxuICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEkxOG5UZXh0KCk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgY3VyRGF0ZTtcclxuICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLmhhc093blByb3BlcnR5KCdzZWxlY3RlZERhdGUnKSkge1xyXG4gICAgICBjdXJEYXRlID0gb2JqLnNlbGVjdGVkRGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN1ckRhdGUgPSBvYmo7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGN1ckRhdGUgP1xyXG4gICAgICB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2UoY3VyRGF0ZSwgdGhpcy5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSB8fCB0aGlzLmkxOG5Mb2NhbGUpIDogbnVsbDtcclxuICAgIHRoaXMud3JpdGVNb2RlbFZhbHVlKG9iaik7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEkxOG5UZXh0KCkge1xyXG4gICAgdGhpcy5pMThuTG9jYWxlID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkubG9jYWxlO1xyXG4gICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uID0gdGhpcy5pMThuLmxhbmdDaGFuZ2UoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5pMThuTG9jYWxlID0gZGF0YS5sb2NhbGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VEYXRlRnVuYyhkYXRlLCBkaXJlY3Rpb24pIHtcclxuICAgIGNvbnN0IHBhcnNlRGF0ZSA9IHRoaXMuZGF0ZUNvbnZlcnRlci5wYXJzZShkYXRlLCB0aGlzLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlIHx8IHRoaXMuaTE4bkxvY2FsZSlcclxuICAgICAgO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzW2RpcmVjdGlvbl0gPSBkYXRlXHJcbiAgICAgIDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlQb3B1cFN0eWxpbmcobmF0aXZlRWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyhuYXRpdmVFbGVtZW50LCAnZGV2dWktZHJvcGRvd24tbWVudScpO1xyXG4gICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3BhZGRpbmcnLCAnMHB4Jyk7XHJcbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd1cCcpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3RvcCcsICdhdXRvJyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICdib3R0b20nLCAnMTAwJScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIGNvbnN0IHBsYXlBbmltYXRpb24gPSB0aGlzLmlzT3BlbiAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHBsYXlBbmltYXRpb24pIHtcclxuICAgICAgdGhpcy5wbGF5QW5pbWF0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdyaXRlTW9kZWxWYWx1ZShzZWxlY3REYXRlT2JqOiBhbnkpIHtcclxuICAgIGxldCBzZWxlY3REYXRlO1xyXG4gICAgbGV0IGRhdGVSZWFzb24gPSBTZWxlY3REYXRlQ2hhbmdlUmVhc29uLnRpbWU7XHJcbiAgICBpZiAoc2VsZWN0RGF0Z