UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

185 lines 30 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Optional, Output, Self, ViewEncapsulation, } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { ReplaySubject, Subject, delay, distinctUntilChanged, filter, map, pairwise, startWith, takeUntil, tap, } from 'rxjs'; import { DOKU_FORM_FIELD_ACCESSOR, } from '../form-field'; import { DokuInputTime } from './input-time.directive'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; export class DokuTimePicker { constructor(cdr, ngControl) { this.cdr = cdr; this.ngControl = ngControl; this.classes = 'd-time-picker'; /** * Whether to disable the time picker. * @default false */ this.disabled = false; /** * Whether to show the seconds input. * @default false */ this.showSeconds = false; /** * Value of the time picker in ISO String format. * @default '' */ this.value = ''; /** * Minimum time that can be selected. Value in ISO String format. * @default '' */ this.min = ''; /** * Maximum time that can be selected. Value in ISO String format. * @default '' */ this.max = ''; /** * An event emitted when the time changes on blur and condition met. * * Conditions: * - All fields are filled. * - All fields were filled previously, but there is an empty field on the current change. * This case, the value will be an empty string. * - Previous and current values are different. */ this.timeChange = new EventEmitter(); this.hourValue = ''; this.minuteValue = ''; this.secondValue = ''; this.notifyOnBlur$ = new Subject(); this.destroy$ = new ReplaySubject(); this.fieldOptions = { withoutInputStyle: true }; if (this.ngControl) { this.ngControl.valueAccessor = this; } } registerOnDisable(fn) { this.onDisable = fn; } registerOnValidate(fn) { this.onValidate = fn; } writeValue(value) { this.setValueFromISOString(value); this.cdr.detectChanges(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; this.cdr.detectChanges(); } ngOnInit() { this.notifyOnBlur$ .pipe(tap(() => { this.onTouched?.(); this.setMinMaxTime(this.constructFinalValue()); }), map(() => this.constructFinalValue()), startWith(this.constructFinalValue()), pairwise(), filter(([prev, current]) => (!prev && !!current) || (!!prev && !current) || (!!prev && !!current)), distinctUntilChanged(([, prev], [, current]) => JSON.stringify(prev) === JSON.stringify(current)), takeUntil(this.destroy$)) .subscribe(([, currentValue]) => { this.timeChange.emit(currentValue); this.onChange?.(currentValue); this.onValidate?.(currentValue ? 'valid' : 'invalid'); }); } ngAfterViewInit() { this.ngControl?.statusChanges ?.pipe(distinctUntilChanged(), delay(0), takeUntil(this.destroy$)) .subscribe((status) => { if (status === 'VALID') { this.onValidate?.('valid'); } else if (status === 'INVALID') { this.onValidate?.('invalid'); } else { this.onValidate?.(); } }); } ngOnChanges(changes) { if (changes['disabled']?.previousValue !== changes['disabled']?.currentValue) { this.onDisable?.(!!this.disabled); } if (changes['value']?.previousValue !== changes['value']?.currentValue) { this.setValueFromISOString(changes['value']?.currentValue); } } ngOnDestroy() { this.destroy$.next(true); this.destroy$.complete(); } constructFinalValue() { if (!this.hourValue || !this.minuteValue) return ''; if (this.showSeconds && !this.secondValue) return ''; const time = this.value ? new Date(this.value) : new Date(); time.setHours(parseInt(this.hourValue)); time.setMinutes(parseInt(this.minuteValue)); time.setSeconds(parseInt(this.showSeconds ? this.secondValue : '0')); time.setMilliseconds(0); return time.toISOString(); } setMinMaxTime(currentTime) { if (this.min && new Date(currentTime) < new Date(this.min)) { this.setValueFromISOString(this.min); } if (this.max && new Date(currentTime) > new Date(this.max)) { this.setValueFromISOString(this.max); } } getTimeFromISODateString(value) { const time = new Date(value || ''); const isValid = time instanceof Date && !isNaN(time.getTime()); if (!isValid) return { hour: '', minute: '', second: '' }; return { hour: time.getHours().toString(), minute: time.getMinutes().toString(), second: time.getSeconds().toString(), }; } setValueFromISOString(value) { const { hour, minute, second } = this.getTimeFromISODateString(value); this.hourValue = this.addPadToValueItem(hour); this.minuteValue = this.addPadToValueItem(minute); this.secondValue = this.addPadToValueItem(second); } addPadToValueItem(value) { return value ? value.padStart(2, '0') : value; } } DokuTimePicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTimePicker, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); DokuTimePicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuTimePicker, isStandalone: true, selector: "doku-time-picker", inputs: { disabled: "disabled", showSeconds: "showSeconds", value: "value", min: "min", max: "max" }, outputs: { timeChange: "timeChange" }, host: { properties: { "class": "this.classes" } }, providers: [{ provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuTimePicker }], exportAs: ["dokuTimePicker"], usesOnChanges: true, ngImport: i0, template: "<div class=\"input-wrapper\">\n <input\n #inputHour\n doku-input-time\n name=\"hour\"\n type=\"text\"\n placeholder=\"HH\"\n maxlength=\"2\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"hourValue\"\n (blur)=\"notifyOnBlur$.next(true)\"\n autocomplete=\"off\"\n />\n</div>\n<div class=\"input-wrapper\">\n <input\n #inputMinute\n doku-input-time\n name=\"minute\"\n type=\"text\"\n placeholder=\"MM\"\n maxlength=\"2\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"minuteValue\"\n (blur)=\"notifyOnBlur$.next(true)\"\n autocomplete=\"off\"\n />\n</div>\n<div class=\"input-wrapper\" *ngIf=\"showSeconds\">\n <input\n #inputSecond\n doku-input-time\n name=\"second\"\n type=\"text\"\n placeholder=\"SS\"\n maxlength=\"2\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"secondValue\"\n (blur)=\"notifyOnBlur$.next(true)\"\n autocomplete=\"off\"\n />\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: DokuInputTime, selector: "[doku-input-time]", exportAs: ["dokuInputTime"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTimePicker, decorators: [{ type: Component, args: [{ selector: 'doku-time-picker', exportAs: 'dokuTimePicker', standalone: true, imports: [CommonModule, DokuInputTime, FormsModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuTimePicker }], template: "<div class=\"input-wrapper\">\n <input\n #inputHour\n doku-input-time\n name=\"hour\"\n type=\"text\"\n placeholder=\"HH\"\n maxlength=\"2\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"hourValue\"\n (blur)=\"notifyOnBlur$.next(true)\"\n autocomplete=\"off\"\n />\n</div>\n<div class=\"input-wrapper\">\n <input\n #inputMinute\n doku-input-time\n name=\"minute\"\n type=\"text\"\n placeholder=\"MM\"\n maxlength=\"2\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"minuteValue\"\n (blur)=\"notifyOnBlur$.next(true)\"\n autocomplete=\"off\"\n />\n</div>\n<div class=\"input-wrapper\" *ngIf=\"showSeconds\">\n <input\n #inputSecond\n doku-input-time\n name=\"second\"\n type=\"text\"\n placeholder=\"SS\"\n maxlength=\"2\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"secondValue\"\n (blur)=\"notifyOnBlur$.next(true)\"\n autocomplete=\"off\"\n />\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{ type: Optional }, { type: Self }] }]; }, propDecorators: { classes: [{ type: HostBinding, args: ['class'] }], disabled: [{ type: Input }], showSeconds: [{ type: Input }], value: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], timeChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9rdS1mcmFnbWVudC9zcmMvbGliL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUNMLGFBQWEsRUFDYixPQUFPLEVBQ1AsS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUNILFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCx3QkFBd0IsR0FJekIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBc0J2RCxNQUFNLE9BQU8sY0FBYztJQTREekIsWUFBb0IsR0FBc0IsRUFBOEIsU0FBb0I7UUFBeEUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBOEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWxEekUsWUFBTyxHQUF1QixlQUFlLENBQUM7UUFFakU7OztXQUdHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQjs7O1dBR0c7UUFD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Q0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBYTtRQUNyQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNoRCxDQUFDOzsyR0FqTVUsY0FBYzsrRkFBZCxjQUFjLCtQQUZkLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDLDZFQ3pEakYsODZCQTBDQSwyQ0RXWSxZQUFZLG1JQUFFLGFBQWEsMEZBQUUsV0FBVzsyRkFNdkMsY0FBYztrQkFWMUIsU0FBUzsrQkFDRSxrQkFBa0IsWUFDbEIsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsaUJBRXBDLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLGdCQUFnQixFQUFFLENBQUM7OzBCQThEbEMsUUFBUTs7MEJBQUksSUFBSTs0Q0FsRDFDLE9BQU87c0JBRHpCLFdBQVc7dUJBQUMsT0FBTztnQkFPWCxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsS0FBSztzQkFBYixLQUFLO2dCQU1HLEdBQUc7c0JBQVgsS0FBSztnQkFNRyxHQUFHO3NCQUFYLEtBQUs7Z0JBV0ksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNlbGYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgUmVwbGF5U3ViamVjdCxcbiAgU3ViamVjdCxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgcGFpcndpc2UsXG4gIHN0YXJ0V2l0aCxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRE9LVV9GT1JNX0ZJRUxEX0FDQ0VTU09SLFxuICBEb2t1Rm9ybUZpZWxkQWNjZXNzb3IsXG4gIERva3VGb3JtRmllbGRBY2Nlc3NvclZhbGlkYXRlVmFsdWUsXG4gIERva3VGb3JtRmllbGRPcHRpb25zLFxufSBmcm9tICcuLi9mb3JtLWZpZWxkJztcbmltcG9ydCB7IERva3VJbnB1dFRpbWUgfSBmcm9tICcuL2lucHV0LXRpbWUuZGlyZWN0aXZlJztcblxuZXhwb3J0IHR5cGUgRG9rdVRpbWVUeXBlID0gJ2hvdXInIHwgJ21pbnV0ZScgfCAnc2Vjb25kJztcblxuZXhwb3J0IGludGVyZmFjZSBEb2t1VGltZVBhcnRpYWxPcHRpb25zIHtcbiAgaG91cj86IGJvb2xlYW47XG4gIG1pbnV0ZT86IGJvb2xlYW47XG4gIHNlY29uZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIERva3VUaW1lUGlja2VyVmFsdWUgPSBzdHJpbmc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rva3UtdGltZS1waWNrZXInLFxuICBleHBvcnRBczogJ2Rva3VUaW1lUGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRG9rdUlucHV0VGltZSwgRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBET0tVX0ZPUk1fRklFTERfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBEb2t1VGltZVBpY2tlciB9XSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdVRpbWVQaWNrZXJcbiAgaW1wbGVtZW50c1xuICAgIERva3VGb3JtRmllbGRBY2Nlc3NvcixcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBBZnRlclZpZXdJbml0XG57XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xhc3NlczogTmdDbGFzc1snbmdDbGFzcyddID0gJ2QtdGltZS1waWNrZXInO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIHRpbWUgcGlja2VyLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBzZWNvbmRzIGlucHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NlY29uZHMgPSBmYWxzZTtcblxuICAvKipcbiAgICogVmFsdWUgb2YgdGhlIHRpbWUgcGlja2VyIGluIElTTyBTdHJpbmcgZm9ybWF0LlxuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KCkgdmFsdWUgPSAnJztcblxuICAvKipcbiAgICogTWluaW11bSB0aW1lIHRoYXQgY2FuIGJlIHNlbGVjdGVkLiBWYWx1ZSBpbiBJU08gU3RyaW5nIGZvcm1hdC5cbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgpIG1pbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuIFZhbHVlIGluIElTTyBTdHJpbmcgZm9ybWF0LlxuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KCkgbWF4ID0gJyc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdGltZSBjaGFuZ2VzIG9uIGJsdXIgYW5kIGNvbmRpdGlvbiBtZXQuXG4gICAqXG4gICAqIENvbmRpdGlvbnM6XG4gICAqIC0gQWxsIGZpZWxkcyBhcmUgZmlsbGVkLlxuICAgKiAtIEFsbCBmaWVsZHMgd2VyZSBmaWxsZWQgcHJldmlvdXNseSwgYnV0IHRoZXJlIGlzIGFuIGVtcHR5IGZpZWxkIG9uIHRoZSBjdXJyZW50IGNoYW5nZS5cbiAgICogVGhpcyBjYXNlLCB0aGUgdmFsdWUgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAqIC0gUHJldmlvdXMgYW5kIGN1cnJlbnQgdmFsdWVzIGFyZSBkaWZmZXJlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgdGltZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RG9rdVRpbWVQaWNrZXJWYWx1ZT4oKTtcblxuICBwcm90ZWN0ZWQgaG91clZhbHVlID0gJyc7XG4gIHByb3RlY3RlZCBtaW51dGVWYWx1ZSA9ICcnO1xuICBwcm90ZWN0ZWQgc2Vjb25kVmFsdWUgPSAnJztcblxuICBwcm90ZWN0ZWQgbm90aWZ5T25CbHVyJCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgQE9wdGlvbmFsKCkgQFNlbGYoKSBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBmaWVsZE9wdGlvbnM/OiBEb2t1Rm9ybUZpZWxkT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHsgd2l0aG91dElucHV0U3R5bGU6IHRydWUgfTtcbiAgb25EaXNhYmxlPzogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9uVmFsaWRhdGU/OiAoKHZhbHVlPzogRG9rdUZvcm1GaWVsZEFjY2Vzc29yVmFsaWRhdGVWYWx1ZSB8IHVuZGVmaW5lZCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHJlZ2lzdGVyT25EaXNhYmxlKGZuOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGlzYWJsZSA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25WYWxpZGF0ZT8oZm46ICh2YWx1ZT86IERva3VGb3JtRmllbGRBY2Nlc3NvclZhbGlkYXRlVmFsdWUgfCB1bmRlZmluZWQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVmFsaWRhdGUgPSBmbjtcbiAgfVxuXG4gIG9uQ2hhbmdlPzogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uVG91Y2hlZD86ICgpID0+IHZvaWQ7XG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tSVNPU3RyaW5nKHZhbHVlKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmeU9uQmx1ciRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25Ub3VjaGVkPy4oKTtcbiAgICAgICAgICB0aGlzLnNldE1pbk1heFRpbWUodGhpcy5jb25zdHJ1Y3RGaW5hbFZhbHVlKCkpO1xuICAgICAgICB9KSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuY29uc3RydWN0RmluYWxWYWx1ZSgpKSxcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuY29uc3RydWN0RmluYWxWYWx1ZSgpKSxcbiAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgZmlsdGVyKFxuICAgICAgICAgIChbcHJldiwgY3VycmVudF0pID0+ICghcHJldiAmJiAhIWN1cnJlbnQpIHx8ICghIXByZXYgJiYgIWN1cnJlbnQpIHx8ICghIXByZXYgJiYgISFjdXJyZW50KVxuICAgICAgICApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChcbiAgICAgICAgICAoWywgcHJldl0sIFssIGN1cnJlbnRdKSA9PiBKU09OLnN0cmluZ2lmeShwcmV2KSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycmVudClcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbLCBjdXJyZW50VmFsdWVdKSA9PiB7XG4gICAgICAgIHRoaXMudGltZUNoYW5nZS5lbWl0KGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2U/LihjdXJyZW50VmFsdWUpO1xuICAgICAgICB0aGlzLm9uVmFsaWRhdGU/LihjdXJyZW50VmFsdWUgPyAndmFsaWQnIDogJ2ludmFsaWQnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdDb250cm9sPy5zdGF0dXNDaGFuZ2VzXG4gICAgICA/LnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVsYXkoMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnVkFMSUQnKSB7XG4gICAgICAgICAgdGhpcy5vblZhbGlkYXRlPy4oJ3ZhbGlkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnSU5WQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLm9uVmFsaWRhdGU/LignaW52YWxpZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25WYWxpZGF0ZT8uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzWydkaXNhYmxlZCddPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMub25EaXNhYmxlPy4oISF0aGlzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sndmFsdWUnXT8ucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlc1sndmFsdWUnXT8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnNldFZhbHVlRnJvbUlTT1N0cmluZyhjaGFuZ2VzWyd2YWx1ZSddPy5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdEZpbmFsVmFsdWUoKTogRG9rdVRpbWVQaWNrZXJWYWx1ZSB7XG4gICAgaWYgKCF0aGlzLmhvdXJWYWx1ZSB8fCAhdGhpcy5taW51dGVWYWx1ZSkgcmV0dXJuICcnO1xuICAgIGlmICh0aGlzLnNob3dTZWNvbmRzICYmICF0aGlzLnNlY29uZFZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCB0aW1lID0gdGhpcy52YWx1ZSA/IG5ldyBEYXRlKHRoaXMudmFsdWUpIDogbmV3IERhdGUoKTtcbiAgICB0aW1lLnNldEhvdXJzKHBhcnNlSW50KHRoaXMuaG91clZhbHVlKSk7XG4gICAgdGltZS5zZXRNaW51dGVzKHBhcnNlSW50KHRoaXMubWludXRlVmFsdWUpKTtcbiAgICB0aW1lLnNldFNlY29uZHMocGFyc2VJbnQodGhpcy5zaG93U2Vjb25kcyA/IHRoaXMuc2Vjb25kVmFsdWUgOiAnMCcpKTtcbiAgICB0aW1lLnNldE1pbGxpc2Vjb25kcygwKTtcbiAgICByZXR1cm4gdGltZS50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNaW5NYXhUaW1lKGN1cnJlbnRUaW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5taW4gJiYgbmV3IERhdGUoY3VycmVudFRpbWUpIDwgbmV3IERhdGUodGhpcy5taW4pKSB7XG4gICAgICB0aGlzLnNldFZhbHVlRnJvbUlTT1N0cmluZyh0aGlzLm1pbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF4ICYmIG5ldyBEYXRlKGN1cnJlbnRUaW1lKSA+IG5ldyBEYXRlKHRoaXMubWF4KSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZUZyb21JU09TdHJpbmcodGhpcy5tYXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGltZUZyb21JU09EYXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudWxsKToge1xuICAgIGhvdXI6IHN0cmluZztcbiAgICBtaW51dGU6IHN0cmluZztcbiAgICBzZWNvbmQ6IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgdGltZSA9IG5ldyBEYXRlKHZhbHVlIHx8ICcnKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGltZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHRpbWUuZ2V0VGltZSgpKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybiB7IGhvdXI6ICcnLCBtaW51dGU6ICcnLCBzZWNvbmQ6ICcnIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGhvdXI6IHRpbWUuZ2V0SG91cnMoKS50b1N0cmluZygpLFxuICAgICAgbWludXRlOiB0aW1lLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLFxuICAgICAgc2Vjb25kOiB0aW1lLmdldFNlY29uZHMoKS50b1N0cmluZygpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlRnJvbUlTT1N0cmluZyh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQgfSA9IHRoaXMuZ2V0VGltZUZyb21JU09EYXRlU3RyaW5nKHZhbHVlKTtcbiAgICB0aGlzLmhvdXJWYWx1ZSA9IHRoaXMuYWRkUGFkVG9WYWx1ZUl0ZW0oaG91cik7XG4gICAgdGhpcy5taW51dGVWYWx1ZSA9IHRoaXMuYWRkUGFkVG9WYWx1ZUl0ZW0obWludXRlKTtcbiAgICB0aGlzLnNlY29uZFZhbHVlID0gdGhpcy5hZGRQYWRUb1ZhbHVlSXRlbShzZWNvbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQYWRUb1ZhbHVlSXRlbSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gdmFsdWUucGFkU3RhcnQoMiwgJzAnKSA6IHZhbHVlO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICA8aW5wdXRcbiAgICAjaW5wdXRIb3VyXG4gICAgZG9rdS1pbnB1dC10aW1lXG4gICAgbmFtZT1cImhvdXJcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBwbGFjZWhvbGRlcj1cIkhIXCJcbiAgICBtYXhsZW5ndGg9XCIyXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFsobmdNb2RlbCldPVwiaG91clZhbHVlXCJcbiAgICAoYmx1cik9XCJub3RpZnlPbkJsdXIkLm5leHQodHJ1ZSlcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gIC8+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XG4gIDxpbnB1dFxuICAgICNpbnB1dE1pbnV0ZVxuICAgIGRva3UtaW5wdXQtdGltZVxuICAgIG5hbWU9XCJtaW51dGVcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBwbGFjZWhvbGRlcj1cIk1NXCJcbiAgICBtYXhsZW5ndGg9XCIyXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFsobmdNb2RlbCldPVwibWludXRlVmFsdWVcIlxuICAgIChibHVyKT1cIm5vdGlmeU9uQmx1ciQubmV4dCh0cnVlKVwiXG4gICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgLz5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIiAqbmdJZj1cInNob3dTZWNvbmRzXCI+XG4gIDxpbnB1dFxuICAgICNpbnB1dFNlY29uZFxuICAgIGRva3UtaW5wdXQtdGltZVxuICAgIG5hbWU9XCJzZWNvbmRcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBwbGFjZWhvbGRlcj1cIlNTXCJcbiAgICBtYXhsZW5ndGg9XCIyXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFsobmdNb2RlbCldPVwic2Vjb25kVmFsdWVcIlxuICAgIChibHVyKT1cIm5vdGlmeU9uQmx1ciQubmV4dCh0cnVlKVwiXG4gICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgLz5cbjwvZGl2PlxuIl19