UNPKG

@hxui/angular

Version:

* * *

733 lines 68.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, ElementRef, EventEmitter, forwardRef, NgZone, ComponentFactoryResolver, ViewContainerRef, Optional } from '@angular/core'; import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms'; import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { Subject } from 'rxjs/index'; import { DatepickerComponent } from './datepicker.component'; import { take, takeUntil } from 'rxjs/operators'; import { Directionality } from '@angular/cdk/bidi'; import { DatepickerConfig } from './datepicker.config'; var DatepickerFormComponent = /** @class */ (function () { function DatepickerFormComponent(_elementRef, _viewContainerRef, overlay, _ngZone, _scrollDispatcher, _componentFactoryResolver, _config, _dir) { var _this = this; this._elementRef = _elementRef; this._viewContainerRef = _viewContainerRef; this.overlay = overlay; this._ngZone = _ngZone; this._scrollDispatcher = _scrollDispatcher; this._componentFactoryResolver = _componentFactoryResolver; this._config = _config; this._dir = _dir; this._destroyed = new Subject(); this.disabled = false; this.readonly = false; this.required = false; this.defaultToPresentDate = true; this.allowPreviousDates = true; this.allowFutureDates = true; this.dateFormat = 'dd/MM/y'; this.placeholder = 'Date'; this.helpText = 'Please select a date'; this.icon = 'hx-icon icon-calendar'; this.iconPlacement = 'right'; this.placement = 'bottom'; this.showDelay = this._config.showDelay; this.hideDelay = this._config.hideDelay; this.from = ''; this.to = ''; this.interval = false; this.dueDateInterval = '0 day(s)'; // '1 week(s)' | '2 month(s)' | '3 year(s)' // '1 week(s)' | '2 month(s)' | '3 year(s)' this.onDateChange = new EventEmitter(); this.visible = false; this.dateValidators = new Array(); this.onChanged = new Array(); this.onTouched = new Array(); this.onDateSelectEvent = function (inputDate) { _this._hide(); _this.setDate(inputDate); }; // get input reference this._elementHtmlCollection = this._elementRef.nativeElement.getElementsByTagName('input'); } /** * Dispose the tooltip when destroyed. */ /** * Dispose the tooltip when destroyed. * @return {?} */ DatepickerFormComponent.prototype.ngOnDestroy = /** * Dispose the tooltip when destroyed. * @return {?} */ function () { if (this._overlayRef) { this._overlayRef.dispose(); this._calendarInstance = null; } this._destroyed.next(); this._destroyed.complete(); }; /** * @return {?} */ DatepickerFormComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; // set element ref which will be used for dropdown positioning this._elementHtmlRef = this._elementHtmlCollection.item(0); /** @type {?} */ var date = new Date(); this.presentDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); if (this.defaultToPresentDate) { setTimeout(function () { _this.setDate(_this.presentDate); }); } // Close to the minimum and maxium possible dates, but still normalisable // http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.1 /** @type {?} */ var from = this.parseDate(this.from) || new Date(-8630000000000000); /** @type {?} */ var to = this.parseDate(this.to) || new Date(8630000000000000); if (!!this.from || !!this.to) { this.validateDateRange = this.createDateRangeValidator(from, to); this.dateValidators.push(this.validateDateRange.bind(this)); } if (!this.allowPreviousDates) { this.dateValidators.push(this.validateIsNotBeforeDate.bind(this)); } if (!this.allowFutureDates) { this.dateValidators.push(this.validateIsNotAfterDate.bind(this)); } }; /** * @param {?} date * @return {?} */ DatepickerFormComponent.prototype.setDate = /** * @param {?} date * @return {?} */ function (date) { this.date = date; this.onDateChange.emit(date); this.propogateChange(date); }; /** * @param {?} inputDate * @return {?} */ DatepickerFormComponent.prototype.onChange = /** * @param {?} inputDate * @return {?} */ function (inputDate) { /** @type {?} */ var date = this.parseDate(inputDate); if (inputDate === '') { this.setDate(null); } else if (!!date) { this.setDate(date); } else { this.propogateChange(inputDate); } }; /** * @return {?} */ DatepickerFormComponent.prototype.onFocus = /** * @return {?} */ function () { this._show(); this.propogateTouched(); }; /** * @param {?} inputDate * @return {?} */ DatepickerFormComponent.prototype.onTab = /** * @param {?} inputDate * @return {?} */ function (inputDate) { this.onChange(inputDate); this._hide(); this.propogateTouched(); }; /** * @param {?} inputDate * @return {?} */ DatepickerFormComponent.prototype.parseDate = /** * @param {?} inputDate * @return {?} */ function (inputDate) { // Since Date.Parse() only acceps m/d/y dates, we have to swap the day and month /** @type {?} */ var dateArray = inputDate.split(/[.,\/ -]/); if (dateArray.length === 3 && dateArray[2].length !== 0) { /** @type {?} */ var day = dateArray.shift(); dateArray.splice(1, 0, day); /** @type {?} */ var parseInput = Date.parse(dateArray.join('/')); if (!isNaN(parseInput)) { return new Date(parseInput); } } return null; }; /** * @param {?} date * @return {?} */ DatepickerFormComponent.prototype.validateIsNotBeforeDate = /** * @param {?} date * @return {?} */ function (date) { /** @type {?} */ var normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); return normalisedDate.getTime() <= this.presentDate.getTime(); }; /** * @param {?} date * @return {?} */ DatepickerFormComponent.prototype.validateIsNotAfterDate = /** * @param {?} date * @return {?} */ function (date) { /** @type {?} */ var normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); return normalisedDate.getTime() >= this.presentDate.getTime(); }; /** * @param {?} from * @param {?} to * @return {?} */ DatepickerFormComponent.prototype.createDateRangeValidator = /** * @param {?} from * @param {?} to * @return {?} */ function (from, to) { /** @type {?} */ var normalisedFromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate()); /** @type {?} */ var normalisedToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate()); return function (date) { /** @type {?} */ var normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()); return !(normalisedFromDate.getTime() <= normalisedDate.getTime() && normalisedDate.getTime() <= normalisedToDate.getTime()); }; }; /** * @param {?} value * @return {?} */ DatepickerFormComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (value !== this.date) { this.setDate(value); } }; /** * @param {?} fn * @return {?} */ DatepickerFormComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChanged.push(fn); }; /** * @param {?} fn * @return {?} */ DatepickerFormComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched.push(fn); }; /** * @return {?} */ DatepickerFormComponent.prototype.propogateTouched = /** * @return {?} */ function () { this.onTouched.forEach(function (fn) { return fn(); }); }; /** * @param {?} value * @return {?} */ DatepickerFormComponent.prototype.propogateChange = /** * @param {?} value * @return {?} */ function (value) { this.onChanged.forEach(function (fn) { return fn(value); }); }; /** * @param {?} control * @return {?} */ DatepickerFormComponent.prototype.validate = /** * @param {?} control * @return {?} */ function (control) { /** @type {?} */ var date = Date.parse(control.value); if (!this.required && (control.value === null || control.value === undefined)) { this.isValid = true; return null; } if (isNaN(date)) { this.isValid = false; return { dateParseError: { valid: false } }; } if (!this.allowPreviousDates && this.validateIsNotBeforeDate(this.date)) { this.isValid = false; return { previousDateError: { valid: false } }; } if (!this.allowFutureDates && this.validateIsNotAfterDate(this.date)) { this.isValid = false; return { futureDateError: { valid: false } }; } if (this.validateDateRange && this.validateDateRange(this.date)) { this.isValid = false; return { dateRangeError: { valid: false } }; } if (this.required && !this.date) { this.isValid = false; return { dateRequiredError: { valid: false } }; } this.isValid = true; return null; }; /** * @param {?=} delay * @return {?} */ DatepickerFormComponent.prototype._show = /** * @param {?=} delay * @return {?} */ function (delay) { var _this = this; if (delay === void 0) { delay = this.showDelay; } if (this.disabled) { return; } /** @type {?} */ var overlayRef = this._createOverlay(); this._detach(); this._portal = this._portal || new ComponentPortal(DatepickerComponent, this._viewContainerRef); this._calendarInstance = overlayRef.attach(this._portal).instance; this._calendarInstance.afterHidden() .pipe(takeUntil(this._destroyed)) .subscribe(function () { return _this._detach(); }); this._updateTooltipContent(); (/** @type {?} */ (this._calendarInstance)).show(delay); }; /** * @param {?=} delay * @return {?} */ DatepickerFormComponent.prototype._hide = /** * @param {?=} delay * @return {?} */ function (delay) { if (delay === void 0) { delay = this.hideDelay; } if (this._calendarInstance) { this._calendarInstance.hide(delay); } }; /** * @return {?} */ DatepickerFormComponent.prototype._createOverlay = /** * @return {?} */ function () { var _this = this; if (this._overlayRef) { return this._overlayRef; } /** @type {?} */ var positionStrategy = this.overlay.position() .flexibleConnectedTo((/** @type {?} */ (this._elementHtmlRef))) .withTransformOriginOn('.hxa-datepicker-control') .withFlexibleDimensions(false); this._overlayRef = this.overlay.create({ positionStrategy: positionStrategy, panelClass: 'hxa-datepicker-calendar', hasBackdrop: true, backdropClass: 'cdk-overlay-transparent-backdrop', scrollStrategy: this.overlay.scrollStrategies.reposition() }); this._updatePosition(); this._overlayRef.detachments() .pipe(takeUntil(this._destroyed)) .subscribe(function () { return _this._detach(); }); this._overlayRef.backdropClick(). subscribe(function () { return _this._hide(); }); /** @type {?} */ var position = (/** @type {?} */ (this._overlayRef.getConfig().positionStrategy)); position.positionChanges .pipe(takeUntil(this._destroyed)) .subscribe(function (pos) { if (pos.connectionPair.originX === 'start') { _this.placement = 'left'; } else if (pos.connectionPair.originX === 'end') { _this.placement = 'right'; } _this._updateTooltipContent(); }); return this._overlayRef; }; /** * @return {?} */ DatepickerFormComponent.prototype._updatePosition = /** * @return {?} */ function () { /** @type {?} */ var position = (/** @type {?} */ ((/** @type {?} */ (this._overlayRef)).getConfig().positionStrategy)); /** @type {?} */ var origin = this._getOrigin(); /** @type {?} */ var overlay = this._getOverlayPosition(); position.withPositions([ tslib_1.__assign({}, origin.main, overlay.main), tslib_1.__assign({}, origin.fallback, overlay.fallback) ]); }; /** * Returns the origin position and a fallback position based on the user's position preference. * The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`). */ /** * Returns the origin position and a fallback position based on the user's position preference. * The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`). * @return {?} */ DatepickerFormComponent.prototype._getOrigin = /** * Returns the origin position and a fallback position based on the user's position preference. * The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`). * @return {?} */ function () { /** @type {?} */ var placement = this.placement; /** @type {?} */ var originPlacement; if (placement === 'top' || placement === 'bottom') { originPlacement = { originX: 'start', originY: placement === 'top' ? 'top' : 'bottom' }; } else if (placement === 'left') { originPlacement = { originX: 'start', originY: 'center' }; } else if (placement === 'right') { originPlacement = { originX: 'end', originY: 'center' }; } else { console.error('Position error', placement); } var _a = this._invertPosition(originPlacement.originX, originPlacement.originY), x = _a.x, y = _a.y; return { main: originPlacement, fallback: { originX: x, originY: y } }; }; /** Returns the overlay position and a fallback position based on the user's preference */ /** * Returns the overlay position and a fallback position based on the user's preference * @return {?} */ DatepickerFormComponent.prototype._getOverlayPosition = /** * Returns the overlay position and a fallback position based on the user's preference * @return {?} */ function () { /** @type {?} */ var placement = this.placement; /** @type {?} */ var overlayPlacement; if (placement === 'top') { overlayPlacement = { overlayX: 'start', overlayY: 'bottom' }; } else if (placement === 'bottom') { overlayPlacement = { overlayX: 'start', overlayY: 'top' }; } else if (placement === 'left') { overlayPlacement = { overlayX: 'end', overlayY: 'center' }; } else if (placement === 'right') { overlayPlacement = { overlayX: 'start', overlayY: 'center' }; } else { console.error('Could not find a position', placement); } var _a = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY), x = _a.x, y = _a.y; return { main: overlayPlacement, fallback: { overlayX: x, overlayY: y } }; }; /** * @param {?} x * @param {?} y * @return {?} */ DatepickerFormComponent.prototype._invertPosition = /** * @param {?} x * @param {?} y * @return {?} */ function (x, y) { if (this.placement === 'top' || this.placement === 'bottom') { if (y === 'top') { y = 'bottom'; } else if (y === 'bottom') { y = 'top'; } } else { if (x === 'end') { x = 'start'; } else if (x === 'start') { x = 'end'; } } return { x: x, y: y }; }; /** * @return {?} */ DatepickerFormComponent.prototype._detach = /** * @return {?} */ function () { if (this._overlayRef && this._overlayRef.hasAttached()) { this._overlayRef.detach(); } this._calendarInstance = null; }; /** Updates the tooltip content and repositions the overlay according to the new content length */ /** * Updates the tooltip content and repositions the overlay according to the new content length * @return {?} */ DatepickerFormComponent.prototype._updateTooltipContent = /** * Updates the tooltip content and repositions the overlay according to the new content length * @return {?} */ function () { var _this = this; // Must wait for the content to be painted to the tooltip so that the overlay can properly // calculate the correct positioning based on the size of its contents. if (this._calendarInstance) { this._calendarInstance.selectedDate = this.date; this._calendarInstance.placement = this.placement; this._calendarInstance.validators = this.dateValidators; this._calendarInstance.onDateSelected = this.onDateSelectEvent; this._calendarInstance.allowInterval = this.interval; this._calendarInstance.selectedDueDateInterval = this.dueDateInterval; this._ngZone.onMicrotaskEmpty.asObservable().pipe(take(1), takeUntil(this._destroyed)).subscribe(function () { if (_this._calendarInstance) { (/** @type {?} */ (_this._overlayRef)).updatePosition(); } }); } }; DatepickerFormComponent.decorators = [ { type: Component, args: [{ selector: 'hxa-datepicker-input, hxa-datepicker-form', template: "<div class=\"hx-input-group hxa-datepicker-form\">\n <i class=\"{{icon}}\" *ngIf=\"iconPlacement === 'left'\"></i>\n <div class=\"hx-input-control hxa-datepicker-control\" [ngClass]=\"{'is-danger': !isValid && datePickerForm.touched}\">\n <input class=\"hx-input\" type=\"text\" #datePickerForm=\"ngModel\"\n [required]=\"required ? true : null\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly ? true : null\"\n [ngModel]=\"date | date:dateFormat\"\n (change)=\"onChange(datePickerForm.value)\"\n (focus)=\"onFocus()\"\n (keydown.Tab)=\"onTab(datePickerForm.value)\">\n <label class=\"hx-label\" *ngIf=\"placeholder\">{{placeholder}} <sup *ngIf=\"required\">*</sup></label>\n <div class=\"hx-help\">{{helpText}}</div>\n </div>\n <i class=\"{{icon}}\" *ngIf=\"iconPlacement === 'right'\"></i>\n</div>\n", styles: [".hxa-datepicker-form{position:relative;max-width:19rem}.hxa-datepicker-control{margin:0}.hxa-datepicker-calendar{position:absolute;z-index:99;left:0;max-width:19rem}.hxa-datepicker-calendar-top{bottom:100%}.hxa-datepicker-calendar-bottom{top:70%}.hxa-datepicker-calendar hxa-datepicker{max-width:19rem}.hxa-datepicker-help{font-size:.75rem;margin-top:.25rem;color:#63605f}.hxa-datepicker-form input[readonly]~.hx-label{top:-.5rem;font-size:.75rem;color:#41b987}hxa-datepicker{border:1px solid #d3d3d3;max-width:19rem}"], providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return DatepickerFormComponent; }), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef(function () { return DatepickerFormComponent; }), multi: true, }] },] }, ]; /** @nocollapse */ DatepickerFormComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: ViewContainerRef }, { type: Overlay }, { type: NgZone }, { type: ScrollDispatcher }, { type: ComponentFactoryResolver }, { type: DatepickerConfig }, { type: Directionality, decorators: [{ type: Optional }] } ]; }; DatepickerFormComponent.propDecorators = { disabled: [{ type: Input }], readonly: [{ type: Input }], required: [{ type: Input }], defaultToPresentDate: [{ type: Input }], allowPreviousDates: [{ type: Input }], allowFutureDates: [{ type: Input }], dateFormat: [{ type: Input }], placeholder: [{ type: Input }], helpText: [{ type: Input }], icon: [{ type: Input }], iconPlacement: [{ type: Input }], placement: [{ type: Input }], showDelay: [{ type: Input }], hideDelay: [{ type: Input }], from: [{ type: Input }], to: [{ type: Input }], interval: [{ type: Input }], dueDateInterval: [{ type: Input }], onDateChange: [{ type: Output }] }; return DatepickerFormComponent; }()); export { DatepickerFormComponent }; if (false) { /** @type {?} */ DatepickerFormComponent.prototype._overlayRef; /** @type {?} */ DatepickerFormComponent.prototype._calendarInstance; /** @type {?} */ DatepickerFormComponent.prototype._portal; /** @type {?} */ DatepickerFormComponent.prototype._destroyed; /** @type {?} */ DatepickerFormComponent.prototype.disabled; /** @type {?} */ DatepickerFormComponent.prototype.readonly; /** @type {?} */ DatepickerFormComponent.prototype.required; /** @type {?} */ DatepickerFormComponent.prototype.defaultToPresentDate; /** @type {?} */ DatepickerFormComponent.prototype.allowPreviousDates; /** @type {?} */ DatepickerFormComponent.prototype.allowFutureDates; /** @type {?} */ DatepickerFormComponent.prototype.dateFormat; /** @type {?} */ DatepickerFormComponent.prototype.placeholder; /** @type {?} */ DatepickerFormComponent.prototype.helpText; /** @type {?} */ DatepickerFormComponent.prototype.icon; /** @type {?} */ DatepickerFormComponent.prototype.iconPlacement; /** @type {?} */ DatepickerFormComponent.prototype.placement; /** @type {?} */ DatepickerFormComponent.prototype.showDelay; /** @type {?} */ DatepickerFormComponent.prototype.hideDelay; /** @type {?} */ DatepickerFormComponent.prototype.from; /** @type {?} */ DatepickerFormComponent.prototype.to; /** @type {?} */ DatepickerFormComponent.prototype.interval; /** @type {?} */ DatepickerFormComponent.prototype.dueDateInterval; /** @type {?} */ DatepickerFormComponent.prototype.onDateChange; /** @type {?} */ DatepickerFormComponent.prototype.date; /** @type {?} */ DatepickerFormComponent.prototype.visible; /** @type {?} */ DatepickerFormComponent.prototype.presentDate; /** @type {?} */ DatepickerFormComponent.prototype.isValid; /** @type {?} */ DatepickerFormComponent.prototype.dateValidators; /** @type {?} */ DatepickerFormComponent.prototype.onChanged; /** @type {?} */ DatepickerFormComponent.prototype.onTouched; /** @type {?} */ DatepickerFormComponent.prototype.validateDateRange; /** @type {?} */ DatepickerFormComponent.prototype._elementHtmlRef; /** @type {?} */ DatepickerFormComponent.prototype._elementHtmlCollection; /** @type {?} */ DatepickerFormComponent.prototype.onDateSelectEvent; /** @type {?} */ DatepickerFormComponent.prototype._elementRef; /** @type {?} */ DatepickerFormComponent.prototype._viewContainerRef; /** @type {?} */ DatepickerFormComponent.prototype.overlay; /** @type {?} */ DatepickerFormComponent.prototype._ngZone; /** @type {?} */ DatepickerFormComponent.prototype._scrollDispatcher; /** @type {?} */ DatepickerFormComponent.prototype._componentFactoryResolver; /** @type {?} */ DatepickerFormComponent.prototype._config; /** @type {?} */ DatepickerFormComponent.prototype._dir; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFVLFVBQVUsRUFBZ0IsWUFBWSxFQUFFLFVBQVUsRUFDekUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFDeEUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBb0QsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSCxPQUFPLEVBR3FCLE9BQU8sRUFDakMsZ0JBQWdCLEVBQ2pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQ7SUEyR0UsaUNBQW9CLFdBQXVCLEVBQ3ZCLGlCQUFtQyxFQUNwQyxPQUFnQixFQUNmLE9BQWUsRUFDZixpQkFBbUMsRUFDbkMseUJBQW1ELEVBQ25ELE9BQXlCLEVBQ2IsSUFBb0I7UUFQcEQsaUJBV0M7UUFYbUIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FB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Q3pCLDBDQUF3Qjs7SUFDeEIsaURBQTZEOztJQUM3RCw0Q0FBdUQ7O0lBQ3ZELDRDQUE0Qzs7SUFFNUMsb0RBQW1EOztJQUNuRCxrREFBaUM7O0lBQ2pDLHlEQUErQzs7SUFrRS9DLG9EQUdDOztJQW5FVyw4Q0FBK0I7O0lBQy9CLG9EQUEyQzs7SUFDM0MsMENBQXVCOztJQUN2QiwwQ0FBdUI7O0lBQ3ZCLG9EQUEyQzs7SUFDM0MsNERBQTJEOztJQUMzRCwwQ0FBaUM7O0lBQ2pDLHVDQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLFxyXG4gIE9uRGVzdHJveSwgTmdab25lLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIFZpZXdDb250YWluZXJSZWYsIE9wdGlvbmFsLCBWaWV3Q2hpbGQsIENvbnRlbnRDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgTkdfVkFMSURBVE9SUywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcclxuICBIb3Jpem9udGFsQ29ubmVjdGlvblBvcyxcclxuICBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb24sIE92ZXJsYXlSZWYsXHJcbiAgU2Nyb2xsRGlzcGF0Y2hlciwgVmVydGljYWxDb25uZWN0aW9uUG9zXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQge0NvbXBvbmVudFBvcnRhbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9pbmRleCc7XHJcbmltcG9ydCB7RGF0ZXBpY2tlckNvbXBvbmVudH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7dGFrZSwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcclxuaW1wb3J0IHtEYXRlcGlja2VyQ29uZmlnfSBmcm9tICcuL2RhdGVwaWNrZXIuY29uZmlnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaHhhLWRhdGVwaWNrZXItaW5wdXQsIGh4YS1kYXRlcGlja2VyLWZvcm0nLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImh4LWlucHV0LWdyb3VwIGh4YS1kYXRlcGlja2VyLWZvcm1cIj5cclxuICA8aSBjbGFzcz1cInt7aWNvbn19XCIgKm5nSWY9XCJpY29uUGxhY2VtZW50ID09PSAnbGVmdCdcIj48L2k+XHJcbiAgPGRpdiBjbGFzcz1cImh4LWlucHV0LWNvbnRyb2wgaHhhLWRhdGVwaWNrZXItY29udHJvbFwiIFtuZ0NsYXNzXT1cInsnaXMtZGFuZ2VyJzogIWlzVmFsaWQgJiYgZGF0ZVBpY2tlckZvcm0udG91Y2hlZH1cIj5cclxuICAgIDxpbnB1dCBjbGFzcz1cImh4LWlucHV0XCIgdHlwZT1cInRleHRcIiAjZGF0ZVBpY2tlckZvcm09XCJuZ01vZGVsXCJcclxuICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkID8gdHJ1ZSA6IG51bGxcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgPyB0cnVlIDogbnVsbFwiXHJcbiAgICAgIFtuZ01vZGVsXT1cImRhdGUgfCBkYXRlOmRhdGVGb3JtYXRcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKGRhdGVQaWNrZXJGb3JtLnZhbHVlKVwiXHJcbiAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAoa2V5ZG93bi5UYWIpPVwib25UYWIoZGF0ZVBpY2tlckZvcm0udmFsdWUpXCI+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJoeC1sYWJlbFwiICpuZ0lmPVwicGxhY2Vob2xkZXJcIj57e3BsYWNlaG9sZGVyfX0gPHN1cCAqbmdJZj1cInJlcXVpcmVkXCI+Kjwvc3VwPjwvbGFiZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaHgtaGVscFwiPnt7aGVscFRleHR9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxpIGNsYXNzPVwie3tpY29ufX1cIiAqbmdJZj1cImljb25QbGFjZW1lbnQgPT09ICdyaWdodCdcIj48L2k+XHJcbjwvZGl2PlxyXG5gLFxyXG4gIHN0eWxlczogW2AuaHhhLWRhdGVwaWNrZXItZm9ybXtwb3NpdGlvbjpyZWxhdGl2ZTttYXgtd2lkdGg6MTlyZW19Lmh4YS1kYXRlcGlja2VyLWNvbnRyb2x7bWFyZ2luOjB9Lmh4YS1kYXRlcGlja2VyLWNhbGVuZGFye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6OTk7bGVmdDowO21heC13aWR0aDoxOXJlbX0uaHhhLWRhdGVwaWNrZXItY2FsZW5kYXItdG9we2JvdHRvbToxMDAlfS5oeGEtZGF0ZXBpY2tlci1jYWxlbmRhci1ib3R0b217dG9wOjcwJX0uaHhhLWRhdGVwaWNrZXItY2FsZW5kYXIgaHhhLWRhdGVwaWNrZXJ7bWF4LXdpZHRoOjE5cmVtfS5oeGEtZGF0ZXBpY2tlci1oZWxwe2ZvbnQtc2l6ZTouNzVyZW07bWFyZ2luLXRvcDouMjVyZW07Y29sb3I6IzYzNjA1Zn0uaHhhLWRhdGVwaWNrZXItZm9ybSBpbnB1dFtyZWFkb25seV1+Lmh4LWxhYmVse3RvcDotLjVyZW07Zm9udC1zaXplOi43NXJlbTtjb2xvcjojNDFiOTg3fWh4YS1kYXRlcGlja2Vye2JvcmRlcjoxcHggc29saWQgI2QzZDNkMzttYXgtd2lkdGg6MTlyZW19YF0sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyRm9ybUNvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH0sXHJcbiAge1xyXG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVwaWNrZXJGb3JtQ29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcclxuXHJcbiAgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsO1xyXG4gIF9jYWxlbmRhckluc3RhbmNlOiBEYXRlcGlja2VyQ29tcG9uZW50IHwgbnVsbDtcclxuICBwcml2YXRlIF9wb3J0YWw6IENvbXBvbmVudFBvcnRhbDxEYXRlcGlja2VyQ29tcG9uZW50PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcmVhZG9ubHkgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICByZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRlZmF1bHRUb1ByZXNlbnREYXRlID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBhbGxvd1ByZXZpb3VzRGF0ZXMgPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGFsbG93RnV0dXJlRGF0ZXMgPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRhdGVGb3JtYXQgPSAnZGQvTU0veSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcGxhY2Vob2xkZXIgPSAnRGF0ZSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaGVscFRleHQgPSAnUGxlYXNlIHNlbGVjdCBhIGRhdGUnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGljb24gPSAnaHgtaWNvbiBpY29uLWNhbGVuZGFyJztcclxuXHJcbiAgQElucHV0KClcclxuICBpY29uUGxhY2VtZW50ID0gJ3JpZ2h0JztcclxuXHJcb