UNPKG

ng19-date-picker

Version:

https://github.com/vlio20/angular-datepicker

176 lines 37.7 kB
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core'; import { TimeSelectService } from './time-select.service'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { dayjsRef } from '../common/dayjs/dayjs.ref'; import * as i0 from "@angular/core"; import * as i1 from "./time-select.service"; import * as i2 from "../common/services/utils/utils.service"; import * as i3 from "@angular/common"; import * as i4 from "@angular/cdk/bidi"; export class TimeSelectComponent { constructor(timeSelectService, utilsService, cd) { this.timeSelectService = timeSelectService; this.utilsService = utilsService; this.cd = cd; this.onChange = new EventEmitter(); this.isInited = false; this.api = { triggerChange: this.emitChange.bind(this) }; } get selected() { return this._selected; } set selected(selected) { this._selected = selected; this.calculateTimeParts(this.selected); this.showDecHour = this.timeSelectService.shouldShowDecrease(this.componentConfig, this._selected, 'hour'); this.showDecMinute = this.timeSelectService.shouldShowDecrease(this.componentConfig, this._selected, 'minute'); this.showDecSecond = this.timeSelectService.shouldShowDecrease(this.componentConfig, this._selected, 'second'); this.showIncHour = this.timeSelectService.shouldShowIncrease(this.componentConfig, this._selected, 'hour'); this.showIncMinute = this.timeSelectService.shouldShowIncrease(this.componentConfig, this._selected, 'minute'); this.showIncSecond = this.timeSelectService.shouldShowIncrease(this.componentConfig, this._selected, 'second'); this.showToggleMeridiem = this.timeSelectService.shouldShowToggleMeridiem(this.componentConfig, this._selected); this.onChangeCallback(this.processOnChangeCallback(selected)); } ngOnInit() { this.isInited = true; this.init(); this.initValidators(); } init() { this.componentConfig = this.timeSelectService.getConfig(this.config); this.selected = this.selected || dayjsRef(); this.inputValueType = this.utilsService.getInputType(this.inputValue, false); } ngOnChanges(changes) { if (this.isInited) { const { minDate, maxDate, minTime, maxTime } = changes; if (minDate || maxDate || minTime || maxTime) { this.initValidators(); } this.init(); } } writeValue(value) { this.inputValue = value; if (value) { const dayjsValue = this.utilsService .convertToDayjsArray(value, { allowMultiSelect: false, format: this.timeSelectService.getTimeFormat(this.componentConfig) })[0]; if (dayjsValue.isValid()) { this.selected = dayjsValue; this.inputValueType = this.utilsService .getInputType(this.inputValue, false); } } this.cd.markForCheck(); } registerOnChange(fn) { this.onChangeCallback = fn; } onChangeCallback(_) { } registerOnTouched(fn) { } validate(formControl) { if (this.minDate || this.maxDate || this.minTime || this.maxTime) { return this.validateFn(formControl.value); } else { return () => null; } } processOnChangeCallback(value) { return this.utilsService.convertFromDayjsArray(this.timeSelectService.getTimeFormat(this.componentConfig), [value], this.componentConfig.returnedValueType || this.inputValueType); } initValidators() { this.validateFn = this.utilsService.createValidator({ minDate: this.minDate, maxDate: this.maxDate, minTime: this.minTime, maxTime: this.maxTime }, undefined, 'day'); this.onChangeCallback(this.processOnChangeCallback(this.selected)); } decrease(unit) { this.selected = this.timeSelectService.decrease(this.componentConfig, this.selected, unit); this.emitChange(); } increase(unit) { this.selected = this.timeSelectService.increase(this.componentConfig, this.selected, unit); this.emitChange(); } toggleMeridiem() { this.selected = this.timeSelectService.toggleMeridiem(this.selected); this.emitChange(); } emitChange() { this.onChange.emit({ date: this.selected, selected: false }); this.cd.markForCheck(); } calculateTimeParts(time) { this.hours = this.timeSelectService.getHours(this.componentConfig, time); this.minutes = this.timeSelectService.getMinutes(this.componentConfig, time); this.seconds = this.timeSelectService.getSeconds(this.componentConfig, time); this.meridiem = this.timeSelectService.getMeridiem(this.componentConfig, time); } handleConfigChange(config) { if (config) { const prevConf = this.timeSelectService.getConfig(config.previousValue); const currentConf = this.timeSelectService.getConfig(config.currentValue); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: TimeSelectComponent, deps: [{ token: i1.TimeSelectService }, { token: i2.UtilsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: TimeSelectComponent, selector: "dp-time-select", inputs: { config: "config", displayDate: "displayDate", minDate: "minDate", maxDate: "maxDate", minTime: "minTime", maxTime: "maxTime", theme: "theme" }, outputs: { onChange: "onChange" }, host: { properties: { "class": "this.theme" } }, providers: [ TimeSelectService, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimeSelectComponent), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => TimeSelectComponent), multi: true } ], usesOnChanges: true, ngImport: i0, template: "<ul class=\"dp-time-select-controls\" dir=\"ltr\">\n <li class=\"dp-time-select-control dp-time-select-control-hours\">\n <button (click)=\"increase('hour')\"\n [disabled]=\"!showIncHour\"\n class=\"dp-time-select-control-up\"\n type=\"button\">\n </button>\n <span [innerText]=\"hours\"\n class=\"dp-time-select-display-hours\">\n </span>\n <button (click)=\"decrease('hour')\"\n [disabled]=\"!showDecHour\"\n class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n <li [innerText]=\"componentConfig.timeSeparator\"\n class=\"dp-time-select-control dp-time-select-separator\">\n </li>\n <li class=\"dp-time-select-control dp-time-select-control-minutes\">\n <button (click)=\"increase('minute')\"\n [disabled]=\"!showIncMinute\"\n class=\"dp-time-select-control-up\"\n type=\"button\"></button>\n <span [innerText]=\"minutes\"\n class=\"dp-time-select-display-minutes\">\n </span>\n <button (click)=\"decrease('minute')\"\n [disabled]=\"!showDecMinute\" class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n <ng-container *ngIf=\"componentConfig.showSeconds\">\n <li [innerText]=\"componentConfig.timeSeparator\"\n class=\"dp-time-select-control dp-time-select-separator\">\n </li>\n <li class=\"dp-time-select-control dp-time-select-control-seconds\">\n <button (click)=\"increase('second')\"\n [disabled]=\"!showIncSecond\"\n class=\"dp-time-select-control-up\"\n type=\"button\"></button>\n <span [innerText]=\"seconds\"\n class=\"dp-time-select-display-seconds\">\n </span>\n <button (click)=\"decrease('second')\"\n [disabled]=\"!showDecSecond\"\n class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!componentConfig.showTwentyFourHours\" class=\"dp-time-select-control dp-time-select-control-meridiem\">\n <button (click)=\"toggleMeridiem()\"\n [disabled]=\"!showToggleMeridiem\"\n class=\"dp-time-select-control-up\"\n type=\"button\">\n </button>\n <span [innerText]=\"meridiem\"\n class=\"dp-time-select-display-meridiem\">\n </span>\n <button (click)=\"toggleMeridiem()\"\n [disabled]=\"!showToggleMeridiem\"\n class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n</ul>\n", styles: ["dp-time-select{display:inline-block}dp-time-select .dp-time-select-controls{margin:0;padding:0;text-align:center;line-height:normal;background:#FFFFFF}dp-time-select .dp-time-select-control{display:inline-block;width:35px;margin:0 auto;vertical-align:middle;font-size:inherit;letter-spacing:1px}dp-time-select .dp-time-select-control-up,dp-time-select .dp-time-select-control-down{position:relative;display:block;width:24px;height:24px;margin:3px auto;cursor:pointer}dp-time-select .dp-time-select-control-up:before,dp-time-select .dp-time-select-control-down:before{position:relative;content:\"\";display:inline-block;height:8px;width:8px;vertical-align:baseline;border-style:solid;border-width:2px 2px 0 0;transform:rotate(0)}dp-time-select .dp-time-select-control-up:before{transform:rotate(-45deg);top:4px}dp-time-select .dp-time-select-control-down:before{transform:rotate(135deg)}dp-time-select .dp-time-select-separator{width:5px}dp-time-select.dp-material .dp-time-select-control-up,dp-time-select.dp-material .dp-time-select-control-down{box-sizing:border-box;background:transparent;border:none;outline:none;border-radius:50%}dp-time-select.dp-material .dp-time-select-control-up:before,dp-time-select.dp-material .dp-time-select-control-down:before{left:0}dp-time-select.dp-material .dp-time-select-control-up:hover,dp-time-select.dp-material .dp-time-select-control-down:hover{background:#E0E0E0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: TimeSelectComponent, decorators: [{ type: Component, args: [{ selector: 'dp-time-select', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ TimeSelectService, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TimeSelectComponent), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => TimeSelectComponent), multi: true } ], template: "<ul class=\"dp-time-select-controls\" dir=\"ltr\">\n <li class=\"dp-time-select-control dp-time-select-control-hours\">\n <button (click)=\"increase('hour')\"\n [disabled]=\"!showIncHour\"\n class=\"dp-time-select-control-up\"\n type=\"button\">\n </button>\n <span [innerText]=\"hours\"\n class=\"dp-time-select-display-hours\">\n </span>\n <button (click)=\"decrease('hour')\"\n [disabled]=\"!showDecHour\"\n class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n <li [innerText]=\"componentConfig.timeSeparator\"\n class=\"dp-time-select-control dp-time-select-separator\">\n </li>\n <li class=\"dp-time-select-control dp-time-select-control-minutes\">\n <button (click)=\"increase('minute')\"\n [disabled]=\"!showIncMinute\"\n class=\"dp-time-select-control-up\"\n type=\"button\"></button>\n <span [innerText]=\"minutes\"\n class=\"dp-time-select-display-minutes\">\n </span>\n <button (click)=\"decrease('minute')\"\n [disabled]=\"!showDecMinute\" class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n <ng-container *ngIf=\"componentConfig.showSeconds\">\n <li [innerText]=\"componentConfig.timeSeparator\"\n class=\"dp-time-select-control dp-time-select-separator\">\n </li>\n <li class=\"dp-time-select-control dp-time-select-control-seconds\">\n <button (click)=\"increase('second')\"\n [disabled]=\"!showIncSecond\"\n class=\"dp-time-select-control-up\"\n type=\"button\"></button>\n <span [innerText]=\"seconds\"\n class=\"dp-time-select-display-seconds\">\n </span>\n <button (click)=\"decrease('second')\"\n [disabled]=\"!showDecSecond\"\n class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!componentConfig.showTwentyFourHours\" class=\"dp-time-select-control dp-time-select-control-meridiem\">\n <button (click)=\"toggleMeridiem()\"\n [disabled]=\"!showToggleMeridiem\"\n class=\"dp-time-select-control-up\"\n type=\"button\">\n </button>\n <span [innerText]=\"meridiem\"\n class=\"dp-time-select-display-meridiem\">\n </span>\n <button (click)=\"toggleMeridiem()\"\n [disabled]=\"!showToggleMeridiem\"\n class=\"dp-time-select-control-down\"\n type=\"button\">\n </button>\n </li>\n</ul>\n", styles: ["dp-time-select{display:inline-block}dp-time-select .dp-time-select-controls{margin:0;padding:0;text-align:center;line-height:normal;background:#FFFFFF}dp-time-select .dp-time-select-control{display:inline-block;width:35px;margin:0 auto;vertical-align:middle;font-size:inherit;letter-spacing:1px}dp-time-select .dp-time-select-control-up,dp-time-select .dp-time-select-control-down{position:relative;display:block;width:24px;height:24px;margin:3px auto;cursor:pointer}dp-time-select .dp-time-select-control-up:before,dp-time-select .dp-time-select-control-down:before{position:relative;content:\"\";display:inline-block;height:8px;width:8px;vertical-align:baseline;border-style:solid;border-width:2px 2px 0 0;transform:rotate(0)}dp-time-select .dp-time-select-control-up:before{transform:rotate(-45deg);top:4px}dp-time-select .dp-time-select-control-down:before{transform:rotate(135deg)}dp-time-select .dp-time-select-separator{width:5px}dp-time-select.dp-material .dp-time-select-control-up,dp-time-select.dp-material .dp-time-select-control-down{box-sizing:border-box;background:transparent;border:none;outline:none;border-radius:50%}dp-time-select.dp-material .dp-time-select-control-up:before,dp-time-select.dp-material .dp-time-select-control-down:before{left:0}dp-time-select.dp-material .dp-time-select-control-up:hover,dp-time-select.dp-material .dp-time-select-control-down:hover{background:#E0E0E0}\n"] }] }], ctorParameters: () => [{ type: i1.TimeSelectService }, { type: i2.UtilsService }, { type: i0.ChangeDetectorRef }], propDecorators: { config: [{ type: Input }], displayDate: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], minTime: [{ type: Input }], maxTime: [{ type: Input }], theme: [{ type: HostBinding, args: ['class'] }, { type: Input }], onChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcyLWRhdGUtcGlja2VyL3NyYy9saWIvdGltZS1zZWxlY3QvdGltZS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcyLWRhdGUtcGlja2VyL3NyYy9saWIvdGltZS1zZWxlY3QvdGltZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFHTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGlCQUFpQixFQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQU94QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQXNCbkQsTUFBTSxPQUFPLG1CQUFtQjtJQThCOUIsWUFBNEIsaUJBQW9DLEVBQ3BDLFlBQTBCLEVBQzFCLEVBQXFCO1FBRnJCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUF2QnZDLGFBQVEsR0FBd0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3RCxhQUFRLEdBQVksS0FBSyxDQUFDO1FBZ0IxQixRQUFHLEdBQUc7WUFDSixhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQzFDLENBQUM7SUFLRixDQUFDO0lBSUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hC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QUFFLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2xELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwrQ0N0REgsbWtGQW1FQTs7MkZEWGEsbUJBQW1CO2tCQXBCL0IsU0FBUzsrQkFDRSxnQkFBZ0IsaUJBR1gsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVCxpQkFBaUI7d0JBQ2pCOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDOzRCQUNsRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lKQUlRLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDeUIsS0FBSztzQkFBbkMsV0FBVzt1QkFBQyxPQUFPOztzQkFBRyxLQUFLO2dCQUNsQixRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFQ2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vY29tbW9uL3R5cGVzL2NhbGVuZGFyLXZhbHVlLWVudW0nO1xuaW1wb3J0IHtTaW5nbGVDYWxlbmRhclZhbHVlfSBmcm9tICcuLi9jb21tb24vdHlwZXMvc2luZ2xlLWNhbGVuZGFyLXZhbHVlJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VGltZVNlbGVjdFNlcnZpY2UsIFRpbWVVbml0fSBmcm9tICcuL3RpbWUtc2VsZWN0LnNlcnZpY2UnO1xuXG5pbXBvcnQge0lUaW1lU2VsZWN0Q29uZmlnLCBJVGltZVNlbGVjdENvbmZpZ0ludGVybmFsfSBmcm9tICcuL3RpbWUtc2VsZWN0LWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Q2FsZW5kYXJWYWx1ZX0gZnJvbSAnLi4vY29tbW9uL3R5cGVzL2NhbGVuZGFyLXZhbHVlJztcbmltcG9ydCB7VXRpbHNTZXJ2aWNlfSBmcm9tICcuLi9jb21tb24vc2VydmljZXMvdXRpbHMvdXRpbHMuc2VydmljZSc7XG5pbXBvcnQge0lEYXRlfSBmcm9tICcuLi9jb21tb24vbW9kZWxzL2RhdGUubW9kZWwnO1xuaW1wb3J0IHtEYXRlVmFsaWRhdG9yfSBmcm9tICcuLi9jb21tb24vdHlwZXMvdmFsaWRhdG9yLnR5cGUnO1xuaW1wb3J0IHtJRGF5Q2FsZW5kYXJDb25maWdJbnRlcm5hbH0gZnJvbSAnLi4vZGF5LWNhbGVuZGFyL2RheS1jYWxlbmRhci1jb25maWcubW9kZWwnO1xuaW1wb3J0IHtEYXlqc30gZnJvbSAnZGF5anMnO1xuaW1wb3J0IHtkYXlqc1JlZn0gZnJvbSAnLi4vY29tbW9uL2RheWpzL2RheWpzLnJlZic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RwLXRpbWUtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICd0aW1lLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWyd0aW1lLXNlbGVjdC5jb21wb25lbnQubGVzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAgVGltZVNlbGVjdFNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaW1lU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGltZVNlbGVjdENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuXG4gIEBJbnB1dCgpIGNvbmZpZzogSVRpbWVTZWxlY3RDb25maWc7XG4gIEBJbnB1dCgpIGRpc3BsYXlEYXRlOiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBASW5wdXQoKSBtaW5EYXRlOiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBASW5wdXQoKSBtYXhEYXRlOiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBASW5wdXQoKSBtaW5UaW1lOiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBASW5wdXQoKSBtYXhUaW1lOiBTaW5nbGVDYWxlbmRhclZhbHVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgQElucHV0KCkgdGhlbWU6IHN0cmluZztcbiAgQE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SURhdGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBpc0luaXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjb21wb25lbnRDb25maWc6IElUaW1lU2VsZWN0Q29uZmlnSW50ZXJuYWw7XG4gIGlucHV0VmFsdWU6IENhbGVuZGFyVmFsdWU7XG4gIGlucHV0VmFsdWVUeXBlOiBFQ2FsZW5kYXJWYWx1ZTtcbiAgdmFsaWRhdGVGbjogRGF0ZVZhbGlkYXRvcjtcbiAgaG91cnM6IHN0cmluZztcbiAgbWludXRlczogc3RyaW5nO1xuICBzZWNvbmRzOiBzdHJpbmc7XG4gIG1lcmlkaWVtOiBzdHJpbmc7XG4gIHNob3dEZWNIb3VyOiBib29sZWFuO1xuICBzaG93RGVjTWludXRlOiBib29sZWFuO1xuICBzaG93RGVjU2Vjb25kOiBib29sZWFuO1xuICBzaG93SW5jSG91cjogYm9vbGVhbjtcbiAgc2hvd0luY01pbnV0ZTogYm9vbGVhbjtcbiAgc2hvd0luY1NlY29uZDogYm9vbGVhbjtcbiAgc2hvd1RvZ2dsZU1lcmlkaWVtOiBib29sZWFuO1xuICBhcGkgPSB7XG4gICAgdHJpZ2dlckNoYW5nZTogdGhpcy5lbWl0Q2hhbmdlLmJpbmQodGhpcylcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdGltZVNlbGVjdFNlcnZpY2U6IFRpbWVTZWxlY3RTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UsXG4gICAgICAgICAgICAgIHB1YmxpYyByZWFkb25seSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG4gIF9zZWxlY3RlZDogRGF5anM7XG5cbiAgZ2V0IHNlbGVjdGVkKCk6IERheWpzIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gIH1cblxuICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IERheWpzKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICB0aGlzLmNhbGN1bGF0ZVRpbWVQYXJ0cyh0aGlzLnNlbGVjdGVkKTtcblxuICAgIHRoaXMuc2hvd0RlY0hvdXIgPSB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLnNob3VsZFNob3dEZWNyZWFzZSh0aGlzLmNvbXBvbmVudENvbmZpZywgdGhpcy5fc2VsZWN0ZWQsICdob3VyJyk7XG4gICAgdGhpcy5zaG93RGVjTWludXRlID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5zaG91bGRTaG93RGVjcmVhc2UodGhpcy5jb21wb25lbnRDb25maWcsIHRoaXMuX3NlbGVjdGVkLCAnbWludXRlJyk7XG4gICAgdGhpcy5zaG93RGVjU2Vjb25kID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5zaG91bGRTaG93RGVjcmVhc2UodGhpcy5jb21wb25lbnRDb25maWcsIHRoaXMuX3NlbGVjdGVkLCAnc2Vjb25kJyk7XG5cbiAgICB0aGlzLnNob3dJbmNIb3VyID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5zaG91bGRTaG93SW5jcmVhc2UodGhpcy5jb21wb25lbnRDb25maWcsIHRoaXMuX3NlbGVjdGVkLCAnaG91cicpO1xuICAgIHRoaXMuc2hvd0luY01pbnV0ZSA9IHRoaXMudGltZVNlbGVjdFNlcnZpY2Uuc2hvdWxkU2hvd0luY3JlYXNlKHRoaXMuY29tcG9uZW50Q29uZmlnLCB0aGlzLl9zZWxlY3RlZCwgJ21pbnV0ZScpO1xuICAgIHRoaXMuc2hvd0luY1NlY29uZCA9IHRoaXMudGltZVNlbGVjdFNlcnZpY2Uuc2hvdWxkU2hvd0luY3JlYXNlKHRoaXMuY29tcG9uZW50Q29uZmlnLCB0aGlzLl9zZWxlY3RlZCwgJ3NlY29uZCcpO1xuXG4gICAgdGhpcy5zaG93VG9nZ2xlTWVyaWRpZW0gPSB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLnNob3VsZFNob3dUb2dnbGVNZXJpZGllbSh0aGlzLmNvbXBvbmVudENvbmZpZywgdGhpcy5fc2VsZWN0ZWQpO1xuXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMucHJvY2Vzc09uQ2hhbmdlQ2FsbGJhY2soc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNJbml0ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuaW5pdFZhbGlkYXRvcnMoKTtcbiAgfVxuXG4gIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRDb25maWcgPSB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLmdldENvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQgfHwgZGF5anNSZWYoKTtcbiAgICB0aGlzLmlucHV0VmFsdWVUeXBlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2V0SW5wdXRUeXBlKHRoaXMuaW5wdXRWYWx1ZSwgZmFsc2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5pdGVkKSB7XG4gICAgICBjb25zdCB7bWluRGF0ZSwgbWF4RGF0ZSwgbWluVGltZSwgbWF4VGltZX0gPSBjaGFuZ2VzO1xuXG4gICAgICBpZiAobWluRGF0ZSB8fCBtYXhEYXRlIHx8IG1pblRpbWUgfHwgbWF4VGltZSkge1xuICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JzKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IENhbGVuZGFyVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgY29uc3QgZGF5anNWYWx1ZSA9IHRoaXMudXRpbHNTZXJ2aWNlXG4gICAgICAgIC5jb252ZXJ0VG9EYXlqc0FycmF5KHZhbHVlLCB7XG4gICAgICAgICAgYWxsb3dNdWx0aVNlbGVjdDogZmFsc2UsXG4gICAgICAgICAgZm9ybWF0OiB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLmdldFRpbWVGb3JtYXQodGhpcy5jb21wb25lbnRDb25maWcpXG4gICAgICAgIH0pWzBdO1xuICAgICAgaWYgKGRheWpzVmFsdWUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBkYXlqc1ZhbHVlO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWVUeXBlID0gdGhpcy51dGlsc1NlcnZpY2VcbiAgICAgICAgICAuZ2V0SW5wdXRUeXBlKHRoaXMuaW5wdXRWYWx1ZSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIG9uQ2hhbmdlQ2FsbGJhY2soXzogYW55KSB7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gIH1cblxuICB2YWxpZGF0ZShmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IGFueSB7XG4gICAgaWYgKHRoaXMubWluRGF0ZSB8fCB0aGlzLm1heERhdGUgfHwgdGhpcy5taW5UaW1lIHx8IHRoaXMubWF4VGltZSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVGbihmb3JtQ29udHJvbC52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoKSA9PiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NPbkNoYW5nZUNhbGxiYWNrKHZhbHVlOiBEYXlqcyk6IENhbGVuZGFyVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnV0aWxzU2VydmljZS5jb252ZXJ0RnJvbURheWpzQXJyYXkoXG4gICAgICB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLmdldFRpbWVGb3JtYXQodGhpcy5jb21wb25lbnRDb25maWcpLFxuICAgICAgW3ZhbHVlXSxcbiAgICAgIHRoaXMuY29tcG9uZW50Q29uZmlnLnJldHVybmVkVmFsdWVUeXBlIHx8IHRoaXMuaW5wdXRWYWx1ZVR5cGVcbiAgICApO1xuICB9XG5cbiAgaW5pdFZhbGlkYXRvcnMoKSB7XG4gICAgdGhpcy52YWxpZGF0ZUZuID0gdGhpcy51dGlsc1NlcnZpY2UuY3JlYXRlVmFsaWRhdG9yKFxuICAgICAge1xuICAgICAgICBtaW5EYXRlOiB0aGlzLm1pbkRhdGUsXG4gICAgICAgIG1heERhdGU6IHRoaXMubWF4RGF0ZSxcbiAgICAgICAgbWluVGltZTogdGhpcy5taW5UaW1lLFxuICAgICAgICBtYXhUaW1lOiB0aGlzLm1heFRpbWVcbiAgICAgIH0sIHVuZGVmaW5lZCwgJ2RheScpO1xuXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHRoaXMucHJvY2Vzc09uQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZCkpO1xuICB9XG5cbiAgZGVjcmVhc2UodW5pdDogVGltZVVuaXQpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5kZWNyZWFzZSh0aGlzLmNvbXBvbmVudENvbmZpZywgdGhpcy5zZWxlY3RlZCwgdW5pdCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBpbmNyZWFzZSh1bml0OiBUaW1lVW5pdCkge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLmluY3JlYXNlKHRoaXMuY29tcG9uZW50Q29uZmlnLCB0aGlzLnNlbGVjdGVkLCB1bml0KTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHRvZ2dsZU1lcmlkaWVtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLnRvZ2dsZU1lcmlkaWVtKHRoaXMuc2VsZWN0ZWQpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICB9XG5cbiAgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoe2RhdGU6IHRoaXMuc2VsZWN0ZWQsIHNlbGVjdGVkOiBmYWxzZX0pO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjYWxjdWxhdGVUaW1lUGFydHModGltZTogRGF5anMpOiB2b2lkIHtcbiAgICB0aGlzLmhvdXJzID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5nZXRIb3Vycyh0aGlzLmNvbXBvbmVudENvbmZpZywgdGltZSk7XG4gICAgdGhpcy5taW51dGVzID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5nZXRNaW51dGVzKHRoaXMuY29tcG9uZW50Q29uZmlnLCB0aW1lKTtcbiAgICB0aGlzLnNlY29uZHMgPSB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLmdldFNlY29uZHModGhpcy5jb21wb25lbnRDb25maWcsIHRpbWUpO1xuICAgIHRoaXMubWVyaWRpZW0gPSB0aGlzLnRpbWVTZWxlY3RTZXJ2aWNlLmdldE1lcmlkaWVtKHRoaXMuY29tcG9uZW50Q29uZmlnLCB0aW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29uZmlnQ2hhbmdlKGNvbmZpZzogU2ltcGxlQ2hhbmdlKTogdm9pZCB7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgY29uc3QgcHJldkNvbmY6IElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5nZXRDb25maWcoY29uZmlnLnByZXZpb3VzVmFsdWUpO1xuICAgICAgY29uc3QgY3VycmVudENvbmY6IElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsID0gdGhpcy50aW1lU2VsZWN0U2VydmljZS5nZXRDb25maWcoY29uZmlnLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLCI8dWwgY2xhc3M9XCJkcC10aW1lLXNlbGVjdC1jb250cm9sc1wiIGRpcj1cImx0clwiPlxuICA8bGkgY2xhc3M9XCJkcC10aW1lLXNlbGVjdC1jb250cm9sIGRwLXRpbWUtc2VsZWN0LWNvbnRyb2wtaG91cnNcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJpbmNyZWFzZSgnaG91cicpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2hvd0luY0hvdXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJkcC10aW1lLXNlbGVjdC1jb250cm9sLXVwXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj5cbiAgICA8L2J1dHRvbj5cbiAgICA8c3BhbiBbaW5uZXJUZXh0XT1cImhvdXJzXCJcbiAgICAgICAgICBjbGFzcz1cImRwLXRpbWUtc2VsZWN0LWRpc3BsYXktaG91cnNcIj5cbiAgICA8L3NwYW4+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVjcmVhc2UoJ2hvdXInKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNob3dEZWNIb3VyXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZHAtdGltZS1zZWxlY3QtY29udHJvbC1kb3duXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj5cbiAgICA8L2J1dHRvbj5cbiAgPC9saT5cbiAgPGxpIFtpbm5lclRleHRdPVwiY29tcG9uZW50Q29uZmlnLnRpbWVTZXBhcmF0b3JcIlxuICAgICAgY2xhc3M9XCJkcC10aW1lLXNlbGVjdC1jb250cm9sIGRwLXRpbWUtc2VsZWN0LXNlcGFyYXRvclwiPlxuICA8L2xpPlxuICA8bGkgY2xhc3M9XCJkcC10aW1lLXNlbGVjdC1jb250cm9sIGRwLXRpbWUtc2VsZWN0LWNvbnRyb2wtbWludXRlc1wiPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImluY3JlYXNlKCdtaW51dGUnKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNob3dJbmNNaW51dGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJkcC10aW1lLXNlbGVjdC1jb250cm9sLXVwXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cbiAgICA8c3BhbiBbaW5uZXJUZXh0XT1cIm1pbnV0ZXNcIlxuICAgICAgICAgIGNsYXNzPVwiZHAtdGltZS1zZWxlY3QtZGlzcGxheS1taW51dGVzXCI+XG4gICAgPC9zcGFuPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImRlY3JlYXNlKCdtaW51dGUnKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNob3dEZWNNaW51dGVcIiBjbGFzcz1cImRwLXRpbWUtc2VsZWN0LWNvbnRyb2wtZG93blwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCI+XG4gICAgPC9idXR0b24+XG4gIDwvbGk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wb25lbnRDb25maWcuc2hvd1NlY29uZHNcIj5cbiAgICA8bGkgW2lubmVyVGV4dF09XCJjb21wb25lbnRDb25maWcudGltZVNlcGFyYXRvclwiXG4gICAgICAgIGNsYXNzPVwiZHAtdGltZS1zZWxlY3QtY29udHJvbCBkcC10aW1lLXNlbGVjdC1zZXBhcmF0b3JcIj5cbiAgICA8L2xpPlxuICAgIDxsaSBjbGFzcz1cImRwLXRpbWUtc2VsZWN0LWNvbnRyb2wgZHAtdGltZS1zZWxlY3QtY29udHJvbC1zZWNvbmRzXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJpbmNyZWFzZSgnc2Vjb25kJylcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNob3dJbmNTZWNvbmRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImRwLXRpbWUtc2VsZWN0LWNvbnRyb2wtdXBcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XG4gICAgICA8c3BhbiBbaW5uZXJUZXh0XT1cInNlY29uZHNcIlxuICAgICAgICAgICAgY2xhc3M9XCJkcC10aW1lLXNlbGVjdC1kaXNwbGF5LXNlY29uZHNcIj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImRlY3JlYXNlKCdzZWNvbmQnKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2hvd0RlY1NlY29uZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZHAtdGltZS1zZWxlY3QtY29udHJvbC1kb3duXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9saT5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxsaSAqbmdJZj1cIiFjb21wb25lbnRDb25maWcuc2hvd1R3ZW50eUZvdXJIb3Vyc1wiIGNsYXNzPVwiZHAtdGltZS1zZWxlY3QtY29udHJvbCBkcC10aW1lLXNlbGVjdC1jb250cm9sLW1lcmlkaWVtXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlTWVyaWRpZW0oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNob3dUb2dnbGVNZXJpZGllbVwiXG4gICAgICAgICAgICBjbGFzcz1cImRwLXRpbWUtc2VsZWN0LWNvbnRyb2wtdXBcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIFtpbm5lclRleHRdPVwibWVyaWRpZW1cIlxuICAgICAgICAgIGNsYXNzPVwiZHAtdGltZS1zZWxlY3QtZGlzcGxheS1tZXJpZGllbVwiPlxuICAgIDwvc3Bhbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVNZXJpZGllbSgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2hvd1RvZ2dsZU1lcmlkaWVtXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZHAtdGltZS1zZWxlY3QtY29udHJvbC1kb3duXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj5cbiAgICA8L2J1dHRvbj5cbiAgPC9saT5cbjwvdWw+XG4iXX0=