UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

210 lines 28.5 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, Input, Optional, Output } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { coerceToBoolean } from '../../common/coerce-to-boolean'; import { ModalService } from '../modal/modal.service'; import { DateTimePickerFormatProvider } from './date-time-picker-format-provider.service'; import { DateTimePickerModal } from './date-time-picker-modal.component'; import { momentjs } from '../../common/momentjs.import'; import * as i0 from "@angular/core"; import * as i1 from "./date-time-picker-format-provider.service"; import * as i2 from "../modal/modal.service"; import * as i3 from "../input/input.component"; import * as i4 from "../button/button.component"; import * as i5 from "@angular/common"; import * as i6 from "../icon/icon.directive"; const GTX_DATEPICKER_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateTimePicker), multi: true }; /** * A form control for selecting a date and (optionally) a time. * * Depends on [ModalService](#/modal-service), which in turn * requires that the [`<gtx-overlay-host>`](#/overlay-host) is present in the app. * * ```html * <gtx-date-time-picker [(ngModel)]="dateOfBirth" * label="Date of Birth" * displayTime="false" * format="Do MMMM YYYY"> * </gtx-date-time-picker> * ``` */ export class DateTimePicker { constructor(formatProvider, modalService, changeDetector) { this.formatProvider = formatProvider; this.modalService = modalService; this.changeDetector = changeDetector; /** Sets the date picker to be auto-focused. Handled by `AutofocusDirective`. */ this.autofocus = false; /** Value to set on the ngModel when the DatePicker is cleared. */ this.emptyValue = null; /** A label for the control. */ this.label = ''; /** Fires when the "okay" button is clicked to close the picker. */ this.change = new EventEmitter(); /** Fires when the "clear" button is clicked on a clearable DateTimePicker. */ this.clear = new EventEmitter(); this._clearable = false; this._selectYear = false; this._disabled = false; this.displayValue = ''; this._displayTime = true; this._displaySeconds = true; // ValueAccessor members this.onChange = () => { }; this.onTouched = () => { }; if (!formatProvider) { this.formatProvider = new DateTimePickerFormatProvider(); } } /** If true the clear button is displayed, which allows the user to clear the selected date. */ set clearable(val) { this._clearable = coerceToBoolean(val); } /** If true, the year may be selected from a Select control. */ set selectYear(val) { this._selectYear = coerceToBoolean(val); } /** Set to `true` to disable the input field and not show the date picker on click. */ set disabled(val) { this._disabled = coerceToBoolean(val); } /** Set to `false` to omit the time picker part of the component. Defaults to `true`. */ set displayTime(val) { this._displayTime = coerceToBoolean(val); } /** Set to `false` to omit the seconds of the time picker part. Defaults to `true`. */ set displaySeconds(val) { this._displaySeconds = coerceToBoolean(val); } ngOnInit() { this.subscription = this.formatProvider.changed$ .subscribe(() => this.updateDisplayValue()); } ngOnChanges(changes) { if (changes.timestamp) { // Whenever the timestamp input property changes, set the current value to it. this.value = momentjs.unix(Number(changes.timestamp.currentValue)); this.updateDisplayValue(); } } ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } } handleEnterKey(event) { if (event.keyCode === 13 && !this._disabled) { this.showModal(); } } showModal() { this.modalService.fromComponent(DateTimePickerModal, { padding: false }, { timestamp: (this.value || momentjs()).unix(), formatProvider: this.formatProvider, displayTime: this._displayTime, displaySeconds: this._displaySeconds, min: this.min, max: this.max, selectYear: this._selectYear }) .then(modal => modal.open()) .then((timestamp) => { this.value = momentjs.unix(timestamp); this.updateDisplayValue(); this.onChange(); this.change.emit(timestamp); }); } getUnixTimestamp() { return this.value.unix(); } writeValue(value) { this.value = value ? momentjs.unix(Number(value)) : undefined; this.updateDisplayValue(); } registerOnChange(fn) { this.onChange = (value) => { if (value) { fn(value); } else if (this.value) { fn(this.value.unix()); } else { fn(this.emptyValue); } }; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(disabled) { this.disabled = disabled; this.changeDetector.markForCheck(); } /** Format date to a human-readable string for displaying in the component's input field. */ updateDisplayValue() { if (!this.value) { this.displayValue = ''; } else if (this.format) { this.displayValue = this.value.format(this.format); } else { this.displayValue = this.formatProvider.format(this.value, this._displayTime, this._displaySeconds); } this.changeDetector.markForCheck(); } /** Clear input value of DateTimePicker and emit `emptyValue` as value. */ clearDateTime() { this.displayValue = ''; this.value = undefined; const emptyValue = this.emptyValue; this.clear.emit(emptyValue); this.onChange(emptyValue); this.change.emit(emptyValue); this.changeDetector.markForCheck(); } } /** @nocollapse */ DateTimePicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DateTimePicker, deps: [{ token: i1.DateTimePickerFormatProvider, optional: true }, { token: i2.ModalService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ DateTimePicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: DateTimePicker, selector: "gtx-date-time-picker", inputs: { autofocus: "autofocus", clearable: "clearable", emptyValue: "emptyValue", timestamp: "timestamp", label: "label", format: "format", min: "min", max: "max", selectYear: "selectYear", disabled: "disabled", displayTime: "displayTime", displaySeconds: "displaySeconds" }, outputs: { change: "change", clear: "clear" }, providers: [GTX_DATEPICKER_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: "<gtx-input [value]=\"displayValue\"\n [label]=\"label\"\n (click)=\"!_disabled && showModal()\"\n (keydown)=\"handleEnterKey($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"_disabled\"\n readonly=\"true\"\n [class.clearable]=\"_clearable\"></gtx-input>\n<gtx-button icon\n class=\"clear-button\"\n *ngIf=\"_clearable\"\n type=\"secondary\"\n [disabled]=\"_disabled\"\n (click)=\"!_disabled && clearDateTime()\">\n <icon>clear</icon>\n</gtx-button>\n\n", components: [{ type: i3.InputField, selector: "gtx-input", inputs: ["autocomplete", "autofocus", "disabled", "id", "label", "max", "min", "maxlength", "name", "pattern", "placeholder", "readonly", "required", "step", "type", "value"], outputs: ["blur", "focus", "change"] }, { type: i4.Button, selector: "gtx-button", inputs: ["autofocus", "size", "type", "flat", "icon", "disabled", "submit"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.Icon, selector: "icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DateTimePicker, decorators: [{ type: Component, args: [{ selector: 'gtx-date-time-picker', providers: [GTX_DATEPICKER_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<gtx-input [value]=\"displayValue\"\n [label]=\"label\"\n (click)=\"!_disabled && showModal()\"\n (keydown)=\"handleEnterKey($event)\"\n (blur)=\"onTouched()\"\n [disabled]=\"_disabled\"\n readonly=\"true\"\n [class.clearable]=\"_clearable\"></gtx-input>\n<gtx-button icon\n class=\"clear-button\"\n *ngIf=\"_clearable\"\n type=\"secondary\"\n [disabled]=\"_disabled\"\n (click)=\"!_disabled && clearDateTime()\">\n <icon>clear</icon>\n</gtx-button>\n\n" }] }], ctorParameters: function () { return [{ type: i1.DateTimePickerFormatProvider, decorators: [{ type: Optional }] }, { type: i2.ModalService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { autofocus: [{ type: Input }], clearable: [{ type: Input }], emptyValue: [{ type: Input }], timestamp: [{ type: Input }], label: [{ type: Input }], format: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], selectYear: [{ type: Input }], disabled: [{ type: Input }], displayTime: [{ type: Input }], displaySeconds: [{ type: Input }], change: [{ type: Output }], clear: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9kYXRlLXRpbWUtcGlja2VyL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZGF0ZS10aW1lLXBpY2tlci9kYXRlLXRpbWUtcGlja2VyLnRwbC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd2RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBQyxRQUFRLEVBQVMsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7QUFJOUQsTUFBTSw2QkFBNkIsR0FBRztJQUNsQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDO0lBQzdDLEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFPSCxNQUFNLE9BQU8sY0FBYztJQXdFdkIsWUFBZ0MsY0FBNEMsRUFDeEQsWUFBMEIsRUFDMUIsY0FBaUM7UUFGckIsbUJBQWMsR0FBZCxjQUFjLENBQThCO1FBQ3hELGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQXpFckQsZ0ZBQWdGO1FBQ3ZFLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFPcEMsa0VBQWtFO1FBQ3pELGVBQVUsR0FBUSxJQUFJLENBQUM7UUFLaEMsK0JBQStCO1FBQ3RCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFtQzVCLG1FQUFtRTtRQUN6RCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUVuRCw4RUFBOEU7UUFDcEUsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFMUMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBSWxCLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBQzdCLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBR3hDLHdCQUF3QjtRQUN4QixhQUFRLEdBQVEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ3pCLGNBQVMsR0FBUSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFNdEIsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksNEJBQTRCLEVBQUUsQ0FBQztTQUM1RDtJQUNMLENBQUM7SUEzRUQsK0ZBQStGO0lBQy9GLElBQWEsU0FBUyxDQUFDLEdBQVE7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQXdCRCwrREFBK0Q7SUFDL0QsSUFBYSxVQUFVLENBQUMsR0FBUTtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLElBQWEsUUFBUSxDQUFDLEdBQVE7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELHdGQUF3RjtJQUN4RixJQUFhLFdBQVcsQ0FBQyxHQUFRO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBYSxjQUFjLENBQUMsR0FBUTtRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBZ0NELFFBQVE7UUFDSixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUTthQUMzQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQW9EO1FBQzVELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNuQiw4RUFBOEU7WUFDOUUsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ25DO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFvQjtRQUMvQixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDcEI7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUMzQixtQkFBbUIsRUFDbkI7WUFDSSxPQUFPLEVBQUUsS0FBSztTQUNqQixFQUNEO1lBQ0ksU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUM1QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzlCLGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNwQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDL0IsQ0FBQzthQUNELElBQUksQ0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNuQyxJQUFJLENBQUMsQ0FBQyxTQUFpQixFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDOUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQVk7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQXFCLEVBQUUsRUFBRTtZQUN0QyxJQUFJLEtBQUssRUFBRTtnQkFDUCxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDYjtpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ25CLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7YUFDekI7aUJBQU07Z0JBQ0gsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN2QjtRQUNMLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFZO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFpQjtRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCw0RkFBNEY7SUFDNUYsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDYixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUMxQjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3ZHO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLGFBQWE7UUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUV2QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDOzs4SEF4TFEsY0FBYztrSEFBZCxjQUFjLG9YQUhaLENBQUMsNkJBQTZCLENBQUMsK0NDaEQ5QywraEJBaUJBOzJGRGtDYSxjQUFjO2tCQU4xQixTQUFTOytCQUNJLHNCQUFzQixhQUVyQixDQUFDLDZCQUE2QixDQUFDLG1CQUN6Qix1QkFBdUIsQ0FBQyxNQUFNOzswQkEwRWxDLFFBQVE7dUdBdEVaLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR08sU0FBUztzQkFBckIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQU9HLE1BQU07c0JBQWQsS0FBSztnQkFHRyxHQUFHO3NCQUFYLEtBQUs7Z0JBR0csR0FBRztzQkFBWCxLQUFLO2dCQUdPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBS08sUUFBUTtzQkFBcEIsS0FBSztnQkFLTyxXQUFXO3NCQUF2QixLQUFLO2dCQUtPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBS0ksTUFBTTtzQkFBZixNQUFNO2dCQUdHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7Y29lcmNlVG9Cb29sZWFufSBmcm9tICcuLi8uLi9jb21tb24vY29lcmNlLXRvLWJvb2xlYW4nO1xuaW1wb3J0IHtNb2RhbFNlcnZpY2V9IGZyb20gJy4uL21vZGFsL21vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRlVGltZVBpY2tlckZvcm1hdFByb3ZpZGVyfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItZm9ybWF0LXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRlVGltZVBpY2tlck1vZGFsfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7RGF0ZVRpbWVQaWNrZXJTdHJpbmdzfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItc3RyaW5ncyc7XG5pbXBvcnQge21vbWVudGpzLCBNb21lbnR9IGZyb20gJy4uLy4uL2NvbW1vbi9tb21lbnRqcy5pbXBvcnQnO1xuXG5leHBvcnQge0RhdGVUaW1lUGlja2VyU3RyaW5nc307XG5cbmNvbnN0IEdUWF9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVUaW1lUGlja2VyKSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIGZvcm0gY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgZGF0ZSBhbmQgKG9wdGlvbmFsbHkpIGEgdGltZS5cbiAqXG4gKiBEZXBlbmRzIG9uIFtNb2RhbFNlcnZpY2VdKCMvbW9kYWwtc2VydmljZSksIHdoaWNoIGluIHR1cm5cbiAqIHJlcXVpcmVzIHRoYXQgdGhlIFtgPGd0eC1vdmVybGF5LWhvc3Q+YF0oIy9vdmVybGF5LWhvc3QpIGlzIHByZXNlbnQgaW4gdGhlIGFwcC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8Z3R4LWRhdGUtdGltZS1waWNrZXIgWyhuZ01vZGVsKV09XCJkYXRlT2ZCaXJ0aFwiXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVRpbWU9XCJmYWxzZVwiXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9XCJEbyBNTU1NIFlZWVlcIj5cbiAqIDwvZ3R4LWRhdGUtdGltZS1waWNrZXI+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdndHgtZGF0ZS10aW1lLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtdGltZS1waWNrZXIudHBsLmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0dUWF9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVBpY2tlciBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIFNldHMgdGhlIGRhdGUgcGlja2VyIHRvIGJlIGF1dG8tZm9jdXNlZC4gSGFuZGxlZCBieSBgQXV0b2ZvY3VzRGlyZWN0aXZlYC4gKi9cbiAgICBASW5wdXQoKSBhdXRvZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBJZiB0cnVlIHRoZSBjbGVhciBidXR0b24gaXMgZGlzcGxheWVkLCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gY2xlYXIgdGhlIHNlbGVjdGVkIGRhdGUuICovXG4gICAgQElucHV0KCkgc2V0IGNsZWFyYWJsZSh2YWw6IGFueSkge1xuICAgICAgICB0aGlzLl9jbGVhcmFibGUgPSBjb2VyY2VUb0Jvb2xlYW4odmFsKTtcbiAgICB9XG5cbiAgICAvKiogVmFsdWUgdG8gc2V0IG9uIHRoZSBuZ01vZGVsIHdoZW4gdGhlIERhdGVQaWNrZXIgaXMgY2xlYXJlZC4gKi9cbiAgICBASW5wdXQoKSBlbXB0eVZhbHVlOiBhbnkgPSBudWxsO1xuXG4gICAgLyoqIFRoZSBkYXRlL3RpbWUgdmFsdWUgYXMgYSB1bml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykuICovXG4gICAgQElucHV0KCkgdGltZXN0YW1wOiBudW1iZXI7XG5cbiAgICAvKiogQSBsYWJlbCBmb3IgdGhlIGNvbnRyb2wuICovXG4gICAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogQSBbbW9tZW50LmpzXShodHRwOi8vbW9tZW50anMuY29tLyktY29tcGF0aWJsZSBmb3JtYXQgc3RyaW5nIHdoaWNoIGRldGVybWluZXMgaG93IHRoZVxuICAgICAqIGRhdGUvdGltZSB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgaW5wdXQgZmllbGQuXG4gICAgICogU2VlIFt0aGUgbW9tZW50IGRvY3NdKGh0dHA6Ly9tb21lbnRqcy5jb20vZG9jcy8jL2Rpc3BsYXlpbmcvZm9ybWF0LykgZm9yIHZhbGlkIHN0cmluZ3MuXG4gICAgICovXG4gICAgQElucHV0KCkgZm9ybWF0OiBzdHJpbmc7XG5cbiAgICAvKiogVGhlIG1pbmltdW0gZGF0ZSBhbGxvd2VkLCBlLmcuIGBuZXcgRGF0ZSgyMDE1LCAyLCAxMilgLiAqL1xuICAgIEBJbnB1dCgpIG1pbjogRGF0ZTtcblxuICAgIC8qKiBUaGUgbWF4aW11bSBkYXRlIGFsbG93ZWQsIGUuZy4gYG5ldyBEYXRlKDIwMzEsIDEsIDMwKWAuICovXG4gICAgQElucHV0KCkgbWF4OiBEYXRlO1xuXG4gICAgLyoqIElmIHRydWUsIHRoZSB5ZWFyIG1heSBiZSBzZWxlY3RlZCBmcm9tIGEgU2VsZWN0IGNvbnRyb2wuICovXG4gICAgQElucHV0KCkgc2V0IHNlbGVjdFllYXIodmFsOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0WWVhciA9IGNvZXJjZVRvQm9vbGVhbih2YWwpO1xuICAgIH1cblxuICAgIC8qKiBTZXQgdG8gYHRydWVgIHRvIGRpc2FibGUgdGhlIGlucHV0IGZpZWxkIGFuZCBub3Qgc2hvdyB0aGUgZGF0ZSBwaWNrZXIgb24gY2xpY2suICovXG4gICAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbDogYW55KSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlVG9Cb29sZWFuKHZhbCk7XG4gICAgfVxuXG4gICAgLyoqIFNldCB0byBgZmFsc2VgIHRvIG9taXQgdGhlIHRpbWUgcGlja2VyIHBhcnQgb2YgdGhlIGNvbXBvbmVudC4gRGVmYXVsdHMgdG8gYHRydWVgLiAqL1xuICAgIEBJbnB1dCgpIHNldCBkaXNwbGF5VGltZSh2YWw6IGFueSkge1xuICAgICAgICB0aGlzLl9kaXNwbGF5VGltZSA9IGNvZXJjZVRvQm9vbGVhbih2YWwpO1xuICAgIH1cblxuICAgIC8qKiBTZXQgdG8gYGZhbHNlYCB0byBvbWl0IHRoZSBzZWNvbmRzIG9mIHRoZSB0aW1lIHBpY2tlciBwYXJ0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gICAgQElucHV0KCkgc2V0IGRpc3BsYXlTZWNvbmRzKHZhbDogYW55KSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlTZWNvbmRzID0gY29lcmNlVG9Cb29sZWFuKHZhbCk7XG4gICAgfVxuXG4gICAgLyoqIEZpcmVzIHdoZW4gdGhlIFwib2theVwiIGJ1dHRvbiBpcyBjbGlja2VkIHRvIGNsb3NlIHRoZSBwaWNrZXIuICovXG4gICAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyfG51bGw+KCk7XG5cbiAgICAvKiogRmlyZXMgd2hlbiB0aGUgXCJjbGVhclwiIGJ1dHRvbiBpcyBjbGlja2VkIG9uIGEgY2xlYXJhYmxlIERhdGVUaW1lUGlja2VyLiAqL1xuICAgIEBPdXRwdXQoKSBjbGVhciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgX2NsZWFyYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIF9zZWxlY3RZZWFyOiBib29sZWFuID0gZmFsc2U7XG4gICAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgZGlzcGxheVZhbHVlOiBzdHJpbmcgPSAnJztcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSB2YWx1ZTogTW9tZW50O1xuXG4gICAgcHJpdmF0ZSBfZGlzcGxheVRpbWU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHByaXZhdGUgX2Rpc3BsYXlTZWNvbmRzOiBib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gVmFsdWVBY2Nlc3NvciBtZW1iZXJzXG4gICAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xuICAgIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1hdFByb3ZpZGVyOiBEYXRlVGltZVBpY2tlckZvcm1hdFByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblxuICAgICAgICBpZiAoIWZvcm1hdFByb3ZpZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdFByb3ZpZGVyID0gbmV3IERhdGVUaW1lUGlja2VyRm9ybWF0UHJvdmlkZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybWF0UHJvdmlkZXIuY2hhbmdlZCRcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczoge1tLIGluIGtleW9mIERhdGVUaW1lUGlja2VyXTogU2ltcGxlQ2hhbmdlfSk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy50aW1lc3RhbXApIHtcbiAgICAgICAgICAgIC8vIFdoZW5ldmVyIHRoZSB0aW1lc3RhbXAgaW5wdXQgcHJvcGVydHkgY2hhbmdlcywgc2V0IHRoZSBjdXJyZW50IHZhbHVlIHRvIGl0LlxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG1vbWVudGpzLnVuaXgoTnVtYmVyKGNoYW5nZXMudGltZXN0YW1wLmN1cnJlbnRWYWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVFbnRlcktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMgJiYgIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dNb2RhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd01vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5mcm9tQ29tcG9uZW50KFxuICAgICAgICAgICAgRGF0ZVRpbWVQaWNrZXJNb2RhbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6ICh0aGlzLnZhbHVlIHx8IG1vbWVudGpzKCkpLnVuaXgoKSxcbiAgICAgICAgICAgICAgICBmb3JtYXRQcm92aWRlcjogdGhpcy5mb3JtYXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBkaXNwbGF5VGltZTogdGhpcy5fZGlzcGxheVRpbWUsXG4gICAgICAgICAgICAgICAgZGlzcGxheVNlY29uZHM6IHRoaXMuX2Rpc3BsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgIG1pbjogdGhpcy5taW4sXG4gICAgICAgICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICAgICAgICBzZWxlY3RZZWFyOiB0aGlzLl9zZWxlY3RZZWFyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW48bnVtYmVyPihtb2RhbCA9PiBtb2RhbC5vcGVuKCkpXG4gICAgICAgICAgICAudGhlbigodGltZXN0YW1wOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbW9tZW50anMudW5peCh0aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodGltZXN0YW1wKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFVuaXhUaW1lc3RhbXAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUudW5peCgpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUgPyBtb21lbnRqcy51bml4KE51bWJlcih2YWx1ZSkpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSAodmFsdWU/OiBudW1iZXIgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmbih2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmbih0aGlzLnZhbHVlLnVuaXgoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZuKHRoaXMuZW1wdHlWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEZvcm1hdCBkYXRlIHRvIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGZvciBkaXNwbGF5aW5nIGluIHRoZSBjb21wb25lbnQncyBpbnB1dCBmaWVsZC4gKi9cbiAgICB1cGRhdGVEaXNwbGF5VmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB0aGlzLnZhbHVlLmZvcm1hdCh0aGlzLmZvcm1hdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0UHJvdmlkZXIuZm9ybWF0KHRoaXMudmFsdWUsIHRoaXMuX2Rpc3BsYXlUaW1lLCB0aGlzLl9kaXNwbGF5U2Vjb25kcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBDbGVhciBpbnB1dCB2YWx1ZSBvZiBEYXRlVGltZVBpY2tlciBhbmQgZW1pdCBgZW1wdHlWYWx1ZWAgYXMgdmFsdWUuICovXG4gICAgY2xlYXJEYXRlVGltZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBlbXB0eVZhbHVlID0gdGhpcy5lbXB0eVZhbHVlO1xuICAgICAgICB0aGlzLmNsZWFyLmVtaXQoZW1wdHlWYWx1ZSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoZW1wdHlWYWx1ZSk7XG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoZW1wdHlWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbn1cbiIsIjxndHgtaW5wdXQgW3ZhbHVlXT1cImRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgICAgICAgIChjbGljayk9XCIhX2Rpc2FibGVkICYmIHNob3dNb2RhbCgpXCJcbiAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlRW50ZXJLZXkoJGV2ZW50KVwiXG4gICAgICAgICAgIChibHVyKT1cIm9uVG91Y2hlZCgpXCJcbiAgICAgICAgICAgW2Rpc2FibGVkXT1cIl9kaXNhYmxlZFwiXG4gICAgICAgICAgIHJlYWRvbmx5PVwidHJ1ZVwiXG4gICAgICAgICAgIFtjbGFzcy5jbGVhcmFibGVdPVwiX2NsZWFyYWJsZVwiPjwvZ3R4LWlucHV0PlxuPGd0eC1idXR0b24gaWNvblxuICAgIGNsYXNzPVwiY2xlYXItYnV0dG9uXCJcbiAgICAqbmdJZj1cIl9jbGVhcmFibGVcIlxuICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxuICAgIFtkaXNhYmxlZF09XCJfZGlzYWJsZWRcIlxuICAgIChjbGljayk9XCIhX2Rpc2FibGVkICYmIGNsZWFyRGF0ZVRpbWUoKVwiPlxuICAgIDxpY29uPmNsZWFyPC9pY29uPlxuPC9ndHgtYnV0dG9uPlxuXG4iXX0=