@vismaux/ngx-nordic-cool
Version:
Common Nordic-Cool components for Angular.
219 lines • 34.9 kB
JavaScript
import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation, Output, EventEmitter, forwardRef, } from '@angular/core';
import { NG_VALUE_ACCESSOR, NG_VALIDATORS, } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@ng-bootstrap/ng-bootstrap";
import * as i2 from "../adapters/date-struct.adapter";
import * as i3 from "../datepicker-parser-formatter";
import * as i4 from "../datepicker/datepicker.component";
import * as i5 from "@angular/cdk/overlay";
import * as i6 from "@angular/cdk/a11y";
export class NcDatepickerInputComponent {
constructor(elRef, cdRef, calendar, adapter, parserFormatter) {
this.elRef = elRef;
this.cdRef = cdRef;
this.calendar = calendar;
this.adapter = adapter;
this.parserFormatter = parserFormatter;
/** @ignore */
this.inputValue = '';
this.showWeekNumbers = true;
this.placeholder = '';
this.dateChanged = new EventEmitter();
this.dateInput = new EventEmitter();
this.touched = new EventEmitter();
}
set value(value) {
this._value = value;
this._valueNative = this.adapter.fromModel(value);
this.updateViewValue();
}
/** @ignore */
get value() {
return this._value;
}
/** @ignore */
ngOnChanges(changes) {
if (changes.minDate || changes.maxDate) {
if (this._onValidatorChange) {
this._onValidatorChange();
}
}
}
toggle() {
this.isOpen = !this.isOpen;
this.cdRef.markForCheck();
}
open() {
this.isOpen = true;
this.cdRef.markForCheck();
}
close() {
this.isOpen = false;
this.cdRef.markForCheck();
}
/** @ignore */
onManualDateChange(value, updateView = false) {
if (value !== this.inputValue) {
this.inputValue = value;
this._valueNative = this.parserFormatter.parse(value);
this._value = this.adapter.toModel(this._valueNative);
this.dateInput.emit(this._value);
if (this._onChange) {
this._onChange(this._value ?? (value || null));
}
}
if (updateView) {
this.dateChanged.emit(this._value);
if (this._valueNative) {
this.updateViewValue();
this.cdRef.markForCheck();
}
}
}
/** @ignore */
onDateSelect(date) {
this.value = date;
if (this._onChange) {
this._onChange(date);
}
this.dateInput.emit(date);
this.dateChanged.emit(date);
this.onTouched();
this.isOpen = false;
this.cdRef.markForCheck();
}
/** @ignore */
onTouched() {
if (this._onTouched) {
this._onTouched();
}
this.touched.emit();
}
setToday() {
const today = this.adapter.toModel(this.calendar.getToday());
this.onDateSelect(today);
}
focusInput() {
this.elRef.nativeElement.querySelector('input').focus();
}
/** @ignore */
writeValue(value) {
this.value = value;
this.cdRef.markForCheck();
}
/** @ignore */
registerOnChange(fn) {
this._onChange = fn;
}
/** @ignore */
registerOnTouched(fn) {
this._onTouched = fn;
}
/** @ignore */
setDisabledState(isDisabled) {
this.disabled = isDisabled;
this.cdRef.markForCheck();
}
/** @ignore */
validate(control) {
const { value } = control;
if (value !== null) {
if (this._valueNative === null) {
return { dateFormat: { actual: control.value } };
}
if (this.minDate) {
const minDateNative = this.adapter.fromModel(this.minDate);
if (this.dateBefore(this._valueNative, minDateNative)) {
return { minDate: { actual: this._value, min: this.minDate } };
}
}
if (this.maxDate) {
const maxDateNative = this.adapter.fromModel(this.maxDate);
if (this.dateAfter(this._valueNative, maxDateNative)) {
return { maxDate: { actual: this._value, max: this.maxDate } };
}
}
}
return null;
}
/** @ignore */
registerOnValidatorChange(fn) {
this._onValidatorChange = fn;
}
/** @ignore */
updateViewValue() {
this.inputValue = this.parserFormatter.format(this._valueNative);
}
/** @ignore */
dateBefore(currValue, beforeValue) {
return (new Date(currValue.year, currValue.month - 1, currValue.day) <
new Date(beforeValue.year, beforeValue.month - 1, beforeValue.day));
}
/** @ignore */
dateAfter(currValue, afterValue) {
return (new Date(currValue.year, currValue.month - 1, currValue.day) >
new Date(afterValue.year, afterValue.month - 1, afterValue.day));
}
}
NcDatepickerInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDatepickerInputComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.NgbCalendar }, { token: i2.NcDateAdapter }, { token: i3.NcDateParserFormatter }], target: i0.ɵɵFactoryTarget.Component });
NcDatepickerInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: NcDatepickerInputComponent, selector: "nc-datepicker-input", inputs: { showWeekNumbers: "showWeekNumbers", firstDayOfWeek: "firstDayOfWeek", minDate: "minDate", maxDate: "maxDate", placeholder: "placeholder", inputId: "inputId", disabled: "disabled", startDate: "startDate", value: "value", ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"] }, outputs: { dateChanged: "dateChanged", dateInput: "dateInput", touched: "touched" }, host: { properties: { "attr.aria-label": "null", "attr.aria-labelledby": "null" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NcDatepickerInputComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => NcDatepickerInputComponent),
multi: true,
},
], usesOnChanges: true, ngImport: i0, template: "<input\n [attr.id]=\"inputId\"\n type=\"text\"\n autocomplete=\"off\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [value]=\"inputValue\"\n (blur)=\"onTouched()\"\n (input)=\"onManualDateChange($any($event.target).value)\"\n (change)=\"onManualDateChange($any($event.target).value, true)\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n/>\n\n<button\n type=\"button\"\n class=\"nc-datepicker-trigger-btn\"\n (click)=\"open()\"\n i18n-aria-label=\"@@nc-datepicker-button\"\n aria-label=\"Calendar\"\n [disabled]=\"disabled\"\n tabindex=\"-1\"\n>\n <span class=\"vismaicon vismaicon-datepicker\"></span>\n</button>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n class=\"nc-datepicker-wrapper\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n role=\"dialog\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n >\n <nc-datepicker\n [showWeekNumbers]=\"showWeekNumbers\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [startDate]=\"startDate\"\n [value]=\"value\"\n (dateSelect)=\"onDateSelect($event)\"\n ></nc-datepicker>\n\n <div class=\"nc-datepicker-footer\">\n <button\n class=\"nc-datepicker-today-btn\"\n (click)=\"setToday()\"\n i18n=\"@@nc-datepicker-today\"\n >\n Today\n </button>\n </div>\n </div>\n</ng-template>\n", styles: ["nc-datepicker-input{display:inline-block;position:relative}nc-datepicker-input input[type=text]{margin:0;width:100%;padding-right:30px}nc-datepicker-input .nc-datepicker-trigger-btn{background-color:transparent;position:absolute;top:1px;right:1px;border:0;height:30px;width:30px;padding:2px 0;cursor:pointer}nc-datepicker-input .nc-datepicker-trigger-btn:disabled{cursor:default}nc-datepicker-input .nc-datepicker-trigger-btn:focus{outline:none}nc-datepicker-input .nc-datepicker-trigger-btn .vismaicon{top:1px}.form-group nc-datepicker-input{width:100%}.form-group nc-datepicker-input input{float:none}.nc-datepicker-wrapper{background:var(--datepicker-popup-bg);box-shadow:var(--datepicker-popup-shadow)}.nc-datepicker-footer{text-align:center;padding-bottom:20px}.nc-datepicker-today-btn{background:transparent;border-radius:15px;width:auto;padding:4px 15px;cursor:pointer}.nc-datepicker-today-btn.nc-datepicker-today-btn{color:var(--datepicker-today-btn-text);border:2px solid var(--datepicker-today-btn-border)}.nc-datepicker-today-btn.nc-datepicker-today-btn:hover{background:var(--button-hover-bg)}.nc-datepicker-today-btn.nc-datepicker-today-btn:focus{outline:none;box-shadow:inset 0 0 0 1px var(--anchor-focus-outline)}\n"], components: [{ type: i4.NcDatepickerComponent, selector: "nc-datepicker", inputs: ["showWeekNumbers", "firstDayOfWeek", "value", "startDate", "minDate", "maxDate"], outputs: ["dateSelect"], exportAs: ["ncDatepicker"] }], directives: [{ type: i5.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { type: i5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayPositions", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayTransformOriginOn"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { type: i6.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcDatepickerInputComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-datepicker-input', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NcDatepickerInputComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => NcDatepickerInputComponent),
multi: true,
},
], host: {
'[attr.aria-label]': 'null',
'[attr.aria-labelledby]': 'null',
}, template: "<input\n [attr.id]=\"inputId\"\n type=\"text\"\n autocomplete=\"off\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [value]=\"inputValue\"\n (blur)=\"onTouched()\"\n (input)=\"onManualDateChange($any($event.target).value)\"\n (change)=\"onManualDateChange($any($event.target).value, true)\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n/>\n\n<button\n type=\"button\"\n class=\"nc-datepicker-trigger-btn\"\n (click)=\"open()\"\n i18n-aria-label=\"@@nc-datepicker-button\"\n aria-label=\"Calendar\"\n [disabled]=\"disabled\"\n tabindex=\"-1\"\n>\n <span class=\"vismaicon vismaicon-datepicker\"></span>\n</button>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (overlayOutsideClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n class=\"nc-datepicker-wrapper\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n role=\"dialog\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n >\n <nc-datepicker\n [showWeekNumbers]=\"showWeekNumbers\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [startDate]=\"startDate\"\n [value]=\"value\"\n (dateSelect)=\"onDateSelect($event)\"\n ></nc-datepicker>\n\n <div class=\"nc-datepicker-footer\">\n <button\n class=\"nc-datepicker-today-btn\"\n (click)=\"setToday()\"\n i18n=\"@@nc-datepicker-today\"\n >\n Today\n </button>\n </div>\n </div>\n</ng-template>\n", styles: ["nc-datepicker-input{display:inline-block;position:relative}nc-datepicker-input input[type=text]{margin:0;width:100%;padding-right:30px}nc-datepicker-input .nc-datepicker-trigger-btn{background-color:transparent;position:absolute;top:1px;right:1px;border:0;height:30px;width:30px;padding:2px 0;cursor:pointer}nc-datepicker-input .nc-datepicker-trigger-btn:disabled{cursor:default}nc-datepicker-input .nc-datepicker-trigger-btn:focus{outline:none}nc-datepicker-input .nc-datepicker-trigger-btn .vismaicon{top:1px}.form-group nc-datepicker-input{width:100%}.form-group nc-datepicker-input input{float:none}.nc-datepicker-wrapper{background:var(--datepicker-popup-bg);box-shadow:var(--datepicker-popup-shadow)}.nc-datepicker-footer{text-align:center;padding-bottom:20px}.nc-datepicker-today-btn{background:transparent;border-radius:15px;width:auto;padding:4px 15px;cursor:pointer}.nc-datepicker-today-btn.nc-datepicker-today-btn{color:var(--datepicker-today-btn-text);border:2px solid var(--datepicker-today-btn-border)}.nc-datepicker-today-btn.nc-datepicker-today-btn:hover{background:var(--button-hover-bg)}.nc-datepicker-today-btn.nc-datepicker-today-btn:focus{outline:none;box-shadow:inset 0 0 0 1px var(--anchor-focus-outline)}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.NgbCalendar }, { type: i2.NcDateAdapter }, { type: i3.NcDateParserFormatter }]; }, propDecorators: { showWeekNumbers: [{
type: Input
}], firstDayOfWeek: [{
type: Input
}], minDate: [{
type: Input
}], maxDate: [{
type: Input
}], placeholder: [{
type: Input
}], inputId: [{
type: Input
}], disabled: [{
type: Input
}], startDate: [{
type: Input
}], value: [{
type: Input
}], ariaLabel: [{
type: Input,
args: ['aria-label']
}], ariaLabelledby: [{
type: Input,
args: ['aria-labelledby']
}], dateChanged: [{
type: Output
}], dateInput: [{
type: Output
}], touched: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9yZGljLWNvb2wvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXItaW5wdXQvZGF0ZXBpY2tlci1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9yZGljLWNvb2wvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXItaW5wdXQvZGF0ZXBpY2tlci1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixZQUFZLEVBQ1osVUFBVSxHQUtYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxpQkFBaUIsRUFFakIsYUFBYSxHQUlkLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBNkJ4QixNQUFNLE9BQU8sMEJBQTBCO0lBMkNyQyxZQUNVLEtBQWlCLEVBQ2pCLEtBQXdCLEVBQ3hCLFFBQXFCLEVBQ3JCLE9BQXlCLEVBQ3pCLGVBQXNDO1FBSnRDLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6QixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFoQ2hELGNBQWM7UUFDZCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRVAsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFJdkIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFnQmhCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztRQUNwQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztRQUNsQyxZQUFPLEdBQUcs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QzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDOzRCQUN6RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMkJBQTJCLENBQUM7NEJBQ3pELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGLFFBQ0s7d0JBQ0osbUJBQW1CLEVBQUUsTUFBTTt3QkFDM0Isd0JBQXdCLEVBQUUsTUFBTTtxQkFDakM7Mk5BcUJRLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDTyxLQUFLO3NCQUFqQixLQUFLO2dCQVNlLFNBQVM7c0JBQTdCLEtBQUs7dUJBQUMsWUFBWTtnQkFDTyxjQUFjO3NCQUF2QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFFZCxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBFbGVtZW50UmVmLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBWYWxpZGF0b3IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIEFic3RyYWN0Q29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmdiQ2FsZW5kYXIgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBOY0RhdGVQYXJzZXJGb3JtYXR0ZXIgfSBmcm9tICcuLi9kYXRlcGlja2VyLXBhcnNlci1mb3JtYXR0ZXInO1xuaW1wb3J0IHsgTmNEYXRlQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXJzL2RhdGUtc3RydWN0LmFkYXB0ZXInO1xuaW1wb3J0IHsgTmNEYXRlU3RydWN0IH0gZnJvbSAnLi4vZGF0ZXBpY2tlci5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25jLWRhdGVwaWNrZXItaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGVwaWNrZXItaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmNEYXRlcGlja2VySW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmNEYXRlcGlja2VySW5wdXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5hcmlhLWxhYmVsXSc6ICdudWxsJyxcbiAgICAnW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XSc6ICdudWxsJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmNEYXRlcGlja2VySW5wdXRDb21wb25lbnQ8VCA9IHN0cmluZz5cbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkNoYW5nZXNcbntcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogVCB8IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9vblZhbGlkYXRvckNoYW5nZTogKCkgPT4gdm9pZDtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfdmFsdWU6IFQ7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgX3ZhbHVlTmF0aXZlOiBOY0RhdGVTdHJ1Y3Q7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgaXNPcGVuOiBib29sZWFuO1xuICAvKiogQGlnbm9yZSAqL1xuICBpbnB1dFZhbHVlID0gJyc7XG5cbiAgQElucHV0KCkgc2hvd1dlZWtOdW1iZXJzID0gdHJ1ZTtcbiAgQElucHV0KCkgZmlyc3REYXlPZldlZWs6IG51bWJlcjtcbiAgQElucHV0KCkgbWluRGF0ZTogVDtcbiAgQElucHV0KCkgbWF4RGF0ZTogVDtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcbiAgQElucHV0KCkgaW5wdXRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgc3RhcnREYXRlOiBUO1xuICBASW5wdXQoKSBzZXQgdmFsdWUodmFsdWU6IFQpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlTmF0aXZlID0gdGhpcy5hZGFwdGVyLmZyb21Nb2RlbCh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWaWV3VmFsdWUoKTtcbiAgfVxuICAvKiogQGlnbm9yZSAqL1xuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIEBJbnB1dCgnYXJpYS1sYWJlbCcpIGFyaWFMYWJlbDogc3RyaW5nO1xuICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgZGF0ZUlucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgdG91Y2hlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgY2FsZW5kYXI6IE5nYkNhbGVuZGFyLFxuICAgIHByaXZhdGUgYWRhcHRlcjogTmNEYXRlQWRhcHRlcjxUPixcbiAgICBwcml2YXRlIHBhcnNlckZvcm1hdHRlcjogTmNEYXRlUGFyc2VyRm9ybWF0dGVyXG4gICkge31cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubWluRGF0ZSB8fCBjaGFuZ2VzLm1heERhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9vblZhbGlkYXRvckNoYW5nZSkge1xuICAgICAgICB0aGlzLl9vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG9uTWFudWFsRGF0ZUNoYW5nZSh2YWx1ZTogc3RyaW5nLCB1cGRhdGVWaWV3ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuaW5wdXRWYWx1ZSkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl92YWx1ZU5hdGl2ZSA9IHRoaXMucGFyc2VyRm9ybWF0dGVyLnBhcnNlKHZhbHVlKTtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5hZGFwdGVyLnRvTW9kZWwodGhpcy5fdmFsdWVOYXRpdmUpO1xuICAgICAgdGhpcy5kYXRlSW5wdXQuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fb25DaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy5fdmFsdWUgPz8gKHZhbHVlIHx8IG51bGwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXBkYXRlVmlldykge1xuICAgICAgdGhpcy5kYXRlQ2hhbmdlZC5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl92YWx1ZU5hdGl2ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdWYWx1ZSgpO1xuICAgICAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG9uRGF0ZVNlbGVjdChkYXRlOiBUKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XG4gICAgaWYgKHRoaXMuX29uQ2hhbmdlKSB7XG4gICAgICB0aGlzLl9vbkNoYW5nZShkYXRlKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVJbnB1dC5lbWl0KGRhdGUpO1xuICAgIHRoaXMuZGF0ZUNoYW5nZWQuZW1pdChkYXRlKTtcblxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgb25Ub3VjaGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vblRvdWNoZWQpIHtcbiAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cbiAgICB0aGlzLnRvdWNoZWQuZW1pdCgpO1xuICB9XG5cbiAgc2V0VG9kYXkoKTogdm9pZCB7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLmFkYXB0ZXIudG9Nb2RlbCh0aGlzLmNhbGVuZGFyLmdldFRvZGF5KCkpO1xuICAgIHRoaXMub25EYXRlU2VsZWN0KHRvZGF5KTtcbiAgfVxuXG4gIGZvY3VzSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gY29udHJvbDtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLl92YWx1ZU5hdGl2ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyBkYXRlRm9ybWF0OiB7IGFjdHVhbDogY29udHJvbC52YWx1ZSB9IH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgY29uc3QgbWluRGF0ZU5hdGl2ZSA9IHRoaXMuYWRhcHRlci5mcm9tTW9kZWwodGhpcy5taW5EYXRlKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0ZUJlZm9yZSh0aGlzLl92YWx1ZU5hdGl2ZSwgbWluRGF0ZU5hdGl2ZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBtaW5EYXRlOiB7IGFjdHVhbDogdGhpcy5fdmFsdWUsIG1pbjogdGhpcy5taW5EYXRlIH0gfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhEYXRlKSB7XG4gICAgICAgIGNvbnN0IG1heERhdGVOYXRpdmUgPSB0aGlzLmFkYXB0ZXIuZnJvbU1vZGVsKHRoaXMubWF4RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLmRhdGVBZnRlcih0aGlzLl92YWx1ZU5hdGl2ZSwgbWF4RGF0ZU5hdGl2ZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBtYXhEYXRlOiB7IGFjdHVhbDogdGhpcy5fdmFsdWUsIG1heDogdGhpcy5tYXhEYXRlIH0gfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaWV3VmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy5wYXJzZXJGb3JtYXR0ZXIuZm9ybWF0KHRoaXMuX3ZhbHVlTmF0aXZlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgZGF0ZUJlZm9yZShcbiAgICBjdXJyVmFsdWU6IE5jRGF0ZVN0cnVjdCxcbiAgICBiZWZvcmVWYWx1ZTogTmNEYXRlU3RydWN0XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgRGF0ZShjdXJyVmFsdWUueWVhciwgY3VyclZhbHVlLm1vbnRoIC0gMSwgY3VyclZhbHVlLmRheSkgPFxuICAgICAgbmV3IERhdGUoYmVmb3JlVmFsdWUueWVhciwgYmVmb3JlVmFsdWUubW9udGggLSAxLCBiZWZvcmVWYWx1ZS5kYXkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgZGF0ZUFmdGVyKFxuICAgIGN1cnJWYWx1ZTogTmNEYXRlU3RydWN0LFxuICAgIGFmdGVyVmFsdWU6IE5jRGF0ZVN0cnVjdFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV3IERhdGUoY3VyclZhbHVlLnllYXIsIGN1cnJWYWx1ZS5tb250aCAtIDEsIGN1cnJWYWx1ZS5kYXkpID5cbiAgICAgIG5ldyBEYXRlKGFmdGVyVmFsdWUueWVhciwgYWZ0ZXJWYWx1ZS5tb250aCAtIDEsIGFmdGVyVmFsdWUuZGF5KVxuICAgICk7XG4gIH1cbn1cbiIsIjxpbnB1dFxuICBbYXR0ci5pZF09XCJpbnB1dElkXCJcbiAgdHlwZT1cInRleHRcIlxuICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbdmFsdWVdPVwiaW5wdXRWYWx1ZVwiXG4gIChibHVyKT1cIm9uVG91Y2hlZCgpXCJcbiAgKGlucHV0KT1cIm9uTWFudWFsRGF0ZUNoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gIChjaGFuZ2UpPVwib25NYW51YWxEYXRlQ2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsIHRydWUpXCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkYnlcIlxuICBjZGtPdmVybGF5T3JpZ2luXG4gICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4vPlxuXG48YnV0dG9uXG4gIHR5cGU9XCJidXR0b25cIlxuICBjbGFzcz1cIm5jLWRhdGVwaWNrZXItdHJpZ2dlci1idG5cIlxuICAoY2xpY2spPVwib3BlbigpXCJcbiAgaTE4bi1hcmlhLWxhYmVsPVwiQEBuYy1kYXRlcGlja2VyLWJ1dHRvblwiXG4gIGFyaWEtbGFiZWw9XCJDYWxlbmRhclwiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIHRhYmluZGV4PVwiLTFcIlxuPlxuICA8c3BhbiBjbGFzcz1cInZpc21haWNvbiB2aXNtYWljb24tZGF0ZXBpY2tlclwiPjwvc3Bhbj5cbjwvYnV0dG9uPlxuXG48bmctdGVtcGxhdGVcbiAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlblwiXG4gIChvdmVybGF5T3V0c2lkZUNsaWNrKT1cImNsb3NlKClcIlxuICAoZGV0YWNoKT1cImNsb3NlKClcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJuYy1kYXRlcGlja2VyLXdyYXBwZXJcIlxuICAgIGNka1RyYXBGb2N1c1xuICAgIFtjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZV09XCJ0cnVlXCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5XCJcbiAgPlxuICAgIDxuYy1kYXRlcGlja2VyXG4gICAgICBbc2hvd1dlZWtOdW1iZXJzXT1cInNob3dXZWVrTnVtYmVyc1wiXG4gICAgICBbZmlyc3REYXlPZldlZWtdPVwiZmlyc3REYXlPZldlZWtcIlxuICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXG4gICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICAgIFtzdGFydERhdGVdPVwic3RhcnREYXRlXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAoZGF0ZVNlbGVjdCk9XCJvbkRhdGVTZWxlY3QoJGV2ZW50KVwiXG4gICAgPjwvbmMtZGF0ZXBpY2tlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJuYy1kYXRlcGlja2VyLWZvb3RlclwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cIm5jLWRhdGVwaWNrZXItdG9kYXktYnRuXCJcbiAgICAgICAgKGNsaWNrKT1cInNldFRvZGF5KClcIlxuICAgICAgICBpMThuPVwiQEBuYy1kYXRlcGlja2VyLXRvZGF5XCJcbiAgICAgID5cbiAgICAgICAgVG9kYXlcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=